freebsd-nq/sys/sys/rctl.h
Edward Tomasz Napierala ae34b6ff96 Add four new RCTL resources - readbps, readiops, writebps and writeiops,
for limiting disk (actually filesystem) IO.

Note that in some cases these limits are not quite precise. It's ok,
as long as it's within some reasonable bounds.

Testing - and review of the code, in particular the VFS and VM parts - is
very welcome.

MFC after:	1 month
Relnotes:	yes
Sponsored by:	The FreeBSD Foundation
Differential Revision:	https://reviews.freebsd.org/D5080
2016-04-07 04:23:25 +00:00

173 lines
5.9 KiB
C

/*-
* Copyright (c) 2010 The FreeBSD Foundation
* All rights reserved.
*
* This software was developed by Edward Tomasz Napierala under sponsorship
* from the FreeBSD Foundation.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $FreeBSD$
*/
/*
* Resource Limits.
*/
#ifndef _RCTL_H_
#define _RCTL_H_
#include <sys/cdefs.h>
#include <sys/queue.h>
#include <sys/types.h>
#include <sys/_task.h>
struct proc;
struct uidinfo;
struct loginclass;
struct prison_racct;
struct ucred;
struct rctl_rule_link;
#ifdef _KERNEL
/*
* Rules describe an action to be taken when conditions defined
* in the rule are met. There is no global list of rules; instead,
* rules are linked to by the racct structures for all the subjects
* they apply to - for example, a rule of type "user" is linked to the
* appropriate struct uidinfo, and to all the processes of that user.
*
* 'rr_refcount' is equal to the number of rctl_rule_link structures
* pointing to the rule.
*
* This structure must never change after being added, via rctl_rule_link
* structures, to subjects. In order to change a rule, add a new rule
* and remove the previous one.
*/
struct rctl_rule {
int rr_subject_type;
union {
struct proc *rs_proc;
struct uidinfo *rs_uip;
struct loginclass *rs_loginclass;
struct prison_racct *rs_prison_racct;
} rr_subject;
int rr_per;
int rr_resource;
int rr_action;
int64_t rr_amount;
u_int rr_refcount;
struct task rr_task;
};
/*
* Allowed values for rr_subject_type and rr_per fields.
*/
#define RCTL_SUBJECT_TYPE_UNDEFINED -1
#define RCTL_SUBJECT_TYPE_PROCESS 0x0000
#define RCTL_SUBJECT_TYPE_USER 0x0001
#define RCTL_SUBJECT_TYPE_LOGINCLASS 0x0003
#define RCTL_SUBJECT_TYPE_JAIL 0x0004
#define RCTL_SUBJECT_TYPE_MAX RCTL_SUBJECT_TYPE_JAIL
/*
* Allowed values for rr_action field.
*/
#define RCTL_ACTION_UNDEFINED -1
#define RCTL_ACTION_SIGHUP SIGHUP
#define RCTL_ACTION_SIGINT SIGINT
#define RCTL_ACTION_SIGQUIT SIGQUIT
#define RCTL_ACTION_SIGILL SIGILL
#define RCTL_ACTION_SIGTRAP SIGTRAP
#define RCTL_ACTION_SIGABRT SIGABRT
#define RCTL_ACTION_SIGEMT SIGEMT
#define RCTL_ACTION_SIGFPE SIGFPE
#define RCTL_ACTION_SIGKILL SIGKILL
#define RCTL_ACTION_SIGBUS SIGBUS
#define RCTL_ACTION_SIGSEGV SIGSEGV
#define RCTL_ACTION_SIGSYS SIGSYS
#define RCTL_ACTION_SIGPIPE SIGPIPE
#define RCTL_ACTION_SIGALRM SIGALRM
#define RCTL_ACTION_SIGTERM SIGTERM
#define RCTL_ACTION_SIGURG SIGURG
#define RCTL_ACTION_SIGSTOP SIGSTOP
#define RCTL_ACTION_SIGTSTP SIGTSTP
#define RCTL_ACTION_SIGCHLD SIGCHLD
#define RCTL_ACTION_SIGTTIN SIGTTIN
#define RCTL_ACTION_SIGTTOU SIGTTOU
#define RCTL_ACTION_SIGIO SIGIO
#define RCTL_ACTION_SIGXCPU SIGXCPU
#define RCTL_ACTION_SIGXFSZ SIGXFSZ
#define RCTL_ACTION_SIGVTALRM SIGVTALRM
#define RCTL_ACTION_SIGPROF SIGPROF
#define RCTL_ACTION_SIGWINCH SIGWINCH
#define RCTL_ACTION_SIGINFO SIGINFO
#define RCTL_ACTION_SIGUSR1 SIGUSR1
#define RCTL_ACTION_SIGUSR2 SIGUSR2
#define RCTL_ACTION_SIGTHR SIGTHR
#define RCTL_ACTION_SIGNAL_MAX RCTL_ACTION_SIGTHR
#define RCTL_ACTION_DENY (RCTL_ACTION_SIGNAL_MAX + 1)
#define RCTL_ACTION_LOG (RCTL_ACTION_SIGNAL_MAX + 2)
#define RCTL_ACTION_DEVCTL (RCTL_ACTION_SIGNAL_MAX + 3)
#define RCTL_ACTION_THROTTLE (RCTL_ACTION_SIGNAL_MAX + 4)
#define RCTL_ACTION_MAX RCTL_ACTION_THROTTLE
#define RCTL_AMOUNT_UNDEFINED -1
struct rctl_rule *rctl_rule_alloc(int flags);
struct rctl_rule *rctl_rule_duplicate(const struct rctl_rule *rule, int flags);
void rctl_rule_acquire(struct rctl_rule *rule);
void rctl_rule_release(struct rctl_rule *rule);
int rctl_rule_add(struct rctl_rule *rule);
int rctl_rule_remove(struct rctl_rule *filter);
int rctl_enforce(struct proc *p, int resource, uint64_t amount);
void rctl_throttle_decay(struct racct *racct, int resource);
int64_t rctl_pcpu_available(const struct proc *p);
uint64_t rctl_get_limit(struct proc *p, int resource);
uint64_t rctl_get_available(struct proc *p, int resource);
const char *rctl_resource_name(int resource);
void rctl_proc_ucred_changed(struct proc *p, struct ucred *newcred);
int rctl_proc_fork(struct proc *parent, struct proc *child);
void rctl_racct_release(struct racct *racct);
#else /* !_KERNEL */
/*
* Syscall interface.
*/
__BEGIN_DECLS
int rctl_get_racct(const char *inbufp, size_t inbuflen, char *outbufp,
size_t outbuflen);
int rctl_get_rules(const char *inbufp, size_t inbuflen, char *outbufp,
size_t outbuflen);
int rctl_get_limits(const char *inbufp, size_t inbuflen, char *outbufp,
size_t outbuflen);
int rctl_add_rule(const char *inbufp, size_t inbuflen, char *outbufp,
size_t outbuflen);
int rctl_remove_rule(const char *inbufp, size_t inbuflen, char *outbufp,
size_t outbuflen);
__END_DECLS
#endif /* !_KERNEL */
#endif /* !_RCTL_H_ */