Print this page
OS-399 zone phys. mem. cap should be a rctl and have associated kstat
| Split |
Close |
| Expand all |
| Collapse all |
--- old/usr/src/uts/common/syscall/sysconfig.c
+++ new/usr/src/uts/common/syscall/sysconfig.c
1 1 /*
2 2 * CDDL HEADER START
3 3 *
4 4 * The contents of this file are subject to the terms of the
5 5 * Common Development and Distribution License (the "License").
6 6 * You may not use this file except in compliance with the License.
7 7 *
8 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 9 * or http://www.opensolaris.org/os/licensing.
10 10 * See the License for the specific language governing permissions
11 11 * and limitations under the License.
12 12 *
13 13 * When distributing Covered Code, include this CDDL HEADER in each
14 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
|
↓ open down ↓ |
14 lines elided |
↑ open up ↑ |
15 15 * If applicable, add the following below this CDDL HEADER, with the
16 16 * fields enclosed by brackets "[]" replaced with your own identifying
17 17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 18 *
19 19 * CDDL HEADER END
20 20 */
21 21
22 22 /*
23 23 * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
24 24 * Use is subject to license terms.
25 + * Copyright 2011 Joyent, Inc. All rights reserved.
25 26 */
26 27
27 28 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
28 29 /* All Rights Reserved */
29 30
30 31 #include <sys/param.h>
31 32 #include <sys/types.h>
32 33 #include <sys/sysmacros.h>
33 34 #include <sys/systm.h>
34 35 #include <sys/tuneable.h>
35 36 #include <sys/errno.h>
36 37 #include <sys/var.h>
37 38 #include <sys/signal.h>
38 39 #include <sys/time.h>
39 40 #include <sys/sysconfig.h>
40 41 #include <sys/resource.h>
41 42 #include <sys/ulimit.h>
42 43 #include <sys/unistd.h>
43 44 #include <sys/debug.h>
44 45 #include <sys/cpuvar.h>
45 46 #include <sys/mman.h>
46 47 #include <sys/timer.h>
47 48 #include <sys/zone.h>
48 49 #include <sys/vm_usage.h>
49 50
50 51 extern rctl_hndl_t rc_process_sigqueue;
51 52
52 53 long
53 54 sysconfig(int which)
54 55 {
55 56 switch (which) {
56 57
57 58 /*
58 59 * if it is not handled in mach_sysconfig either
59 60 * it must be EINVAL.
60 61 */
61 62 default:
62 63 return (mach_sysconfig(which)); /* `uname -i`/os */
63 64
64 65 case _CONFIG_CLK_TCK:
65 66 return ((long)hz); /* clock frequency per second */
66 67
67 68 case _CONFIG_PROF_TCK:
68 69 return ((long)hz); /* profiling clock freq per sec */
69 70
70 71 case _CONFIG_NGROUPS:
71 72 /*
72 73 * Maximum number of supplementary groups.
73 74 */
74 75 return (ngroups_max);
75 76
76 77 case _CONFIG_OPEN_FILES:
77 78 /*
78 79 * Maximum number of open files (soft limit).
79 80 */
80 81 {
81 82 rlim64_t fd_ctl;
82 83 mutex_enter(&curproc->p_lock);
83 84 fd_ctl = rctl_enforced_value(
84 85 rctlproc_legacy[RLIMIT_NOFILE], curproc->p_rctls,
85 86 curproc);
86 87 mutex_exit(&curproc->p_lock);
87 88 return ((ulong_t)fd_ctl);
88 89 }
89 90
90 91 case _CONFIG_CHILD_MAX:
91 92 /*
92 93 * Maximum number of processes.
93 94 */
94 95 return (v.v_maxup);
95 96
96 97 case _CONFIG_POSIX_VER:
97 98 return (_POSIX_VERSION); /* current POSIX version */
98 99
99 100 case _CONFIG_PAGESIZE:
100 101 return (PAGESIZE);
101 102
102 103 case _CONFIG_XOPEN_VER:
103 104 return (_XOPEN_VERSION); /* current XOPEN version */
104 105
105 106 case _CONFIG_NPROC_CONF:
106 107 return (zone_ncpus_get(curproc->p_zone));
107 108
108 109 case _CONFIG_NPROC_ONLN:
109 110 return (zone_ncpus_online_get(curproc->p_zone));
110 111
111 112 case _CONFIG_NPROC_MAX:
112 113 return (max_ncpus);
113 114
114 115 case _CONFIG_STACK_PROT:
115 116 return (curproc->p_stkprot & ~PROT_USER);
116 117
117 118 case _CONFIG_AIO_LISTIO_MAX:
118 119 return (_AIO_LISTIO_MAX);
119 120
120 121 case _CONFIG_AIO_MAX:
121 122 return (_AIO_MAX);
122 123
123 124 case _CONFIG_AIO_PRIO_DELTA_MAX:
124 125 return (0);
125 126
126 127 case _CONFIG_DELAYTIMER_MAX:
127 128 return (INT_MAX);
128 129
129 130 case _CONFIG_MQ_OPEN_MAX:
130 131 return (_MQ_OPEN_MAX);
131 132
132 133 case _CONFIG_MQ_PRIO_MAX:
133 134 return (_MQ_PRIO_MAX);
134 135
135 136 case _CONFIG_RTSIG_MAX:
136 137 return (_SIGRTMAX - _SIGRTMIN + 1);
137 138
138 139 case _CONFIG_SEM_NSEMS_MAX:
139 140 return (_SEM_NSEMS_MAX);
140 141
141 142 case _CONFIG_SEM_VALUE_MAX:
142 143 return (_SEM_VALUE_MAX);
143 144
144 145 case _CONFIG_SIGQUEUE_MAX:
145 146 /*
146 147 * Maximum number of outstanding queued signals.
147 148 */
148 149 {
149 150 rlim64_t sigqsz_max;
150 151 mutex_enter(&curproc->p_lock);
151 152 sigqsz_max = rctl_enforced_value(rc_process_sigqueue,
152 153 curproc->p_rctls, curproc);
153 154 mutex_exit(&curproc->p_lock);
154 155 return ((uint_t)sigqsz_max);
155 156 }
156 157
157 158 case _CONFIG_SIGRT_MIN:
158 159 return (_SIGRTMIN);
159 160
160 161 case _CONFIG_SIGRT_MAX:
161 162 return (_SIGRTMAX);
162 163
|
↓ open down ↓ |
128 lines elided |
↑ open up ↑ |
163 164 case _CONFIG_TIMER_MAX:
164 165 return (timer_max);
165 166
166 167 case _CONFIG_PHYS_PAGES:
167 168 /*
168 169 * If the non-global zone has a phys. memory cap, use that.
169 170 * We always report the system-wide value for the global zone,
170 171 * even though rcapd can be used on the global zone too.
171 172 */
172 173 if (!INGLOBALZONE(curproc) &&
173 - curproc->p_zone->zone_phys_mcap != 0)
174 - return (MIN(btop(curproc->p_zone->zone_phys_mcap),
174 + curproc->p_zone->zone_phys_mem_ctl != UINT64_MAX)
175 + return (MIN(btop(curproc->p_zone->zone_phys_mem_ctl),
175 176 physinstalled));
176 177
177 178 return (physinstalled);
178 179
179 180 case _CONFIG_AVPHYS_PAGES:
180 181 /*
181 182 * If the non-global zone has a phys. memory cap, use
182 183 * the phys. memory cap - zone's current rss. We always
183 184 * report the system-wide value for the global zone, even
184 185 * though rcapd can be used on the global zone too.
185 186 */
186 187 if (!INGLOBALZONE(curproc) &&
187 - curproc->p_zone->zone_phys_mcap != 0) {
188 + curproc->p_zone->zone_phys_mem_ctl != UINT64_MAX) {
188 189 pgcnt_t cap, rss, free;
189 190 vmusage_t in_use;
190 191 size_t cnt = 1;
191 192
192 - cap = btop(curproc->p_zone->zone_phys_mcap);
193 + cap = btop(curproc->p_zone->zone_phys_mem_ctl);
193 194 if (cap > physinstalled)
194 195 return (freemem);
195 196
196 197 if (vm_getusage(VMUSAGE_ZONE, 1, &in_use, &cnt,
197 198 FKIOCTL) != 0)
198 199 in_use.vmu_rss_all = 0;
199 200 rss = btop(in_use.vmu_rss_all);
200 201 /*
201 202 * Because rcapd implements a soft cap, it is possible
202 203 * for rss to be temporarily over the cap.
203 204 */
204 205 if (cap > rss)
205 206 free = cap - rss;
206 207 else
207 208 free = 0;
208 209 return (MIN(free, freemem));
209 210 }
210 211
211 212 return (freemem);
212 213
213 214 case _CONFIG_MAXPID:
214 215 return (maxpid);
215 216
216 217 case _CONFIG_CPUID_MAX:
217 218 return (max_cpuid);
218 219
219 220 case _CONFIG_EPHID_MAX:
220 221 return (MAXEPHUID);
221 222
222 223 case _CONFIG_SYMLOOP_MAX:
223 224 return (MAXSYMLINKS);
224 225 }
225 226 }
|
↓ open down ↓ |
23 lines elided |
↑ open up ↑ |
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX