master
1/*-
2 * SPDX-License-Identifier: BSD-3-Clause
3 *
4 * Copyright (c) 1991, 1993
5 * The Regents of the University of California. All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of the University nor the names of its contributors
16 * may be used to endorse or promote products derived from this software
17 * without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * SUCH DAMAGE.
30 *
31 * @(#)resourcevar.h 8.4 (Berkeley) 1/9/95
32 */
33
34#ifndef _SYS_RESOURCEVAR_H_
35#define _SYS_RESOURCEVAR_H_
36
37#include <sys/resource.h>
38#include <sys/queue.h>
39#ifdef _KERNEL
40#include <sys/_lock.h>
41#include <sys/_mutex.h>
42#endif
43
44/*
45 * Kernel per-process accounting / statistics
46 * (not necessarily resident except when running).
47 *
48 * Locking key:
49 * b - created at fork, never changes
50 * c - locked by proc mtx
51 * k - only accessed by curthread
52 * w - locked by proc itim lock
53 * w2 - locked by proc prof lock
54 */
55struct pstats {
56#define pstat_startzero p_cru
57 struct rusage p_cru; /* Stats for reaped children. */
58 struct itimerval p_timer[3]; /* (w) Virtual-time timers. */
59#define pstat_endzero pstat_startcopy
60
61#define pstat_startcopy p_prof
62 struct uprof { /* Profile arguments. */
63 caddr_t pr_base; /* (c + w2) Buffer base. */
64 u_long pr_size; /* (c + w2) Buffer size. */
65 u_long pr_off; /* (c + w2) PC offset. */
66 u_long pr_scale; /* (c + w2) PC scaling. */
67 } p_prof;
68#define pstat_endcopy p_start
69 struct timeval p_start; /* (b) Starting time. */
70};
71
72#ifdef _KERNEL
73
74/*
75 * Kernel shareable process resource limits. Because this structure
76 * is moderately large but changes infrequently, it is normally
77 * shared copy-on-write after forks.
78 */
79struct plimit {
80 struct rlimit pl_rlimit[RLIM_NLIMITS];
81 int pl_refcnt; /* number of references */
82};
83
84struct limbatch {
85 struct plimit *limp;
86 int count;
87};
88
89static inline void
90limbatch_prep(struct limbatch *lb)
91{
92 lb->limp = NULL;
93 lb->count = 0;
94}
95
96void limbatch_add(struct limbatch *lb, struct thread *td);
97
98static inline void
99limbatch_process(struct limbatch *lb __unused)
100{
101
102}
103
104void limbatch_final(struct limbatch *lb);
105
106struct racct;
107
108/*-
109 * Per uid resource consumption. This structure is used to track
110 * the total resource consumption (process count, socket buffer size,
111 * etc) for the uid and impose limits.
112 *
113 * Locking guide:
114 * (a) Constant from inception
115 * (b) Lockless, updated using atomics
116 * (c) Locked by global uihashtbl_lock
117 */
118struct uidinfo {
119 LIST_ENTRY(uidinfo) ui_hash; /* (c) hash chain of uidinfos */
120 u_long ui_vmsize; /* (b) pages of swap reservation by uid */
121 long ui_sbsize; /* (b) socket buffer space consumed */
122 long ui_proccnt; /* (b) number of processes */
123 long ui_ptscnt; /* (b) number of pseudo-terminals */
124 long ui_kqcnt; /* (b) number of kqueues */
125 long ui_umtxcnt; /* (b) number of shared umtxs */
126 long ui_pipecnt; /* (b) consumption of pipe buffers */
127 uid_t ui_uid; /* (a) uid */
128 u_int ui_ref; /* (b) reference count */
129#ifdef RACCT
130 struct racct *ui_racct; /* (a) resource accounting */
131#endif
132};
133
134struct proc;
135struct rusage_ext;
136struct thread;
137
138void addupc_intr(struct thread *td, uintfptr_t pc, u_int ticks);
139void addupc_task(struct thread *td, uintfptr_t pc, u_int ticks);
140void calccru(struct proc *p, struct timeval *up, struct timeval *sp);
141void calcru(struct proc *p, struct timeval *up, struct timeval *sp);
142int chgkqcnt(struct uidinfo *uip, int diff, rlim_t max);
143int chgproccnt(struct uidinfo *uip, int diff, rlim_t maxval);
144int chgsbsize(struct uidinfo *uip, u_int *hiwat, u_int to,
145 rlim_t maxval);
146int chgptscnt(struct uidinfo *uip, int diff, rlim_t maxval);
147int chgumtxcnt(struct uidinfo *uip, int diff, rlim_t maxval);
148int chgpipecnt(struct uidinfo *uip, int diff, rlim_t max);
149int kern_proc_setrlimit(struct thread *td, struct proc *p, u_int which,
150 struct rlimit *limp);
151struct plimit
152 *lim_alloc(void);
153void lim_copy(struct plimit *dst, struct plimit *src);
154rlim_t lim_cur(struct thread *td, int which);
155#define lim_cur(td, which) ({ \
156 rlim_t _rlim; \
157 struct thread *_td = (td); \
158 int _which = (which); \
159 if (__builtin_constant_p(which) && which != RLIMIT_DATA && \
160 which != RLIMIT_STACK && which != RLIMIT_VMEM) { \
161 _rlim = _td->td_limit->pl_rlimit[_which].rlim_cur; \
162 } else { \
163 _rlim = lim_cur(_td, _which); \
164 } \
165 _rlim; \
166})
167
168rlim_t lim_cur_proc(struct proc *p, int which);
169void lim_fork(struct proc *p1, struct proc *p2);
170void lim_free(struct plimit *limp);
171void lim_freen(struct plimit *limp, int n);
172struct plimit
173 *lim_hold(struct plimit *limp);
174struct plimit
175 *lim_cowsync(void);
176rlim_t lim_max(struct thread *td, int which);
177rlim_t lim_max_proc(struct proc *p, int which);
178void lim_rlimit(struct thread *td, int which, struct rlimit *rlp);
179void lim_rlimit_proc(struct proc *p, int which, struct rlimit *rlp);
180void ruadd(struct rusage *ru, struct rusage_ext *rux, struct rusage *ru2,
181 struct rusage_ext *rux2);
182void rucollect(struct rusage *ru, struct rusage *ru2);
183void rufetch(struct proc *p, struct rusage *ru);
184void rufetchcalc(struct proc *p, struct rusage *ru, struct timeval *up,
185 struct timeval *sp);
186void rufetchtd(struct thread *td, struct rusage *ru);
187void ruxagg(struct proc *p, struct thread *td);
188void ruxagg_locked(struct proc *p, struct thread *td);
189struct uidinfo
190 *uifind(uid_t uid);
191void uifree(struct uidinfo *uip);
192void uihashinit(void);
193void uihold(struct uidinfo *uip);
194#ifdef RACCT
195void ui_racct_foreach(void (*callback)(struct racct *racct,
196 void *arg2, void *arg3), void (*pre)(void), void (*post)(void),
197 void *arg2, void *arg3);
198#endif
199
200#endif /* _KERNEL */
201#endif /* !_SYS_RESOURCEVAR_H_ */