1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21 /*
22 * Copyright 2014 Garrrett D'Amore <garrett@damore.org>
23 *
24 * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
25 * Use is subject to license terms.
26 * Copyright 2014 Joyent, Inc. All rights reserved.
27 */
28
29 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
30 /* All Rights Reserved */
31
32 /*
33 * University Copyright- Copyright (c) 1982, 1986, 1988
34 * The Regents of the University of California
35 * All Rights Reserved
36 *
37 * University Acknowledgment- Portions of this document are derived from
38 * software developed by the University of California, Berkeley, and its
39 * contributors.
40 */
41
42 #ifndef _SYS_RESOURCE_H
43 #define _SYS_RESOURCE_H
44
45 #include <sys/feature_tests.h>
46
47 #include <sys/types.h>
48 #include <sys/time.h>
49
50 #ifdef __cplusplus
51 extern "C" {
52 #endif
53
54 /*
55 * Process priority specifications
56 */
57 #define PRIO_PROCESS 0
58 #define PRIO_PGRP 1
59 #define PRIO_USER 2
60 #define PRIO_GROUP 3
61 #define PRIO_SESSION 4
62 #define PRIO_LWP 5
63 #define PRIO_TASK 6
64 #define PRIO_PROJECT 7
65 #define PRIO_ZONE 8
66 #define PRIO_CONTRACT 9
67
68 /*
69 * Resource limits
70 */
71 #define RLIMIT_CPU 0 /* cpu time in seconds */
72 #define RLIMIT_FSIZE 1 /* maximum file size */
73 #define RLIMIT_DATA 2 /* data size */
74 #define RLIMIT_STACK 3 /* stack size */
75 #define RLIMIT_CORE 4 /* core file size */
76 #define RLIMIT_NOFILE 5 /* file descriptors */
77 #define RLIMIT_VMEM 6 /* maximum mapped memory */
78 #define RLIMIT_AS RLIMIT_VMEM
79
80 #define RLIM_NLIMITS 7 /* number of resource limits */
81
82 #if defined(_LP64)
83
84 typedef unsigned long rlim_t;
85
86 #define RLIM_INFINITY ((rlim_t)-3)
87 #define RLIM_SAVED_MAX ((rlim_t)-2)
88 #define RLIM_SAVED_CUR ((rlim_t)-1)
89
90 #else /* _LP64 */
91
92 /*
93 * The definitions of the following types and constants differ between the
94 * regular and large file compilation environments.
95 */
96 #if _FILE_OFFSET_BITS == 32
97
98 typedef unsigned long rlim_t;
99
100 #define RLIM_INFINITY 0x7fffffff
101 #define RLIM_SAVED_MAX 0x7ffffffe
102 #define RLIM_SAVED_CUR 0x7ffffffd
103
104 #else /* _FILE_OFFSET_BITS == 32 */
105
106 typedef u_longlong_t rlim_t;
107
108 #define RLIM_INFINITY ((rlim_t)-3)
109 #define RLIM_SAVED_MAX ((rlim_t)-2)
110 #define RLIM_SAVED_CUR ((rlim_t)-1)
111
112 #endif /* _FILE_OFFSET_BITS == 32 */
113
114 #endif /* _LP64 */
115
116 #if defined(_SYSCALL32)
117
118 /* Kernel's view of user ILP32 rlimits */
119
120 typedef uint32_t rlim32_t;
121
122 #define RLIM32_INFINITY 0x7fffffff
123 #define RLIM32_SAVED_MAX 0x7ffffffe
124 #define RLIM32_SAVED_CUR 0x7ffffffd
125
126 struct rlimit32 {
127 rlim32_t rlim_cur; /* current limit */
128 rlim32_t rlim_max; /* maximum value for rlim_cur */
129 };
130
131 #endif /* _SYSCALL32 */
132
133 struct rlimit {
134 rlim_t rlim_cur; /* current limit */
135 rlim_t rlim_max; /* maximum value for rlim_cur */
136 };
137
138 /* transitional large file interface versions */
139 #ifdef _LARGEFILE64_SOURCE
140
141 typedef u_longlong_t rlim64_t;
142
143 #define RLIM64_INFINITY ((rlim64_t)-3)
144 #define RLIM64_SAVED_MAX ((rlim64_t)-2)
145 #define RLIM64_SAVED_CUR ((rlim64_t)-1)
146
147 struct rlimit64 {
148 rlim64_t rlim_cur; /* current limit */
149 rlim64_t rlim_max; /* maximum value for rlim_cur */
150 };
151
152 #endif
153
154 /*
155 * Although the saved rlimits were initially introduced by the large file API,
156 * they are now available for all resource limits on the 64-bit kernel and for
157 * cpu time and file size limits on the 32-bit kernel.
158 */
159 #if defined(_LP64)
160
161 #define RLIM_SAVED(x) (1) /* save all resource limits */
162 #define RLIM_NSAVED RLIM_NLIMITS /* size of u_saved_rlimits[] */
163
164 #else /* _LP64 */
165
166 #define RLIM_SAVED(x) (x <= RLIMIT_FSIZE) /* cpu time and file size */
167 #define RLIM_NSAVED (RLIMIT_FSIZE + 1) /* size of u_saved_rlimits[] */
168
169 #endif /* _LP64 */
170
171
172 struct rusage {
173 struct timeval ru_utime; /* user time used */
174 struct timeval ru_stime; /* system time used */
175 long ru_maxrss; /* <unimp> */
176 long ru_ixrss; /* <unimp> */
177 long ru_idrss; /* <unimp> */
178 long ru_isrss; /* <unimp> */
179 long ru_minflt; /* any page faults not requiring I/O */
180 long ru_majflt; /* any page faults requiring I/O */
181 long ru_nswap; /* swaps */
182 long ru_inblock; /* block input operations */
183 long ru_oublock; /* block output operations */
184 long ru_msgsnd; /* streams messsages sent */
185 long ru_msgrcv; /* streams messages received */
186 long ru_nsignals; /* signals received */
187 long ru_nvcsw; /* voluntary context switches */
188 long ru_nivcsw; /* involuntary " */
189 };
190
191 #define _RUSAGESYS_GETRUSAGE 0 /* rusage process */
192 #define _RUSAGESYS_GETRUSAGE_CHLD 1 /* rusage child process */
193 #define _RUSAGESYS_GETRUSAGE_LWP 2 /* rusage lwp */
194 #define _RUSAGESYS_GETVMUSAGE 3 /* getvmusage */
195 #define _RUSAGESYS_INVALMAP 4 /* vm_map_inval */
196
197 #if defined(_SYSCALL32)
198
199 struct rusage32 {
200 struct timeval32 ru_utime; /* user time used */
201 struct timeval32 ru_stime; /* system time used */
202 int ru_maxrss; /* <unimp> */
203 int ru_ixrss; /* <unimp> */
204 int ru_idrss; /* <unimp> */
205 int ru_isrss; /* <unimp> */
206 int ru_minflt; /* any page faults not requiring I/O */
207 int ru_majflt; /* any page faults requiring I/O */
208 int ru_nswap; /* swaps */
209 int ru_inblock; /* block input operations */
210 int ru_oublock; /* block output operations */
211 int ru_msgsnd; /* streams messages sent */
212 int ru_msgrcv; /* streams messages received */
213 int ru_nsignals; /* signals received */
214 int ru_nvcsw; /* voluntary context switches */
215 int ru_nivcsw; /* involuntary " */
216 };
217
218 #endif /* _SYSCALL32 */
219
220
221 #ifdef _KERNEL
222
223 #include <sys/model.h>
224
225 struct proc;
226
227 #else
228
229 #define RUSAGE_SELF 0
230 #define RUSAGE_LWP 1
231 #define RUSAGE_CHILDREN -1
232
233
234 #if !defined(_LP64) && _FILE_OFFSET_BITS == 64
235 /*
236 * large file compilation environment setup
237 */
238 #ifdef __PRAGMA_REDEFINE_EXTNAME
239 #pragma redefine_extname setrlimit setrlimit64
240 #pragma redefine_extname getrlimit getrlimit64
241 #else
242 #define setrlimit setrlimit64
243 #define getrlimit getrlimit64
244 #define rlimit rlimit64
245 #endif
246 #endif /* !_LP64 && _FILE_OFFSET_BITS == 64 */
247
248 #if defined(_LP64) && defined(_LARGEFILE64_SOURCE)
249 /*
250 * In the LP64 compilation environment, map large file interfaces
251 * back to native versions where possible.
252 */
253 #ifdef __PRAGMA_REDEFINE_EXTNAME
254 #pragma redefine_extname setrlimit64 setrlimit
255 #pragma redefine_extname getrlimit64 getrlimit
256 #else
257 #define setrlimit64 setrlimit
258 #define getrlimit64 getrlimit
259 #define rlimit64 rlimit
260 #endif
261 #endif /* _LP64 && _LARGEFILE64_SOURCE */
262
263 extern int setrlimit(int, const struct rlimit *);
264 extern int getrlimit(int, struct rlimit *);
265
266 /* transitional large file interfaces */
267 #if defined(_LARGEFILE64_SOURCE) && !((_FILE_OFFSET_BITS == 64) && \
268 !defined(__PRAGMA_REDEFINE_EXTNAME))
269 extern int setrlimit64(int, const struct rlimit64 *);
270 extern int getrlimit64(int, struct rlimit64 *);
271 #endif /* _LARGEFILE64_SOURCE... */
272
273 extern int getpriority(int, id_t);
274 extern int setpriority(int, id_t, int);
275 extern int getrusage(int, struct rusage *);
276
277 #endif /* _KERNEL */
278
279 #ifdef __cplusplus
280 }
281 #endif
282
283 #endif /* _SYS_RESOURCE_H */