1*efd4c9b6SSteve Lawrence /*
2*efd4c9b6SSteve Lawrence  * CDDL HEADER START
3*efd4c9b6SSteve Lawrence  *
4*efd4c9b6SSteve Lawrence  * The contents of this file are subject to the terms of the
5*efd4c9b6SSteve Lawrence  * Common Development and Distribution License (the "License").
6*efd4c9b6SSteve Lawrence  * You may not use this file except in compliance with the License.
7*efd4c9b6SSteve Lawrence  *
8*efd4c9b6SSteve Lawrence  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*efd4c9b6SSteve Lawrence  * or http://www.opensolaris.org/os/licensing.
10*efd4c9b6SSteve Lawrence  * See the License for the specific language governing permissions
11*efd4c9b6SSteve Lawrence  * and limitations under the License.
12*efd4c9b6SSteve Lawrence  *
13*efd4c9b6SSteve Lawrence  * When distributing Covered Code, include this CDDL HEADER in each
14*efd4c9b6SSteve Lawrence  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*efd4c9b6SSteve Lawrence  * If applicable, add the following below this CDDL HEADER, with the
16*efd4c9b6SSteve Lawrence  * fields enclosed by brackets "[]" replaced with your own identifying
17*efd4c9b6SSteve Lawrence  * information: Portions Copyright [yyyy] [name of copyright owner]
18*efd4c9b6SSteve Lawrence  *
19*efd4c9b6SSteve Lawrence  * CDDL HEADER END
20*efd4c9b6SSteve Lawrence  */
21*efd4c9b6SSteve Lawrence 
22*efd4c9b6SSteve Lawrence /*
23*efd4c9b6SSteve Lawrence  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
24*efd4c9b6SSteve Lawrence  */
25*efd4c9b6SSteve Lawrence 
26*efd4c9b6SSteve Lawrence #include <alloca.h>
27*efd4c9b6SSteve Lawrence #include <assert.h>
28*efd4c9b6SSteve Lawrence #include <door.h>
29*efd4c9b6SSteve Lawrence #include <errno.h>
30*efd4c9b6SSteve Lawrence #include <fcntl.h>
31*efd4c9b6SSteve Lawrence #include <stddef.h>
32*efd4c9b6SSteve Lawrence #include <stdlib.h>
33*efd4c9b6SSteve Lawrence #include <stdio.h>
34*efd4c9b6SSteve Lawrence #include <strings.h>
35*efd4c9b6SSteve Lawrence #include <sys/mman.h>
36*efd4c9b6SSteve Lawrence #include <sys/socket.h>
37*efd4c9b6SSteve Lawrence #include <sys/stat.h>
38*efd4c9b6SSteve Lawrence #include <sys/types.h>
39*efd4c9b6SSteve Lawrence #include <unistd.h>
40*efd4c9b6SSteve Lawrence #include <zonestat.h>
41*efd4c9b6SSteve Lawrence #include <zonestat_impl.h>
42*efd4c9b6SSteve Lawrence 
43*efd4c9b6SSteve Lawrence #define	ZSD_PCT_INT	10000
44*efd4c9b6SSteve Lawrence #define	ZSD_PCT_DOUBLE	10000.0
45*efd4c9b6SSteve Lawrence 
46*efd4c9b6SSteve Lawrence #define	ZSD_ONE_CPU	100
47*efd4c9b6SSteve Lawrence 
48*efd4c9b6SSteve Lawrence #ifndef	MIN
49*efd4c9b6SSteve Lawrence #define	MIN(a, b) (((a) < (b)) ? (a) : (b))
50*efd4c9b6SSteve Lawrence #endif
51*efd4c9b6SSteve Lawrence #ifndef	MAX
52*efd4c9b6SSteve Lawrence #define	MAX(a, b) (((a) > (b)) ? (a) : (b))
53*efd4c9b6SSteve Lawrence #endif
54*efd4c9b6SSteve Lawrence 
55*efd4c9b6SSteve Lawrence #define	ZS_MAXTS(a, b) ((b).tv_sec > (a).tv_sec || \
56*efd4c9b6SSteve Lawrence 	((b).tv_sec == (a).tv_sec && (b).tv_nsec > (a).tv_nsec) ? (b) : (a))
57*efd4c9b6SSteve Lawrence 
58*efd4c9b6SSteve Lawrence 
59*efd4c9b6SSteve Lawrence /* Compute max, treating ZS_LIMIT_NONE as zero */
60*efd4c9b6SSteve Lawrence #define	ZS_MAXOF(a, b) { \
61*efd4c9b6SSteve Lawrence 	if ((b) != ZS_LIMIT_NONE) { \
62*efd4c9b6SSteve Lawrence 		if ((a) == ZS_LIMIT_NONE) \
63*efd4c9b6SSteve Lawrence 			(a) = (b); \
64*efd4c9b6SSteve Lawrence 		else if ((b) > (a)) \
65*efd4c9b6SSteve Lawrence 		(b) = (a); \
66*efd4c9b6SSteve Lawrence 	} \
67*efd4c9b6SSteve Lawrence 	}
68*efd4c9b6SSteve Lawrence 
69*efd4c9b6SSteve Lawrence /* Add two caps together, treating ZS_LIMIT_NONE as zero */
70*efd4c9b6SSteve Lawrence #define	ZS_ADD_CAP(a, b) { \
71*efd4c9b6SSteve Lawrence 	if ((b) != ZS_LIMIT_NONE) { \
72*efd4c9b6SSteve Lawrence 		if ((a) == ZS_LIMIT_NONE) \
73*efd4c9b6SSteve Lawrence 			(a) = (b); \
74*efd4c9b6SSteve Lawrence 		else \
75*efd4c9b6SSteve Lawrence 		(a) += (b); \
76*efd4c9b6SSteve Lawrence 	} \
77*efd4c9b6SSteve Lawrence 	}
78*efd4c9b6SSteve Lawrence 
79*efd4c9b6SSteve Lawrence #define	ZS_MAXOFTS(a, b) { \
80*efd4c9b6SSteve Lawrence     if ((b).tv_sec > (a).tv_sec) (a) = (b); \
81*efd4c9b6SSteve Lawrence     else if ((b).tv_nsec > (a).tv_nsec) (a) = (b); }
82*efd4c9b6SSteve Lawrence 
83*efd4c9b6SSteve Lawrence /*
84*efd4c9b6SSteve Lawrence  * Functions for reading and manipulating resource usage.
85*efd4c9b6SSteve Lawrence  */
86*efd4c9b6SSteve Lawrence static int
zs_connect_zonestatd()87*efd4c9b6SSteve Lawrence zs_connect_zonestatd()
88*efd4c9b6SSteve Lawrence {
89*efd4c9b6SSteve Lawrence 	int fd;
90*efd4c9b6SSteve Lawrence 
91*efd4c9b6SSteve Lawrence 	fd = open(ZS_DOOR_PATH, O_RDONLY);
92*efd4c9b6SSteve Lawrence 	return (fd);
93*efd4c9b6SSteve Lawrence }
94*efd4c9b6SSteve Lawrence 
95*efd4c9b6SSteve Lawrence static zs_zone_t *
zs_lookup_zone_byid(zs_usage_t * u,zoneid_t zid)96*efd4c9b6SSteve Lawrence zs_lookup_zone_byid(zs_usage_t *u, zoneid_t zid)
97*efd4c9b6SSteve Lawrence {
98*efd4c9b6SSteve Lawrence 	zs_zone_t *zone;
99*efd4c9b6SSteve Lawrence 
100*efd4c9b6SSteve Lawrence 	for (zone = list_head(&u->zsu_zone_list); zone != NULL;
101*efd4c9b6SSteve Lawrence 	    zone = list_next(&u->zsu_zone_list, zone)) {
102*efd4c9b6SSteve Lawrence 		if (zone->zsz_id == zid)
103*efd4c9b6SSteve Lawrence 			return (zone);
104*efd4c9b6SSteve Lawrence 	}
105*efd4c9b6SSteve Lawrence 	return (NULL);
106*efd4c9b6SSteve Lawrence }
107*efd4c9b6SSteve Lawrence 
108*efd4c9b6SSteve Lawrence static zs_zone_t *
zs_lookup_zone_byname(zs_usage_t * u,char * name)109*efd4c9b6SSteve Lawrence zs_lookup_zone_byname(zs_usage_t *u, char *name)
110*efd4c9b6SSteve Lawrence {
111*efd4c9b6SSteve Lawrence 	zs_zone_t *zone;
112*efd4c9b6SSteve Lawrence 
113*efd4c9b6SSteve Lawrence 	for (zone = list_head(&u->zsu_zone_list); zone != NULL;
114*efd4c9b6SSteve Lawrence 	    zone = list_next(&u->zsu_zone_list, zone)) {
115*efd4c9b6SSteve Lawrence 		if (strcmp(zone->zsz_name, name) == 0)
116*efd4c9b6SSteve Lawrence 			return (zone);
117*efd4c9b6SSteve Lawrence 	}
118*efd4c9b6SSteve Lawrence 	return (NULL);
119*efd4c9b6SSteve Lawrence }
120*efd4c9b6SSteve Lawrence 
121*efd4c9b6SSteve Lawrence static zs_usage_t *
zs_usage_alloc()122*efd4c9b6SSteve Lawrence zs_usage_alloc()
123*efd4c9b6SSteve Lawrence {
124*efd4c9b6SSteve Lawrence 	zs_usage_t *u;
125*efd4c9b6SSteve Lawrence 	zs_system_t *s;
126*efd4c9b6SSteve Lawrence 
127*efd4c9b6SSteve Lawrence 	u = (zs_usage_t *)calloc(sizeof (zs_usage_t), 1);
128*efd4c9b6SSteve Lawrence 	if (u == NULL)
129*efd4c9b6SSteve Lawrence 		return (NULL);
130*efd4c9b6SSteve Lawrence 
131*efd4c9b6SSteve Lawrence 	s = (zs_system_t *)calloc(sizeof (zs_system_t), 1);
132*efd4c9b6SSteve Lawrence 	if (s == NULL) {
133*efd4c9b6SSteve Lawrence 		free(u);
134*efd4c9b6SSteve Lawrence 		return (NULL);
135*efd4c9b6SSteve Lawrence 	}
136*efd4c9b6SSteve Lawrence 
137*efd4c9b6SSteve Lawrence 	u->zsu_mmap = B_FALSE;
138*efd4c9b6SSteve Lawrence 	u->zsu_system = s;
139*efd4c9b6SSteve Lawrence 	list_create(&u->zsu_zone_list, sizeof (zs_zone_t),
140*efd4c9b6SSteve Lawrence 	    offsetof(zs_zone_t, zsz_next));
141*efd4c9b6SSteve Lawrence 	list_create(&u->zsu_pset_list, sizeof (zs_pset_t),
142*efd4c9b6SSteve Lawrence 	    offsetof(zs_pset_t, zsp_next));
143*efd4c9b6SSteve Lawrence 
144*efd4c9b6SSteve Lawrence 	return (u);
145*efd4c9b6SSteve Lawrence }
146*efd4c9b6SSteve Lawrence 
147*efd4c9b6SSteve Lawrence static void
zs_zone_add_usage(zs_zone_t * old,zs_zone_t * new,int func)148*efd4c9b6SSteve Lawrence zs_zone_add_usage(zs_zone_t *old, zs_zone_t *new, int func)
149*efd4c9b6SSteve Lawrence {
150*efd4c9b6SSteve Lawrence 
151*efd4c9b6SSteve Lawrence 	if (func == ZS_COMPUTE_USAGE_HIGH) {
152*efd4c9b6SSteve Lawrence 
153*efd4c9b6SSteve Lawrence 		/* Compute max of caps */
154*efd4c9b6SSteve Lawrence 		ZS_MAXOF(old->zsz_cpu_cap, new->zsz_cpu_cap);
155*efd4c9b6SSteve Lawrence 		ZS_MAXOF(old->zsz_cpu_shares, new->zsz_cpu_shares);
156*efd4c9b6SSteve Lawrence 		ZS_MAXOF(old->zsz_ram_cap, new->zsz_ram_cap);
157*efd4c9b6SSteve Lawrence 		ZS_MAXOF(old->zsz_locked_cap, new->zsz_locked_cap);
158*efd4c9b6SSteve Lawrence 		ZS_MAXOF(old->zsz_vm_cap, new->zsz_vm_cap);
159*efd4c9b6SSteve Lawrence 		ZS_MAXOF(old->zsz_processes_cap, new->zsz_processes_cap);
160*efd4c9b6SSteve Lawrence 		ZS_MAXOF(old->zsz_lwps_cap, new->zsz_lwps_cap);
161*efd4c9b6SSteve Lawrence 		ZS_MAXOF(old->zsz_shm_cap, new->zsz_shm_cap);
162*efd4c9b6SSteve Lawrence 		ZS_MAXOF(old->zsz_shmids_cap, new->zsz_shmids_cap);
163*efd4c9b6SSteve Lawrence 		ZS_MAXOF(old->zsz_semids_cap, new->zsz_semids_cap);
164*efd4c9b6SSteve Lawrence 		ZS_MAXOF(old->zsz_msgids_cap, new->zsz_msgids_cap);
165*efd4c9b6SSteve Lawrence 		ZS_MAXOF(old->zsz_lofi_cap, new->zsz_lofi_cap);
166*efd4c9b6SSteve Lawrence 
167*efd4c9b6SSteve Lawrence 		/* Compute max memory and limit usages */
168*efd4c9b6SSteve Lawrence 		ZS_MAXOF(old->zsz_usage_ram, new->zsz_usage_ram);
169*efd4c9b6SSteve Lawrence 		ZS_MAXOF(old->zsz_usage_locked, new->zsz_usage_locked);
170*efd4c9b6SSteve Lawrence 		ZS_MAXOF(old->zsz_usage_ram, new->zsz_usage_ram);
171*efd4c9b6SSteve Lawrence 
172*efd4c9b6SSteve Lawrence 		ZS_MAXOF(old->zsz_processes, new->zsz_processes);
173*efd4c9b6SSteve Lawrence 		ZS_MAXOF(old->zsz_lwps, new->zsz_lwps);
174*efd4c9b6SSteve Lawrence 		ZS_MAXOF(old->zsz_shm, new->zsz_shm);
175*efd4c9b6SSteve Lawrence 		ZS_MAXOF(old->zsz_shmids, new->zsz_shmids);
176*efd4c9b6SSteve Lawrence 		ZS_MAXOF(old->zsz_semids, new->zsz_semids);
177*efd4c9b6SSteve Lawrence 		ZS_MAXOF(old->zsz_msgids, new->zsz_msgids);
178*efd4c9b6SSteve Lawrence 		ZS_MAXOF(old->zsz_lofi, new->zsz_lofi);
179*efd4c9b6SSteve Lawrence 
180*efd4c9b6SSteve Lawrence 		ZS_MAXOF(old->zsz_cpus_online, new->zsz_cpus_online);
181*efd4c9b6SSteve Lawrence 
182*efd4c9b6SSteve Lawrence 		ZS_MAXOFTS(old->zsz_cpu_usage, new->zsz_cpu_usage);
183*efd4c9b6SSteve Lawrence 		ZS_MAXOFTS(old->zsz_pset_time, new->zsz_pset_time);
184*efd4c9b6SSteve Lawrence 		ZS_MAXOFTS(old->zsz_cap_time, new->zsz_cap_time);
185*efd4c9b6SSteve Lawrence 		ZS_MAXOFTS(old->zsz_share_time, new->zsz_share_time);
186*efd4c9b6SSteve Lawrence 		return;
187*efd4c9b6SSteve Lawrence 	}
188*efd4c9b6SSteve Lawrence 
189*efd4c9b6SSteve Lawrence 	ZS_ADD_CAP(old->zsz_cpu_cap, new->zsz_cpu_cap);
190*efd4c9b6SSteve Lawrence 	ZS_ADD_CAP(old->zsz_ram_cap, new->zsz_ram_cap);
191*efd4c9b6SSteve Lawrence 	ZS_ADD_CAP(old->zsz_locked_cap, new->zsz_locked_cap);
192*efd4c9b6SSteve Lawrence 	ZS_ADD_CAP(old->zsz_vm_cap, new->zsz_vm_cap);
193*efd4c9b6SSteve Lawrence 	ZS_ADD_CAP(old->zsz_processes_cap, new->zsz_processes_cap);
194*efd4c9b6SSteve Lawrence 	ZS_ADD_CAP(old->zsz_lwps_cap, new->zsz_lwps_cap);
195*efd4c9b6SSteve Lawrence 	ZS_ADD_CAP(old->zsz_shm_cap, new->zsz_shm_cap);
196*efd4c9b6SSteve Lawrence 	ZS_ADD_CAP(old->zsz_shmids_cap, new->zsz_shmids_cap);
197*efd4c9b6SSteve Lawrence 	ZS_ADD_CAP(old->zsz_semids_cap, new->zsz_semids_cap);
198*efd4c9b6SSteve Lawrence 	ZS_ADD_CAP(old->zsz_msgids_cap, new->zsz_msgids_cap);
199*efd4c9b6SSteve Lawrence 	ZS_ADD_CAP(old->zsz_lofi_cap, new->zsz_lofi_cap);
200*efd4c9b6SSteve Lawrence 
201*efd4c9b6SSteve Lawrence 	/* Add in memory and limit usages */
202*efd4c9b6SSteve Lawrence 	old->zsz_usage_ram += new->zsz_usage_ram;
203*efd4c9b6SSteve Lawrence 	old->zsz_usage_locked += new->zsz_usage_locked;
204*efd4c9b6SSteve Lawrence 	old->zsz_usage_vm += new->zsz_usage_vm;
205*efd4c9b6SSteve Lawrence 
206*efd4c9b6SSteve Lawrence 	old->zsz_processes += new->zsz_processes;
207*efd4c9b6SSteve Lawrence 	old->zsz_lwps += new->zsz_lwps;
208*efd4c9b6SSteve Lawrence 	old->zsz_shm += new->zsz_shm;
209*efd4c9b6SSteve Lawrence 	old->zsz_shmids += new->zsz_shmids;
210*efd4c9b6SSteve Lawrence 	old->zsz_semids += new->zsz_semids;
211*efd4c9b6SSteve Lawrence 	old->zsz_msgids += new->zsz_msgids;
212*efd4c9b6SSteve Lawrence 	old->zsz_lofi += new->zsz_lofi;
213*efd4c9b6SSteve Lawrence 
214*efd4c9b6SSteve Lawrence 	old->zsz_cpus_online += new->zsz_cpus_online;
215*efd4c9b6SSteve Lawrence 	old->zsz_cpu_shares += new->zsz_cpu_shares;
216*efd4c9b6SSteve Lawrence 
217*efd4c9b6SSteve Lawrence 	TIMESTRUC_ADD_TIMESTRUC(old->zsz_cpu_usage, new->zsz_cpu_usage);
218*efd4c9b6SSteve Lawrence 	TIMESTRUC_ADD_TIMESTRUC(old->zsz_pset_time, new->zsz_pset_time);
219*efd4c9b6SSteve Lawrence 	TIMESTRUC_ADD_TIMESTRUC(old->zsz_cap_time, new->zsz_cap_time);
220*efd4c9b6SSteve Lawrence 	TIMESTRUC_ADD_TIMESTRUC(old->zsz_share_time, new->zsz_share_time);
221*efd4c9b6SSteve Lawrence }
222*efd4c9b6SSteve Lawrence 
223*efd4c9b6SSteve Lawrence static int
zs_usage_compute_zones(zs_usage_t * ures,zs_usage_t * uold,zs_usage_t * unew,int func)224*efd4c9b6SSteve Lawrence zs_usage_compute_zones(zs_usage_t *ures, zs_usage_t *uold, zs_usage_t *unew,
225*efd4c9b6SSteve Lawrence     int func)
226*efd4c9b6SSteve Lawrence {
227*efd4c9b6SSteve Lawrence 	zs_system_t *sres;
228*efd4c9b6SSteve Lawrence 	zs_zone_t *zold, *znew, *zres;
229*efd4c9b6SSteve Lawrence 
230*efd4c9b6SSteve Lawrence 	sres = ures->zsu_system;
231*efd4c9b6SSteve Lawrence 	/*
232*efd4c9b6SSteve Lawrence 	 * Walk zones, assume lists are always sorted the same.  Include
233*efd4c9b6SSteve Lawrence 	 * all zones that exist in the new usage.
234*efd4c9b6SSteve Lawrence 	 */
235*efd4c9b6SSteve Lawrence 	zold = list_head(&uold->zsu_zone_list);
236*efd4c9b6SSteve Lawrence 	znew = list_head(&unew->zsu_zone_list);
237*efd4c9b6SSteve Lawrence 
238*efd4c9b6SSteve Lawrence 	while (zold != NULL && znew != NULL) {
239*efd4c9b6SSteve Lawrence 
240*efd4c9b6SSteve Lawrence 		int cmp;
241*efd4c9b6SSteve Lawrence 
242*efd4c9b6SSteve Lawrence 		cmp = strcmp(zold->zsz_name, znew->zsz_name);
243*efd4c9b6SSteve Lawrence 		if (cmp > 0) {
244*efd4c9b6SSteve Lawrence 			/*
245*efd4c9b6SSteve Lawrence 			 * Old interval does not contain zone in new
246*efd4c9b6SSteve Lawrence 			 * interval.  Zone is new.  Add zone to result.
247*efd4c9b6SSteve Lawrence 			 */
248*efd4c9b6SSteve Lawrence 			if (ures != unew) {
249*efd4c9b6SSteve Lawrence 				zres = (zs_zone_t *)calloc(sizeof (zs_zone_t),
250*efd4c9b6SSteve Lawrence 				    1);
251*efd4c9b6SSteve Lawrence 				if (zres == NULL)
252*efd4c9b6SSteve Lawrence 					return (-1);
253*efd4c9b6SSteve Lawrence 				*zres = *znew;
254*efd4c9b6SSteve Lawrence 
255*efd4c9b6SSteve Lawrence 				zres->zsz_system = sres;
256*efd4c9b6SSteve Lawrence 				list_link_init(&zres->zsz_next);
257*efd4c9b6SSteve Lawrence 				zres->zsz_intervals = 0;
258*efd4c9b6SSteve Lawrence 				if (ures == uold)
259*efd4c9b6SSteve Lawrence 					list_insert_before(&uold->zsu_zone_list,
260*efd4c9b6SSteve Lawrence 					    zold, zres);
261*efd4c9b6SSteve Lawrence 				else
262*efd4c9b6SSteve Lawrence 					list_insert_tail(&ures->zsu_zone_list,
263*efd4c9b6SSteve Lawrence 					    zres);
264*efd4c9b6SSteve Lawrence 
265*efd4c9b6SSteve Lawrence 			} else {
266*efd4c9b6SSteve Lawrence 				zres = znew;
267*efd4c9b6SSteve Lawrence 			}
268*efd4c9b6SSteve Lawrence 
269*efd4c9b6SSteve Lawrence 			if (func == ZS_COMPUTE_USAGE_AVERAGE)
270*efd4c9b6SSteve Lawrence 				zres->zsz_intervals++;
271*efd4c9b6SSteve Lawrence 
272*efd4c9b6SSteve Lawrence 			znew = list_next(&unew->zsu_zone_list, znew);
273*efd4c9b6SSteve Lawrence 			continue;
274*efd4c9b6SSteve Lawrence 
275*efd4c9b6SSteve Lawrence 		} else if (cmp < 0) {
276*efd4c9b6SSteve Lawrence 			/*
277*efd4c9b6SSteve Lawrence 			 * Start interval contains zones that is not in the
278*efd4c9b6SSteve Lawrence 			 * end interval.  This zone is gone.  Leave zone in
279*efd4c9b6SSteve Lawrence 			 * old usage, but do not add it to result usage
280*efd4c9b6SSteve Lawrence 			 */
281*efd4c9b6SSteve Lawrence 			zold = list_next(&uold->zsu_zone_list, zold);
282*efd4c9b6SSteve Lawrence 			continue;
283*efd4c9b6SSteve Lawrence 		}
284*efd4c9b6SSteve Lawrence 
285*efd4c9b6SSteve Lawrence 		/* Zone is in both start and end interval.  Compute interval */
286*efd4c9b6SSteve Lawrence 		if (ures == uold) {
287*efd4c9b6SSteve Lawrence 			zres = zold;
288*efd4c9b6SSteve Lawrence 		} else if (ures == unew) {
289*efd4c9b6SSteve Lawrence 			zres = znew;
290*efd4c9b6SSteve Lawrence 		} else {
291*efd4c9b6SSteve Lawrence 			/* add zone to new usage */
292*efd4c9b6SSteve Lawrence 			zres = (zs_zone_t *)calloc(sizeof (zs_zone_t), 1);
293*efd4c9b6SSteve Lawrence 			if (zres == NULL)
294*efd4c9b6SSteve Lawrence 				return (-1);
295*efd4c9b6SSteve Lawrence 			*zres = *znew;
296*efd4c9b6SSteve Lawrence 			zres->zsz_system = sres;
297*efd4c9b6SSteve Lawrence 			list_insert_tail(&ures->zsu_zone_list, zres);
298*efd4c9b6SSteve Lawrence 		}
299*efd4c9b6SSteve Lawrence 		if (func == ZS_COMPUTE_USAGE_AVERAGE)
300*efd4c9b6SSteve Lawrence 			zres->zsz_intervals++;
301*efd4c9b6SSteve Lawrence 		if (func == ZS_COMPUTE_USAGE_INTERVAL) {
302*efd4c9b6SSteve Lawrence 			/*
303*efd4c9b6SSteve Lawrence 			 * If zone is in the old interval, but has been
304*efd4c9b6SSteve Lawrence 			 * rebooted, don't subtract its old interval usage
305*efd4c9b6SSteve Lawrence 			 */
306*efd4c9b6SSteve Lawrence 			if (zres->zsz_hrstart > uold->zsu_hrtime) {
307*efd4c9b6SSteve Lawrence 				znew = list_next(&unew->zsu_zone_list, znew);
308*efd4c9b6SSteve Lawrence 				zold = list_next(&uold->zsu_zone_list, zold);
309*efd4c9b6SSteve Lawrence 				continue;
310*efd4c9b6SSteve Lawrence 			}
311*efd4c9b6SSteve Lawrence 			TIMESTRUC_DELTA(zres->zsz_cpu_usage,
312*efd4c9b6SSteve Lawrence 			    znew->zsz_cpu_usage, zold->zsz_cpu_usage);
313*efd4c9b6SSteve Lawrence 			TIMESTRUC_DELTA(zres->zsz_cap_time, znew->zsz_cap_time,
314*efd4c9b6SSteve Lawrence 			    zold->zsz_cap_time);
315*efd4c9b6SSteve Lawrence 			TIMESTRUC_DELTA(zres->zsz_share_time,
316*efd4c9b6SSteve Lawrence 			    znew->zsz_share_time, zold->zsz_share_time);
317*efd4c9b6SSteve Lawrence 			TIMESTRUC_DELTA(zres->zsz_pset_time,
318*efd4c9b6SSteve Lawrence 			    znew->zsz_pset_time, zold->zsz_pset_time);
319*efd4c9b6SSteve Lawrence 		} else {
320*efd4c9b6SSteve Lawrence 			zs_zone_add_usage(zres, znew, func);
321*efd4c9b6SSteve Lawrence 		}
322*efd4c9b6SSteve Lawrence 		znew = list_next(&unew->zsu_zone_list, znew);
323*efd4c9b6SSteve Lawrence 		zold = list_next(&uold->zsu_zone_list, zold);
324*efd4c9b6SSteve Lawrence 	}
325*efd4c9b6SSteve Lawrence 
326*efd4c9b6SSteve Lawrence 	if (ures == unew)
327*efd4c9b6SSteve Lawrence 		return (0);
328*efd4c9b6SSteve Lawrence 
329*efd4c9b6SSteve Lawrence 	/* Add in any remaining zones in the new interval */
330*efd4c9b6SSteve Lawrence 	while (znew != NULL) {
331*efd4c9b6SSteve Lawrence 		zres = (zs_zone_t *)calloc(sizeof (zs_zone_t), 1);
332*efd4c9b6SSteve Lawrence 		if (zres == NULL)
333*efd4c9b6SSteve Lawrence 			return (-1);
334*efd4c9b6SSteve Lawrence 		*zres = *znew;
335*efd4c9b6SSteve Lawrence 		zres->zsz_system = sres;
336*efd4c9b6SSteve Lawrence 		if (func == ZS_COMPUTE_USAGE_AVERAGE)
337*efd4c9b6SSteve Lawrence 			zres->zsz_intervals++;
338*efd4c9b6SSteve Lawrence 		if (ures == uold)
339*efd4c9b6SSteve Lawrence 			list_insert_tail(&uold->zsu_zone_list, zres);
340*efd4c9b6SSteve Lawrence 		else
341*efd4c9b6SSteve Lawrence 			list_insert_tail(&ures->zsu_zone_list, zres);
342*efd4c9b6SSteve Lawrence 
343*efd4c9b6SSteve Lawrence 		znew = list_next(&unew->zsu_zone_list, znew);
344*efd4c9b6SSteve Lawrence 	}
345*efd4c9b6SSteve Lawrence 	return (0);
346*efd4c9b6SSteve Lawrence }
347*efd4c9b6SSteve Lawrence 
348*efd4c9b6SSteve Lawrence static void
zs_pset_zone_add_usage(zs_pset_zone_t * old,zs_pset_zone_t * new,int func)349*efd4c9b6SSteve Lawrence zs_pset_zone_add_usage(zs_pset_zone_t *old, zs_pset_zone_t *new, int func)
350*efd4c9b6SSteve Lawrence {
351*efd4c9b6SSteve Lawrence 	if (func == ZS_COMPUTE_USAGE_HIGH) {
352*efd4c9b6SSteve Lawrence 		ZS_MAXOF(old->zspz_cpu_shares, new->zspz_cpu_shares);
353*efd4c9b6SSteve Lawrence 		ZS_MAXOFTS(old->zspz_cpu_usage, new->zspz_cpu_usage);
354*efd4c9b6SSteve Lawrence 		return;
355*efd4c9b6SSteve Lawrence 	}
356*efd4c9b6SSteve Lawrence 	old->zspz_cpu_shares += new->zspz_cpu_shares;
357*efd4c9b6SSteve Lawrence 	TIMESTRUC_ADD_TIMESTRUC(old->zspz_cpu_usage, new->zspz_cpu_usage);
358*efd4c9b6SSteve Lawrence }
359*efd4c9b6SSteve Lawrence 
360*efd4c9b6SSteve Lawrence static int
zs_usage_compute_pset_usage(zs_usage_t * uold,zs_usage_t * ures,zs_pset_t * pres,zs_pset_t * pold,zs_pset_t * pnew,int func)361*efd4c9b6SSteve Lawrence zs_usage_compute_pset_usage(zs_usage_t *uold, zs_usage_t *ures,
362*efd4c9b6SSteve Lawrence     zs_pset_t *pres, zs_pset_t *pold, zs_pset_t *pnew, int func)
363*efd4c9b6SSteve Lawrence {
364*efd4c9b6SSteve Lawrence 	zs_pset_zone_t *puold, *punew, *pures;
365*efd4c9b6SSteve Lawrence 
366*efd4c9b6SSteve Lawrence 	/*
367*efd4c9b6SSteve Lawrence 	 * Walk psets usages, assume lists are always sorted the same.  Include
368*efd4c9b6SSteve Lawrence 	 * all pset usages that exist in the new pset.
369*efd4c9b6SSteve Lawrence 	 */
370*efd4c9b6SSteve Lawrence 	if (pold == NULL)
371*efd4c9b6SSteve Lawrence 		puold = NULL;
372*efd4c9b6SSteve Lawrence 	else
373*efd4c9b6SSteve Lawrence 		puold = list_head(&pold->zsp_usage_list);
374*efd4c9b6SSteve Lawrence 	punew = list_head(&pnew->zsp_usage_list);
375*efd4c9b6SSteve Lawrence 
376*efd4c9b6SSteve Lawrence 	while (puold != NULL && punew != NULL) {
377*efd4c9b6SSteve Lawrence 
378*efd4c9b6SSteve Lawrence 		int cmp;
379*efd4c9b6SSteve Lawrence 
380*efd4c9b6SSteve Lawrence 		cmp = strcmp(puold->zspz_zone->zsz_name,
381*efd4c9b6SSteve Lawrence 		    punew->zspz_zone->zsz_name);
382*efd4c9b6SSteve Lawrence 		if (cmp > 0) {
383*efd4c9b6SSteve Lawrence 			/*
384*efd4c9b6SSteve Lawrence 			 * Old interval does not contain usage new
385*efd4c9b6SSteve Lawrence 			 * interval.  Usage is new.
386*efd4c9b6SSteve Lawrence 			 */
387*efd4c9b6SSteve Lawrence 			if (pres != pnew) {
388*efd4c9b6SSteve Lawrence 				pures = (zs_pset_zone_t *)malloc(
389*efd4c9b6SSteve Lawrence 				    sizeof (zs_pset_zone_t));
390*efd4c9b6SSteve Lawrence 				if (pures == NULL)
391*efd4c9b6SSteve Lawrence 					return (-1);
392*efd4c9b6SSteve Lawrence 				*pures = *punew;
393*efd4c9b6SSteve Lawrence 
394*efd4c9b6SSteve Lawrence 				pures->zspz_pset = pres;
395*efd4c9b6SSteve Lawrence 				pures->zspz_zone = zs_lookup_zone_byname(ures,
396*efd4c9b6SSteve Lawrence 				    punew->zspz_zone->zsz_name);
397*efd4c9b6SSteve Lawrence 				assert(pures->zspz_zone != NULL);
398*efd4c9b6SSteve Lawrence 				pures->zspz_intervals = 0;
399*efd4c9b6SSteve Lawrence 				if (pres == pold)
400*efd4c9b6SSteve Lawrence 					list_insert_before(
401*efd4c9b6SSteve Lawrence 					    &pold->zsp_usage_list, puold,
402*efd4c9b6SSteve Lawrence 					    pures);
403*efd4c9b6SSteve Lawrence 				else
404*efd4c9b6SSteve Lawrence 					list_insert_tail(&pres->zsp_usage_list,
405*efd4c9b6SSteve Lawrence 					    pures);
406*efd4c9b6SSteve Lawrence 			} else {
407*efd4c9b6SSteve Lawrence 				pures = punew;
408*efd4c9b6SSteve Lawrence 			}
409*efd4c9b6SSteve Lawrence 			if (func == ZS_COMPUTE_USAGE_AVERAGE)
410*efd4c9b6SSteve Lawrence 				pures->zspz_intervals++;
411*efd4c9b6SSteve Lawrence 			else if (func == ZS_COMPUTE_USAGE_TOTAL) {
412*efd4c9b6SSteve Lawrence 				/* Add pset's time so far to the zone usage */
413*efd4c9b6SSteve Lawrence 				TIMESTRUC_ADD_TIMESTRUC(
414*efd4c9b6SSteve Lawrence 				    pures->zspz_zone->zsz_pset_time,
415*efd4c9b6SSteve Lawrence 				    pres->zsp_total_time);
416*efd4c9b6SSteve Lawrence 				pures->zspz_zone->zsz_cpus_online +=
417*efd4c9b6SSteve Lawrence 				    pres->zsp_online;
418*efd4c9b6SSteve Lawrence 			}
419*efd4c9b6SSteve Lawrence 
420*efd4c9b6SSteve Lawrence 			punew = list_next(&pnew->zsp_usage_list, punew);
421*efd4c9b6SSteve Lawrence 			continue;
422*efd4c9b6SSteve Lawrence 		} else if (cmp < 0) {
423*efd4c9b6SSteve Lawrence 
424*efd4c9b6SSteve Lawrence 			/*
425*efd4c9b6SSteve Lawrence 			 * Old interval contains pset_zone that is not in the
426*efd4c9b6SSteve Lawrence 			 * new interval.  This zone is no longer using the
427*efd4c9b6SSteve Lawrence 			 * pset.  Leave pset_zone in old interval, but do not
428*efd4c9b6SSteve Lawrence 			 * add it to result usage.
429*efd4c9b6SSteve Lawrence 			 *
430*efd4c9b6SSteve Lawrence 			 * For total utilization, add pset time to zone that
431*efd4c9b6SSteve Lawrence 			 * has run in this pset before.
432*efd4c9b6SSteve Lawrence 			 */
433*efd4c9b6SSteve Lawrence 			if (func == ZS_COMPUTE_USAGE_TOTAL) {
434*efd4c9b6SSteve Lawrence 				/* Add new pset time to the zone usage */
435*efd4c9b6SSteve Lawrence 				TIMESTRUC_ADD_TIMESTRUC(
436*efd4c9b6SSteve Lawrence 				    puold->zspz_zone->zsz_pset_time,
437*efd4c9b6SSteve Lawrence 				    pnew->zsp_total_time);
438*efd4c9b6SSteve Lawrence 				puold->zspz_zone->zsz_cpus_online +=
439*efd4c9b6SSteve Lawrence 				    pnew->zsp_online;
440*efd4c9b6SSteve Lawrence 			}
441*efd4c9b6SSteve Lawrence 			puold = list_next(&pold->zsp_usage_list, puold);
442*efd4c9b6SSteve Lawrence 			continue;
443*efd4c9b6SSteve Lawrence 		}
444*efd4c9b6SSteve Lawrence 		/*
445*efd4c9b6SSteve Lawrence 		 * Zone is using pset in both start and end interval.  Compute
446*efd4c9b6SSteve Lawrence 		 * interval
447*efd4c9b6SSteve Lawrence 		 */
448*efd4c9b6SSteve Lawrence 		if (pres == pold) {
449*efd4c9b6SSteve Lawrence 			pures = puold;
450*efd4c9b6SSteve Lawrence 		} else if (pres == pnew) {
451*efd4c9b6SSteve Lawrence 			pures = punew;
452*efd4c9b6SSteve Lawrence 		} else {
453*efd4c9b6SSteve Lawrence 			pures = (zs_pset_zone_t *)malloc(
454*efd4c9b6SSteve Lawrence 			    sizeof (zs_pset_zone_t));
455*efd4c9b6SSteve Lawrence 			if (pures == NULL)
456*efd4c9b6SSteve Lawrence 				return (-1);
457*efd4c9b6SSteve Lawrence 			*pures = *punew;
458*efd4c9b6SSteve Lawrence 			pures->zspz_pset = pres;
459*efd4c9b6SSteve Lawrence 			pures->zspz_zone = zs_lookup_zone_byname(ures,
460*efd4c9b6SSteve Lawrence 			    punew->zspz_zone->zsz_name);
461*efd4c9b6SSteve Lawrence 			assert(pures->zspz_zone != NULL);
462*efd4c9b6SSteve Lawrence 			list_insert_tail(&pres->zsp_usage_list, pures);
463*efd4c9b6SSteve Lawrence 		}
464*efd4c9b6SSteve Lawrence 		if (func == ZS_COMPUTE_USAGE_AVERAGE)
465*efd4c9b6SSteve Lawrence 			pures->zspz_intervals++;
466*efd4c9b6SSteve Lawrence 
467*efd4c9b6SSteve Lawrence 		if (func == ZS_COMPUTE_USAGE_INTERVAL) {
468*efd4c9b6SSteve Lawrence 			/*
469*efd4c9b6SSteve Lawrence 			 * If pset usage has been destroyed and re-created
470*efd4c9b6SSteve Lawrence 			 * since start interval, don't subtract the start
471*efd4c9b6SSteve Lawrence 			 * interval.
472*efd4c9b6SSteve Lawrence 			 */
473*efd4c9b6SSteve Lawrence 			if (punew->zspz_hrstart > uold->zsu_hrtime) {
474*efd4c9b6SSteve Lawrence 				punew = list_next(&pnew->zsp_usage_list, punew);
475*efd4c9b6SSteve Lawrence 				puold = list_next(&pold->zsp_usage_list, puold);
476*efd4c9b6SSteve Lawrence 				continue;
477*efd4c9b6SSteve Lawrence 			}
478*efd4c9b6SSteve Lawrence 			TIMESTRUC_DELTA(pures->zspz_cpu_usage,
479*efd4c9b6SSteve Lawrence 			    punew->zspz_cpu_usage, puold->zspz_cpu_usage);
480*efd4c9b6SSteve Lawrence 		} else {
481*efd4c9b6SSteve Lawrence 			zs_pset_zone_add_usage(pures, punew, func);
482*efd4c9b6SSteve Lawrence 		}
483*efd4c9b6SSteve Lawrence 		punew = list_next(&pnew->zsp_usage_list, punew);
484*efd4c9b6SSteve Lawrence 		puold = list_next(&pold->zsp_usage_list, puold);
485*efd4c9b6SSteve Lawrence 	}
486*efd4c9b6SSteve Lawrence 	if (func == ZS_COMPUTE_USAGE_TOTAL) {
487*efd4c9b6SSteve Lawrence 		while (puold != NULL) {
488*efd4c9b6SSteve Lawrence 			TIMESTRUC_ADD_TIMESTRUC(
489*efd4c9b6SSteve Lawrence 			    puold->zspz_zone->zsz_pset_time,
490*efd4c9b6SSteve Lawrence 			    pnew->zsp_total_time);
491*efd4c9b6SSteve Lawrence 			puold->zspz_zone->zsz_cpus_online +=
492*efd4c9b6SSteve Lawrence 			    pnew->zsp_online;
493*efd4c9b6SSteve Lawrence 			puold = list_next(&pold->zsp_usage_list, puold);
494*efd4c9b6SSteve Lawrence 		}
495*efd4c9b6SSteve Lawrence 	}
496*efd4c9b6SSteve Lawrence 
497*efd4c9b6SSteve Lawrence 	/* No need to add new pset zone usages if result pset is new pset */
498*efd4c9b6SSteve Lawrence 	if (pres == pnew)
499*efd4c9b6SSteve Lawrence 		return (0);
500*efd4c9b6SSteve Lawrence 
501*efd4c9b6SSteve Lawrence 	/* Add in any remaining new psets in the new interval */
502*efd4c9b6SSteve Lawrence 	while (punew != NULL) {
503*efd4c9b6SSteve Lawrence 		pures = (zs_pset_zone_t *)calloc(sizeof (zs_pset_zone_t), 1);
504*efd4c9b6SSteve Lawrence 		if (pures == NULL)
505*efd4c9b6SSteve Lawrence 			return (-1);
506*efd4c9b6SSteve Lawrence 		*pures = *punew;
507*efd4c9b6SSteve Lawrence 		pures->zspz_pset = pres;
508*efd4c9b6SSteve Lawrence 		pures->zspz_zone = zs_lookup_zone_byname(ures,
509*efd4c9b6SSteve Lawrence 		    punew->zspz_zone->zsz_name);
510*efd4c9b6SSteve Lawrence 		assert(pures->zspz_zone  != NULL);
511*efd4c9b6SSteve Lawrence 		if (func == ZS_COMPUTE_USAGE_AVERAGE)
512*efd4c9b6SSteve Lawrence 			pures->zspz_intervals++;
513*efd4c9b6SSteve Lawrence 		if (pres == pold)
514*efd4c9b6SSteve Lawrence 			list_insert_tail(&pold->zsp_usage_list, pures);
515*efd4c9b6SSteve Lawrence 		else
516*efd4c9b6SSteve Lawrence 			list_insert_tail(&pres->zsp_usage_list, pures);
517*efd4c9b6SSteve Lawrence 
518*efd4c9b6SSteve Lawrence 		punew = list_next(&pnew->zsp_usage_list, punew);
519*efd4c9b6SSteve Lawrence 	}
520*efd4c9b6SSteve Lawrence 	return (0);
521*efd4c9b6SSteve Lawrence }
522*efd4c9b6SSteve Lawrence 
523*efd4c9b6SSteve Lawrence static void
zs_pset_add_usage(zs_pset_t * old,zs_pset_t * new,int func)524*efd4c9b6SSteve Lawrence zs_pset_add_usage(zs_pset_t *old, zs_pset_t *new, int func)
525*efd4c9b6SSteve Lawrence {
526*efd4c9b6SSteve Lawrence 
527*efd4c9b6SSteve Lawrence 	if (func == ZS_COMPUTE_USAGE_HIGH) {
528*efd4c9b6SSteve Lawrence 		ZS_MAXOF(old->zsp_online, new->zsp_online);
529*efd4c9b6SSteve Lawrence 		ZS_MAXOF(old->zsp_size, new->zsp_size);
530*efd4c9b6SSteve Lawrence 		ZS_MAXOF(old->zsp_min, new->zsp_min);
531*efd4c9b6SSteve Lawrence 		ZS_MAXOF(old->zsp_max, new->zsp_max);
532*efd4c9b6SSteve Lawrence 		ZS_MAXOF(old->zsp_importance, new->zsp_importance);
533*efd4c9b6SSteve Lawrence 		ZS_MAXOF(old->zsp_cpu_shares, new->zsp_cpu_shares);
534*efd4c9b6SSteve Lawrence 		ZS_MAXOFTS(old->zsp_total_time, new->zsp_total_time);
535*efd4c9b6SSteve Lawrence 		ZS_MAXOFTS(old->zsp_usage_kern, new->zsp_usage_kern);
536*efd4c9b6SSteve Lawrence 		ZS_MAXOFTS(old->zsp_usage_zones, new->zsp_usage_zones);
537*efd4c9b6SSteve Lawrence 		return;
538*efd4c9b6SSteve Lawrence 	}
539*efd4c9b6SSteve Lawrence 	old->zsp_online += new->zsp_online;
540*efd4c9b6SSteve Lawrence 	old->zsp_size += new->zsp_size;
541*efd4c9b6SSteve Lawrence 	old->zsp_min += new->zsp_min;
542*efd4c9b6SSteve Lawrence 	old->zsp_max += new->zsp_max;
543*efd4c9b6SSteve Lawrence 	old->zsp_importance += new->zsp_importance;
544*efd4c9b6SSteve Lawrence 	old->zsp_cpu_shares += new->zsp_cpu_shares;
545*efd4c9b6SSteve Lawrence 	TIMESTRUC_ADD_TIMESTRUC(old->zsp_total_time, new->zsp_total_time);
546*efd4c9b6SSteve Lawrence 	TIMESTRUC_ADD_TIMESTRUC(old->zsp_usage_kern, new->zsp_usage_kern);
547*efd4c9b6SSteve Lawrence 	TIMESTRUC_ADD_TIMESTRUC(old->zsp_usage_zones, new->zsp_usage_zones);
548*efd4c9b6SSteve Lawrence }
549*efd4c9b6SSteve Lawrence 
550*efd4c9b6SSteve Lawrence static int
zs_usage_compute_psets(zs_usage_t * ures,zs_usage_t * uold,zs_usage_t * unew,int func)551*efd4c9b6SSteve Lawrence zs_usage_compute_psets(zs_usage_t *ures, zs_usage_t *uold, zs_usage_t *unew,
552*efd4c9b6SSteve Lawrence     int func)
553*efd4c9b6SSteve Lawrence {
554*efd4c9b6SSteve Lawrence 	zs_pset_t *pold, *pnew, *pres;
555*efd4c9b6SSteve Lawrence 
556*efd4c9b6SSteve Lawrence 	/*
557*efd4c9b6SSteve Lawrence 	 * Walk psets, assume lists are always sorted the same.  Include
558*efd4c9b6SSteve Lawrence 	 * all psets that exist at the end of the interval.
559*efd4c9b6SSteve Lawrence 	 */
560*efd4c9b6SSteve Lawrence 	pold = list_head(&uold->zsu_pset_list);
561*efd4c9b6SSteve Lawrence 	pnew = list_head(&unew->zsu_pset_list);
562*efd4c9b6SSteve Lawrence 
563*efd4c9b6SSteve Lawrence 	while (pold != NULL && pnew != NULL) {
564*efd4c9b6SSteve Lawrence 
565*efd4c9b6SSteve Lawrence 		int cmp;
566*efd4c9b6SSteve Lawrence 
567*efd4c9b6SSteve Lawrence 		cmp = strcmp(pold->zsp_name, pnew->zsp_name);
568*efd4c9b6SSteve Lawrence 		if (cmp > 0) {
569*efd4c9b6SSteve Lawrence 			/*
570*efd4c9b6SSteve Lawrence 			 * Old interval does not contain pset in new
571*efd4c9b6SSteve Lawrence 			 * interval.  Pset is new.
572*efd4c9b6SSteve Lawrence 			 */
573*efd4c9b6SSteve Lawrence 			if (ures != unew) {
574*efd4c9b6SSteve Lawrence 				pres = (zs_pset_t *)malloc(sizeof (zs_pset_t));
575*efd4c9b6SSteve Lawrence 				if (pres == NULL)
576*efd4c9b6SSteve Lawrence 					return (-1);
577*efd4c9b6SSteve Lawrence 				*pres = *pnew;
578*efd4c9b6SSteve Lawrence 				pres->zsp_intervals = 0;
579*efd4c9b6SSteve Lawrence 				list_create(&pres->zsp_usage_list,
580*efd4c9b6SSteve Lawrence 				    sizeof (zs_pset_zone_t),
581*efd4c9b6SSteve Lawrence 				    offsetof(zs_pset_zone_t, zspz_next));
582*efd4c9b6SSteve Lawrence 
583*efd4c9b6SSteve Lawrence 				if (ures == uold)
584*efd4c9b6SSteve Lawrence 					list_insert_before(&uold->zsu_pset_list,
585*efd4c9b6SSteve Lawrence 					    pold, pres);
586*efd4c9b6SSteve Lawrence 				else
587*efd4c9b6SSteve Lawrence 					list_insert_tail(&ures->zsu_pset_list,
588*efd4c9b6SSteve Lawrence 					    pres);
589*efd4c9b6SSteve Lawrence 
590*efd4c9b6SSteve Lawrence 			} else {
591*efd4c9b6SSteve Lawrence 				pres = pnew;
592*efd4c9b6SSteve Lawrence 			}
593*efd4c9b6SSteve Lawrence 			if (zs_usage_compute_pset_usage(uold, ures, pres,
594*efd4c9b6SSteve Lawrence 			    NULL, pnew, func) != 0)
595*efd4c9b6SSteve Lawrence 				return (-1);
596*efd4c9b6SSteve Lawrence 
597*efd4c9b6SSteve Lawrence 			if (func == ZS_COMPUTE_USAGE_AVERAGE ||
598*efd4c9b6SSteve Lawrence 			    func == ZS_COMPUTE_USAGE_TOTAL)
599*efd4c9b6SSteve Lawrence 				pres->zsp_intervals++;
600*efd4c9b6SSteve Lawrence 			pnew = list_next(&unew->zsu_pset_list, pnew);
601*efd4c9b6SSteve Lawrence 			continue;
602*efd4c9b6SSteve Lawrence 
603*efd4c9b6SSteve Lawrence 		} else if (cmp < 0) {
604*efd4c9b6SSteve Lawrence 			/*
605*efd4c9b6SSteve Lawrence 			 * Start interval contains psets that is not in the
606*efd4c9b6SSteve Lawrence 			 * end interval.  This pset is gone.  Leave pset in
607*efd4c9b6SSteve Lawrence 			 * old usage, but do not add it to result usage.
608*efd4c9b6SSteve Lawrence 			 */
609*efd4c9b6SSteve Lawrence 			pold = list_next(&uold->zsu_pset_list, pold);
610*efd4c9b6SSteve Lawrence 			continue;
611*efd4c9b6SSteve Lawrence 		}
612*efd4c9b6SSteve Lawrence 
613*efd4c9b6SSteve Lawrence 		/* Pset is in both start and end interval.  Compute interval */
614*efd4c9b6SSteve Lawrence 		if (ures == uold) {
615*efd4c9b6SSteve Lawrence 			pres = pold;
616*efd4c9b6SSteve Lawrence 		} else if (ures == unew) {
617*efd4c9b6SSteve Lawrence 			pres = pnew;
618*efd4c9b6SSteve Lawrence 		} else {
619*efd4c9b6SSteve Lawrence 			pres = (zs_pset_t *)calloc(sizeof (zs_pset_t), 1);
620*efd4c9b6SSteve Lawrence 			if (pres == NULL)
621*efd4c9b6SSteve Lawrence 				return (-1);
622*efd4c9b6SSteve Lawrence 
623*efd4c9b6SSteve Lawrence 			*pres = *pnew;
624*efd4c9b6SSteve Lawrence 			list_create(&pres->zsp_usage_list,
625*efd4c9b6SSteve Lawrence 			    sizeof (zs_pset_zone_t),
626*efd4c9b6SSteve Lawrence 			    offsetof(zs_pset_zone_t, zspz_next));
627*efd4c9b6SSteve Lawrence 			list_insert_tail(&ures->zsu_pset_list, pres);
628*efd4c9b6SSteve Lawrence 		}
629*efd4c9b6SSteve Lawrence 		if (func == ZS_COMPUTE_USAGE_AVERAGE ||
630*efd4c9b6SSteve Lawrence 		    func == ZS_COMPUTE_USAGE_TOTAL)
631*efd4c9b6SSteve Lawrence 			pres->zsp_intervals++;
632*efd4c9b6SSteve Lawrence 		if (func == ZS_COMPUTE_USAGE_INTERVAL) {
633*efd4c9b6SSteve Lawrence 			/*
634*efd4c9b6SSteve Lawrence 			 * If pset as been destroyed and re-created since start
635*efd4c9b6SSteve Lawrence 			 * interval, don't subtract the start interval.
636*efd4c9b6SSteve Lawrence 			 */
637*efd4c9b6SSteve Lawrence 			if (pnew->zsp_hrstart > uold->zsu_hrtime) {
638*efd4c9b6SSteve Lawrence 				goto usages;
639*efd4c9b6SSteve Lawrence 			}
640*efd4c9b6SSteve Lawrence 			TIMESTRUC_DELTA(pres->zsp_total_time,
641*efd4c9b6SSteve Lawrence 			    pnew->zsp_total_time, pold->zsp_total_time);
642*efd4c9b6SSteve Lawrence 
643*efd4c9b6SSteve Lawrence 			TIMESTRUC_DELTA(pres->zsp_usage_kern,
644*efd4c9b6SSteve Lawrence 			    pnew->zsp_usage_kern, pold->zsp_usage_kern);
645*efd4c9b6SSteve Lawrence 			TIMESTRUC_DELTA(pres->zsp_usage_zones,
646*efd4c9b6SSteve Lawrence 			    pnew->zsp_usage_zones, pold->zsp_usage_zones);
647*efd4c9b6SSteve Lawrence 		} else {
648*efd4c9b6SSteve Lawrence 			zs_pset_add_usage(pres, pnew, func);
649*efd4c9b6SSteve Lawrence 		}
650*efd4c9b6SSteve Lawrence usages:
651*efd4c9b6SSteve Lawrence 		if (zs_usage_compute_pset_usage(uold, ures, pres, pold,
652*efd4c9b6SSteve Lawrence 		    pnew, func) != 0)
653*efd4c9b6SSteve Lawrence 			return (-1);
654*efd4c9b6SSteve Lawrence 
655*efd4c9b6SSteve Lawrence 		pnew = list_next(&unew->zsu_pset_list, pnew);
656*efd4c9b6SSteve Lawrence 		pold = list_next(&uold->zsu_pset_list, pold);
657*efd4c9b6SSteve Lawrence 	}
658*efd4c9b6SSteve Lawrence 
659*efd4c9b6SSteve Lawrence 	if (ures == unew)
660*efd4c9b6SSteve Lawrence 		return (0);
661*efd4c9b6SSteve Lawrence 
662*efd4c9b6SSteve Lawrence 	/* Add in any remaining psets in the new interval */
663*efd4c9b6SSteve Lawrence 	while (pnew != NULL) {
664*efd4c9b6SSteve Lawrence 		pres = (zs_pset_t *)calloc(sizeof (zs_pset_t), 1);
665*efd4c9b6SSteve Lawrence 		if (pres == NULL)
666*efd4c9b6SSteve Lawrence 			return (-1);
667*efd4c9b6SSteve Lawrence 		*pres = *pnew;
668*efd4c9b6SSteve Lawrence 		list_create(&pres->zsp_usage_list,
669*efd4c9b6SSteve Lawrence 		    sizeof (zs_pset_zone_t),
670*efd4c9b6SSteve Lawrence 		    offsetof(zs_pset_zone_t, zspz_next));
671*efd4c9b6SSteve Lawrence 		if (func == ZS_COMPUTE_USAGE_AVERAGE ||
672*efd4c9b6SSteve Lawrence 		    func == ZS_COMPUTE_USAGE_TOTAL)
673*efd4c9b6SSteve Lawrence 			pres->zsp_intervals++;
674*efd4c9b6SSteve Lawrence 		if (ures == uold)
675*efd4c9b6SSteve Lawrence 			list_insert_tail(&uold->zsu_pset_list, pres);
676*efd4c9b6SSteve Lawrence 		else
677*efd4c9b6SSteve Lawrence 			list_insert_tail(&ures->zsu_pset_list, pres);
678*efd4c9b6SSteve Lawrence 
679*efd4c9b6SSteve Lawrence 		if (zs_usage_compute_pset_usage(uold, ures, pres, NULL,
680*efd4c9b6SSteve Lawrence 		    pnew, func) != 0)
681*efd4c9b6SSteve Lawrence 			return (-1);
682*efd4c9b6SSteve Lawrence 
683*efd4c9b6SSteve Lawrence 		pnew = list_next(&unew->zsu_pset_list, pnew);
684*efd4c9b6SSteve Lawrence 	}
685*efd4c9b6SSteve Lawrence 	return (0);
686*efd4c9b6SSteve Lawrence }
687*efd4c9b6SSteve Lawrence 
688*efd4c9b6SSteve Lawrence static int
zs_zone_name(zs_zone_t * zone,char * name,size_t len)689*efd4c9b6SSteve Lawrence zs_zone_name(zs_zone_t *zone, char *name, size_t len)
690*efd4c9b6SSteve Lawrence {
691*efd4c9b6SSteve Lawrence 	return (strlcpy(name, zone->zsz_name, len));
692*efd4c9b6SSteve Lawrence }
693*efd4c9b6SSteve Lawrence 
694*efd4c9b6SSteve Lawrence static zoneid_t
zs_zone_id(zs_zone_t * zone)695*efd4c9b6SSteve Lawrence zs_zone_id(zs_zone_t *zone)
696*efd4c9b6SSteve Lawrence {
697*efd4c9b6SSteve Lawrence 	return (zone->zsz_id);
698*efd4c9b6SSteve Lawrence }
699*efd4c9b6SSteve Lawrence 
700*efd4c9b6SSteve Lawrence static uint_t
zs_zone_iptype(zs_zone_t * zone)701*efd4c9b6SSteve Lawrence zs_zone_iptype(zs_zone_t *zone)
702*efd4c9b6SSteve Lawrence {
703*efd4c9b6SSteve Lawrence 	return (zone->zsz_iptype);
704*efd4c9b6SSteve Lawrence }
705*efd4c9b6SSteve Lawrence 
706*efd4c9b6SSteve Lawrence static uint_t
zs_zone_cputype(zs_zone_t * zone)707*efd4c9b6SSteve Lawrence zs_zone_cputype(zs_zone_t *zone)
708*efd4c9b6SSteve Lawrence {
709*efd4c9b6SSteve Lawrence 	return (zone->zsz_cputype);
710*efd4c9b6SSteve Lawrence }
711*efd4c9b6SSteve Lawrence 
712*efd4c9b6SSteve Lawrence static int
zs_zone_poolname(zs_zone_t * zone,char * name,size_t len)713*efd4c9b6SSteve Lawrence zs_zone_poolname(zs_zone_t *zone, char *name, size_t len)
714*efd4c9b6SSteve Lawrence {
715*efd4c9b6SSteve Lawrence 	return (strlcpy(name, zone->zsz_pool, len));
716*efd4c9b6SSteve Lawrence }
717*efd4c9b6SSteve Lawrence 
718*efd4c9b6SSteve Lawrence static int
zs_zone_psetname(zs_zone_t * zone,char * name,size_t len)719*efd4c9b6SSteve Lawrence zs_zone_psetname(zs_zone_t *zone, char *name, size_t len)
720*efd4c9b6SSteve Lawrence {
721*efd4c9b6SSteve Lawrence 	return (strlcpy(name, zone->zsz_pset, len));
722*efd4c9b6SSteve Lawrence }
723*efd4c9b6SSteve Lawrence 
724*efd4c9b6SSteve Lawrence static uint_t
zs_zone_schedulers(zs_zone_t * zone)725*efd4c9b6SSteve Lawrence zs_zone_schedulers(zs_zone_t *zone)
726*efd4c9b6SSteve Lawrence {
727*efd4c9b6SSteve Lawrence 	return (zone->zsz_scheds);
728*efd4c9b6SSteve Lawrence }
729*efd4c9b6SSteve Lawrence 
730*efd4c9b6SSteve Lawrence static uint64_t
zs_ts_used_scale(timestruc_t * total,timestruc_t * used,uint64_t scale,boolean_t cap_at_100)731*efd4c9b6SSteve Lawrence zs_ts_used_scale(timestruc_t *total, timestruc_t *used, uint64_t scale,
732*efd4c9b6SSteve Lawrence     boolean_t cap_at_100)
733*efd4c9b6SSteve Lawrence {
734*efd4c9b6SSteve Lawrence 	double dtotal, dused, pct, dscale;
735*efd4c9b6SSteve Lawrence 
736*efd4c9b6SSteve Lawrence 	/* If no time yet, treat as zero */
737*efd4c9b6SSteve Lawrence 	if (total->tv_sec == 0 && total->tv_nsec == 0)
738*efd4c9b6SSteve Lawrence 		return (0);
739*efd4c9b6SSteve Lawrence 
740*efd4c9b6SSteve Lawrence 	dtotal = (double)total->tv_sec +
741*efd4c9b6SSteve Lawrence 	    ((double)total->tv_nsec / (double)NANOSEC);
742*efd4c9b6SSteve Lawrence 	dused = (double)used->tv_sec +
743*efd4c9b6SSteve Lawrence 	    ((double)used->tv_nsec / (double)NANOSEC);
744*efd4c9b6SSteve Lawrence 
745*efd4c9b6SSteve Lawrence 	dscale = (double)scale;
746*efd4c9b6SSteve Lawrence 	pct = dused / dtotal * dscale;
747*efd4c9b6SSteve Lawrence 	if (cap_at_100 && pct > dscale)
748*efd4c9b6SSteve Lawrence 		pct = dscale;
749*efd4c9b6SSteve Lawrence 
750*efd4c9b6SSteve Lawrence 	return ((uint_t)pct);
751*efd4c9b6SSteve Lawrence }
752*efd4c9b6SSteve Lawrence 
753*efd4c9b6SSteve Lawrence /*
754*efd4c9b6SSteve Lawrence  * Convert total and used time into percent used.
755*efd4c9b6SSteve Lawrence  */
756*efd4c9b6SSteve Lawrence static uint_t
zs_ts_used_pct(timestruc_t * total,timestruc_t * used,boolean_t cap_at_100)757*efd4c9b6SSteve Lawrence zs_ts_used_pct(timestruc_t *total, timestruc_t *used, boolean_t cap_at_100)
758*efd4c9b6SSteve Lawrence {
759*efd4c9b6SSteve Lawrence 	return ((uint_t)zs_ts_used_scale(total, used, ZSD_PCT_INT, cap_at_100));
760*efd4c9b6SSteve Lawrence }
761*efd4c9b6SSteve Lawrence 
762*efd4c9b6SSteve Lawrence /*
763*efd4c9b6SSteve Lawrence  * Convert total and used time, plus number of cpus, into number of cpus
764*efd4c9b6SSteve Lawrence  * used, where 100 equals 1 cpu used.
765*efd4c9b6SSteve Lawrence  */
766*efd4c9b6SSteve Lawrence static uint64_t
zs_ts_used_cpus(timestruc_t * total,timestruc_t * used,uint_t ncpus,boolean_t cap_at_100)767*efd4c9b6SSteve Lawrence zs_ts_used_cpus(timestruc_t *total, timestruc_t *used, uint_t ncpus,
768*efd4c9b6SSteve Lawrence     boolean_t cap_at_100)
769*efd4c9b6SSteve Lawrence {
770*efd4c9b6SSteve Lawrence 	return (zs_ts_used_scale(total, used, ncpus * ZSD_ONE_CPU, cap_at_100));
771*efd4c9b6SSteve Lawrence }
772*efd4c9b6SSteve Lawrence 
773*efd4c9b6SSteve Lawrence static uint64_t
zs_zone_cpu_shares(zs_zone_t * zone)774*efd4c9b6SSteve Lawrence zs_zone_cpu_shares(zs_zone_t *zone)
775*efd4c9b6SSteve Lawrence {
776*efd4c9b6SSteve Lawrence 	/* No processes found in FSS */
777*efd4c9b6SSteve Lawrence 	if ((zone->zsz_scheds & ZS_SCHED_FSS) == 0)
778*efd4c9b6SSteve Lawrence 		return (ZS_LIMIT_NONE);
779*efd4c9b6SSteve Lawrence 
780*efd4c9b6SSteve Lawrence 	return (zone->zsz_cpu_shares);
781*efd4c9b6SSteve Lawrence }
782*efd4c9b6SSteve Lawrence 
783*efd4c9b6SSteve Lawrence static uint64_t
zs_zone_cpu_cap(zs_zone_t * zone)784*efd4c9b6SSteve Lawrence zs_zone_cpu_cap(zs_zone_t *zone)
785*efd4c9b6SSteve Lawrence {
786*efd4c9b6SSteve Lawrence 	return (zone->zsz_cpu_cap);
787*efd4c9b6SSteve Lawrence }
788*efd4c9b6SSteve Lawrence 
789*efd4c9b6SSteve Lawrence static uint64_t
zs_zone_cpu_cap_used(zs_zone_t * zone)790*efd4c9b6SSteve Lawrence zs_zone_cpu_cap_used(zs_zone_t *zone)
791*efd4c9b6SSteve Lawrence {
792*efd4c9b6SSteve Lawrence 	if (zone->zsz_cpu_cap == ZS_LIMIT_NONE)
793*efd4c9b6SSteve Lawrence 		return (ZS_LIMIT_NONE);
794*efd4c9b6SSteve Lawrence 
795*efd4c9b6SSteve Lawrence 	return (zs_ts_used_cpus(&zone->zsz_cap_time, &zone->zsz_cpu_usage,
796*efd4c9b6SSteve Lawrence 	    zone->zsz_cpus_online, B_TRUE));
797*efd4c9b6SSteve Lawrence }
798*efd4c9b6SSteve Lawrence 
799*efd4c9b6SSteve Lawrence static uint64_t
zs_zone_cpu_shares_used(zs_zone_t * zone)800*efd4c9b6SSteve Lawrence zs_zone_cpu_shares_used(zs_zone_t *zone)
801*efd4c9b6SSteve Lawrence {
802*efd4c9b6SSteve Lawrence 	if (zone->zsz_cpu_shares == ZS_LIMIT_NONE)
803*efd4c9b6SSteve Lawrence 		return (ZS_LIMIT_NONE);
804*efd4c9b6SSteve Lawrence 
805*efd4c9b6SSteve Lawrence 	if (zone->zsz_cpu_shares == ZS_SHARES_UNLIMITED)
806*efd4c9b6SSteve Lawrence 		return (ZS_LIMIT_NONE);
807*efd4c9b6SSteve Lawrence 
808*efd4c9b6SSteve Lawrence 	if ((zone->zsz_scheds & ZS_SCHED_FSS) == 0)
809*efd4c9b6SSteve Lawrence 		return (ZS_LIMIT_NONE);
810*efd4c9b6SSteve Lawrence 
811*efd4c9b6SSteve Lawrence 	return (zs_ts_used_scale(&zone->zsz_share_time, &zone->zsz_cpu_usage,
812*efd4c9b6SSteve Lawrence 	    zone->zsz_cpu_shares, B_FALSE));
813*efd4c9b6SSteve Lawrence }
814*efd4c9b6SSteve Lawrence 
815*efd4c9b6SSteve Lawrence static void
zs_zone_cpu_cap_time(zs_zone_t * zone,timestruc_t * ts)816*efd4c9b6SSteve Lawrence zs_zone_cpu_cap_time(zs_zone_t *zone, timestruc_t *ts)
817*efd4c9b6SSteve Lawrence {
818*efd4c9b6SSteve Lawrence 	*ts = zone->zsz_cap_time;
819*efd4c9b6SSteve Lawrence }
820*efd4c9b6SSteve Lawrence 
821*efd4c9b6SSteve Lawrence static void
zs_zone_cpu_share_time(zs_zone_t * zone,timestruc_t * ts)822*efd4c9b6SSteve Lawrence zs_zone_cpu_share_time(zs_zone_t *zone, timestruc_t *ts)
823*efd4c9b6SSteve Lawrence {
824*efd4c9b6SSteve Lawrence 	*ts = zone->zsz_share_time;
825*efd4c9b6SSteve Lawrence }
826*efd4c9b6SSteve Lawrence 
827*efd4c9b6SSteve Lawrence static void
zs_zone_cpu_cap_time_used(zs_zone_t * zone,timestruc_t * ts)828*efd4c9b6SSteve Lawrence zs_zone_cpu_cap_time_used(zs_zone_t *zone, timestruc_t *ts)
829*efd4c9b6SSteve Lawrence {
830*efd4c9b6SSteve Lawrence 	*ts = zone->zsz_cpu_usage;
831*efd4c9b6SSteve Lawrence }
832*efd4c9b6SSteve Lawrence 
833*efd4c9b6SSteve Lawrence static void
zs_zone_cpu_share_time_used(zs_zone_t * zone,timestruc_t * ts)834*efd4c9b6SSteve Lawrence zs_zone_cpu_share_time_used(zs_zone_t *zone, timestruc_t *ts)
835*efd4c9b6SSteve Lawrence {
836*efd4c9b6SSteve Lawrence 	*ts = zone->zsz_cpu_usage;
837*efd4c9b6SSteve Lawrence }
838*efd4c9b6SSteve Lawrence 
839*efd4c9b6SSteve Lawrence 
840*efd4c9b6SSteve Lawrence static uint64_t
zs_uint64_used_scale(uint64_t total,uint64_t used,uint64_t scale,boolean_t cap_at_100)841*efd4c9b6SSteve Lawrence zs_uint64_used_scale(uint64_t total, uint64_t used, uint64_t scale,
842*efd4c9b6SSteve Lawrence     boolean_t cap_at_100)
843*efd4c9b6SSteve Lawrence {
844*efd4c9b6SSteve Lawrence 	double dtotal, dused, pct, dscale;
845*efd4c9b6SSteve Lawrence 
846*efd4c9b6SSteve Lawrence 	/* If no time yet, treat as zero */
847*efd4c9b6SSteve Lawrence 	if (total == 0)
848*efd4c9b6SSteve Lawrence 		return (0);
849*efd4c9b6SSteve Lawrence 
850*efd4c9b6SSteve Lawrence 	dtotal = (double)total;
851*efd4c9b6SSteve Lawrence 	dused = (double)used;
852*efd4c9b6SSteve Lawrence 
853*efd4c9b6SSteve Lawrence 	dscale = (double)scale;
854*efd4c9b6SSteve Lawrence 	pct = dused / dtotal * dscale;
855*efd4c9b6SSteve Lawrence 	if (cap_at_100 && pct > dscale)
856*efd4c9b6SSteve Lawrence 		pct = dscale;
857*efd4c9b6SSteve Lawrence 
858*efd4c9b6SSteve Lawrence 	return ((uint64_t)pct);
859*efd4c9b6SSteve Lawrence }
860*efd4c9b6SSteve Lawrence 
861*efd4c9b6SSteve Lawrence /*
862*efd4c9b6SSteve Lawrence  * Convert a total and used value into a percent used.
863*efd4c9b6SSteve Lawrence  */
864*efd4c9b6SSteve Lawrence static uint_t
zs_uint64_used_pct(uint64_t total,uint64_t used,boolean_t cap_at_100)865*efd4c9b6SSteve Lawrence zs_uint64_used_pct(uint64_t total, uint64_t used, boolean_t cap_at_100)
866*efd4c9b6SSteve Lawrence {
867*efd4c9b6SSteve Lawrence 	return ((uint_t)zs_uint64_used_scale(total, used, ZSD_PCT_INT,
868*efd4c9b6SSteve Lawrence 	    cap_at_100));
869*efd4c9b6SSteve Lawrence }
870*efd4c9b6SSteve Lawrence 
871*efd4c9b6SSteve Lawrence static uint_t
zs_zone_cpu_cap_pct(zs_zone_t * zone)872*efd4c9b6SSteve Lawrence zs_zone_cpu_cap_pct(zs_zone_t *zone)
873*efd4c9b6SSteve Lawrence {
874*efd4c9b6SSteve Lawrence 	if (zone->zsz_cpu_cap == ZS_LIMIT_NONE)
875*efd4c9b6SSteve Lawrence 		return (ZS_PCT_NONE);
876*efd4c9b6SSteve Lawrence 
877*efd4c9b6SSteve Lawrence 	return (zs_ts_used_pct(&zone->zsz_cap_time, &zone->zsz_cpu_usage,
878*efd4c9b6SSteve Lawrence 	    B_TRUE));
879*efd4c9b6SSteve Lawrence }
880*efd4c9b6SSteve Lawrence 
881*efd4c9b6SSteve Lawrence static uint_t
zs_zone_cpu_shares_pct(zs_zone_t * zone)882*efd4c9b6SSteve Lawrence zs_zone_cpu_shares_pct(zs_zone_t *zone)
883*efd4c9b6SSteve Lawrence {
884*efd4c9b6SSteve Lawrence 	if (zone->zsz_cpu_shares == ZS_LIMIT_NONE)
885*efd4c9b6SSteve Lawrence 		return (ZS_PCT_NONE);
886*efd4c9b6SSteve Lawrence 
887*efd4c9b6SSteve Lawrence 	if (zone->zsz_cpu_shares == ZS_SHARES_UNLIMITED)
888*efd4c9b6SSteve Lawrence 		return (ZS_PCT_NONE);
889*efd4c9b6SSteve Lawrence 
890*efd4c9b6SSteve Lawrence 	if ((zone->zsz_scheds & ZS_SCHED_FSS) == 0)
891*efd4c9b6SSteve Lawrence 		return (ZS_PCT_NONE);
892*efd4c9b6SSteve Lawrence 
893*efd4c9b6SSteve Lawrence 	return (zs_ts_used_pct(&zone->zsz_share_time, &zone->zsz_cpu_usage,
894*efd4c9b6SSteve Lawrence 	    B_FALSE));
895*efd4c9b6SSteve Lawrence }
896*efd4c9b6SSteve Lawrence 
897*efd4c9b6SSteve Lawrence static uint64_t
zs_zone_physical_memory_cap(zs_zone_t * zone)898*efd4c9b6SSteve Lawrence zs_zone_physical_memory_cap(zs_zone_t *zone)
899*efd4c9b6SSteve Lawrence {
900*efd4c9b6SSteve Lawrence 	return (zone->zsz_ram_cap);
901*efd4c9b6SSteve Lawrence }
902*efd4c9b6SSteve Lawrence 
903*efd4c9b6SSteve Lawrence static uint64_t
zs_zone_virtual_memory_cap(zs_zone_t * zone)904*efd4c9b6SSteve Lawrence zs_zone_virtual_memory_cap(zs_zone_t *zone)
905*efd4c9b6SSteve Lawrence {
906*efd4c9b6SSteve Lawrence 	return (zone->zsz_vm_cap);
907*efd4c9b6SSteve Lawrence }
908*efd4c9b6SSteve Lawrence 
909*efd4c9b6SSteve Lawrence static uint64_t
zs_zone_locked_memory_cap(zs_zone_t * zone)910*efd4c9b6SSteve Lawrence zs_zone_locked_memory_cap(zs_zone_t *zone)
911*efd4c9b6SSteve Lawrence {
912*efd4c9b6SSteve Lawrence 	return (zone->zsz_locked_cap);
913*efd4c9b6SSteve Lawrence }
914*efd4c9b6SSteve Lawrence 
915*efd4c9b6SSteve Lawrence static uint64_t
zs_zone_physical_memory_cap_used(zs_zone_t * zone)916*efd4c9b6SSteve Lawrence zs_zone_physical_memory_cap_used(zs_zone_t *zone)
917*efd4c9b6SSteve Lawrence {
918*efd4c9b6SSteve Lawrence 	if (zone->zsz_ram_cap == ZS_LIMIT_NONE)
919*efd4c9b6SSteve Lawrence 		return (ZS_LIMIT_NONE);
920*efd4c9b6SSteve Lawrence 
921*efd4c9b6SSteve Lawrence 	return (zone->zsz_usage_ram);
922*efd4c9b6SSteve Lawrence }
923*efd4c9b6SSteve Lawrence 
924*efd4c9b6SSteve Lawrence static uint64_t
zs_zone_virtual_memory_cap_used(zs_zone_t * zone)925*efd4c9b6SSteve Lawrence zs_zone_virtual_memory_cap_used(zs_zone_t *zone)
926*efd4c9b6SSteve Lawrence {
927*efd4c9b6SSteve Lawrence 	if (zone->zsz_vm_cap == ZS_LIMIT_NONE)
928*efd4c9b6SSteve Lawrence 		return (ZS_LIMIT_NONE);
929*efd4c9b6SSteve Lawrence 
930*efd4c9b6SSteve Lawrence 	return (zone->zsz_usage_vm);
931*efd4c9b6SSteve Lawrence }
932*efd4c9b6SSteve Lawrence 
933*efd4c9b6SSteve Lawrence static uint64_t
zs_zone_locked_memory_cap_used(zs_zone_t * zone)934*efd4c9b6SSteve Lawrence zs_zone_locked_memory_cap_used(zs_zone_t *zone)
935*efd4c9b6SSteve Lawrence {
936*efd4c9b6SSteve Lawrence 	if (zone->zsz_locked_cap == ZS_LIMIT_NONE)
937*efd4c9b6SSteve Lawrence 		return (ZS_LIMIT_NONE);
938*efd4c9b6SSteve Lawrence 
939*efd4c9b6SSteve Lawrence 	return (zone->zsz_usage_locked);
940*efd4c9b6SSteve Lawrence }
941*efd4c9b6SSteve Lawrence 
942*efd4c9b6SSteve Lawrence static int
zs_pset_name(zs_pset_t * pset,char * name,size_t len)943*efd4c9b6SSteve Lawrence zs_pset_name(zs_pset_t *pset, char *name, size_t len)
944*efd4c9b6SSteve Lawrence {
945*efd4c9b6SSteve Lawrence 	return (strlcpy(name, pset->zsp_name, len));
946*efd4c9b6SSteve Lawrence }
947*efd4c9b6SSteve Lawrence 
948*efd4c9b6SSteve Lawrence static psetid_t
zs_pset_id(zs_pset_t * pset)949*efd4c9b6SSteve Lawrence zs_pset_id(zs_pset_t *pset)
950*efd4c9b6SSteve Lawrence {
951*efd4c9b6SSteve Lawrence 	return (pset->zsp_id);
952*efd4c9b6SSteve Lawrence }
953*efd4c9b6SSteve Lawrence 
954*efd4c9b6SSteve Lawrence static uint64_t
zs_pset_size(zs_pset_t * pset)955*efd4c9b6SSteve Lawrence zs_pset_size(zs_pset_t *pset)
956*efd4c9b6SSteve Lawrence {
957*efd4c9b6SSteve Lawrence 	return (pset->zsp_size);
958*efd4c9b6SSteve Lawrence }
959*efd4c9b6SSteve Lawrence 
960*efd4c9b6SSteve Lawrence static uint64_t
zs_pset_online(zs_pset_t * pset)961*efd4c9b6SSteve Lawrence zs_pset_online(zs_pset_t *pset)
962*efd4c9b6SSteve Lawrence {
963*efd4c9b6SSteve Lawrence 	return (pset->zsp_online);
964*efd4c9b6SSteve Lawrence }
965*efd4c9b6SSteve Lawrence 
966*efd4c9b6SSteve Lawrence uint64_t
zs_pset_min(zs_pset_t * pset)967*efd4c9b6SSteve Lawrence zs_pset_min(zs_pset_t *pset)
968*efd4c9b6SSteve Lawrence {
969*efd4c9b6SSteve Lawrence 	return (pset->zsp_min);
970*efd4c9b6SSteve Lawrence }
971*efd4c9b6SSteve Lawrence 
972*efd4c9b6SSteve Lawrence uint64_t
zs_pset_max(zs_pset_t * pset)973*efd4c9b6SSteve Lawrence zs_pset_max(zs_pset_t *pset)
974*efd4c9b6SSteve Lawrence {
975*efd4c9b6SSteve Lawrence 	return (pset->zsp_max);
976*efd4c9b6SSteve Lawrence }
977*efd4c9b6SSteve Lawrence 
978*efd4c9b6SSteve Lawrence static uint_t
zs_pset_schedulers(zs_pset_t * pset)979*efd4c9b6SSteve Lawrence zs_pset_schedulers(zs_pset_t *pset)
980*efd4c9b6SSteve Lawrence {
981*efd4c9b6SSteve Lawrence 	return (pset->zsp_scheds);
982*efd4c9b6SSteve Lawrence }
983*efd4c9b6SSteve Lawrence 
984*efd4c9b6SSteve Lawrence static uint_t
zs_pset_zone_schedulers(zs_pset_zone_t * pz)985*efd4c9b6SSteve Lawrence zs_pset_zone_schedulers(zs_pset_zone_t *pz)
986*efd4c9b6SSteve Lawrence {
987*efd4c9b6SSteve Lawrence 	return (pz->zspz_scheds);
988*efd4c9b6SSteve Lawrence }
989*efd4c9b6SSteve Lawrence 
990*efd4c9b6SSteve Lawrence static uint64_t
zs_pset_cpu_shares(zs_pset_t * pset)991*efd4c9b6SSteve Lawrence zs_pset_cpu_shares(zs_pset_t *pset)
992*efd4c9b6SSteve Lawrence {
993*efd4c9b6SSteve Lawrence 	if (!(pset->zsp_scheds & ZS_SCHED_FSS))
994*efd4c9b6SSteve Lawrence 		return (ZS_LIMIT_NONE);
995*efd4c9b6SSteve Lawrence 
996*efd4c9b6SSteve Lawrence 	return (pset->zsp_cpu_shares);
997*efd4c9b6SSteve Lawrence }
998*efd4c9b6SSteve Lawrence 
999*efd4c9b6SSteve Lawrence static uint64_t
zs_pset_zone_cpu_shares(zs_pset_zone_t * pz)1000*efd4c9b6SSteve Lawrence zs_pset_zone_cpu_shares(zs_pset_zone_t *pz)
1001*efd4c9b6SSteve Lawrence {
1002*efd4c9b6SSteve Lawrence 	if (!(pz->zspz_scheds & ZS_SCHED_FSS))
1003*efd4c9b6SSteve Lawrence 		return (ZS_LIMIT_NONE);
1004*efd4c9b6SSteve Lawrence 
1005*efd4c9b6SSteve Lawrence 	return (pz->zspz_cpu_shares);
1006*efd4c9b6SSteve Lawrence }
1007*efd4c9b6SSteve Lawrence 
1008*efd4c9b6SSteve Lawrence static uint_t
zs_pset_cputype(zs_pset_t * pset)1009*efd4c9b6SSteve Lawrence zs_pset_cputype(zs_pset_t *pset)
1010*efd4c9b6SSteve Lawrence {
1011*efd4c9b6SSteve Lawrence 	return (pset->zsp_cputype);
1012*efd4c9b6SSteve Lawrence }
1013*efd4c9b6SSteve Lawrence 
1014*efd4c9b6SSteve Lawrence static void
zs_pset_usage_all(zs_pset_t * pset,timestruc_t * ts)1015*efd4c9b6SSteve Lawrence zs_pset_usage_all(zs_pset_t *pset, timestruc_t *ts)
1016*efd4c9b6SSteve Lawrence {
1017*efd4c9b6SSteve Lawrence 	timestruc_t tot;
1018*efd4c9b6SSteve Lawrence 
1019*efd4c9b6SSteve Lawrence 	tot = pset->zsp_usage_kern;
1020*efd4c9b6SSteve Lawrence 	TIMESTRUC_ADD_TIMESTRUC(tot, pset->zsp_usage_zones);
1021*efd4c9b6SSteve Lawrence 	*ts = tot;
1022*efd4c9b6SSteve Lawrence }
1023*efd4c9b6SSteve Lawrence 
1024*efd4c9b6SSteve Lawrence static void
zs_pset_usage_idle(zs_pset_t * pset,timestruc_t * ts)1025*efd4c9b6SSteve Lawrence zs_pset_usage_idle(zs_pset_t *pset, timestruc_t *ts)
1026*efd4c9b6SSteve Lawrence {
1027*efd4c9b6SSteve Lawrence 	timestruc_t tot, time, idle;
1028*efd4c9b6SSteve Lawrence 
1029*efd4c9b6SSteve Lawrence 	tot = pset->zsp_usage_kern;
1030*efd4c9b6SSteve Lawrence 	TIMESTRUC_ADD_TIMESTRUC(tot, pset->zsp_usage_zones);
1031*efd4c9b6SSteve Lawrence 	time = pset->zsp_total_time;
1032*efd4c9b6SSteve Lawrence 	TIMESTRUC_DELTA(idle, time, tot);
1033*efd4c9b6SSteve Lawrence 	*ts = idle;
1034*efd4c9b6SSteve Lawrence }
1035*efd4c9b6SSteve Lawrence 
1036*efd4c9b6SSteve Lawrence static void
zs_pset_usage_kernel(zs_pset_t * pset,timestruc_t * ts)1037*efd4c9b6SSteve Lawrence zs_pset_usage_kernel(zs_pset_t *pset, timestruc_t *ts)
1038*efd4c9b6SSteve Lawrence {
1039*efd4c9b6SSteve Lawrence 	*ts = pset->zsp_usage_kern;
1040*efd4c9b6SSteve Lawrence }
1041*efd4c9b6SSteve Lawrence 
1042*efd4c9b6SSteve Lawrence static void
zs_pset_usage_zones(zs_pset_t * pset,timestruc_t * ts)1043*efd4c9b6SSteve Lawrence zs_pset_usage_zones(zs_pset_t *pset, timestruc_t *ts)
1044*efd4c9b6SSteve Lawrence {
1045*efd4c9b6SSteve Lawrence 	*ts = pset->zsp_usage_zones;
1046*efd4c9b6SSteve Lawrence }
1047*efd4c9b6SSteve Lawrence 
1048*efd4c9b6SSteve Lawrence static uint_t
zs_pset_usage_all_pct(zs_pset_t * pset)1049*efd4c9b6SSteve Lawrence zs_pset_usage_all_pct(zs_pset_t *pset)
1050*efd4c9b6SSteve Lawrence {
1051*efd4c9b6SSteve Lawrence 	timestruc_t tot;
1052*efd4c9b6SSteve Lawrence 
1053*efd4c9b6SSteve Lawrence 	tot = pset->zsp_usage_kern;
1054*efd4c9b6SSteve Lawrence 	TIMESTRUC_ADD_TIMESTRUC(tot, pset->zsp_usage_zones);
1055*efd4c9b6SSteve Lawrence 
1056*efd4c9b6SSteve Lawrence 	return (zs_ts_used_pct(&pset->zsp_total_time, &tot, B_TRUE));
1057*efd4c9b6SSteve Lawrence }
1058*efd4c9b6SSteve Lawrence 
1059*efd4c9b6SSteve Lawrence static uint_t
zs_pset_usage_idle_pct(zs_pset_t * pset)1060*efd4c9b6SSteve Lawrence zs_pset_usage_idle_pct(zs_pset_t *pset)
1061*efd4c9b6SSteve Lawrence {
1062*efd4c9b6SSteve Lawrence 	timestruc_t tot, idle;
1063*efd4c9b6SSteve Lawrence 
1064*efd4c9b6SSteve Lawrence 	tot = pset->zsp_usage_kern;
1065*efd4c9b6SSteve Lawrence 	TIMESTRUC_ADD_TIMESTRUC(tot, pset->zsp_usage_zones);
1066*efd4c9b6SSteve Lawrence 	TIMESTRUC_DELTA(idle, pset->zsp_total_time, tot);
1067*efd4c9b6SSteve Lawrence 
1068*efd4c9b6SSteve Lawrence 	return (zs_ts_used_pct(&pset->zsp_total_time, &idle, B_TRUE));
1069*efd4c9b6SSteve Lawrence }
1070*efd4c9b6SSteve Lawrence 
1071*efd4c9b6SSteve Lawrence static uint_t
zs_pset_usage_kernel_pct(zs_pset_t * pset)1072*efd4c9b6SSteve Lawrence zs_pset_usage_kernel_pct(zs_pset_t *pset)
1073*efd4c9b6SSteve Lawrence {
1074*efd4c9b6SSteve Lawrence 	return (zs_ts_used_pct(&pset->zsp_total_time, &pset->zsp_usage_kern,
1075*efd4c9b6SSteve Lawrence 	    B_TRUE));
1076*efd4c9b6SSteve Lawrence }
1077*efd4c9b6SSteve Lawrence 
1078*efd4c9b6SSteve Lawrence static uint_t
zs_pset_usage_zones_pct(zs_pset_t * pset)1079*efd4c9b6SSteve Lawrence zs_pset_usage_zones_pct(zs_pset_t *pset)
1080*efd4c9b6SSteve Lawrence {
1081*efd4c9b6SSteve Lawrence 	return (zs_ts_used_pct(&pset->zsp_total_time, &pset->zsp_usage_zones,
1082*efd4c9b6SSteve Lawrence 	    B_TRUE));
1083*efd4c9b6SSteve Lawrence }
1084*efd4c9b6SSteve Lawrence 
1085*efd4c9b6SSteve Lawrence static uint_t
zs_pset_usage_all_cpus(zs_pset_t * pset)1086*efd4c9b6SSteve Lawrence zs_pset_usage_all_cpus(zs_pset_t *pset)
1087*efd4c9b6SSteve Lawrence {
1088*efd4c9b6SSteve Lawrence 	timestruc_t tot;
1089*efd4c9b6SSteve Lawrence 
1090*efd4c9b6SSteve Lawrence 	tot = pset->zsp_usage_kern;
1091*efd4c9b6SSteve Lawrence 	TIMESTRUC_ADD_TIMESTRUC(tot, pset->zsp_usage_zones);
1092*efd4c9b6SSteve Lawrence 	return (zs_ts_used_cpus(&pset->zsp_total_time, &tot, pset->zsp_online,
1093*efd4c9b6SSteve Lawrence 	    B_TRUE));
1094*efd4c9b6SSteve Lawrence }
1095*efd4c9b6SSteve Lawrence 
1096*efd4c9b6SSteve Lawrence static uint_t
zs_pset_usage_idle_cpus(zs_pset_t * pset)1097*efd4c9b6SSteve Lawrence zs_pset_usage_idle_cpus(zs_pset_t *pset)
1098*efd4c9b6SSteve Lawrence {
1099*efd4c9b6SSteve Lawrence 	timestruc_t tot, idle;
1100*efd4c9b6SSteve Lawrence 
1101*efd4c9b6SSteve Lawrence 	tot = pset->zsp_usage_kern;
1102*efd4c9b6SSteve Lawrence 	TIMESTRUC_ADD_TIMESTRUC(tot, pset->zsp_usage_zones);
1103*efd4c9b6SSteve Lawrence 	TIMESTRUC_DELTA(idle, pset->zsp_total_time, tot);
1104*efd4c9b6SSteve Lawrence 
1105*efd4c9b6SSteve Lawrence 	return (zs_ts_used_cpus(&pset->zsp_total_time, &tot, pset->zsp_online,
1106*efd4c9b6SSteve Lawrence 	    B_TRUE));
1107*efd4c9b6SSteve Lawrence }
1108*efd4c9b6SSteve Lawrence 
1109*efd4c9b6SSteve Lawrence static uint_t
zs_pset_usage_kernel_cpus(zs_pset_t * pset)1110*efd4c9b6SSteve Lawrence zs_pset_usage_kernel_cpus(zs_pset_t *pset)
1111*efd4c9b6SSteve Lawrence {
1112*efd4c9b6SSteve Lawrence 	return (zs_ts_used_cpus(&pset->zsp_total_time, &pset->zsp_usage_kern,
1113*efd4c9b6SSteve Lawrence 	    pset->zsp_online, B_TRUE));
1114*efd4c9b6SSteve Lawrence }
1115*efd4c9b6SSteve Lawrence 
1116*efd4c9b6SSteve Lawrence static uint64_t
zs_pset_usage_zones_cpus(zs_pset_t * pset)1117*efd4c9b6SSteve Lawrence zs_pset_usage_zones_cpus(zs_pset_t *pset)
1118*efd4c9b6SSteve Lawrence {
1119*efd4c9b6SSteve Lawrence 	return (zs_ts_used_cpus(&pset->zsp_total_time, &pset->zsp_usage_zones,
1120*efd4c9b6SSteve Lawrence 	    pset->zsp_online, B_TRUE));
1121*efd4c9b6SSteve Lawrence }
1122*efd4c9b6SSteve Lawrence 
1123*efd4c9b6SSteve Lawrence static void
zs_pset_zone_usage_time(zs_pset_zone_t * pz,timestruc_t * t)1124*efd4c9b6SSteve Lawrence zs_pset_zone_usage_time(zs_pset_zone_t *pz, timestruc_t *t)
1125*efd4c9b6SSteve Lawrence {
1126*efd4c9b6SSteve Lawrence 	*t = pz->zspz_cpu_usage;
1127*efd4c9b6SSteve Lawrence }
1128*efd4c9b6SSteve Lawrence 
1129*efd4c9b6SSteve Lawrence static uint_t
zs_pset_zone_usage_cpus(zs_pset_zone_t * pz)1130*efd4c9b6SSteve Lawrence zs_pset_zone_usage_cpus(zs_pset_zone_t *pz)
1131*efd4c9b6SSteve Lawrence {
1132*efd4c9b6SSteve Lawrence 	return (zs_ts_used_cpus(&pz->zspz_pset->zsp_total_time,
1133*efd4c9b6SSteve Lawrence 	    &pz->zspz_cpu_usage, pz->zspz_pset->zsp_online, B_TRUE));
1134*efd4c9b6SSteve Lawrence }
1135*efd4c9b6SSteve Lawrence 
1136*efd4c9b6SSteve Lawrence static uint_t
zs_pset_zone_usage_pct_pset(zs_pset_zone_t * pz)1137*efd4c9b6SSteve Lawrence zs_pset_zone_usage_pct_pset(zs_pset_zone_t *pz)
1138*efd4c9b6SSteve Lawrence {
1139*efd4c9b6SSteve Lawrence 	return (zs_ts_used_pct(&pz->zspz_pset->zsp_total_time,
1140*efd4c9b6SSteve Lawrence 	    &pz->zspz_cpu_usage, B_TRUE));
1141*efd4c9b6SSteve Lawrence }
1142*efd4c9b6SSteve Lawrence 
1143*efd4c9b6SSteve Lawrence static uint64_t
zs_pset_zone_cpu_cap(zs_pset_zone_t * pz)1144*efd4c9b6SSteve Lawrence zs_pset_zone_cpu_cap(zs_pset_zone_t *pz)
1145*efd4c9b6SSteve Lawrence {
1146*efd4c9b6SSteve Lawrence 	return (pz->zspz_zone->zsz_cpu_cap);
1147*efd4c9b6SSteve Lawrence }
1148*efd4c9b6SSteve Lawrence 
1149*efd4c9b6SSteve Lawrence static uint_t
zs_pset_zone_usage_pct_cpu_cap(zs_pset_zone_t * pz)1150*efd4c9b6SSteve Lawrence zs_pset_zone_usage_pct_cpu_cap(zs_pset_zone_t *pz)
1151*efd4c9b6SSteve Lawrence {
1152*efd4c9b6SSteve Lawrence 	zs_zone_t *zone = pz->zspz_zone;
1153*efd4c9b6SSteve Lawrence 
1154*efd4c9b6SSteve Lawrence 	if (zone->zsz_cpu_cap == ZS_LIMIT_NONE) {
1155*efd4c9b6SSteve Lawrence 		return (ZS_PCT_NONE);
1156*efd4c9b6SSteve Lawrence 	}
1157*efd4c9b6SSteve Lawrence 	return (zs_ts_used_pct(&zone->zsz_cap_time,
1158*efd4c9b6SSteve Lawrence 	    &pz->zspz_cpu_usage, B_TRUE));
1159*efd4c9b6SSteve Lawrence }
1160*efd4c9b6SSteve Lawrence 
1161*efd4c9b6SSteve Lawrence /*
1162*efd4c9b6SSteve Lawrence  * Return the fraction of total shares for a pset allocated to the zone.
1163*efd4c9b6SSteve Lawrence  */
1164*efd4c9b6SSteve Lawrence static uint_t
zs_pset_zone_usage_pct_pset_shares(zs_pset_zone_t * pz)1165*efd4c9b6SSteve Lawrence zs_pset_zone_usage_pct_pset_shares(zs_pset_zone_t *pz)
1166*efd4c9b6SSteve Lawrence {
1167*efd4c9b6SSteve Lawrence 	zs_pset_t *pset = pz->zspz_pset;
1168*efd4c9b6SSteve Lawrence 
1169*efd4c9b6SSteve Lawrence 	if (!(pz->zspz_scheds & ZS_SCHED_FSS))
1170*efd4c9b6SSteve Lawrence 		return (ZS_PCT_NONE);
1171*efd4c9b6SSteve Lawrence 
1172*efd4c9b6SSteve Lawrence 	if (pz->zspz_cpu_shares == ZS_LIMIT_NONE)
1173*efd4c9b6SSteve Lawrence 		return (ZS_PCT_NONE);
1174*efd4c9b6SSteve Lawrence 
1175*efd4c9b6SSteve Lawrence 	if (pz->zspz_cpu_shares == ZS_SHARES_UNLIMITED)
1176*efd4c9b6SSteve Lawrence 		return (ZS_PCT_NONE);
1177*efd4c9b6SSteve Lawrence 
1178*efd4c9b6SSteve Lawrence 	if (pz->zspz_pset->zsp_cpu_shares == 0)
1179*efd4c9b6SSteve Lawrence 		return (0);
1180*efd4c9b6SSteve Lawrence 
1181*efd4c9b6SSteve Lawrence 	if (pz->zspz_cpu_shares == 0)
1182*efd4c9b6SSteve Lawrence 		return (0);
1183*efd4c9b6SSteve Lawrence 
1184*efd4c9b6SSteve Lawrence 	return (zs_uint64_used_pct(pset->zsp_cpu_shares, pz->zspz_cpu_shares,
1185*efd4c9b6SSteve Lawrence 	    B_TRUE));
1186*efd4c9b6SSteve Lawrence }
1187*efd4c9b6SSteve Lawrence 
1188*efd4c9b6SSteve Lawrence /*
1189*efd4c9b6SSteve Lawrence  * Of a zones shares, what percent of cpu time is it using.  For instance,
1190*efd4c9b6SSteve Lawrence  * if a zone has 50% of shares, and is using 50% of the cpu time, then it is
1191*efd4c9b6SSteve Lawrence  * using 100% of its share.
1192*efd4c9b6SSteve Lawrence  */
1193*efd4c9b6SSteve Lawrence static uint_t
zs_pset_zone_usage_pct_cpu_shares(zs_pset_zone_t * pz)1194*efd4c9b6SSteve Lawrence zs_pset_zone_usage_pct_cpu_shares(zs_pset_zone_t *pz)
1195*efd4c9b6SSteve Lawrence {
1196*efd4c9b6SSteve Lawrence 	timestruc_t tot, time;
1197*efd4c9b6SSteve Lawrence 	double sharefactor;
1198*efd4c9b6SSteve Lawrence 	double total;
1199*efd4c9b6SSteve Lawrence 	double used;
1200*efd4c9b6SSteve Lawrence 	double pct;
1201*efd4c9b6SSteve Lawrence 
1202*efd4c9b6SSteve Lawrence 	if (!(pz->zspz_scheds & ZS_SCHED_FSS))
1203*efd4c9b6SSteve Lawrence 		return (ZS_PCT_NONE);
1204*efd4c9b6SSteve Lawrence 
1205*efd4c9b6SSteve Lawrence 	if (pz->zspz_cpu_shares == ZS_LIMIT_NONE)
1206*efd4c9b6SSteve Lawrence 		return (ZS_PCT_NONE);
1207*efd4c9b6SSteve Lawrence 
1208*efd4c9b6SSteve Lawrence 	if (pz->zspz_cpu_shares == ZS_SHARES_UNLIMITED)
1209*efd4c9b6SSteve Lawrence 		return (ZS_PCT_NONE);
1210*efd4c9b6SSteve Lawrence 
1211*efd4c9b6SSteve Lawrence 	if (pz->zspz_cpu_shares == 0)
1212*efd4c9b6SSteve Lawrence 		return (ZS_PCT_NONE);
1213*efd4c9b6SSteve Lawrence 
1214*efd4c9b6SSteve Lawrence 	sharefactor = (double)zs_pset_zone_usage_pct_pset_shares(pz);
1215*efd4c9b6SSteve Lawrence 
1216*efd4c9b6SSteve Lawrence 	/* Common scaling function won't do sharefactor. */
1217*efd4c9b6SSteve Lawrence 	time = pz->zspz_pset->zsp_total_time;
1218*efd4c9b6SSteve Lawrence 	tot = pz->zspz_cpu_usage;
1219*efd4c9b6SSteve Lawrence 
1220*efd4c9b6SSteve Lawrence 	total = (double)time.tv_sec +
1221*efd4c9b6SSteve Lawrence 	    ((double)time.tv_nsec / (double)NANOSEC);
1222*efd4c9b6SSteve Lawrence 	total = total * (sharefactor / ZSD_PCT_DOUBLE);
1223*efd4c9b6SSteve Lawrence 	used = (double)tot.tv_sec +
1224*efd4c9b6SSteve Lawrence 	    ((double)tot.tv_nsec / (double)NANOSEC);
1225*efd4c9b6SSteve Lawrence 
1226*efd4c9b6SSteve Lawrence 	pct = used / total * ZSD_PCT_DOUBLE;
1227*efd4c9b6SSteve Lawrence 	/* Allow percent of share used to exceed 100% */
1228*efd4c9b6SSteve Lawrence 	return ((uint_t)pct);
1229*efd4c9b6SSteve Lawrence }
1230*efd4c9b6SSteve Lawrence 
1231*efd4c9b6SSteve Lawrence static void
zs_cpu_total_time(zs_usage_t * usage,timestruc_t * ts)1232*efd4c9b6SSteve Lawrence zs_cpu_total_time(zs_usage_t *usage, timestruc_t *ts)
1233*efd4c9b6SSteve Lawrence {
1234*efd4c9b6SSteve Lawrence 	*ts = usage->zsu_system->zss_cpu_total_time;
1235*efd4c9b6SSteve Lawrence }
1236*efd4c9b6SSteve Lawrence 
1237*efd4c9b6SSteve Lawrence static void
zs_cpu_usage_all(zs_usage_t * usage,timestruc_t * ts)1238*efd4c9b6SSteve Lawrence zs_cpu_usage_all(zs_usage_t *usage, timestruc_t *ts)
1239*efd4c9b6SSteve Lawrence {
1240*efd4c9b6SSteve Lawrence 	timestruc_t tot;
1241*efd4c9b6SSteve Lawrence 
1242*efd4c9b6SSteve Lawrence 	tot.tv_sec = 0;
1243*efd4c9b6SSteve Lawrence 	tot.tv_nsec = 0;
1244*efd4c9b6SSteve Lawrence 	TIMESTRUC_ADD_TIMESTRUC(tot, usage->zsu_system->zss_cpu_usage_kern);
1245*efd4c9b6SSteve Lawrence 	TIMESTRUC_ADD_TIMESTRUC(tot, usage->zsu_system->zss_cpu_usage_zones);
1246*efd4c9b6SSteve Lawrence 	*ts = tot;
1247*efd4c9b6SSteve Lawrence }
1248*efd4c9b6SSteve Lawrence 
1249*efd4c9b6SSteve Lawrence static void
zs_cpu_usage_idle(zs_usage_t * usage,timestruc_t * ts)1250*efd4c9b6SSteve Lawrence zs_cpu_usage_idle(zs_usage_t *usage, timestruc_t *ts)
1251*efd4c9b6SSteve Lawrence {
1252*efd4c9b6SSteve Lawrence 	timestruc_t tot, time, idle;
1253*efd4c9b6SSteve Lawrence 
1254*efd4c9b6SSteve Lawrence 	tot.tv_sec = 0;
1255*efd4c9b6SSteve Lawrence 	tot.tv_nsec = 0;
1256*efd4c9b6SSteve Lawrence 	tot = usage->zsu_system->zss_cpu_usage_kern;
1257*efd4c9b6SSteve Lawrence 	TIMESTRUC_ADD_TIMESTRUC(tot, usage->zsu_system->zss_cpu_usage_zones);
1258*efd4c9b6SSteve Lawrence 	time = usage->zsu_system->zss_cpu_total_time;
1259*efd4c9b6SSteve Lawrence 	TIMESTRUC_DELTA(idle, time, tot);
1260*efd4c9b6SSteve Lawrence 	*ts = idle;
1261*efd4c9b6SSteve Lawrence }
1262*efd4c9b6SSteve Lawrence 
1263*efd4c9b6SSteve Lawrence static uint_t
zs_cpu_usage_all_pct(zs_usage_t * usage)1264*efd4c9b6SSteve Lawrence zs_cpu_usage_all_pct(zs_usage_t *usage)
1265*efd4c9b6SSteve Lawrence {
1266*efd4c9b6SSteve Lawrence 	timestruc_t tot;
1267*efd4c9b6SSteve Lawrence 
1268*efd4c9b6SSteve Lawrence 	tot = usage->zsu_system->zss_cpu_usage_kern;
1269*efd4c9b6SSteve Lawrence 	TIMESTRUC_ADD_TIMESTRUC(tot, usage->zsu_system->zss_cpu_usage_zones);
1270*efd4c9b6SSteve Lawrence 
1271*efd4c9b6SSteve Lawrence 	return (zs_ts_used_pct(&usage->zsu_system->zss_cpu_total_time,
1272*efd4c9b6SSteve Lawrence 	    &tot, B_TRUE));
1273*efd4c9b6SSteve Lawrence }
1274*efd4c9b6SSteve Lawrence 
1275*efd4c9b6SSteve Lawrence 
1276*efd4c9b6SSteve Lawrence static uint_t
zs_cpu_usage_idle_pct(zs_usage_t * usage)1277*efd4c9b6SSteve Lawrence zs_cpu_usage_idle_pct(zs_usage_t *usage)
1278*efd4c9b6SSteve Lawrence {
1279*efd4c9b6SSteve Lawrence 	timestruc_t tot, idle;
1280*efd4c9b6SSteve Lawrence 
1281*efd4c9b6SSteve Lawrence 	tot = usage->zsu_system->zss_cpu_usage_kern;
1282*efd4c9b6SSteve Lawrence 	TIMESTRUC_ADD_TIMESTRUC(tot, usage->zsu_system->zss_cpu_usage_zones);
1283*efd4c9b6SSteve Lawrence 	TIMESTRUC_DELTA(idle, usage->zsu_system->zss_cpu_total_time, tot);
1284*efd4c9b6SSteve Lawrence 
1285*efd4c9b6SSteve Lawrence 	return (zs_ts_used_pct(&usage->zsu_system->zss_cpu_total_time,
1286*efd4c9b6SSteve Lawrence 	    &idle, B_TRUE));
1287*efd4c9b6SSteve Lawrence }
1288*efd4c9b6SSteve Lawrence 
1289*efd4c9b6SSteve Lawrence static void
zs_cpu_usage_kernel(zs_usage_t * usage,timestruc_t * ts)1290*efd4c9b6SSteve Lawrence zs_cpu_usage_kernel(zs_usage_t *usage, timestruc_t *ts)
1291*efd4c9b6SSteve Lawrence {
1292*efd4c9b6SSteve Lawrence 	*ts = usage->zsu_system->zss_cpu_usage_kern;
1293*efd4c9b6SSteve Lawrence }
1294*efd4c9b6SSteve Lawrence 
1295*efd4c9b6SSteve Lawrence static uint_t
zs_cpu_usage_kernel_pct(zs_usage_t * usage)1296*efd4c9b6SSteve Lawrence zs_cpu_usage_kernel_pct(zs_usage_t *usage)
1297*efd4c9b6SSteve Lawrence {
1298*efd4c9b6SSteve Lawrence 	return (zs_ts_used_pct(&usage->zsu_system->zss_cpu_total_time,
1299*efd4c9b6SSteve Lawrence 	    &usage->zsu_system->zss_cpu_usage_kern, B_TRUE));
1300*efd4c9b6SSteve Lawrence }
1301*efd4c9b6SSteve Lawrence 
1302*efd4c9b6SSteve Lawrence static void
zs_cpu_usage_zones(zs_usage_t * usage,timestruc_t * ts)1303*efd4c9b6SSteve Lawrence zs_cpu_usage_zones(zs_usage_t *usage, timestruc_t *ts)
1304*efd4c9b6SSteve Lawrence {
1305*efd4c9b6SSteve Lawrence 	*ts = usage->zsu_system->zss_cpu_usage_zones;
1306*efd4c9b6SSteve Lawrence }
1307*efd4c9b6SSteve Lawrence 
1308*efd4c9b6SSteve Lawrence 
1309*efd4c9b6SSteve Lawrence static uint_t
zs_cpu_usage_zones_pct(zs_usage_t * usage)1310*efd4c9b6SSteve Lawrence zs_cpu_usage_zones_pct(zs_usage_t *usage)
1311*efd4c9b6SSteve Lawrence {
1312*efd4c9b6SSteve Lawrence 	return (zs_ts_used_pct(&usage->zsu_system->zss_cpu_total_time,
1313*efd4c9b6SSteve Lawrence 	    &usage->zsu_system->zss_cpu_usage_zones, B_TRUE));
1314*efd4c9b6SSteve Lawrence }
1315*efd4c9b6SSteve Lawrence 
1316*efd4c9b6SSteve Lawrence 
1317*efd4c9b6SSteve Lawrence static void
zs_cpu_usage_zone(zs_zone_t * zone,timestruc_t * ts)1318*efd4c9b6SSteve Lawrence zs_cpu_usage_zone(zs_zone_t *zone, timestruc_t *ts)
1319*efd4c9b6SSteve Lawrence {
1320*efd4c9b6SSteve Lawrence 	*ts = zone->zsz_cpu_usage;
1321*efd4c9b6SSteve Lawrence }
1322*efd4c9b6SSteve Lawrence 
1323*efd4c9b6SSteve Lawrence static uint64_t
zs_cpu_total_cpu(zs_usage_t * usage)1324*efd4c9b6SSteve Lawrence zs_cpu_total_cpu(zs_usage_t *usage)
1325*efd4c9b6SSteve Lawrence {
1326*efd4c9b6SSteve Lawrence 	return (usage->zsu_system->zss_ncpus_online * ZSD_ONE_CPU);
1327*efd4c9b6SSteve Lawrence }
1328*efd4c9b6SSteve Lawrence 
1329*efd4c9b6SSteve Lawrence static uint64_t
zs_cpu_usage_all_cpu(zs_usage_t * usage)1330*efd4c9b6SSteve Lawrence zs_cpu_usage_all_cpu(zs_usage_t *usage)
1331*efd4c9b6SSteve Lawrence {
1332*efd4c9b6SSteve Lawrence 	timestruc_t tot;
1333*efd4c9b6SSteve Lawrence 
1334*efd4c9b6SSteve Lawrence 	tot = usage->zsu_system->zss_cpu_usage_kern;
1335*efd4c9b6SSteve Lawrence 	TIMESTRUC_ADD_TIMESTRUC(tot, usage->zsu_system->zss_cpu_usage_zones);
1336*efd4c9b6SSteve Lawrence 
1337*efd4c9b6SSteve Lawrence 	return (zs_ts_used_cpus(&usage->zsu_system->zss_cpu_total_time,
1338*efd4c9b6SSteve Lawrence 	    &tot, usage->zsu_system->zss_ncpus_online, B_TRUE));
1339*efd4c9b6SSteve Lawrence }
1340*efd4c9b6SSteve Lawrence 
1341*efd4c9b6SSteve Lawrence static uint64_t
zs_cpu_usage_idle_cpu(zs_usage_t * usage)1342*efd4c9b6SSteve Lawrence zs_cpu_usage_idle_cpu(zs_usage_t *usage)
1343*efd4c9b6SSteve Lawrence {
1344*efd4c9b6SSteve Lawrence 	timestruc_t tot, idle;
1345*efd4c9b6SSteve Lawrence 
1346*efd4c9b6SSteve Lawrence 	tot = usage->zsu_system->zss_cpu_usage_kern;
1347*efd4c9b6SSteve Lawrence 	TIMESTRUC_ADD_TIMESTRUC(tot, usage->zsu_system->zss_cpu_usage_zones);
1348*efd4c9b6SSteve Lawrence 	TIMESTRUC_DELTA(idle, usage->zsu_system->zss_cpu_total_time, tot);
1349*efd4c9b6SSteve Lawrence 
1350*efd4c9b6SSteve Lawrence 	return (zs_ts_used_cpus(&usage->zsu_system->zss_cpu_total_time,
1351*efd4c9b6SSteve Lawrence 	    &idle, usage->zsu_system->zss_ncpus_online, B_TRUE));
1352*efd4c9b6SSteve Lawrence }
1353*efd4c9b6SSteve Lawrence 
1354*efd4c9b6SSteve Lawrence static uint64_t
zs_cpu_usage_kernel_cpu(zs_usage_t * usage)1355*efd4c9b6SSteve Lawrence zs_cpu_usage_kernel_cpu(zs_usage_t *usage)
1356*efd4c9b6SSteve Lawrence {
1357*efd4c9b6SSteve Lawrence 	return (zs_ts_used_cpus(&usage->zsu_system->zss_cpu_total_time,
1358*efd4c9b6SSteve Lawrence 	    &usage->zsu_system->zss_cpu_usage_kern,
1359*efd4c9b6SSteve Lawrence 	    usage->zsu_system->zss_ncpus_online, B_TRUE));
1360*efd4c9b6SSteve Lawrence }
1361*efd4c9b6SSteve Lawrence 
1362*efd4c9b6SSteve Lawrence static uint64_t
zs_cpu_usage_zones_cpu(zs_usage_t * usage)1363*efd4c9b6SSteve Lawrence zs_cpu_usage_zones_cpu(zs_usage_t *usage)
1364*efd4c9b6SSteve Lawrence {
1365*efd4c9b6SSteve Lawrence 	return (zs_ts_used_cpus(&usage->zsu_system->zss_cpu_total_time,
1366*efd4c9b6SSteve Lawrence 	    &usage->zsu_system->zss_cpu_usage_kern,
1367*efd4c9b6SSteve Lawrence 	    usage->zsu_system->zss_ncpus_online, B_TRUE));
1368*efd4c9b6SSteve Lawrence }
1369*efd4c9b6SSteve Lawrence 
1370*efd4c9b6SSteve Lawrence static uint64_t
zs_cpu_usage_zone_cpu(zs_zone_t * zone)1371*efd4c9b6SSteve Lawrence zs_cpu_usage_zone_cpu(zs_zone_t *zone)
1372*efd4c9b6SSteve Lawrence {
1373*efd4c9b6SSteve Lawrence 	return (zs_ts_used_cpus(&zone->zsz_pset_time, &zone->zsz_cpu_usage,
1374*efd4c9b6SSteve Lawrence 	    zone->zsz_cpus_online, B_TRUE));
1375*efd4c9b6SSteve Lawrence }
1376*efd4c9b6SSteve Lawrence 
1377*efd4c9b6SSteve Lawrence static uint_t
zs_cpu_usage_zone_pct(zs_zone_t * zone)1378*efd4c9b6SSteve Lawrence zs_cpu_usage_zone_pct(zs_zone_t *zone)
1379*efd4c9b6SSteve Lawrence {
1380*efd4c9b6SSteve Lawrence 	return (zs_ts_used_pct(&zone->zsz_pset_time, &zone->zsz_cpu_usage,
1381*efd4c9b6SSteve Lawrence 	    B_TRUE));
1382*efd4c9b6SSteve Lawrence }
1383*efd4c9b6SSteve Lawrence 
1384*efd4c9b6SSteve Lawrence static uint64_t
zs_physical_memory_total(zs_usage_t * usage)1385*efd4c9b6SSteve Lawrence zs_physical_memory_total(zs_usage_t *usage)
1386*efd4c9b6SSteve Lawrence {
1387*efd4c9b6SSteve Lawrence 	return (usage->zsu_system->zss_ram_total);
1388*efd4c9b6SSteve Lawrence }
1389*efd4c9b6SSteve Lawrence 
1390*efd4c9b6SSteve Lawrence 
1391*efd4c9b6SSteve Lawrence static uint64_t
zs_physical_memory_usage_all(zs_usage_t * usage)1392*efd4c9b6SSteve Lawrence zs_physical_memory_usage_all(zs_usage_t *usage)
1393*efd4c9b6SSteve Lawrence {
1394*efd4c9b6SSteve Lawrence 	return (usage->zsu_system->zss_ram_kern +
1395*efd4c9b6SSteve Lawrence 	    usage->zsu_system->zss_ram_zones);
1396*efd4c9b6SSteve Lawrence }
1397*efd4c9b6SSteve Lawrence 
1398*efd4c9b6SSteve Lawrence static uint_t
zs_physical_memory_usage_all_pct(zs_usage_t * usage)1399*efd4c9b6SSteve Lawrence zs_physical_memory_usage_all_pct(zs_usage_t *usage)
1400*efd4c9b6SSteve Lawrence {
1401*efd4c9b6SSteve Lawrence 	zs_system_t *system = usage->zsu_system;
1402*efd4c9b6SSteve Lawrence 
1403*efd4c9b6SSteve Lawrence 	return (zs_uint64_used_pct(system->zss_ram_total,
1404*efd4c9b6SSteve Lawrence 	    (system->zss_ram_kern + system->zss_ram_zones), B_TRUE));
1405*efd4c9b6SSteve Lawrence }
1406*efd4c9b6SSteve Lawrence 
1407*efd4c9b6SSteve Lawrence static uint64_t
zs_physical_memory_usage_free(zs_usage_t * usage)1408*efd4c9b6SSteve Lawrence zs_physical_memory_usage_free(zs_usage_t *usage)
1409*efd4c9b6SSteve Lawrence {
1410*efd4c9b6SSteve Lawrence 	return (usage->zsu_system->zss_ram_total -
1411*efd4c9b6SSteve Lawrence 	    (usage->zsu_system->zss_ram_kern +
1412*efd4c9b6SSteve Lawrence 	    usage->zsu_system->zss_ram_zones));
1413*efd4c9b6SSteve Lawrence }
1414*efd4c9b6SSteve Lawrence 
1415*efd4c9b6SSteve Lawrence static uint_t
zs_physical_memory_usage_free_pct(zs_usage_t * usage)1416*efd4c9b6SSteve Lawrence zs_physical_memory_usage_free_pct(zs_usage_t *usage)
1417*efd4c9b6SSteve Lawrence {
1418*efd4c9b6SSteve Lawrence 	return (ZSD_PCT_INT - zs_physical_memory_usage_all_pct(usage));
1419*efd4c9b6SSteve Lawrence }
1420*efd4c9b6SSteve Lawrence 
1421*efd4c9b6SSteve Lawrence static uint64_t
zs_physical_memory_usage_kernel(zs_usage_t * usage)1422*efd4c9b6SSteve Lawrence zs_physical_memory_usage_kernel(zs_usage_t *usage)
1423*efd4c9b6SSteve Lawrence {
1424*efd4c9b6SSteve Lawrence 	return (usage->zsu_system->zss_ram_kern);
1425*efd4c9b6SSteve Lawrence }
1426*efd4c9b6SSteve Lawrence 
1427*efd4c9b6SSteve Lawrence static uint_t
zs_physical_memory_usage_kernel_pct(zs_usage_t * usage)1428*efd4c9b6SSteve Lawrence zs_physical_memory_usage_kernel_pct(zs_usage_t *usage)
1429*efd4c9b6SSteve Lawrence {
1430*efd4c9b6SSteve Lawrence 	zs_system_t *system = usage->zsu_system;
1431*efd4c9b6SSteve Lawrence 
1432*efd4c9b6SSteve Lawrence 	return (zs_uint64_used_pct(system->zss_ram_total,
1433*efd4c9b6SSteve Lawrence 	    system->zss_ram_kern, B_TRUE));
1434*efd4c9b6SSteve Lawrence }
1435*efd4c9b6SSteve Lawrence 
1436*efd4c9b6SSteve Lawrence static uint64_t
zs_physical_memory_usage_zones(zs_usage_t * usage)1437*efd4c9b6SSteve Lawrence zs_physical_memory_usage_zones(zs_usage_t *usage)
1438*efd4c9b6SSteve Lawrence {
1439*efd4c9b6SSteve Lawrence 	return (usage->zsu_system->zss_ram_zones);
1440*efd4c9b6SSteve Lawrence }
1441*efd4c9b6SSteve Lawrence 
1442*efd4c9b6SSteve Lawrence static uint_t
zs_physical_memory_usage_zones_pct(zs_usage_t * usage)1443*efd4c9b6SSteve Lawrence zs_physical_memory_usage_zones_pct(zs_usage_t *usage)
1444*efd4c9b6SSteve Lawrence {
1445*efd4c9b6SSteve Lawrence 	zs_system_t *system = usage->zsu_system;
1446*efd4c9b6SSteve Lawrence 
1447*efd4c9b6SSteve Lawrence 	return (zs_uint64_used_pct(system->zss_ram_total,
1448*efd4c9b6SSteve Lawrence 	    system->zss_ram_zones, B_TRUE));
1449*efd4c9b6SSteve Lawrence }
1450*efd4c9b6SSteve Lawrence 
1451*efd4c9b6SSteve Lawrence static uint64_t
zs_physical_memory_usage_zone(zs_zone_t * zone)1452*efd4c9b6SSteve Lawrence zs_physical_memory_usage_zone(zs_zone_t *zone)
1453*efd4c9b6SSteve Lawrence {
1454*efd4c9b6SSteve Lawrence 	return (zone->zsz_usage_ram);
1455*efd4c9b6SSteve Lawrence }
1456*efd4c9b6SSteve Lawrence 
1457*efd4c9b6SSteve Lawrence static uint_t
zs_physical_memory_usage_zone_pct(zs_zone_t * zone)1458*efd4c9b6SSteve Lawrence zs_physical_memory_usage_zone_pct(zs_zone_t *zone)
1459*efd4c9b6SSteve Lawrence {
1460*efd4c9b6SSteve Lawrence 	zs_system_t *system = zone->zsz_system;
1461*efd4c9b6SSteve Lawrence 
1462*efd4c9b6SSteve Lawrence 	return (zs_uint64_used_pct(system->zss_ram_total,
1463*efd4c9b6SSteve Lawrence 	    zone->zsz_usage_ram, B_TRUE));
1464*efd4c9b6SSteve Lawrence }
1465*efd4c9b6SSteve Lawrence 
1466*efd4c9b6SSteve Lawrence static uint_t
zs_zone_physical_memory_cap_pct(zs_zone_t * zone)1467*efd4c9b6SSteve Lawrence zs_zone_physical_memory_cap_pct(zs_zone_t *zone)
1468*efd4c9b6SSteve Lawrence {
1469*efd4c9b6SSteve Lawrence 	if (zone->zsz_ram_cap == ZS_LIMIT_NONE)
1470*efd4c9b6SSteve Lawrence 		return (ZS_PCT_NONE);
1471*efd4c9b6SSteve Lawrence 
1472*efd4c9b6SSteve Lawrence 	if (zone->zsz_ram_cap == 0) {
1473*efd4c9b6SSteve Lawrence 		return (0);
1474*efd4c9b6SSteve Lawrence 	}
1475*efd4c9b6SSteve Lawrence 
1476*efd4c9b6SSteve Lawrence 	/* Allow ram cap to exeed 100% */
1477*efd4c9b6SSteve Lawrence 	return (zs_uint64_used_pct(zone->zsz_ram_cap,
1478*efd4c9b6SSteve Lawrence 	    zone->zsz_usage_ram, B_FALSE));
1479*efd4c9b6SSteve Lawrence }
1480*efd4c9b6SSteve Lawrence static uint64_t
zs_virtual_memory_total(zs_usage_t * usage)1481*efd4c9b6SSteve Lawrence zs_virtual_memory_total(zs_usage_t *usage)
1482*efd4c9b6SSteve Lawrence {
1483*efd4c9b6SSteve Lawrence 	return (usage->zsu_system->zss_vm_total);
1484*efd4c9b6SSteve Lawrence }
1485*efd4c9b6SSteve Lawrence 
1486*efd4c9b6SSteve Lawrence static uint64_t
zs_virtual_memory_usage_all(zs_usage_t * usage)1487*efd4c9b6SSteve Lawrence zs_virtual_memory_usage_all(zs_usage_t *usage)
1488*efd4c9b6SSteve Lawrence {
1489*efd4c9b6SSteve Lawrence 	return (usage->zsu_system->zss_vm_kern +
1490*efd4c9b6SSteve Lawrence 	    usage->zsu_system->zss_vm_zones);
1491*efd4c9b6SSteve Lawrence }
1492*efd4c9b6SSteve Lawrence static uint64_t
zs_virtual_memory_usage_free(zs_usage_t * usage)1493*efd4c9b6SSteve Lawrence zs_virtual_memory_usage_free(zs_usage_t *usage)
1494*efd4c9b6SSteve Lawrence {
1495*efd4c9b6SSteve Lawrence 	return (usage->zsu_system->zss_vm_total -
1496*efd4c9b6SSteve Lawrence 	    (usage->zsu_system->zss_vm_kern +
1497*efd4c9b6SSteve Lawrence 	    usage->zsu_system->zss_vm_zones));
1498*efd4c9b6SSteve Lawrence }
1499*efd4c9b6SSteve Lawrence static uint_t
zs_virtual_memory_usage_all_pct(zs_usage_t * usage)1500*efd4c9b6SSteve Lawrence zs_virtual_memory_usage_all_pct(zs_usage_t *usage)
1501*efd4c9b6SSteve Lawrence {
1502*efd4c9b6SSteve Lawrence 	zs_system_t *system = usage->zsu_system;
1503*efd4c9b6SSteve Lawrence 
1504*efd4c9b6SSteve Lawrence 	return (zs_uint64_used_pct(system->zss_vm_total,
1505*efd4c9b6SSteve Lawrence 	    (system->zss_vm_kern + system->zss_vm_zones), B_TRUE));
1506*efd4c9b6SSteve Lawrence 
1507*efd4c9b6SSteve Lawrence }
1508*efd4c9b6SSteve Lawrence 
1509*efd4c9b6SSteve Lawrence static uint_t
zs_virtual_memory_usage_free_pct(zs_usage_t * usage)1510*efd4c9b6SSteve Lawrence zs_virtual_memory_usage_free_pct(zs_usage_t *usage)
1511*efd4c9b6SSteve Lawrence {
1512*efd4c9b6SSteve Lawrence 	return (ZSD_PCT_INT - zs_virtual_memory_usage_all_pct(usage));
1513*efd4c9b6SSteve Lawrence 
1514*efd4c9b6SSteve Lawrence }
1515*efd4c9b6SSteve Lawrence static uint64_t
zs_virtual_memory_usage_kernel(zs_usage_t * usage)1516*efd4c9b6SSteve Lawrence zs_virtual_memory_usage_kernel(zs_usage_t *usage)
1517*efd4c9b6SSteve Lawrence {
1518*efd4c9b6SSteve Lawrence 	return (usage->zsu_system->zss_vm_kern);
1519*efd4c9b6SSteve Lawrence }
1520*efd4c9b6SSteve Lawrence 
1521*efd4c9b6SSteve Lawrence static uint_t
zs_virtual_memory_usage_kernel_pct(zs_usage_t * usage)1522*efd4c9b6SSteve Lawrence zs_virtual_memory_usage_kernel_pct(zs_usage_t *usage)
1523*efd4c9b6SSteve Lawrence {
1524*efd4c9b6SSteve Lawrence 	zs_system_t *system = usage->zsu_system;
1525*efd4c9b6SSteve Lawrence 
1526*efd4c9b6SSteve Lawrence 	return (zs_uint64_used_pct(system->zss_vm_total,
1527*efd4c9b6SSteve Lawrence 	    system->zss_vm_kern, B_TRUE));
1528*efd4c9b6SSteve Lawrence }
1529*efd4c9b6SSteve Lawrence 
1530*efd4c9b6SSteve Lawrence static uint64_t
zs_virtual_memory_usage_zones(zs_usage_t * usage)1531*efd4c9b6SSteve Lawrence zs_virtual_memory_usage_zones(zs_usage_t *usage)
1532*efd4c9b6SSteve Lawrence {
1533*efd4c9b6SSteve Lawrence 	return (usage->zsu_system->zss_vm_zones);
1534*efd4c9b6SSteve Lawrence }
1535*efd4c9b6SSteve Lawrence 
1536*efd4c9b6SSteve Lawrence static uint_t
zs_virtual_memory_usage_zones_pct(zs_usage_t * usage)1537*efd4c9b6SSteve Lawrence zs_virtual_memory_usage_zones_pct(zs_usage_t *usage)
1538*efd4c9b6SSteve Lawrence {
1539*efd4c9b6SSteve Lawrence 	zs_system_t *system = usage->zsu_system;
1540*efd4c9b6SSteve Lawrence 
1541*efd4c9b6SSteve Lawrence 	return (zs_uint64_used_pct(system->zss_vm_total,
1542*efd4c9b6SSteve Lawrence 	    system->zss_vm_zones, B_TRUE));
1543*efd4c9b6SSteve Lawrence }
1544*efd4c9b6SSteve Lawrence 
1545*efd4c9b6SSteve Lawrence static uint64_t
zs_virtual_memory_usage_zone(zs_zone_t * zone)1546*efd4c9b6SSteve Lawrence zs_virtual_memory_usage_zone(zs_zone_t *zone)
1547*efd4c9b6SSteve Lawrence {
1548*efd4c9b6SSteve Lawrence 	return (zone->zsz_usage_vm);
1549*efd4c9b6SSteve Lawrence }
1550*efd4c9b6SSteve Lawrence 
1551*efd4c9b6SSteve Lawrence static uint_t
zs_virtual_memory_usage_zone_pct(zs_zone_t * zone)1552*efd4c9b6SSteve Lawrence zs_virtual_memory_usage_zone_pct(zs_zone_t *zone)
1553*efd4c9b6SSteve Lawrence {
1554*efd4c9b6SSteve Lawrence 	zs_system_t *system = zone->zsz_system;
1555*efd4c9b6SSteve Lawrence 
1556*efd4c9b6SSteve Lawrence 	return (zs_uint64_used_pct(system->zss_vm_total,
1557*efd4c9b6SSteve Lawrence 	    zone->zsz_usage_vm, B_TRUE));
1558*efd4c9b6SSteve Lawrence 
1559*efd4c9b6SSteve Lawrence }
1560*efd4c9b6SSteve Lawrence 
1561*efd4c9b6SSteve Lawrence static uint_t
zs_zone_virtual_memory_cap_pct(zs_zone_t * zone)1562*efd4c9b6SSteve Lawrence zs_zone_virtual_memory_cap_pct(zs_zone_t *zone)
1563*efd4c9b6SSteve Lawrence {
1564*efd4c9b6SSteve Lawrence 	if (zone->zsz_vm_cap == ZS_LIMIT_NONE)
1565*efd4c9b6SSteve Lawrence 		return (ZS_PCT_NONE);
1566*efd4c9b6SSteve Lawrence 
1567*efd4c9b6SSteve Lawrence 	if (zone->zsz_vm_cap == 0)
1568*efd4c9b6SSteve Lawrence 		return (0);
1569*efd4c9b6SSteve Lawrence 
1570*efd4c9b6SSteve Lawrence 	return (zs_uint64_used_pct(zone->zsz_vm_cap,
1571*efd4c9b6SSteve Lawrence 	    zone->zsz_usage_vm, B_TRUE));
1572*efd4c9b6SSteve Lawrence }
1573*efd4c9b6SSteve Lawrence 
1574*efd4c9b6SSteve Lawrence static uint64_t
zs_locked_memory_total(zs_usage_t * usage)1575*efd4c9b6SSteve Lawrence zs_locked_memory_total(zs_usage_t *usage)
1576*efd4c9b6SSteve Lawrence {
1577*efd4c9b6SSteve Lawrence 	return (usage->zsu_system->zss_ram_total);
1578*efd4c9b6SSteve Lawrence }
1579*efd4c9b6SSteve Lawrence 
1580*efd4c9b6SSteve Lawrence static uint64_t
zs_locked_memory_usage_all(zs_usage_t * usage)1581*efd4c9b6SSteve Lawrence zs_locked_memory_usage_all(zs_usage_t *usage)
1582*efd4c9b6SSteve Lawrence {
1583*efd4c9b6SSteve Lawrence 	return (usage->zsu_system->zss_locked_kern +
1584*efd4c9b6SSteve Lawrence 	    usage->zsu_system->zss_locked_zones);
1585*efd4c9b6SSteve Lawrence }
1586*efd4c9b6SSteve Lawrence static uint64_t
zs_locked_memory_usage_free(zs_usage_t * usage)1587*efd4c9b6SSteve Lawrence zs_locked_memory_usage_free(zs_usage_t *usage)
1588*efd4c9b6SSteve Lawrence {
1589*efd4c9b6SSteve Lawrence 	return (usage->zsu_system->zss_ram_total -
1590*efd4c9b6SSteve Lawrence 	    (usage->zsu_system->zss_locked_kern +
1591*efd4c9b6SSteve Lawrence 	    usage->zsu_system->zss_locked_zones));
1592*efd4c9b6SSteve Lawrence }
1593*efd4c9b6SSteve Lawrence 
1594*efd4c9b6SSteve Lawrence static uint_t
zs_locked_memory_usage_all_pct(zs_usage_t * usage)1595*efd4c9b6SSteve Lawrence zs_locked_memory_usage_all_pct(zs_usage_t *usage)
1596*efd4c9b6SSteve Lawrence {
1597*efd4c9b6SSteve Lawrence 	zs_system_t *system = usage->zsu_system;
1598*efd4c9b6SSteve Lawrence 
1599*efd4c9b6SSteve Lawrence 	return (zs_uint64_used_pct(system->zss_ram_total,
1600*efd4c9b6SSteve Lawrence 	    (system->zss_locked_kern + system->zss_locked_zones), B_TRUE));
1601*efd4c9b6SSteve Lawrence }
1602*efd4c9b6SSteve Lawrence 
1603*efd4c9b6SSteve Lawrence static uint_t
zs_locked_memory_usage_free_pct(zs_usage_t * usage)1604*efd4c9b6SSteve Lawrence zs_locked_memory_usage_free_pct(zs_usage_t *usage)
1605*efd4c9b6SSteve Lawrence {
1606*efd4c9b6SSteve Lawrence 	return (ZSD_PCT_INT - zs_locked_memory_usage_all_pct(usage));
1607*efd4c9b6SSteve Lawrence 
1608*efd4c9b6SSteve Lawrence }
1609*efd4c9b6SSteve Lawrence 
1610*efd4c9b6SSteve Lawrence static uint64_t
zs_locked_memory_usage_kernel(zs_usage_t * usage)1611*efd4c9b6SSteve Lawrence zs_locked_memory_usage_kernel(zs_usage_t *usage)
1612*efd4c9b6SSteve Lawrence {
1613*efd4c9b6SSteve Lawrence 	return (usage->zsu_system->zss_locked_kern);
1614*efd4c9b6SSteve Lawrence }
1615*efd4c9b6SSteve Lawrence 
1616*efd4c9b6SSteve Lawrence static uint_t
zs_locked_memory_usage_kernel_pct(zs_usage_t * usage)1617*efd4c9b6SSteve Lawrence zs_locked_memory_usage_kernel_pct(zs_usage_t *usage)
1618*efd4c9b6SSteve Lawrence {
1619*efd4c9b6SSteve Lawrence 	zs_system_t *system = usage->zsu_system;
1620*efd4c9b6SSteve Lawrence 
1621*efd4c9b6SSteve Lawrence 	return (zs_uint64_used_pct(system->zss_ram_total,
1622*efd4c9b6SSteve Lawrence 	    system->zss_locked_kern, B_TRUE));
1623*efd4c9b6SSteve Lawrence }
1624*efd4c9b6SSteve Lawrence 
1625*efd4c9b6SSteve Lawrence static uint64_t
zs_locked_memory_usage_zones(zs_usage_t * usage)1626*efd4c9b6SSteve Lawrence zs_locked_memory_usage_zones(zs_usage_t *usage)
1627*efd4c9b6SSteve Lawrence {
1628*efd4c9b6SSteve Lawrence 	return (usage->zsu_system->zss_locked_zones);
1629*efd4c9b6SSteve Lawrence }
1630*efd4c9b6SSteve Lawrence 
1631*efd4c9b6SSteve Lawrence static uint_t
zs_locked_memory_usage_zones_pct(zs_usage_t * usage)1632*efd4c9b6SSteve Lawrence zs_locked_memory_usage_zones_pct(zs_usage_t *usage)
1633*efd4c9b6SSteve Lawrence {
1634*efd4c9b6SSteve Lawrence 	zs_system_t *system = usage->zsu_system;
1635*efd4c9b6SSteve Lawrence 
1636*efd4c9b6SSteve Lawrence 	return (zs_uint64_used_pct(system->zss_ram_total,
1637*efd4c9b6SSteve Lawrence 	    system->zss_locked_zones, B_TRUE));
1638*efd4c9b6SSteve Lawrence }
1639*efd4c9b6SSteve Lawrence 
1640*efd4c9b6SSteve Lawrence static uint64_t
zs_locked_memory_usage_zone(zs_zone_t * zone)1641*efd4c9b6SSteve Lawrence zs_locked_memory_usage_zone(zs_zone_t *zone)
1642*efd4c9b6SSteve Lawrence {
1643*efd4c9b6SSteve Lawrence 	return (zone->zsz_usage_locked);
1644*efd4c9b6SSteve Lawrence }
1645*efd4c9b6SSteve Lawrence 
1646*efd4c9b6SSteve Lawrence static uint_t
zs_locked_memory_usage_zone_pct(zs_zone_t * zone)1647*efd4c9b6SSteve Lawrence zs_locked_memory_usage_zone_pct(zs_zone_t *zone)
1648*efd4c9b6SSteve Lawrence {
1649*efd4c9b6SSteve Lawrence 	zs_system_t *system = zone->zsz_system;
1650*efd4c9b6SSteve Lawrence 
1651*efd4c9b6SSteve Lawrence 	return (zs_uint64_used_pct(system->zss_ram_total,
1652*efd4c9b6SSteve Lawrence 	    zone->zsz_usage_locked, B_TRUE));
1653*efd4c9b6SSteve Lawrence }
1654*efd4c9b6SSteve Lawrence 
1655*efd4c9b6SSteve Lawrence static uint_t
zs_zone_locked_memory_cap_pct(zs_zone_t * zone)1656*efd4c9b6SSteve Lawrence zs_zone_locked_memory_cap_pct(zs_zone_t *zone)
1657*efd4c9b6SSteve Lawrence {
1658*efd4c9b6SSteve Lawrence 	if (zone->zsz_locked_cap == ZS_LIMIT_NONE)
1659*efd4c9b6SSteve Lawrence 		return (ZS_PCT_NONE);
1660*efd4c9b6SSteve Lawrence 
1661*efd4c9b6SSteve Lawrence 	if (zone->zsz_locked_cap == 0)
1662*efd4c9b6SSteve Lawrence 		return (0);
1663*efd4c9b6SSteve Lawrence 
1664*efd4c9b6SSteve Lawrence 	return (zs_uint64_used_pct(zone->zsz_locked_cap,
1665*efd4c9b6SSteve Lawrence 	    zone->zsz_usage_locked, B_TRUE));
1666*efd4c9b6SSteve Lawrence 
1667*efd4c9b6SSteve Lawrence }
1668*efd4c9b6SSteve Lawrence static uint64_t
zs_disk_swap_total(zs_usage_t * usage)1669*efd4c9b6SSteve Lawrence zs_disk_swap_total(zs_usage_t *usage)
1670*efd4c9b6SSteve Lawrence {
1671*efd4c9b6SSteve Lawrence 	return (usage->zsu_system->zss_swap_total);
1672*efd4c9b6SSteve Lawrence }
1673*efd4c9b6SSteve Lawrence 
1674*efd4c9b6SSteve Lawrence static uint64_t
zs_disk_swap_usage_all(zs_usage_t * usage)1675*efd4c9b6SSteve Lawrence zs_disk_swap_usage_all(zs_usage_t *usage)
1676*efd4c9b6SSteve Lawrence {
1677*efd4c9b6SSteve Lawrence 	return (usage->zsu_system->zss_swap_used);
1678*efd4c9b6SSteve Lawrence }
1679*efd4c9b6SSteve Lawrence 
1680*efd4c9b6SSteve Lawrence static uint_t
zs_disk_swap_usage_all_pct(zs_usage_t * usage)1681*efd4c9b6SSteve Lawrence zs_disk_swap_usage_all_pct(zs_usage_t *usage)
1682*efd4c9b6SSteve Lawrence {
1683*efd4c9b6SSteve Lawrence 	return (zs_uint64_used_pct(usage->zsu_system->zss_swap_total,
1684*efd4c9b6SSteve Lawrence 	    usage->zsu_system->zss_swap_used, B_TRUE));
1685*efd4c9b6SSteve Lawrence }
1686*efd4c9b6SSteve Lawrence 
1687*efd4c9b6SSteve Lawrence static uint64_t
zs_disk_swap_usage_free(zs_usage_t * usage)1688*efd4c9b6SSteve Lawrence zs_disk_swap_usage_free(zs_usage_t *usage)
1689*efd4c9b6SSteve Lawrence {
1690*efd4c9b6SSteve Lawrence 	return (usage->zsu_system->zss_swap_total -
1691*efd4c9b6SSteve Lawrence 	    usage->zsu_system->zss_swap_used);
1692*efd4c9b6SSteve Lawrence }
1693*efd4c9b6SSteve Lawrence 
1694*efd4c9b6SSteve Lawrence static uint_t
zs_disk_swap_usage_free_pct(zs_usage_t * usage)1695*efd4c9b6SSteve Lawrence zs_disk_swap_usage_free_pct(zs_usage_t *usage)
1696*efd4c9b6SSteve Lawrence {
1697*efd4c9b6SSteve Lawrence 	return (ZSD_PCT_INT - zs_disk_swap_usage_all_pct(usage));
1698*efd4c9b6SSteve Lawrence }
1699*efd4c9b6SSteve Lawrence 
1700*efd4c9b6SSteve Lawrence static uint64_t
zs_processes_total(zs_usage_t * usage)1701*efd4c9b6SSteve Lawrence zs_processes_total(zs_usage_t *usage)
1702*efd4c9b6SSteve Lawrence {
1703*efd4c9b6SSteve Lawrence 	return (usage->zsu_system->zss_processes_max);
1704*efd4c9b6SSteve Lawrence }
1705*efd4c9b6SSteve Lawrence 
1706*efd4c9b6SSteve Lawrence static uint64_t
zs_lwps_total(zs_usage_t * usage)1707*efd4c9b6SSteve Lawrence zs_lwps_total(zs_usage_t *usage)
1708*efd4c9b6SSteve Lawrence {
1709*efd4c9b6SSteve Lawrence 	return (usage->zsu_system->zss_lwps_max);
1710*efd4c9b6SSteve Lawrence }
1711*efd4c9b6SSteve Lawrence 
1712*efd4c9b6SSteve Lawrence static uint64_t
zs_shm_total(zs_usage_t * usage)1713*efd4c9b6SSteve Lawrence zs_shm_total(zs_usage_t *usage)
1714*efd4c9b6SSteve Lawrence {
1715*efd4c9b6SSteve Lawrence 	return (usage->zsu_system->zss_shm_max);
1716*efd4c9b6SSteve Lawrence }
1717*efd4c9b6SSteve Lawrence 
1718*efd4c9b6SSteve Lawrence static uint64_t
zs_shmids_total(zs_usage_t * usage)1719*efd4c9b6SSteve Lawrence zs_shmids_total(zs_usage_t *usage)
1720*efd4c9b6SSteve Lawrence {
1721*efd4c9b6SSteve Lawrence 	return (usage->zsu_system->zss_shmids_max);
1722*efd4c9b6SSteve Lawrence }
1723*efd4c9b6SSteve Lawrence 
1724*efd4c9b6SSteve Lawrence static uint64_t
zs_semids_total(zs_usage_t * usage)1725*efd4c9b6SSteve Lawrence zs_semids_total(zs_usage_t *usage)
1726*efd4c9b6SSteve Lawrence {
1727*efd4c9b6SSteve Lawrence 	return (usage->zsu_system->zss_semids_max);
1728*efd4c9b6SSteve Lawrence }
1729*efd4c9b6SSteve Lawrence 
1730*efd4c9b6SSteve Lawrence static uint64_t
zs_msgids_total(zs_usage_t * usage)1731*efd4c9b6SSteve Lawrence zs_msgids_total(zs_usage_t *usage)
1732*efd4c9b6SSteve Lawrence {
1733*efd4c9b6SSteve Lawrence 	return (usage->zsu_system->zss_msgids_max);
1734*efd4c9b6SSteve Lawrence }
1735*efd4c9b6SSteve Lawrence 
1736*efd4c9b6SSteve Lawrence static uint64_t
zs_lofi_total(zs_usage_t * usage)1737*efd4c9b6SSteve Lawrence zs_lofi_total(zs_usage_t *usage)
1738*efd4c9b6SSteve Lawrence {
1739*efd4c9b6SSteve Lawrence 	return (usage->zsu_system->zss_lofi_max);
1740*efd4c9b6SSteve Lawrence }
1741*efd4c9b6SSteve Lawrence 
1742*efd4c9b6SSteve Lawrence static uint64_t
zs_processes_usage_all(zs_usage_t * usage)1743*efd4c9b6SSteve Lawrence zs_processes_usage_all(zs_usage_t *usage)
1744*efd4c9b6SSteve Lawrence {
1745*efd4c9b6SSteve Lawrence 	return (usage->zsu_system->zss_processes);
1746*efd4c9b6SSteve Lawrence }
1747*efd4c9b6SSteve Lawrence 
1748*efd4c9b6SSteve Lawrence static uint64_t
zs_lwps_usage_all(zs_usage_t * usage)1749*efd4c9b6SSteve Lawrence zs_lwps_usage_all(zs_usage_t *usage)
1750*efd4c9b6SSteve Lawrence {
1751*efd4c9b6SSteve Lawrence 	return (usage->zsu_system->zss_lwps);
1752*efd4c9b6SSteve Lawrence }
1753*efd4c9b6SSteve Lawrence 
1754*efd4c9b6SSteve Lawrence static uint64_t
zs_shm_usage_all(zs_usage_t * usage)1755*efd4c9b6SSteve Lawrence zs_shm_usage_all(zs_usage_t *usage)
1756*efd4c9b6SSteve Lawrence {
1757*efd4c9b6SSteve Lawrence 	return (usage->zsu_system->zss_shm);
1758*efd4c9b6SSteve Lawrence }
1759*efd4c9b6SSteve Lawrence 
1760*efd4c9b6SSteve Lawrence static uint64_t
zs_shmids_usage_all(zs_usage_t * usage)1761*efd4c9b6SSteve Lawrence zs_shmids_usage_all(zs_usage_t *usage)
1762*efd4c9b6SSteve Lawrence {
1763*efd4c9b6SSteve Lawrence 	return (usage->zsu_system->zss_shmids);
1764*efd4c9b6SSteve Lawrence }
1765*efd4c9b6SSteve Lawrence 
1766*efd4c9b6SSteve Lawrence static uint64_t
zs_semids_usage_all(zs_usage_t * usage)1767*efd4c9b6SSteve Lawrence zs_semids_usage_all(zs_usage_t *usage)
1768*efd4c9b6SSteve Lawrence {
1769*efd4c9b6SSteve Lawrence 	return (usage->zsu_system->zss_semids);
1770*efd4c9b6SSteve Lawrence }
1771*efd4c9b6SSteve Lawrence 
1772*efd4c9b6SSteve Lawrence static uint64_t
zs_msgids_usage_all(zs_usage_t * usage)1773*efd4c9b6SSteve Lawrence zs_msgids_usage_all(zs_usage_t *usage)
1774*efd4c9b6SSteve Lawrence {
1775*efd4c9b6SSteve Lawrence 	return (usage->zsu_system->zss_msgids);
1776*efd4c9b6SSteve Lawrence }
1777*efd4c9b6SSteve Lawrence 
1778*efd4c9b6SSteve Lawrence static uint64_t
zs_lofi_usage_all(zs_usage_t * usage)1779*efd4c9b6SSteve Lawrence zs_lofi_usage_all(zs_usage_t *usage)
1780*efd4c9b6SSteve Lawrence {
1781*efd4c9b6SSteve Lawrence 	return (usage->zsu_system->zss_lofi);
1782*efd4c9b6SSteve Lawrence }
1783*efd4c9b6SSteve Lawrence static uint64_t
zs_processes_usage_all_pct(zs_usage_t * usage)1784*efd4c9b6SSteve Lawrence zs_processes_usage_all_pct(zs_usage_t *usage)
1785*efd4c9b6SSteve Lawrence {
1786*efd4c9b6SSteve Lawrence 	zs_system_t *system = usage->zsu_system;
1787*efd4c9b6SSteve Lawrence 
1788*efd4c9b6SSteve Lawrence 	return (zs_uint64_used_pct(system->zss_processes_max,
1789*efd4c9b6SSteve Lawrence 	    system->zss_processes, B_TRUE));
1790*efd4c9b6SSteve Lawrence }
1791*efd4c9b6SSteve Lawrence 
1792*efd4c9b6SSteve Lawrence static uint_t
zs_lwps_usage_all_pct(zs_usage_t * usage)1793*efd4c9b6SSteve Lawrence zs_lwps_usage_all_pct(zs_usage_t *usage)
1794*efd4c9b6SSteve Lawrence {
1795*efd4c9b6SSteve Lawrence 	zs_system_t *system = usage->zsu_system;
1796*efd4c9b6SSteve Lawrence 
1797*efd4c9b6SSteve Lawrence 	return (zs_uint64_used_pct(system->zss_lwps_max,
1798*efd4c9b6SSteve Lawrence 	    system->zss_lwps, B_TRUE));
1799*efd4c9b6SSteve Lawrence }
1800*efd4c9b6SSteve Lawrence 
1801*efd4c9b6SSteve Lawrence static uint_t
zs_shm_usage_all_pct(zs_usage_t * usage)1802*efd4c9b6SSteve Lawrence zs_shm_usage_all_pct(zs_usage_t *usage)
1803*efd4c9b6SSteve Lawrence {
1804*efd4c9b6SSteve Lawrence 	zs_system_t *system = usage->zsu_system;
1805*efd4c9b6SSteve Lawrence 
1806*efd4c9b6SSteve Lawrence 	return (zs_uint64_used_pct(system->zss_shm_max,
1807*efd4c9b6SSteve Lawrence 	    system->zss_shm, B_TRUE));
1808*efd4c9b6SSteve Lawrence }
1809*efd4c9b6SSteve Lawrence 
1810*efd4c9b6SSteve Lawrence static uint_t
zs_shmids_usage_all_pct(zs_usage_t * usage)1811*efd4c9b6SSteve Lawrence zs_shmids_usage_all_pct(zs_usage_t *usage)
1812*efd4c9b6SSteve Lawrence {
1813*efd4c9b6SSteve Lawrence 	zs_system_t *system = usage->zsu_system;
1814*efd4c9b6SSteve Lawrence 
1815*efd4c9b6SSteve Lawrence 	return (zs_uint64_used_pct(system->zss_shmids_max,
1816*efd4c9b6SSteve Lawrence 	    system->zss_shmids, B_TRUE));
1817*efd4c9b6SSteve Lawrence }
1818*efd4c9b6SSteve Lawrence 
1819*efd4c9b6SSteve Lawrence static uint64_t
zs_semids_usage_all_pct(zs_usage_t * usage)1820*efd4c9b6SSteve Lawrence zs_semids_usage_all_pct(zs_usage_t *usage)
1821*efd4c9b6SSteve Lawrence {
1822*efd4c9b6SSteve Lawrence 	zs_system_t *system = usage->zsu_system;
1823*efd4c9b6SSteve Lawrence 
1824*efd4c9b6SSteve Lawrence 	return (zs_uint64_used_pct(system->zss_semids_max,
1825*efd4c9b6SSteve Lawrence 	    system->zss_semids, B_TRUE));
1826*efd4c9b6SSteve Lawrence }
1827*efd4c9b6SSteve Lawrence 
1828*efd4c9b6SSteve Lawrence static uint64_t
zs_msgids_usage_all_pct(zs_usage_t * usage)1829*efd4c9b6SSteve Lawrence zs_msgids_usage_all_pct(zs_usage_t *usage)
1830*efd4c9b6SSteve Lawrence {
1831*efd4c9b6SSteve Lawrence 	zs_system_t *system = usage->zsu_system;
1832*efd4c9b6SSteve Lawrence 
1833*efd4c9b6SSteve Lawrence 	return (zs_uint64_used_pct(system->zss_msgids_max,
1834*efd4c9b6SSteve Lawrence 	    system->zss_msgids, B_TRUE));
1835*efd4c9b6SSteve Lawrence }
1836*efd4c9b6SSteve Lawrence 
1837*efd4c9b6SSteve Lawrence static uint64_t
zs_lofi_usage_all_pct(zs_usage_t * usage)1838*efd4c9b6SSteve Lawrence zs_lofi_usage_all_pct(zs_usage_t *usage)
1839*efd4c9b6SSteve Lawrence {
1840*efd4c9b6SSteve Lawrence 	zs_system_t *system = usage->zsu_system;
1841*efd4c9b6SSteve Lawrence 
1842*efd4c9b6SSteve Lawrence 	return (zs_uint64_used_pct(system->zss_lofi_max,
1843*efd4c9b6SSteve Lawrence 	    system->zss_lofi, B_TRUE));
1844*efd4c9b6SSteve Lawrence }
1845*efd4c9b6SSteve Lawrence 
1846*efd4c9b6SSteve Lawrence static uint64_t
zs_processes_usage_zone(zs_zone_t * zone)1847*efd4c9b6SSteve Lawrence zs_processes_usage_zone(zs_zone_t *zone)
1848*efd4c9b6SSteve Lawrence {
1849*efd4c9b6SSteve Lawrence 	return (zone->zsz_processes);
1850*efd4c9b6SSteve Lawrence }
1851*efd4c9b6SSteve Lawrence 
1852*efd4c9b6SSteve Lawrence static uint64_t
zs_lwps_usage_zone(zs_zone_t * zone)1853*efd4c9b6SSteve Lawrence zs_lwps_usage_zone(zs_zone_t *zone)
1854*efd4c9b6SSteve Lawrence {
1855*efd4c9b6SSteve Lawrence 	return (zone->zsz_lwps);
1856*efd4c9b6SSteve Lawrence }
1857*efd4c9b6SSteve Lawrence 
1858*efd4c9b6SSteve Lawrence static uint64_t
zs_shm_usage_zone(zs_zone_t * zone)1859*efd4c9b6SSteve Lawrence zs_shm_usage_zone(zs_zone_t *zone)
1860*efd4c9b6SSteve Lawrence {
1861*efd4c9b6SSteve Lawrence 	return (zone->zsz_shm);
1862*efd4c9b6SSteve Lawrence }
1863*efd4c9b6SSteve Lawrence 
1864*efd4c9b6SSteve Lawrence static uint64_t
zs_shmids_usage_zone(zs_zone_t * zone)1865*efd4c9b6SSteve Lawrence zs_shmids_usage_zone(zs_zone_t *zone)
1866*efd4c9b6SSteve Lawrence {
1867*efd4c9b6SSteve Lawrence 	return (zone->zsz_shmids);
1868*efd4c9b6SSteve Lawrence }
1869*efd4c9b6SSteve Lawrence 
1870*efd4c9b6SSteve Lawrence static uint64_t
zs_semids_usage_zone(zs_zone_t * zone)1871*efd4c9b6SSteve Lawrence zs_semids_usage_zone(zs_zone_t *zone)
1872*efd4c9b6SSteve Lawrence {
1873*efd4c9b6SSteve Lawrence 	return (zone->zsz_semids);
1874*efd4c9b6SSteve Lawrence }
1875*efd4c9b6SSteve Lawrence 
1876*efd4c9b6SSteve Lawrence static uint64_t
zs_msgids_usage_zone(zs_zone_t * zone)1877*efd4c9b6SSteve Lawrence zs_msgids_usage_zone(zs_zone_t *zone)
1878*efd4c9b6SSteve Lawrence {
1879*efd4c9b6SSteve Lawrence 	return (zone->zsz_msgids);
1880*efd4c9b6SSteve Lawrence }
1881*efd4c9b6SSteve Lawrence 
1882*efd4c9b6SSteve Lawrence static uint64_t
zs_lofi_usage_zone(zs_zone_t * zone)1883*efd4c9b6SSteve Lawrence zs_lofi_usage_zone(zs_zone_t *zone)
1884*efd4c9b6SSteve Lawrence {
1885*efd4c9b6SSteve Lawrence 	return (zone->zsz_lofi);
1886*efd4c9b6SSteve Lawrence }
1887*efd4c9b6SSteve Lawrence 
1888*efd4c9b6SSteve Lawrence static uint_t
zs_processes_usage_zone_pct(zs_zone_t * zone)1889*efd4c9b6SSteve Lawrence zs_processes_usage_zone_pct(zs_zone_t *zone)
1890*efd4c9b6SSteve Lawrence {
1891*efd4c9b6SSteve Lawrence 	zs_system_t *system = zone->zsz_system;
1892*efd4c9b6SSteve Lawrence 
1893*efd4c9b6SSteve Lawrence 	return (zs_uint64_used_pct(system->zss_processes_max,
1894*efd4c9b6SSteve Lawrence 	    zone->zsz_processes, B_TRUE));
1895*efd4c9b6SSteve Lawrence }
1896*efd4c9b6SSteve Lawrence 
1897*efd4c9b6SSteve Lawrence static uint_t
zs_lwps_usage_zone_pct(zs_zone_t * zone)1898*efd4c9b6SSteve Lawrence zs_lwps_usage_zone_pct(zs_zone_t *zone)
1899*efd4c9b6SSteve Lawrence {
1900*efd4c9b6SSteve Lawrence 	zs_system_t *system = zone->zsz_system;
1901*efd4c9b6SSteve Lawrence 
1902*efd4c9b6SSteve Lawrence 	return (zs_uint64_used_pct(system->zss_lwps_max,
1903*efd4c9b6SSteve Lawrence 	    zone->zsz_lwps, B_TRUE));
1904*efd4c9b6SSteve Lawrence }
1905*efd4c9b6SSteve Lawrence 
1906*efd4c9b6SSteve Lawrence static uint_t
zs_shm_usage_zone_pct(zs_zone_t * zone)1907*efd4c9b6SSteve Lawrence zs_shm_usage_zone_pct(zs_zone_t *zone)
1908*efd4c9b6SSteve Lawrence {
1909*efd4c9b6SSteve Lawrence 	zs_system_t *system = zone->zsz_system;
1910*efd4c9b6SSteve Lawrence 
1911*efd4c9b6SSteve Lawrence 	return (zs_uint64_used_pct(system->zss_shm_max,
1912*efd4c9b6SSteve Lawrence 	    zone->zsz_shm, B_TRUE));
1913*efd4c9b6SSteve Lawrence }
1914*efd4c9b6SSteve Lawrence 
1915*efd4c9b6SSteve Lawrence static uint_t
zs_shmids_usage_zone_pct(zs_zone_t * zone)1916*efd4c9b6SSteve Lawrence zs_shmids_usage_zone_pct(zs_zone_t *zone)
1917*efd4c9b6SSteve Lawrence {
1918*efd4c9b6SSteve Lawrence 	zs_system_t *system = zone->zsz_system;
1919*efd4c9b6SSteve Lawrence 
1920*efd4c9b6SSteve Lawrence 	return (zs_uint64_used_pct(system->zss_shmids_max,
1921*efd4c9b6SSteve Lawrence 	    zone->zsz_shmids, B_TRUE));
1922*efd4c9b6SSteve Lawrence }
1923*efd4c9b6SSteve Lawrence 
1924*efd4c9b6SSteve Lawrence static uint_t
zs_semids_usage_zone_pct(zs_zone_t * zone)1925*efd4c9b6SSteve Lawrence zs_semids_usage_zone_pct(zs_zone_t *zone)
1926*efd4c9b6SSteve Lawrence {
1927*efd4c9b6SSteve Lawrence 	zs_system_t *system = zone->zsz_system;
1928*efd4c9b6SSteve Lawrence 
1929*efd4c9b6SSteve Lawrence 	return (zs_uint64_used_pct(system->zss_semids_max,
1930*efd4c9b6SSteve Lawrence 	    zone->zsz_semids, B_TRUE));
1931*efd4c9b6SSteve Lawrence }
1932*efd4c9b6SSteve Lawrence 
1933*efd4c9b6SSteve Lawrence static uint_t
zs_msgids_usage_zone_pct(zs_zone_t * zone)1934*efd4c9b6SSteve Lawrence zs_msgids_usage_zone_pct(zs_zone_t *zone)
1935*efd4c9b6SSteve Lawrence {
1936*efd4c9b6SSteve Lawrence 	zs_system_t *system = zone->zsz_system;
1937*efd4c9b6SSteve Lawrence 
1938*efd4c9b6SSteve Lawrence 	return (zs_uint64_used_pct(system->zss_msgids_max,
1939*efd4c9b6SSteve Lawrence 	    zone->zsz_msgids, B_TRUE));
1940*efd4c9b6SSteve Lawrence }
1941*efd4c9b6SSteve Lawrence 
1942*efd4c9b6SSteve Lawrence static uint_t
zs_lofi_usage_zone_pct(zs_zone_t * zone)1943*efd4c9b6SSteve Lawrence zs_lofi_usage_zone_pct(zs_zone_t *zone)
1944*efd4c9b6SSteve Lawrence {
1945*efd4c9b6SSteve Lawrence 	zs_system_t *system = zone->zsz_system;
1946*efd4c9b6SSteve Lawrence 
1947*efd4c9b6SSteve Lawrence 	return (zs_uint64_used_pct(system->zss_lofi_max,
1948*efd4c9b6SSteve Lawrence 	    zone->zsz_lofi, B_TRUE));
1949*efd4c9b6SSteve Lawrence }
1950*efd4c9b6SSteve Lawrence 
1951*efd4c9b6SSteve Lawrence static uint_t
zs_processes_zone_cap_pct(zs_zone_t * zone)1952*efd4c9b6SSteve Lawrence zs_processes_zone_cap_pct(zs_zone_t *zone)
1953*efd4c9b6SSteve Lawrence {
1954*efd4c9b6SSteve Lawrence 	if (zone->zsz_processes_cap == ZS_LIMIT_NONE)
1955*efd4c9b6SSteve Lawrence 		return (ZS_PCT_NONE);
1956*efd4c9b6SSteve Lawrence 
1957*efd4c9b6SSteve Lawrence 	if (zone->zsz_processes_cap == 0)
1958*efd4c9b6SSteve Lawrence 		return (0);
1959*efd4c9b6SSteve Lawrence 
1960*efd4c9b6SSteve Lawrence 	return (zs_uint64_used_pct(zone->zsz_processes_cap,
1961*efd4c9b6SSteve Lawrence 	    zone->zsz_processes, B_TRUE));
1962*efd4c9b6SSteve Lawrence }
1963*efd4c9b6SSteve Lawrence 
1964*efd4c9b6SSteve Lawrence static uint_t
zs_lwps_zone_cap_pct(zs_zone_t * zone)1965*efd4c9b6SSteve Lawrence zs_lwps_zone_cap_pct(zs_zone_t *zone)
1966*efd4c9b6SSteve Lawrence {
1967*efd4c9b6SSteve Lawrence 	if (zone->zsz_lwps_cap == ZS_LIMIT_NONE)
1968*efd4c9b6SSteve Lawrence 		return (ZS_PCT_NONE);
1969*efd4c9b6SSteve Lawrence 
1970*efd4c9b6SSteve Lawrence 	if (zone->zsz_lwps_cap == 0)
1971*efd4c9b6SSteve Lawrence 		return (0);
1972*efd4c9b6SSteve Lawrence 
1973*efd4c9b6SSteve Lawrence 	return (zs_uint64_used_pct(zone->zsz_lwps_cap, zone->zsz_lwps, B_TRUE));
1974*efd4c9b6SSteve Lawrence }
1975*efd4c9b6SSteve Lawrence 
1976*efd4c9b6SSteve Lawrence static uint_t
zs_shm_zone_cap_pct(zs_zone_t * zone)1977*efd4c9b6SSteve Lawrence zs_shm_zone_cap_pct(zs_zone_t *zone)
1978*efd4c9b6SSteve Lawrence {
1979*efd4c9b6SSteve Lawrence 	if (zone->zsz_shm_cap == ZS_LIMIT_NONE)
1980*efd4c9b6SSteve Lawrence 		return (ZS_PCT_NONE);
1981*efd4c9b6SSteve Lawrence 
1982*efd4c9b6SSteve Lawrence 	if (zone->zsz_shm_cap == 0)
1983*efd4c9b6SSteve Lawrence 		return (0);
1984*efd4c9b6SSteve Lawrence 
1985*efd4c9b6SSteve Lawrence 	return (zs_uint64_used_pct(zone->zsz_shm_cap, zone->zsz_shm, B_TRUE));
1986*efd4c9b6SSteve Lawrence }
1987*efd4c9b6SSteve Lawrence 
1988*efd4c9b6SSteve Lawrence static uint_t
zs_shmids_zone_cap_pct(zs_zone_t * zone)1989*efd4c9b6SSteve Lawrence zs_shmids_zone_cap_pct(zs_zone_t *zone)
1990*efd4c9b6SSteve Lawrence {
1991*efd4c9b6SSteve Lawrence 	if (zone->zsz_shmids_cap == ZS_LIMIT_NONE)
1992*efd4c9b6SSteve Lawrence 		return (ZS_PCT_NONE);
1993*efd4c9b6SSteve Lawrence 
1994*efd4c9b6SSteve Lawrence 	if (zone->zsz_shmids_cap == 0)
1995*efd4c9b6SSteve Lawrence 		return (0);
1996*efd4c9b6SSteve Lawrence 
1997*efd4c9b6SSteve Lawrence 	return (zs_uint64_used_pct(zone->zsz_shmids_cap, zone->zsz_shmids,
1998*efd4c9b6SSteve Lawrence 	    B_TRUE));
1999*efd4c9b6SSteve Lawrence }
2000*efd4c9b6SSteve Lawrence 
2001*efd4c9b6SSteve Lawrence static uint_t
zs_semids_zone_cap_pct(zs_zone_t * zone)2002*efd4c9b6SSteve Lawrence zs_semids_zone_cap_pct(zs_zone_t *zone)
2003*efd4c9b6SSteve Lawrence {
2004*efd4c9b6SSteve Lawrence 	if (zone->zsz_semids_cap == ZS_LIMIT_NONE)
2005*efd4c9b6SSteve Lawrence 		return (ZS_PCT_NONE);
2006*efd4c9b6SSteve Lawrence 
2007*efd4c9b6SSteve Lawrence 	if (zone->zsz_semids_cap == 0)
2008*efd4c9b6SSteve Lawrence 		return (0);
2009*efd4c9b6SSteve Lawrence 
2010*efd4c9b6SSteve Lawrence 	return (zs_uint64_used_pct(zone->zsz_semids_cap, zone->zsz_semids,
2011*efd4c9b6SSteve Lawrence 	    B_TRUE));
2012*efd4c9b6SSteve Lawrence }
2013*efd4c9b6SSteve Lawrence 
2014*efd4c9b6SSteve Lawrence static uint_t
zs_msgids_zone_cap_pct(zs_zone_t * zone)2015*efd4c9b6SSteve Lawrence zs_msgids_zone_cap_pct(zs_zone_t *zone)
2016*efd4c9b6SSteve Lawrence {
2017*efd4c9b6SSteve Lawrence 	if (zone->zsz_msgids_cap == ZS_LIMIT_NONE)
2018*efd4c9b6SSteve Lawrence 		return (ZS_PCT_NONE);
2019*efd4c9b6SSteve Lawrence 
2020*efd4c9b6SSteve Lawrence 	if (zone->zsz_msgids_cap == 0)
2021*efd4c9b6SSteve Lawrence 		return (0);
2022*efd4c9b6SSteve Lawrence 
2023*efd4c9b6SSteve Lawrence 	return (zs_uint64_used_pct(zone->zsz_msgids_cap, zone->zsz_msgids,
2024*efd4c9b6SSteve Lawrence 	    B_TRUE));
2025*efd4c9b6SSteve Lawrence }
2026*efd4c9b6SSteve Lawrence 
2027*efd4c9b6SSteve Lawrence static uint_t
zs_lofi_zone_cap_pct(zs_zone_t * zone)2028*efd4c9b6SSteve Lawrence zs_lofi_zone_cap_pct(zs_zone_t *zone)
2029*efd4c9b6SSteve Lawrence {
2030*efd4c9b6SSteve Lawrence 	if (zone->zsz_lofi_cap == ZS_LIMIT_NONE)
2031*efd4c9b6SSteve Lawrence 		return (ZS_PCT_NONE);
2032*efd4c9b6SSteve Lawrence 
2033*efd4c9b6SSteve Lawrence 	if (zone->zsz_lofi_cap == 0)
2034*efd4c9b6SSteve Lawrence 		return (0);
2035*efd4c9b6SSteve Lawrence 
2036*efd4c9b6SSteve Lawrence 	return (zs_uint64_used_pct(zone->zsz_lofi_cap, zone->zsz_lofi,
2037*efd4c9b6SSteve Lawrence 	    B_TRUE));
2038*efd4c9b6SSteve Lawrence }
2039*efd4c9b6SSteve Lawrence 
2040*efd4c9b6SSteve Lawrence /* All funcs this line should be static */
2041*efd4c9b6SSteve Lawrence 
2042*efd4c9b6SSteve Lawrence void
zs_close(zs_ctl_t * ctl)2043*efd4c9b6SSteve Lawrence zs_close(zs_ctl_t *ctl)
2044*efd4c9b6SSteve Lawrence {
2045*efd4c9b6SSteve Lawrence 	(void) close(ctl->zsctl_door);
2046*efd4c9b6SSteve Lawrence 	zs_usage_free(ctl->zsctl_start);
2047*efd4c9b6SSteve Lawrence 	free(ctl);
2048*efd4c9b6SSteve Lawrence }
2049*efd4c9b6SSteve Lawrence 
2050*efd4c9b6SSteve Lawrence /*
2051*efd4c9b6SSteve Lawrence  * ERRORS
2052*efd4c9b6SSteve Lawrence  *
2053*efd4c9b6SSteve Lawrence  *	EINTR   signal received, process forked, or zonestatd exited
2054*efd4c9b6SSteve Lawrence  *      ESRCH	zonestatd not responding
2055*efd4c9b6SSteve Lawrence  */
2056*efd4c9b6SSteve Lawrence static zs_usage_t *
zs_usage_read_internal(zs_ctl_t * ctl,int init)2057*efd4c9b6SSteve Lawrence zs_usage_read_internal(zs_ctl_t *ctl, int init)
2058*efd4c9b6SSteve Lawrence {
2059*efd4c9b6SSteve Lawrence 	int fd = -1;
2060*efd4c9b6SSteve Lawrence 	uint_t i, j;
2061*efd4c9b6SSteve Lawrence 	zs_usage_t *usage;
2062*efd4c9b6SSteve Lawrence 	zs_zone_t *zone = NULL;
2063*efd4c9b6SSteve Lawrence 	zs_pset_t *pset = NULL;
2064*efd4c9b6SSteve Lawrence 	zs_pset_zone_t *pz;
2065*efd4c9b6SSteve Lawrence 	char *next;
2066*efd4c9b6SSteve Lawrence 	uint64_t cmd[2];
2067*efd4c9b6SSteve Lawrence 	door_arg_t params;
2068*efd4c9b6SSteve Lawrence 
2069*efd4c9b6SSteve Lawrence 	fd = ctl->zsctl_door;
2070*efd4c9b6SSteve Lawrence 	cmd[0] = ZSD_CMD_READ;
2071*efd4c9b6SSteve Lawrence 	cmd[1] = ctl->zsctl_gen;
2072*efd4c9b6SSteve Lawrence 	params.data_ptr = (char *)cmd;
2073*efd4c9b6SSteve Lawrence 	params.data_size = sizeof (cmd);
2074*efd4c9b6SSteve Lawrence 	params.desc_ptr = NULL;
2075*efd4c9b6SSteve Lawrence 	params.desc_num = 0;
2076*efd4c9b6SSteve Lawrence 	params.rbuf = NULL;
2077*efd4c9b6SSteve Lawrence 	params.rsize = 0;
2078*efd4c9b6SSteve Lawrence 
2079*efd4c9b6SSteve Lawrence 	if (door_call(fd, &params) != 0) {
2080*efd4c9b6SSteve Lawrence 		if (errno != EINTR)
2081*efd4c9b6SSteve Lawrence 			errno = ESRCH;
2082*efd4c9b6SSteve Lawrence 		return (NULL);
2083*efd4c9b6SSteve Lawrence 	}
2084*efd4c9b6SSteve Lawrence 
2085*efd4c9b6SSteve Lawrence 	if (params.rbuf == NULL) {
2086*efd4c9b6SSteve Lawrence 		errno = ESRCH;
2087*efd4c9b6SSteve Lawrence 		return (NULL);
2088*efd4c9b6SSteve Lawrence 	}
2089*efd4c9b6SSteve Lawrence 	/* LINTED */
2090*efd4c9b6SSteve Lawrence 	usage = (zs_usage_t *)params.data_ptr;
2091*efd4c9b6SSteve Lawrence 	ctl->zsctl_gen = usage->zsu_gen;
2092*efd4c9b6SSteve Lawrence 	usage->zsu_mmap = B_TRUE;
2093*efd4c9b6SSteve Lawrence 	usage->zsu_intervals = 0;
2094*efd4c9b6SSteve Lawrence 
2095*efd4c9b6SSteve Lawrence 	list_create(&usage->zsu_zone_list, sizeof (zs_zone_t),
2096*efd4c9b6SSteve Lawrence 	    offsetof(zs_zone_t, zsz_next));
2097*efd4c9b6SSteve Lawrence 	list_create(&usage->zsu_pset_list, sizeof (zs_pset_t),
2098*efd4c9b6SSteve Lawrence 	    offsetof(zs_pset_t, zsp_next));
2099*efd4c9b6SSteve Lawrence 
2100*efd4c9b6SSteve Lawrence 	/* Fix up next pointers inside usage_t */
2101*efd4c9b6SSteve Lawrence 	next = (char *)usage;
2102*efd4c9b6SSteve Lawrence 	next += sizeof (zs_usage_t);
2103*efd4c9b6SSteve Lawrence 
2104*efd4c9b6SSteve Lawrence 	/* LINTED */
2105*efd4c9b6SSteve Lawrence 	usage->zsu_system = (zs_system_t *)next;
2106*efd4c9b6SSteve Lawrence 	next += sizeof (zs_system_t);
2107*efd4c9b6SSteve Lawrence 
2108*efd4c9b6SSteve Lawrence 	for (i = 0; i < usage->zsu_nzones; i++) {
2109*efd4c9b6SSteve Lawrence 		/* LINTED */
2110*efd4c9b6SSteve Lawrence 		zone = (zs_zone_t *)next;
2111*efd4c9b6SSteve Lawrence 		list_insert_tail(&usage->zsu_zone_list, zone);
2112*efd4c9b6SSteve Lawrence 		next += sizeof (zs_zone_t);
2113*efd4c9b6SSteve Lawrence 		zone->zsz_system = usage->zsu_system;
2114*efd4c9b6SSteve Lawrence 		zone->zsz_intervals = 0;
2115*efd4c9b6SSteve Lawrence 	}
2116*efd4c9b6SSteve Lawrence 
2117*efd4c9b6SSteve Lawrence 	for (i = 0; i < usage->zsu_npsets; i++) {
2118*efd4c9b6SSteve Lawrence 		/* LINTED */
2119*efd4c9b6SSteve Lawrence 		pset = (zs_pset_t *)next;
2120*efd4c9b6SSteve Lawrence 		list_insert_tail(&usage->zsu_pset_list, pset);
2121*efd4c9b6SSteve Lawrence 		next += sizeof (zs_pset_t);
2122*efd4c9b6SSteve Lawrence 		list_create(&pset->zsp_usage_list, sizeof (zs_pset_zone_t),
2123*efd4c9b6SSteve Lawrence 		    offsetof(zs_pset_zone_t, zspz_next));
2124*efd4c9b6SSteve Lawrence 		for (j = 0; j < pset->zsp_nusage; j++) {
2125*efd4c9b6SSteve Lawrence 			/* LINTED */
2126*efd4c9b6SSteve Lawrence 			pz = (zs_pset_zone_t *)next;
2127*efd4c9b6SSteve Lawrence 			list_insert_tail(&pset->zsp_usage_list, pz);
2128*efd4c9b6SSteve Lawrence 			next += sizeof (zs_pset_zone_t);
2129*efd4c9b6SSteve Lawrence 			pz->zspz_pset = pset;
2130*efd4c9b6SSteve Lawrence 			pz->zspz_zone =
2131*efd4c9b6SSteve Lawrence 			    zs_lookup_zone_byid(usage, pz->zspz_zoneid);
2132*efd4c9b6SSteve Lawrence 			assert(pz->zspz_zone != NULL);
2133*efd4c9b6SSteve Lawrence 			pz->zspz_intervals = 0;
2134*efd4c9b6SSteve Lawrence 		}
2135*efd4c9b6SSteve Lawrence 		pset->zsp_intervals = 0;
2136*efd4c9b6SSteve Lawrence 	}
2137*efd4c9b6SSteve Lawrence 	if (init)
2138*efd4c9b6SSteve Lawrence 		return (usage);
2139*efd4c9b6SSteve Lawrence 
2140*efd4c9b6SSteve Lawrence 	/*
2141*efd4c9b6SSteve Lawrence 	 * If current usage tracking started after start usage, then
2142*efd4c9b6SSteve Lawrence 	 * no need to subtract start usage.  This really can't happen,
2143*efd4c9b6SSteve Lawrence 	 * as zonestatd should never start over while this client is
2144*efd4c9b6SSteve Lawrence 	 * connected.
2145*efd4c9b6SSteve Lawrence 	 */
2146*efd4c9b6SSteve Lawrence 	if (usage->zsu_hrstart > ctl->zsctl_start->zsu_hrtime) {
2147*efd4c9b6SSteve Lawrence 		return (usage);
2148*efd4c9b6SSteve Lawrence 	}
2149*efd4c9b6SSteve Lawrence 
2150*efd4c9b6SSteve Lawrence 	/*
2151*efd4c9b6SSteve Lawrence 	 * Compute usage relative to first open.  Usage returned by
2152*efd4c9b6SSteve Lawrence 	 * zonestatd starts at an arbitrary point in the past.
2153*efd4c9b6SSteve Lawrence 	 *
2154*efd4c9b6SSteve Lawrence 	 */
2155*efd4c9b6SSteve Lawrence 
2156*efd4c9b6SSteve Lawrence 	(void) zs_usage_compute(usage, ctl->zsctl_start, usage,
2157*efd4c9b6SSteve Lawrence 	    ZS_COMPUTE_USAGE_INTERVAL);
2158*efd4c9b6SSteve Lawrence 
2159*efd4c9b6SSteve Lawrence 	return (usage);
2160*efd4c9b6SSteve Lawrence }
2161*efd4c9b6SSteve Lawrence 
2162*efd4c9b6SSteve Lawrence zs_usage_t *
zs_usage_read(zs_ctl_t * ctl)2163*efd4c9b6SSteve Lawrence zs_usage_read(zs_ctl_t *ctl)
2164*efd4c9b6SSteve Lawrence {
2165*efd4c9b6SSteve Lawrence 	return (zs_usage_read_internal(ctl, B_FALSE));
2166*efd4c9b6SSteve Lawrence }
2167*efd4c9b6SSteve Lawrence 
2168*efd4c9b6SSteve Lawrence /*
2169*efd4c9b6SSteve Lawrence  * Open connection to zonestatd.  NULL of failure, with errno set:
2170*efd4c9b6SSteve Lawrence  *
2171*efd4c9b6SSteve Lawrence  *  EPERM:  Insufficent privilege (no PRIV_PROC_INFO)
2172*efd4c9b6SSteve Lawrence  *  ESRCH:  Zones monitoring service not available or responding
2173*efd4c9b6SSteve Lawrence  *  ENOTSUP: Incompatiable zones monitoring service version.
2174*efd4c9b6SSteve Lawrence  *  EINTR: Server exited or client forked.
2175*efd4c9b6SSteve Lawrence  *  ENOMEM: as malloc(3c)
2176*efd4c9b6SSteve Lawrence  *  EAGAIN: asl malloc(3c)
2177*efd4c9b6SSteve Lawrence  *
2178*efd4c9b6SSteve Lawrence  */
2179*efd4c9b6SSteve Lawrence zs_ctl_t *
zs_open()2180*efd4c9b6SSteve Lawrence zs_open()
2181*efd4c9b6SSteve Lawrence {
2182*efd4c9b6SSteve Lawrence 	zs_ctl_t *ctl;
2183*efd4c9b6SSteve Lawrence 	int cmd[2];
2184*efd4c9b6SSteve Lawrence 	int *res;
2185*efd4c9b6SSteve Lawrence 	int fd;
2186*efd4c9b6SSteve Lawrence 	door_arg_t params;
2187*efd4c9b6SSteve Lawrence 	door_desc_t *door;
2188*efd4c9b6SSteve Lawrence 	int errno_save;
2189*efd4c9b6SSteve Lawrence 
2190*efd4c9b6SSteve Lawrence 	ctl = calloc(sizeof (zs_ctl_t), 1);
2191*efd4c9b6SSteve Lawrence 	if (ctl == NULL)
2192*efd4c9b6SSteve Lawrence 		return (NULL);
2193*efd4c9b6SSteve Lawrence 
2194*efd4c9b6SSteve Lawrence 	fd = zs_connect_zonestatd();
2195*efd4c9b6SSteve Lawrence 	if (fd < 0) {
2196*efd4c9b6SSteve Lawrence 		free(ctl);
2197*efd4c9b6SSteve Lawrence 		errno = ESRCH;
2198*efd4c9b6SSteve Lawrence 		return (NULL);
2199*efd4c9b6SSteve Lawrence 	}
2200*efd4c9b6SSteve Lawrence 
2201*efd4c9b6SSteve Lawrence 	cmd[0] = ZSD_CMD_CONNECT;
2202*efd4c9b6SSteve Lawrence 	cmd[1] = ZS_VERSION;
2203*efd4c9b6SSteve Lawrence 	params.data_ptr = (char *)cmd;
2204*efd4c9b6SSteve Lawrence 	params.data_size = sizeof (cmd);
2205*efd4c9b6SSteve Lawrence 	params.desc_ptr = NULL;
2206*efd4c9b6SSteve Lawrence 	params.desc_num = 0;
2207*efd4c9b6SSteve Lawrence 	params.rbuf = NULL;
2208*efd4c9b6SSteve Lawrence 	params.rsize = 0;
2209*efd4c9b6SSteve Lawrence 	if (door_call(fd, &params) != 0) {
2210*efd4c9b6SSteve Lawrence 		errno_save = errno;
2211*efd4c9b6SSteve Lawrence 		free(ctl);
2212*efd4c9b6SSteve Lawrence 		(void) close(fd);
2213*efd4c9b6SSteve Lawrence 		if (errno_save == EINTR)
2214*efd4c9b6SSteve Lawrence 			errno = EINTR;
2215*efd4c9b6SSteve Lawrence 		else
2216*efd4c9b6SSteve Lawrence 			errno = ESRCH;
2217*efd4c9b6SSteve Lawrence 		return (NULL);
2218*efd4c9b6SSteve Lawrence 	}
2219*efd4c9b6SSteve Lawrence 	(void) close(fd);
2220*efd4c9b6SSteve Lawrence 	/* LINTED */
2221*efd4c9b6SSteve Lawrence 	res = (int *)params.data_ptr;
2222*efd4c9b6SSteve Lawrence 	if (res[1] == ZSD_STATUS_VERSION_MISMATCH) {
2223*efd4c9b6SSteve Lawrence 		free(ctl);
2224*efd4c9b6SSteve Lawrence 		errno = ENOTSUP;
2225*efd4c9b6SSteve Lawrence 		return (NULL);
2226*efd4c9b6SSteve Lawrence 	}
2227*efd4c9b6SSteve Lawrence 	if (res[1] == ZSD_STATUS_PERMISSION) {
2228*efd4c9b6SSteve Lawrence 		free(ctl);
2229*efd4c9b6SSteve Lawrence 		errno = EPERM;
2230*efd4c9b6SSteve Lawrence 		return (NULL);
2231*efd4c9b6SSteve Lawrence 	}
2232*efd4c9b6SSteve Lawrence 	if (res[1] != ZSD_STATUS_OK) {
2233*efd4c9b6SSteve Lawrence 		free(ctl);
2234*efd4c9b6SSteve Lawrence 		errno = ESRCH;
2235*efd4c9b6SSteve Lawrence 		return (NULL);
2236*efd4c9b6SSteve Lawrence 	}
2237*efd4c9b6SSteve Lawrence 
2238*efd4c9b6SSteve Lawrence 	door = params.desc_ptr;
2239*efd4c9b6SSteve Lawrence 	if (door == NULL) {
2240*efd4c9b6SSteve Lawrence 		free(ctl);
2241*efd4c9b6SSteve Lawrence 		return (NULL);
2242*efd4c9b6SSteve Lawrence 	}
2243*efd4c9b6SSteve Lawrence 	ctl->zsctl_door = door->d_data.d_desc.d_descriptor;
2244*efd4c9b6SSteve Lawrence 
2245*efd4c9b6SSteve Lawrence 	if (params.data_ptr != (char *)cmd)
2246*efd4c9b6SSteve Lawrence 		(void) munmap(params.data_ptr, params.data_size);
2247*efd4c9b6SSteve Lawrence 
2248*efd4c9b6SSteve Lawrence 
2249*efd4c9b6SSteve Lawrence 	/*
2250*efd4c9b6SSteve Lawrence 	 * Get the initial usage from zonestatd.  This creates a
2251*efd4c9b6SSteve Lawrence 	 * zero-point on which to base future usages returned by
2252*efd4c9b6SSteve Lawrence 	 * zs_read().
2253*efd4c9b6SSteve Lawrence 	 */
2254*efd4c9b6SSteve Lawrence 	ctl->zsctl_start = zs_usage_read_internal(ctl, B_TRUE);
2255*efd4c9b6SSteve Lawrence 	if (ctl->zsctl_start == NULL) {
2256*efd4c9b6SSteve Lawrence 		errno_save = errno;
2257*efd4c9b6SSteve Lawrence 		(void) close(ctl->zsctl_door);
2258*efd4c9b6SSteve Lawrence 		free(ctl);
2259*efd4c9b6SSteve Lawrence 		if (errno_save == EINTR)
2260*efd4c9b6SSteve Lawrence 			errno = EINTR;
2261*efd4c9b6SSteve Lawrence 		else
2262*efd4c9b6SSteve Lawrence 			errno = ESRCH;
2263*efd4c9b6SSteve Lawrence 		return (NULL);
2264*efd4c9b6SSteve Lawrence 	}
2265*efd4c9b6SSteve Lawrence 	return (ctl);
2266*efd4c9b6SSteve Lawrence }
2267*efd4c9b6SSteve Lawrence 
2268*efd4c9b6SSteve Lawrence /*
2269*efd4c9b6SSteve Lawrence  * Return NULL on error.
2270*efd4c9b6SSteve Lawrence  *
2271*efd4c9b6SSteve Lawrence  * ERRORS:
2272*efd4c9b6SSteve Lawrence  *		EINVAL:  Invalid function.
2273*efd4c9b6SSteve Lawrence  */
2274*efd4c9b6SSteve Lawrence zs_usage_t *
zs_usage_compute(zs_usage_t * ures,zs_usage_t * uold,zs_usage_t * unew,int func)2275*efd4c9b6SSteve Lawrence zs_usage_compute(zs_usage_t *ures, zs_usage_t *uold, zs_usage_t *unew,
2276*efd4c9b6SSteve Lawrence     int func)
2277*efd4c9b6SSteve Lawrence {
2278*efd4c9b6SSteve Lawrence 	zs_system_t *sold, *snew, *sres;
2279*efd4c9b6SSteve Lawrence 	boolean_t alloced = B_FALSE;
2280*efd4c9b6SSteve Lawrence 
2281*efd4c9b6SSteve Lawrence 	if (func != ZS_COMPUTE_USAGE_INTERVAL &&
2282*efd4c9b6SSteve Lawrence 	    func != ZS_COMPUTE_USAGE_TOTAL &&
2283*efd4c9b6SSteve Lawrence 	    func != ZS_COMPUTE_USAGE_AVERAGE &&
2284*efd4c9b6SSteve Lawrence 	    func != ZS_COMPUTE_USAGE_HIGH)
2285*efd4c9b6SSteve Lawrence 		assert(0);
2286*efd4c9b6SSteve Lawrence 
2287*efd4c9b6SSteve Lawrence 	if (ures == NULL) {
2288*efd4c9b6SSteve Lawrence 		alloced = B_TRUE;
2289*efd4c9b6SSteve Lawrence 		ures = zs_usage_alloc();
2290*efd4c9b6SSteve Lawrence 		if (ures == NULL)
2291*efd4c9b6SSteve Lawrence 			return (NULL);
2292*efd4c9b6SSteve Lawrence 	}
2293*efd4c9b6SSteve Lawrence 
2294*efd4c9b6SSteve Lawrence 	sres = ures->zsu_system;
2295*efd4c9b6SSteve Lawrence 	sold = uold->zsu_system;
2296*efd4c9b6SSteve Lawrence 	snew = unew->zsu_system;
2297*efd4c9b6SSteve Lawrence 
2298*efd4c9b6SSteve Lawrence 	switch (func) {
2299*efd4c9b6SSteve Lawrence 	case ZS_COMPUTE_USAGE_INTERVAL:
2300*efd4c9b6SSteve Lawrence 		/* Use system totals from newer interval */
2301*efd4c9b6SSteve Lawrence 		if (sres != snew)
2302*efd4c9b6SSteve Lawrence 			*sres = *snew;
2303*efd4c9b6SSteve Lawrence 
2304*efd4c9b6SSteve Lawrence 		TIMESTRUC_DELTA(sres->zss_cpu_total_time,
2305*efd4c9b6SSteve Lawrence 		    snew->zss_cpu_total_time, sold->zss_cpu_total_time);
2306*efd4c9b6SSteve Lawrence 		TIMESTRUC_DELTA(sres->zss_cpu_usage_kern,
2307*efd4c9b6SSteve Lawrence 		    snew->zss_cpu_usage_kern, sold->zss_cpu_usage_kern);
2308*efd4c9b6SSteve Lawrence 		TIMESTRUC_DELTA(sres->zss_cpu_usage_zones,
2309*efd4c9b6SSteve Lawrence 		    snew->zss_cpu_usage_zones, sold->zss_cpu_usage_zones);
2310*efd4c9b6SSteve Lawrence 		break;
2311*efd4c9b6SSteve Lawrence 	case ZS_COMPUTE_USAGE_HIGH:
2312*efd4c9b6SSteve Lawrence 
2313*efd4c9b6SSteve Lawrence 		/* Find max cpus */
2314*efd4c9b6SSteve Lawrence 		sres->zss_ncpus = MAX(sold->zss_ncpus, snew->zss_ncpus);
2315*efd4c9b6SSteve Lawrence 		sres->zss_ncpus_online = MAX(sold->zss_ncpus_online,
2316*efd4c9b6SSteve Lawrence 		    snew->zss_ncpus_online);
2317*efd4c9b6SSteve Lawrence 
2318*efd4c9b6SSteve Lawrence 		/* Find max cpu times */
2319*efd4c9b6SSteve Lawrence 		sres->zss_cpu_total_time = ZS_MAXTS(sold->zss_cpu_total_time,
2320*efd4c9b6SSteve Lawrence 		    snew->zss_cpu_total_time);
2321*efd4c9b6SSteve Lawrence 		sres->zss_cpu_usage_kern = ZS_MAXTS(sold->zss_cpu_usage_kern,
2322*efd4c9b6SSteve Lawrence 		    snew->zss_cpu_usage_kern);
2323*efd4c9b6SSteve Lawrence 		sres->zss_cpu_usage_zones = ZS_MAXTS(sold->zss_cpu_usage_zones,
2324*efd4c9b6SSteve Lawrence 		    snew->zss_cpu_usage_zones);
2325*efd4c9b6SSteve Lawrence 
2326*efd4c9b6SSteve Lawrence 		/* These don't change */
2327*efd4c9b6SSteve Lawrence 		sres->zss_processes_max = snew->zss_processes_max;
2328*efd4c9b6SSteve Lawrence 		sres->zss_lwps_max = snew->zss_lwps_max;
2329*efd4c9b6SSteve Lawrence 		sres->zss_shm_max = snew->zss_shm_max;
2330*efd4c9b6SSteve Lawrence 		sres->zss_shmids_max = snew->zss_shmids_max;
2331*efd4c9b6SSteve Lawrence 		sres->zss_semids_max = snew->zss_semids_max;
2332*efd4c9b6SSteve Lawrence 		sres->zss_msgids_max = snew->zss_msgids_max;
2333*efd4c9b6SSteve Lawrence 		sres->zss_lofi_max = snew->zss_lofi_max;
2334*efd4c9b6SSteve Lawrence 		/*
2335*efd4c9b6SSteve Lawrence 		 * Add in memory values and limits.  Scale memory to
2336*efd4c9b6SSteve Lawrence 		 * avoid overflow.
2337*efd4c9b6SSteve Lawrence 		 */
2338*efd4c9b6SSteve Lawrence 		sres->zss_ram_total = MAX(sold->zss_ram_total,
2339*efd4c9b6SSteve Lawrence 		    snew->zss_ram_total);
2340*efd4c9b6SSteve Lawrence 		sres->zss_ram_kern = MAX(sold->zss_ram_kern,
2341*efd4c9b6SSteve Lawrence 		    snew->zss_ram_kern);
2342*efd4c9b6SSteve Lawrence 		sres->zss_ram_zones = MAX(sold->zss_ram_zones,
2343*efd4c9b6SSteve Lawrence 		    snew->zss_ram_zones);
2344*efd4c9b6SSteve Lawrence 		sres->zss_locked_kern = MAX(sold->zss_locked_kern,
2345*efd4c9b6SSteve Lawrence 		    snew->zss_locked_kern);
2346*efd4c9b6SSteve Lawrence 		sres->zss_locked_zones = MAX(sold->zss_locked_zones,
2347*efd4c9b6SSteve Lawrence 		    snew->zss_locked_zones);
2348*efd4c9b6SSteve Lawrence 		sres->zss_vm_total = MAX(sold->zss_vm_total,
2349*efd4c9b6SSteve Lawrence 		    snew->zss_vm_total);
2350*efd4c9b6SSteve Lawrence 		sres->zss_vm_kern = MAX(sold->zss_vm_kern,
2351*efd4c9b6SSteve Lawrence 		    snew->zss_vm_kern);
2352*efd4c9b6SSteve Lawrence 		sres->zss_vm_zones = MAX(sold->zss_vm_zones,
2353*efd4c9b6SSteve Lawrence 		    snew->zss_vm_zones);
2354*efd4c9b6SSteve Lawrence 		sres->zss_swap_total = MAX(sold->zss_swap_total,
2355*efd4c9b6SSteve Lawrence 		    snew->zss_swap_total);
2356*efd4c9b6SSteve Lawrence 		sres->zss_swap_used = MAX(sold->zss_swap_used,
2357*efd4c9b6SSteve Lawrence 		    snew->zss_swap_used);
2358*efd4c9b6SSteve Lawrence 
2359*efd4c9b6SSteve Lawrence 		sres->zss_processes = MAX(sold->zss_processes,
2360*efd4c9b6SSteve Lawrence 		    snew->zss_processes);
2361*efd4c9b6SSteve Lawrence 		sres->zss_lwps = MAX(sold->zss_lwps, snew->zss_lwps);
2362*efd4c9b6SSteve Lawrence 		sres->zss_shm = MAX(sold->zss_shm, snew->zss_shm);
2363*efd4c9b6SSteve Lawrence 		sres->zss_shmids = MAX(sold->zss_shmids, snew->zss_shmids);
2364*efd4c9b6SSteve Lawrence 		sres->zss_semids = MAX(sold->zss_semids, snew->zss_semids);
2365*efd4c9b6SSteve Lawrence 		sres->zss_msgids = MAX(sold->zss_msgids, snew->zss_msgids);
2366*efd4c9b6SSteve Lawrence 		sres->zss_lofi = MAX(sold->zss_msgids, snew->zss_lofi);
2367*efd4c9b6SSteve Lawrence 	break;
2368*efd4c9b6SSteve Lawrence 	case ZS_COMPUTE_USAGE_TOTAL:
2369*efd4c9b6SSteve Lawrence 		/* FALLTHROUGH */
2370*efd4c9b6SSteve Lawrence 	case ZS_COMPUTE_USAGE_AVERAGE:
2371*efd4c9b6SSteve Lawrence 		ures->zsu_intervals++;
2372*efd4c9b6SSteve Lawrence 
2373*efd4c9b6SSteve Lawrence 		/*
2374*efd4c9b6SSteve Lawrence 		 * Add cpus.  The total report will divide this by the
2375*efd4c9b6SSteve Lawrence 		 * number of intervals to give the average number of cpus
2376*efd4c9b6SSteve Lawrence 		 * over all intervals.
2377*efd4c9b6SSteve Lawrence 		 */
2378*efd4c9b6SSteve Lawrence 		sres->zss_ncpus = sold->zss_ncpus + snew->zss_ncpus;
2379*efd4c9b6SSteve Lawrence 		sres->zss_ncpus_online = sold->zss_ncpus_online +
2380*efd4c9b6SSteve Lawrence 		    snew->zss_ncpus_online;
2381*efd4c9b6SSteve Lawrence 
2382*efd4c9b6SSteve Lawrence 		/* Add in cpu times */
2383*efd4c9b6SSteve Lawrence 		sres->zss_cpu_total_time = sold->zss_cpu_total_time;
2384*efd4c9b6SSteve Lawrence 		TIMESTRUC_ADD_TIMESTRUC(sres->zss_cpu_total_time,
2385*efd4c9b6SSteve Lawrence 		    snew->zss_cpu_total_time);
2386*efd4c9b6SSteve Lawrence 		sres->zss_cpu_usage_kern = sold->zss_cpu_usage_kern;
2387*efd4c9b6SSteve Lawrence 		TIMESTRUC_ADD_TIMESTRUC(sres->zss_cpu_usage_kern,
2388*efd4c9b6SSteve Lawrence 		    snew->zss_cpu_usage_kern);
2389*efd4c9b6SSteve Lawrence 		sres->zss_cpu_usage_zones = sold->zss_cpu_usage_zones;
2390*efd4c9b6SSteve Lawrence 		TIMESTRUC_ADD_TIMESTRUC(sres->zss_cpu_usage_zones,
2391*efd4c9b6SSteve Lawrence 		    snew->zss_cpu_usage_zones);
2392*efd4c9b6SSteve Lawrence 
2393*efd4c9b6SSteve Lawrence 		/* These don't change */
2394*efd4c9b6SSteve Lawrence 		sres->zss_processes_max = snew->zss_processes_max;
2395*efd4c9b6SSteve Lawrence 		sres->zss_lwps_max = snew->zss_lwps_max;
2396*efd4c9b6SSteve Lawrence 		sres->zss_shm_max = snew->zss_shm_max;
2397*efd4c9b6SSteve Lawrence 		sres->zss_shmids_max = snew->zss_shmids_max;
2398*efd4c9b6SSteve Lawrence 		sres->zss_semids_max = snew->zss_semids_max;
2399*efd4c9b6SSteve Lawrence 		sres->zss_msgids_max = snew->zss_msgids_max;
2400*efd4c9b6SSteve Lawrence 		sres->zss_lofi_max = snew->zss_lofi_max;
2401*efd4c9b6SSteve Lawrence 		/*
2402*efd4c9b6SSteve Lawrence 		 * Add in memory values and limits.  Scale memory to
2403*efd4c9b6SSteve Lawrence 		 * avoid overflow.
2404*efd4c9b6SSteve Lawrence 		 */
2405*efd4c9b6SSteve Lawrence 		if (sres != sold) {
2406*efd4c9b6SSteve Lawrence 			sres->zss_ram_total = sold->zss_ram_total / 1024;
2407*efd4c9b6SSteve Lawrence 			sres->zss_ram_kern = sold->zss_ram_kern / 1024;
2408*efd4c9b6SSteve Lawrence 			sres->zss_ram_zones = sold->zss_ram_zones / 1024;
2409*efd4c9b6SSteve Lawrence 			sres->zss_locked_kern = sold->zss_locked_kern / 1024;
2410*efd4c9b6SSteve Lawrence 			sres->zss_locked_zones = sold->zss_locked_zones / 1024;
2411*efd4c9b6SSteve Lawrence 			sres->zss_vm_total = sold->zss_vm_total / 1024;
2412*efd4c9b6SSteve Lawrence 			sres->zss_vm_kern = sold->zss_vm_kern / 1024;
2413*efd4c9b6SSteve Lawrence 			sres->zss_vm_zones = sold->zss_vm_zones / 1024;
2414*efd4c9b6SSteve Lawrence 			sres->zss_swap_total = sold->zss_swap_total / 1024;
2415*efd4c9b6SSteve Lawrence 			sres->zss_swap_used = sold->zss_swap_used / 1024;
2416*efd4c9b6SSteve Lawrence 
2417*efd4c9b6SSteve Lawrence 			sres->zss_processes = sold->zss_processes;
2418*efd4c9b6SSteve Lawrence 			sres->zss_lwps = sold->zss_lwps;
2419*efd4c9b6SSteve Lawrence 			sres->zss_shm = sold->zss_shm / 1024;
2420*efd4c9b6SSteve Lawrence 			sres->zss_shmids = sold->zss_shmids;
2421*efd4c9b6SSteve Lawrence 			sres->zss_semids = sold->zss_semids;
2422*efd4c9b6SSteve Lawrence 			sres->zss_msgids = sold->zss_msgids;
2423*efd4c9b6SSteve Lawrence 			sres->zss_lofi = sold->zss_lofi;
2424*efd4c9b6SSteve Lawrence 		}
2425*efd4c9b6SSteve Lawrence 		/* Add in new values. */
2426*efd4c9b6SSteve Lawrence 		sres->zss_ram_total += (snew->zss_ram_total / 1024);
2427*efd4c9b6SSteve Lawrence 		sres->zss_ram_kern += (snew->zss_ram_kern / 1024);
2428*efd4c9b6SSteve Lawrence 		sres->zss_ram_zones += (snew->zss_ram_zones / 1024);
2429*efd4c9b6SSteve Lawrence 		sres->zss_locked_kern += (snew->zss_locked_kern / 1024);
2430*efd4c9b6SSteve Lawrence 		sres->zss_locked_zones += (snew->zss_locked_zones / 1024);
2431*efd4c9b6SSteve Lawrence 		sres->zss_vm_total += (snew->zss_vm_total / 1024);
2432*efd4c9b6SSteve Lawrence 		sres->zss_vm_kern += (snew->zss_vm_kern / 1024);
2433*efd4c9b6SSteve Lawrence 		sres->zss_vm_zones += (snew->zss_vm_zones / 1024);
2434*efd4c9b6SSteve Lawrence 		sres->zss_swap_total += (snew->zss_swap_total / 1024);
2435*efd4c9b6SSteve Lawrence 		sres->zss_swap_used += (snew->zss_swap_used / 1024);
2436*efd4c9b6SSteve Lawrence 		sres->zss_processes += snew->zss_processes;
2437*efd4c9b6SSteve Lawrence 		sres->zss_lwps += snew->zss_lwps;
2438*efd4c9b6SSteve Lawrence 		sres->zss_shm += (snew->zss_shm / 1024);
2439*efd4c9b6SSteve Lawrence 		sres->zss_shmids += snew->zss_shmids;
2440*efd4c9b6SSteve Lawrence 		sres->zss_semids += snew->zss_semids;
2441*efd4c9b6SSteve Lawrence 		sres->zss_msgids += snew->zss_msgids;
2442*efd4c9b6SSteve Lawrence 		sres->zss_lofi += snew->zss_lofi;
2443*efd4c9b6SSteve Lawrence 		break;
2444*efd4c9b6SSteve Lawrence 	default:
2445*efd4c9b6SSteve Lawrence 		if (alloced)
2446*efd4c9b6SSteve Lawrence 			zs_usage_free(ures);
2447*efd4c9b6SSteve Lawrence 		assert(0);
2448*efd4c9b6SSteve Lawrence 	}
2449*efd4c9b6SSteve Lawrence 	if (zs_usage_compute_zones(ures, uold, unew, func) != 0)
2450*efd4c9b6SSteve Lawrence 		goto err;
2451*efd4c9b6SSteve Lawrence 
2452*efd4c9b6SSteve Lawrence 	if (zs_usage_compute_psets(ures, uold, unew, func) != 0)
2453*efd4c9b6SSteve Lawrence 		goto err;
2454*efd4c9b6SSteve Lawrence 
2455*efd4c9b6SSteve Lawrence 	return (ures);
2456*efd4c9b6SSteve Lawrence err:
2457*efd4c9b6SSteve Lawrence 	if (alloced)
2458*efd4c9b6SSteve Lawrence 		zs_usage_free(ures);
2459*efd4c9b6SSteve Lawrence 	return (NULL);
2460*efd4c9b6SSteve Lawrence }
2461*efd4c9b6SSteve Lawrence 
2462*efd4c9b6SSteve Lawrence void
zs_usage_free(zs_usage_t * usage)2463*efd4c9b6SSteve Lawrence zs_usage_free(zs_usage_t *usage)
2464*efd4c9b6SSteve Lawrence {
2465*efd4c9b6SSteve Lawrence 	zs_zone_t *zone, *ztmp;
2466*efd4c9b6SSteve Lawrence 	zs_pset_t *pset, *ptmp;
2467*efd4c9b6SSteve Lawrence 	zs_pset_zone_t *pz, *pztmp;
2468*efd4c9b6SSteve Lawrence 
2469*efd4c9b6SSteve Lawrence 	if (usage->zsu_mmap) {
2470*efd4c9b6SSteve Lawrence 		(void) munmap((void *)usage, usage->zsu_size);
2471*efd4c9b6SSteve Lawrence 		return;
2472*efd4c9b6SSteve Lawrence 	}
2473*efd4c9b6SSteve Lawrence 	free(usage->zsu_system);
2474*efd4c9b6SSteve Lawrence 	zone = list_head(&usage->zsu_zone_list);
2475*efd4c9b6SSteve Lawrence 	while (zone != NULL) {
2476*efd4c9b6SSteve Lawrence 			ztmp = zone;
2477*efd4c9b6SSteve Lawrence 			zone = list_next(&usage->zsu_zone_list, zone);
2478*efd4c9b6SSteve Lawrence 			free(ztmp);
2479*efd4c9b6SSteve Lawrence 	}
2480*efd4c9b6SSteve Lawrence 	pset = list_head(&usage->zsu_pset_list);
2481*efd4c9b6SSteve Lawrence 	while (pset != NULL) {
2482*efd4c9b6SSteve Lawrence 		pz = list_head(&pset->zsp_usage_list);
2483*efd4c9b6SSteve Lawrence 		while (pz != NULL) {
2484*efd4c9b6SSteve Lawrence 			pztmp = pz;
2485*efd4c9b6SSteve Lawrence 			pz = list_next(&pset->zsp_usage_list, pz);
2486*efd4c9b6SSteve Lawrence 			free(pztmp);
2487*efd4c9b6SSteve Lawrence 		}
2488*efd4c9b6SSteve Lawrence 		ptmp = pset;
2489*efd4c9b6SSteve Lawrence 		pset = list_next(&usage->zsu_pset_list, pset);
2490*efd4c9b6SSteve Lawrence 		free(ptmp);
2491*efd4c9b6SSteve Lawrence 	}
2492*efd4c9b6SSteve Lawrence 	free(usage);
2493*efd4c9b6SSteve Lawrence }
2494*efd4c9b6SSteve Lawrence 
2495*efd4c9b6SSteve Lawrence zs_usage_set_t *
zs_usage_set_alloc()2496*efd4c9b6SSteve Lawrence zs_usage_set_alloc()
2497*efd4c9b6SSteve Lawrence {
2498*efd4c9b6SSteve Lawrence 	zs_usage_set_t *set;
2499*efd4c9b6SSteve Lawrence 
2500*efd4c9b6SSteve Lawrence 	set = calloc(sizeof (zs_usage_set_t), 1);
2501*efd4c9b6SSteve Lawrence 	if (set == NULL)
2502*efd4c9b6SSteve Lawrence 		return (NULL);
2503*efd4c9b6SSteve Lawrence 
2504*efd4c9b6SSteve Lawrence 	if ((set->zsus_total = zs_usage_alloc()) == NULL)
2505*efd4c9b6SSteve Lawrence 		goto err;
2506*efd4c9b6SSteve Lawrence 	if ((set->zsus_avg = zs_usage_alloc()) == NULL)
2507*efd4c9b6SSteve Lawrence 		goto err;
2508*efd4c9b6SSteve Lawrence 	if ((set->zsus_high = zs_usage_alloc()) == NULL)
2509*efd4c9b6SSteve Lawrence 		goto err;
2510*efd4c9b6SSteve Lawrence 
2511*efd4c9b6SSteve Lawrence 	return (set);
2512*efd4c9b6SSteve Lawrence 
2513*efd4c9b6SSteve Lawrence err:
2514*efd4c9b6SSteve Lawrence 	if (set->zsus_total != NULL)
2515*efd4c9b6SSteve Lawrence 		free(set->zsus_total);
2516*efd4c9b6SSteve Lawrence 	if (set->zsus_avg != NULL)
2517*efd4c9b6SSteve Lawrence 		free(set->zsus_avg);
2518*efd4c9b6SSteve Lawrence 	if (set->zsus_high != NULL)
2519*efd4c9b6SSteve Lawrence 		free(set->zsus_high);
2520*efd4c9b6SSteve Lawrence 
2521*efd4c9b6SSteve Lawrence 	return (NULL);
2522*efd4c9b6SSteve Lawrence }
2523*efd4c9b6SSteve Lawrence 
2524*efd4c9b6SSteve Lawrence void
zs_usage_set_free(zs_usage_set_t * set)2525*efd4c9b6SSteve Lawrence zs_usage_set_free(zs_usage_set_t *set)
2526*efd4c9b6SSteve Lawrence {
2527*efd4c9b6SSteve Lawrence 	zs_usage_free(set->zsus_total);
2528*efd4c9b6SSteve Lawrence 	zs_usage_free(set->zsus_avg);
2529*efd4c9b6SSteve Lawrence 	zs_usage_free(set->zsus_high);
2530*efd4c9b6SSteve Lawrence 	free(set);
2531*efd4c9b6SSteve Lawrence }
2532*efd4c9b6SSteve Lawrence 
2533*efd4c9b6SSteve Lawrence int
zs_usage_set_add(zs_usage_set_t * set,zs_usage_t * usage)2534*efd4c9b6SSteve Lawrence zs_usage_set_add(zs_usage_set_t *set, zs_usage_t *usage)
2535*efd4c9b6SSteve Lawrence {
2536*efd4c9b6SSteve Lawrence 
2537*efd4c9b6SSteve Lawrence 	/* Compute ongoing functions for usage set */
2538*efd4c9b6SSteve Lawrence 	(void) zs_usage_compute(set->zsus_high, set->zsus_high, usage,
2539*efd4c9b6SSteve Lawrence 	    ZS_COMPUTE_USAGE_HIGH);
2540*efd4c9b6SSteve Lawrence 
2541*efd4c9b6SSteve Lawrence 	(void) zs_usage_compute(set->zsus_total, set->zsus_total, usage,
2542*efd4c9b6SSteve Lawrence 	    ZS_COMPUTE_USAGE_TOTAL);
2543*efd4c9b6SSteve Lawrence 
2544*efd4c9b6SSteve Lawrence 	(void) zs_usage_compute(set->zsus_avg, set->zsus_avg, usage,
2545*efd4c9b6SSteve Lawrence 	    ZS_COMPUTE_USAGE_AVERAGE);
2546*efd4c9b6SSteve Lawrence 
2547*efd4c9b6SSteve Lawrence 	set->zsus_count++;
2548*efd4c9b6SSteve Lawrence 	zs_usage_free(usage);
2549*efd4c9b6SSteve Lawrence 	return (0);
2550*efd4c9b6SSteve Lawrence }
2551*efd4c9b6SSteve Lawrence 
2552*efd4c9b6SSteve Lawrence int
zs_usage_set_count(zs_usage_set_t * set)2553*efd4c9b6SSteve Lawrence zs_usage_set_count(zs_usage_set_t *set)
2554*efd4c9b6SSteve Lawrence {
2555*efd4c9b6SSteve Lawrence 	return (set->zsus_count);
2556*efd4c9b6SSteve Lawrence }
2557*efd4c9b6SSteve Lawrence 
2558*efd4c9b6SSteve Lawrence zs_usage_t *
zs_usage_set_compute(zs_usage_set_t * set,int func)2559*efd4c9b6SSteve Lawrence zs_usage_set_compute(zs_usage_set_t *set,  int func)
2560*efd4c9b6SSteve Lawrence {
2561*efd4c9b6SSteve Lawrence 	zs_usage_t *u;
2562*efd4c9b6SSteve Lawrence 	zs_system_t *s;
2563*efd4c9b6SSteve Lawrence 	zs_zone_t *z;
2564*efd4c9b6SSteve Lawrence 	zs_pset_t *p;
2565*efd4c9b6SSteve Lawrence 	zs_pset_zone_t *pz;
2566*efd4c9b6SSteve Lawrence 	uint_t intervals;
2567*efd4c9b6SSteve Lawrence 	boolean_t average;
2568*efd4c9b6SSteve Lawrence 
2569*efd4c9b6SSteve Lawrence 	switch (func) {
2570*efd4c9b6SSteve Lawrence 	case ZS_COMPUTE_SET_HIGH:
2571*efd4c9b6SSteve Lawrence 		return (set->zsus_high);
2572*efd4c9b6SSteve Lawrence 	case ZS_COMPUTE_SET_TOTAL:
2573*efd4c9b6SSteve Lawrence 		u = set->zsus_total;
2574*efd4c9b6SSteve Lawrence 		average = B_FALSE;
2575*efd4c9b6SSteve Lawrence 		break;
2576*efd4c9b6SSteve Lawrence 	case ZS_COMPUTE_SET_AVERAGE:
2577*efd4c9b6SSteve Lawrence 		u = set->zsus_avg;
2578*efd4c9b6SSteve Lawrence 		average = B_TRUE;
2579*efd4c9b6SSteve Lawrence 		break;
2580*efd4c9b6SSteve Lawrence 	default:
2581*efd4c9b6SSteve Lawrence 		assert(0);
2582*efd4c9b6SSteve Lawrence 	}
2583*efd4c9b6SSteve Lawrence 
2584*efd4c9b6SSteve Lawrence 	s = u->zsu_system;
2585*efd4c9b6SSteve Lawrence 
2586*efd4c9b6SSteve Lawrence 	s->zss_ram_total /= u->zsu_intervals;
2587*efd4c9b6SSteve Lawrence 	s->zss_ram_total *= 1024;
2588*efd4c9b6SSteve Lawrence 	s->zss_ram_kern /= u->zsu_intervals;
2589*efd4c9b6SSteve Lawrence 	s->zss_ram_kern *= 1024;
2590*efd4c9b6SSteve Lawrence 	s->zss_ram_zones /= u->zsu_intervals;
2591*efd4c9b6SSteve Lawrence 	s->zss_ram_zones *= 1024;
2592*efd4c9b6SSteve Lawrence 	s->zss_locked_kern /= u->zsu_intervals;
2593*efd4c9b6SSteve Lawrence 	s->zss_locked_kern *= 1024;
2594*efd4c9b6SSteve Lawrence 	s->zss_locked_zones /= u->zsu_intervals;
2595*efd4c9b6SSteve Lawrence 	s->zss_locked_zones *= 1024;
2596*efd4c9b6SSteve Lawrence 	s->zss_vm_total /= u->zsu_intervals;
2597*efd4c9b6SSteve Lawrence 	s->zss_vm_total *= 1024;
2598*efd4c9b6SSteve Lawrence 	s->zss_vm_kern /= u->zsu_intervals;
2599*efd4c9b6SSteve Lawrence 	s->zss_vm_kern *= 1024;
2600*efd4c9b6SSteve Lawrence 	s->zss_vm_zones /= u->zsu_intervals;
2601*efd4c9b6SSteve Lawrence 	s->zss_vm_zones *= 1024;
2602*efd4c9b6SSteve Lawrence 	s->zss_swap_total /= u->zsu_intervals;
2603*efd4c9b6SSteve Lawrence 	s->zss_swap_total *= 1024;
2604*efd4c9b6SSteve Lawrence 	s->zss_swap_used /= u->zsu_intervals;
2605*efd4c9b6SSteve Lawrence 	s->zss_swap_used *= 1024;
2606*efd4c9b6SSteve Lawrence 	s->zss_processes /= u->zsu_intervals;
2607*efd4c9b6SSteve Lawrence 	s->zss_lwps /= u->zsu_intervals;
2608*efd4c9b6SSteve Lawrence 	s->zss_shm /= u->zsu_intervals;
2609*efd4c9b6SSteve Lawrence 	s->zss_shm *= 1024;
2610*efd4c9b6SSteve Lawrence 	s->zss_shmids /= u->zsu_intervals;
2611*efd4c9b6SSteve Lawrence 	s->zss_semids /= u->zsu_intervals;
2612*efd4c9b6SSteve Lawrence 	s->zss_msgids /= u->zsu_intervals;
2613*efd4c9b6SSteve Lawrence 	s->zss_lofi /= u->zsu_intervals;
2614*efd4c9b6SSteve Lawrence 
2615*efd4c9b6SSteve Lawrence 	s->zss_ncpus /= u->zsu_intervals;
2616*efd4c9b6SSteve Lawrence 	s->zss_ncpus_online /= u->zsu_intervals;
2617*efd4c9b6SSteve Lawrence 
2618*efd4c9b6SSteve Lawrence 	for (z = list_head(&u->zsu_zone_list); z != NULL;
2619*efd4c9b6SSteve Lawrence 	    z = list_next(&u->zsu_zone_list, z)) {
2620*efd4c9b6SSteve Lawrence 
2621*efd4c9b6SSteve Lawrence 		if (average) {
2622*efd4c9b6SSteve Lawrence 			intervals = z->zsz_intervals;
2623*efd4c9b6SSteve Lawrence 		} else {
2624*efd4c9b6SSteve Lawrence 			assert(z->zsz_intervals == 0);
2625*efd4c9b6SSteve Lawrence 			intervals = u->zsu_intervals;
2626*efd4c9b6SSteve Lawrence 		}
2627*efd4c9b6SSteve Lawrence 
2628*efd4c9b6SSteve Lawrence 		if (z->zsz_cpu_cap != ZS_LIMIT_NONE)
2629*efd4c9b6SSteve Lawrence 			z->zsz_cpu_cap /= z->zsz_intervals;
2630*efd4c9b6SSteve Lawrence 		if (z->zsz_ram_cap != ZS_LIMIT_NONE)
2631*efd4c9b6SSteve Lawrence 			z->zsz_ram_cap /= z->zsz_intervals;
2632*efd4c9b6SSteve Lawrence 		if (z->zsz_vm_cap != ZS_LIMIT_NONE)
2633*efd4c9b6SSteve Lawrence 			z->zsz_vm_cap /= z->zsz_intervals;
2634*efd4c9b6SSteve Lawrence 		if (z->zsz_locked_cap != ZS_LIMIT_NONE)
2635*efd4c9b6SSteve Lawrence 			z->zsz_locked_cap /= z->zsz_intervals;
2636*efd4c9b6SSteve Lawrence 		if (z->zsz_processes_cap != ZS_LIMIT_NONE)
2637*efd4c9b6SSteve Lawrence 			z->zsz_processes_cap /= z->zsz_intervals;
2638*efd4c9b6SSteve Lawrence 		if (z->zsz_lwps_cap != ZS_LIMIT_NONE)
2639*efd4c9b6SSteve Lawrence 			z->zsz_lwps_cap /= z->zsz_intervals;
2640*efd4c9b6SSteve Lawrence 		if (z->zsz_shm_cap != ZS_LIMIT_NONE)
2641*efd4c9b6SSteve Lawrence 			z->zsz_shm_cap /= z->zsz_intervals;
2642*efd4c9b6SSteve Lawrence 		if (z->zsz_shmids_cap != ZS_LIMIT_NONE)
2643*efd4c9b6SSteve Lawrence 			z->zsz_shmids_cap /= z->zsz_intervals;
2644*efd4c9b6SSteve Lawrence 		if (z->zsz_semids_cap != ZS_LIMIT_NONE)
2645*efd4c9b6SSteve Lawrence 			z->zsz_semids_cap /= z->zsz_intervals;
2646*efd4c9b6SSteve Lawrence 		if (z->zsz_msgids_cap != ZS_LIMIT_NONE)
2647*efd4c9b6SSteve Lawrence 			z->zsz_msgids_cap /= z->zsz_intervals;
2648*efd4c9b6SSteve Lawrence 		if (z->zsz_lofi_cap != ZS_LIMIT_NONE)
2649*efd4c9b6SSteve Lawrence 			z->zsz_lofi_cap /= z->zsz_intervals;
2650*efd4c9b6SSteve Lawrence 
2651*efd4c9b6SSteve Lawrence 		z->zsz_usage_ram /= intervals;
2652*efd4c9b6SSteve Lawrence 		z->zsz_usage_locked /= intervals;
2653*efd4c9b6SSteve Lawrence 		z->zsz_usage_vm /= intervals;
2654*efd4c9b6SSteve Lawrence 		z->zsz_processes /= intervals;
2655*efd4c9b6SSteve Lawrence 		z->zsz_lwps /= intervals;
2656*efd4c9b6SSteve Lawrence 		z->zsz_shm /= intervals;
2657*efd4c9b6SSteve Lawrence 		z->zsz_shmids /= intervals;
2658*efd4c9b6SSteve Lawrence 		z->zsz_semids /= intervals;
2659*efd4c9b6SSteve Lawrence 		z->zsz_msgids /= intervals;
2660*efd4c9b6SSteve Lawrence 		z->zsz_lofi /= intervals;
2661*efd4c9b6SSteve Lawrence 		z->zsz_cpus_online /= intervals;
2662*efd4c9b6SSteve Lawrence 		z->zsz_cpu_shares /= intervals;
2663*efd4c9b6SSteve Lawrence 	}
2664*efd4c9b6SSteve Lawrence 	for (p = list_head(&u->zsu_pset_list); p != NULL;
2665*efd4c9b6SSteve Lawrence 	    p = list_next(&u->zsu_pset_list, p)) {
2666*efd4c9b6SSteve Lawrence 
2667*efd4c9b6SSteve Lawrence 		intervals = p->zsp_intervals;
2668*efd4c9b6SSteve Lawrence 
2669*efd4c9b6SSteve Lawrence 		p->zsp_online /= intervals;
2670*efd4c9b6SSteve Lawrence 		p->zsp_size /= intervals;
2671*efd4c9b6SSteve Lawrence 		p->zsp_min /= intervals;
2672*efd4c9b6SSteve Lawrence 		p->zsp_max /= intervals;
2673*efd4c9b6SSteve Lawrence 		p->zsp_importance /= intervals;
2674*efd4c9b6SSteve Lawrence 		p->zsp_cpu_shares /= intervals;
2675*efd4c9b6SSteve Lawrence 
2676*efd4c9b6SSteve Lawrence 		for (pz = list_head(&p->zsp_usage_list); pz != NULL;
2677*efd4c9b6SSteve Lawrence 		    pz = list_next(&p->zsp_usage_list, pz)) {
2678*efd4c9b6SSteve Lawrence 
2679*efd4c9b6SSteve Lawrence 			if (average) {
2680*efd4c9b6SSteve Lawrence 				intervals = pz->zspz_intervals;
2681*efd4c9b6SSteve Lawrence 			} else {
2682*efd4c9b6SSteve Lawrence 				assert(pz->zspz_intervals == 0);
2683*efd4c9b6SSteve Lawrence 				intervals = p->zsp_intervals;
2684*efd4c9b6SSteve Lawrence 			}
2685*efd4c9b6SSteve Lawrence 			pz->zspz_cpu_shares /= intervals;
2686*efd4c9b6SSteve Lawrence 		}
2687*efd4c9b6SSteve Lawrence 	}
2688*efd4c9b6SSteve Lawrence 	return (u);
2689*efd4c9b6SSteve Lawrence }
2690*efd4c9b6SSteve Lawrence 
2691*efd4c9b6SSteve Lawrence /*
2692*efd4c9b6SSteve Lawrence  * Returns 0 on success.  Trips assert on invalid property.
2693*efd4c9b6SSteve Lawrence  */
2694*efd4c9b6SSteve Lawrence void
zs_resource_property(zs_usage_t * u,int res,int prop,zs_property_t * p)2695*efd4c9b6SSteve Lawrence zs_resource_property(zs_usage_t *u, int res, int prop, zs_property_t *p)
2696*efd4c9b6SSteve Lawrence {
2697*efd4c9b6SSteve Lawrence 	switch (res)  {
2698*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_CPU:
2699*efd4c9b6SSteve Lawrence 		switch (prop) {
2700*efd4c9b6SSteve Lawrence 		case ZS_RESOURCE_PROP_CPU_TOTAL:
2701*efd4c9b6SSteve Lawrence 			p->zsp_id = prop;
2702*efd4c9b6SSteve Lawrence 			p->zsp_type = ZS_PROP_TYPE_UINT64;
2703*efd4c9b6SSteve Lawrence 			p->zsp_v.zsv_uint64 = u->zsu_system->zss_ncpus;
2704*efd4c9b6SSteve Lawrence 			break;
2705*efd4c9b6SSteve Lawrence 		case ZS_RESOURCE_PROP_CPU_ONLINE:
2706*efd4c9b6SSteve Lawrence 			p->zsp_id = prop;
2707*efd4c9b6SSteve Lawrence 			p->zsp_type = ZS_PROP_TYPE_UINT64;
2708*efd4c9b6SSteve Lawrence 			p->zsp_v.zsv_uint64 = u->zsu_system->zss_ncpus_online;
2709*efd4c9b6SSteve Lawrence 			break;
2710*efd4c9b6SSteve Lawrence 		default:
2711*efd4c9b6SSteve Lawrence 			assert(0);
2712*efd4c9b6SSteve Lawrence 		}
2713*efd4c9b6SSteve Lawrence 		break;
2714*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_RAM_RSS:
2715*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_RAM_LOCKED:
2716*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_VM:
2717*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_DISK_SWAP:
2718*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_LWPS:
2719*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_PROCESSES:
2720*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_SHM_MEMORY:
2721*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_SHM_IDS:
2722*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_SEM_IDS:
2723*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_MSG_IDS:
2724*efd4c9b6SSteve Lawrence 		/* FALLTHROUGH */
2725*efd4c9b6SSteve Lawrence 	default:
2726*efd4c9b6SSteve Lawrence 		assert(0);
2727*efd4c9b6SSteve Lawrence 	}
2728*efd4c9b6SSteve Lawrence }
2729*efd4c9b6SSteve Lawrence 
2730*efd4c9b6SSteve Lawrence /*
2731*efd4c9b6SSteve Lawrence  * Returns one of ZS_RESOURCE_TYPE_* on success.  Asserts on invalid
2732*efd4c9b6SSteve Lawrence  * resource.
2733*efd4c9b6SSteve Lawrence  */
2734*efd4c9b6SSteve Lawrence int
zs_resource_type(int res)2735*efd4c9b6SSteve Lawrence zs_resource_type(int res)
2736*efd4c9b6SSteve Lawrence {
2737*efd4c9b6SSteve Lawrence 	switch (res)  {
2738*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_CPU:
2739*efd4c9b6SSteve Lawrence 		return (ZS_RESOURCE_TYPE_TIME);
2740*efd4c9b6SSteve Lawrence 		break;
2741*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_RAM_RSS:
2742*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_RAM_LOCKED:
2743*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_VM:
2744*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_DISK_SWAP:
2745*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_SHM_MEMORY:
2746*efd4c9b6SSteve Lawrence 		return (ZS_RESOURCE_TYPE_BYTES);
2747*efd4c9b6SSteve Lawrence 		break;
2748*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_LWPS:
2749*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_PROCESSES:
2750*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_SHM_IDS:
2751*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_SEM_IDS:
2752*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_MSG_IDS:
2753*efd4c9b6SSteve Lawrence 		return (ZS_RESOURCE_TYPE_COUNT);
2754*efd4c9b6SSteve Lawrence 		break;
2755*efd4c9b6SSteve Lawrence 	default:
2756*efd4c9b6SSteve Lawrence 		assert(0);
2757*efd4c9b6SSteve Lawrence 		return (0);
2758*efd4c9b6SSteve Lawrence 	}
2759*efd4c9b6SSteve Lawrence }
2760*efd4c9b6SSteve Lawrence 
2761*efd4c9b6SSteve Lawrence /*
2762*efd4c9b6SSteve Lawrence  * Get total available resource on system
2763*efd4c9b6SSteve Lawrence  */
2764*efd4c9b6SSteve Lawrence uint64_t
zs_resource_total_uint64(zs_usage_t * u,int res)2765*efd4c9b6SSteve Lawrence zs_resource_total_uint64(zs_usage_t *u, int res)
2766*efd4c9b6SSteve Lawrence {
2767*efd4c9b6SSteve Lawrence 	uint64_t v;
2768*efd4c9b6SSteve Lawrence 
2769*efd4c9b6SSteve Lawrence 	switch (res)  {
2770*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_CPU:
2771*efd4c9b6SSteve Lawrence 		v = zs_cpu_total_cpu(u);
2772*efd4c9b6SSteve Lawrence 		break;
2773*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_RAM_RSS:
2774*efd4c9b6SSteve Lawrence 		v = zs_physical_memory_total(u);
2775*efd4c9b6SSteve Lawrence 		break;
2776*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_RAM_LOCKED:
2777*efd4c9b6SSteve Lawrence 		v = zs_locked_memory_total(u);
2778*efd4c9b6SSteve Lawrence 		break;
2779*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_VM:
2780*efd4c9b6SSteve Lawrence 		v = zs_virtual_memory_total(u);
2781*efd4c9b6SSteve Lawrence 		break;
2782*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_DISK_SWAP:
2783*efd4c9b6SSteve Lawrence 		v = zs_disk_swap_total(u);
2784*efd4c9b6SSteve Lawrence 		break;
2785*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_LWPS:
2786*efd4c9b6SSteve Lawrence 		v = zs_lwps_total(u);
2787*efd4c9b6SSteve Lawrence 		break;
2788*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_PROCESSES:
2789*efd4c9b6SSteve Lawrence 		v = zs_processes_total(u);
2790*efd4c9b6SSteve Lawrence 		break;
2791*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_SHM_MEMORY:
2792*efd4c9b6SSteve Lawrence 		v = zs_shm_total(u);
2793*efd4c9b6SSteve Lawrence 		break;
2794*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_SHM_IDS:
2795*efd4c9b6SSteve Lawrence 		v = zs_shmids_total(u);
2796*efd4c9b6SSteve Lawrence 		break;
2797*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_SEM_IDS:
2798*efd4c9b6SSteve Lawrence 		v = zs_semids_total(u);
2799*efd4c9b6SSteve Lawrence 		break;
2800*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_MSG_IDS:
2801*efd4c9b6SSteve Lawrence 		v = zs_msgids_total(u);
2802*efd4c9b6SSteve Lawrence 		break;
2803*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_LOFI:
2804*efd4c9b6SSteve Lawrence 		v = zs_lofi_total(u);
2805*efd4c9b6SSteve Lawrence 		break;
2806*efd4c9b6SSteve Lawrence 	default:
2807*efd4c9b6SSteve Lawrence 		assert(0);
2808*efd4c9b6SSteve Lawrence 	}
2809*efd4c9b6SSteve Lawrence 	return (v);
2810*efd4c9b6SSteve Lawrence }
2811*efd4c9b6SSteve Lawrence 
2812*efd4c9b6SSteve Lawrence /*
2813*efd4c9b6SSteve Lawrence  * Get amount of used resource.
2814*efd4c9b6SSteve Lawrence  */
2815*efd4c9b6SSteve Lawrence uint64_t
zs_resource_used_uint64(zs_usage_t * u,int res,int user)2816*efd4c9b6SSteve Lawrence zs_resource_used_uint64(zs_usage_t *u, int res, int user)
2817*efd4c9b6SSteve Lawrence {
2818*efd4c9b6SSteve Lawrence 	uint64_t v;
2819*efd4c9b6SSteve Lawrence 
2820*efd4c9b6SSteve Lawrence 	switch (res)  {
2821*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_CPU:
2822*efd4c9b6SSteve Lawrence 		switch (user) {
2823*efd4c9b6SSteve Lawrence 		case ZS_USER_ALL:
2824*efd4c9b6SSteve Lawrence 			v = zs_cpu_usage_all_cpu(u);
2825*efd4c9b6SSteve Lawrence 			break;
2826*efd4c9b6SSteve Lawrence 		case ZS_USER_KERNEL:
2827*efd4c9b6SSteve Lawrence 			v = zs_cpu_usage_kernel_cpu(u);
2828*efd4c9b6SSteve Lawrence 			break;
2829*efd4c9b6SSteve Lawrence 		case ZS_USER_ZONES:
2830*efd4c9b6SSteve Lawrence 			v = zs_cpu_usage_zones_cpu(u);
2831*efd4c9b6SSteve Lawrence 			break;
2832*efd4c9b6SSteve Lawrence 		case ZS_USER_FREE:
2833*efd4c9b6SSteve Lawrence 			v = zs_cpu_usage_idle_cpu(u);
2834*efd4c9b6SSteve Lawrence 			break;
2835*efd4c9b6SSteve Lawrence 		default:
2836*efd4c9b6SSteve Lawrence 			assert(0);
2837*efd4c9b6SSteve Lawrence 		}
2838*efd4c9b6SSteve Lawrence 		break;
2839*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_RAM_RSS:
2840*efd4c9b6SSteve Lawrence 		switch (user) {
2841*efd4c9b6SSteve Lawrence 		case ZS_USER_ALL:
2842*efd4c9b6SSteve Lawrence 			v = zs_physical_memory_usage_all(u);
2843*efd4c9b6SSteve Lawrence 			break;
2844*efd4c9b6SSteve Lawrence 		case ZS_USER_KERNEL:
2845*efd4c9b6SSteve Lawrence 			v = zs_physical_memory_usage_kernel(u);
2846*efd4c9b6SSteve Lawrence 			break;
2847*efd4c9b6SSteve Lawrence 		case ZS_USER_ZONES:
2848*efd4c9b6SSteve Lawrence 			v = zs_physical_memory_usage_zones(u);
2849*efd4c9b6SSteve Lawrence 			break;
2850*efd4c9b6SSteve Lawrence 		case ZS_USER_FREE:
2851*efd4c9b6SSteve Lawrence 			v = zs_physical_memory_usage_free(u);
2852*efd4c9b6SSteve Lawrence 			break;
2853*efd4c9b6SSteve Lawrence 		default:
2854*efd4c9b6SSteve Lawrence 			assert(0);
2855*efd4c9b6SSteve Lawrence 		}
2856*efd4c9b6SSteve Lawrence 		break;
2857*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_RAM_LOCKED:
2858*efd4c9b6SSteve Lawrence 		switch (user) {
2859*efd4c9b6SSteve Lawrence 		case ZS_USER_ALL:
2860*efd4c9b6SSteve Lawrence 			v = zs_locked_memory_usage_all(u);
2861*efd4c9b6SSteve Lawrence 			break;
2862*efd4c9b6SSteve Lawrence 		case ZS_USER_KERNEL:
2863*efd4c9b6SSteve Lawrence 			v = zs_locked_memory_usage_kernel(u);
2864*efd4c9b6SSteve Lawrence 			break;
2865*efd4c9b6SSteve Lawrence 		case ZS_USER_ZONES:
2866*efd4c9b6SSteve Lawrence 			v = zs_locked_memory_usage_zones(u);
2867*efd4c9b6SSteve Lawrence 			break;
2868*efd4c9b6SSteve Lawrence 		case ZS_USER_FREE:
2869*efd4c9b6SSteve Lawrence 			v = zs_locked_memory_usage_free(u);
2870*efd4c9b6SSteve Lawrence 			break;
2871*efd4c9b6SSteve Lawrence 		default:
2872*efd4c9b6SSteve Lawrence 			assert(0);
2873*efd4c9b6SSteve Lawrence 		}
2874*efd4c9b6SSteve Lawrence 		break;
2875*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_VM:
2876*efd4c9b6SSteve Lawrence 		switch (user) {
2877*efd4c9b6SSteve Lawrence 		case ZS_USER_ALL:
2878*efd4c9b6SSteve Lawrence 			v = zs_virtual_memory_usage_all(u);
2879*efd4c9b6SSteve Lawrence 			break;
2880*efd4c9b6SSteve Lawrence 		case ZS_USER_KERNEL:
2881*efd4c9b6SSteve Lawrence 			v = zs_virtual_memory_usage_kernel(u);
2882*efd4c9b6SSteve Lawrence 			break;
2883*efd4c9b6SSteve Lawrence 		case ZS_USER_ZONES:
2884*efd4c9b6SSteve Lawrence 			v = zs_virtual_memory_usage_zones(u);
2885*efd4c9b6SSteve Lawrence 			break;
2886*efd4c9b6SSteve Lawrence 		case ZS_USER_FREE:
2887*efd4c9b6SSteve Lawrence 			v = zs_virtual_memory_usage_free(u);
2888*efd4c9b6SSteve Lawrence 			break;
2889*efd4c9b6SSteve Lawrence 		default:
2890*efd4c9b6SSteve Lawrence 			assert(0);
2891*efd4c9b6SSteve Lawrence 		}
2892*efd4c9b6SSteve Lawrence 		break;
2893*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_DISK_SWAP:
2894*efd4c9b6SSteve Lawrence 		switch (user) {
2895*efd4c9b6SSteve Lawrence 		case ZS_USER_ALL:
2896*efd4c9b6SSteve Lawrence 			v = zs_disk_swap_usage_all(u);
2897*efd4c9b6SSteve Lawrence 			break;
2898*efd4c9b6SSteve Lawrence 		case ZS_USER_FREE:
2899*efd4c9b6SSteve Lawrence 			v = zs_disk_swap_usage_free(u);
2900*efd4c9b6SSteve Lawrence 			break;
2901*efd4c9b6SSteve Lawrence 		case ZS_USER_KERNEL:
2902*efd4c9b6SSteve Lawrence 		case ZS_USER_ZONES:
2903*efd4c9b6SSteve Lawrence 			/* FALLTHROUGH */
2904*efd4c9b6SSteve Lawrence 		default:
2905*efd4c9b6SSteve Lawrence 			assert(0);
2906*efd4c9b6SSteve Lawrence 		}
2907*efd4c9b6SSteve Lawrence 		break;
2908*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_LWPS:
2909*efd4c9b6SSteve Lawrence 		switch (user) {
2910*efd4c9b6SSteve Lawrence 		case ZS_USER_ALL:
2911*efd4c9b6SSteve Lawrence 		case ZS_USER_ZONES:
2912*efd4c9b6SSteve Lawrence 			v = zs_lwps_usage_all(u);
2913*efd4c9b6SSteve Lawrence 			break;
2914*efd4c9b6SSteve Lawrence 		case ZS_USER_FREE:
2915*efd4c9b6SSteve Lawrence 			v = zs_lwps_total(u) - zs_lwps_usage_all(u);
2916*efd4c9b6SSteve Lawrence 			break;
2917*efd4c9b6SSteve Lawrence 		case ZS_USER_KERNEL:
2918*efd4c9b6SSteve Lawrence 			v = 0;
2919*efd4c9b6SSteve Lawrence 			break;
2920*efd4c9b6SSteve Lawrence 		default:
2921*efd4c9b6SSteve Lawrence 			assert(0);
2922*efd4c9b6SSteve Lawrence 		}
2923*efd4c9b6SSteve Lawrence 		break;
2924*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_PROCESSES:
2925*efd4c9b6SSteve Lawrence 		switch (user) {
2926*efd4c9b6SSteve Lawrence 		case ZS_USER_ALL:
2927*efd4c9b6SSteve Lawrence 		case ZS_USER_ZONES:
2928*efd4c9b6SSteve Lawrence 			v = zs_processes_usage_all(u);
2929*efd4c9b6SSteve Lawrence 			break;
2930*efd4c9b6SSteve Lawrence 		case ZS_USER_FREE:
2931*efd4c9b6SSteve Lawrence 			v = zs_processes_total(u) - zs_processes_usage_all(u);
2932*efd4c9b6SSteve Lawrence 			break;
2933*efd4c9b6SSteve Lawrence 		case ZS_USER_KERNEL:
2934*efd4c9b6SSteve Lawrence 			v = 0;
2935*efd4c9b6SSteve Lawrence 			break;
2936*efd4c9b6SSteve Lawrence 		default:
2937*efd4c9b6SSteve Lawrence 			assert(0);
2938*efd4c9b6SSteve Lawrence 		}
2939*efd4c9b6SSteve Lawrence 		break;
2940*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_SHM_MEMORY:
2941*efd4c9b6SSteve Lawrence 		switch (user) {
2942*efd4c9b6SSteve Lawrence 		case ZS_USER_ALL:
2943*efd4c9b6SSteve Lawrence 		case ZS_USER_ZONES:
2944*efd4c9b6SSteve Lawrence 			v = zs_shm_usage_all(u);
2945*efd4c9b6SSteve Lawrence 			break;
2946*efd4c9b6SSteve Lawrence 		case ZS_USER_FREE:
2947*efd4c9b6SSteve Lawrence 			v = zs_shm_total(u) -
2948*efd4c9b6SSteve Lawrence 			    zs_shm_usage_all(u);
2949*efd4c9b6SSteve Lawrence 			break;
2950*efd4c9b6SSteve Lawrence 		case ZS_USER_KERNEL:
2951*efd4c9b6SSteve Lawrence 			v = 0;
2952*efd4c9b6SSteve Lawrence 			break;
2953*efd4c9b6SSteve Lawrence 		default:
2954*efd4c9b6SSteve Lawrence 			assert(0);
2955*efd4c9b6SSteve Lawrence 		}
2956*efd4c9b6SSteve Lawrence 		break;
2957*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_SHM_IDS:
2958*efd4c9b6SSteve Lawrence 		switch (user) {
2959*efd4c9b6SSteve Lawrence 		case ZS_USER_ALL:
2960*efd4c9b6SSteve Lawrence 		case ZS_USER_ZONES:
2961*efd4c9b6SSteve Lawrence 			v = zs_shmids_usage_all(u);
2962*efd4c9b6SSteve Lawrence 			break;
2963*efd4c9b6SSteve Lawrence 		case ZS_USER_FREE:
2964*efd4c9b6SSteve Lawrence 			v = zs_shmids_total(u) - zs_shmids_usage_all(u);
2965*efd4c9b6SSteve Lawrence 			break;
2966*efd4c9b6SSteve Lawrence 		case ZS_USER_KERNEL:
2967*efd4c9b6SSteve Lawrence 			v = 0;
2968*efd4c9b6SSteve Lawrence 			break;
2969*efd4c9b6SSteve Lawrence 		default:
2970*efd4c9b6SSteve Lawrence 			assert(0);
2971*efd4c9b6SSteve Lawrence 		}
2972*efd4c9b6SSteve Lawrence 		break;
2973*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_SEM_IDS:
2974*efd4c9b6SSteve Lawrence 		switch (user) {
2975*efd4c9b6SSteve Lawrence 		case ZS_USER_ALL:
2976*efd4c9b6SSteve Lawrence 		case ZS_USER_ZONES:
2977*efd4c9b6SSteve Lawrence 			v = zs_semids_usage_all(u);
2978*efd4c9b6SSteve Lawrence 			break;
2979*efd4c9b6SSteve Lawrence 		case ZS_USER_FREE:
2980*efd4c9b6SSteve Lawrence 			v = zs_semids_total(u) - zs_semids_usage_all(u);
2981*efd4c9b6SSteve Lawrence 			break;
2982*efd4c9b6SSteve Lawrence 		case ZS_USER_KERNEL:
2983*efd4c9b6SSteve Lawrence 			v = 0;
2984*efd4c9b6SSteve Lawrence 			break;
2985*efd4c9b6SSteve Lawrence 		default:
2986*efd4c9b6SSteve Lawrence 			assert(0);
2987*efd4c9b6SSteve Lawrence 		}
2988*efd4c9b6SSteve Lawrence 		break;
2989*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_MSG_IDS:
2990*efd4c9b6SSteve Lawrence 		switch (user) {
2991*efd4c9b6SSteve Lawrence 		case ZS_USER_ALL:
2992*efd4c9b6SSteve Lawrence 		case ZS_USER_ZONES:
2993*efd4c9b6SSteve Lawrence 			v = zs_msgids_usage_all(u);
2994*efd4c9b6SSteve Lawrence 			break;
2995*efd4c9b6SSteve Lawrence 		case ZS_USER_FREE:
2996*efd4c9b6SSteve Lawrence 			v = zs_msgids_total(u) - zs_msgids_usage_all(u);
2997*efd4c9b6SSteve Lawrence 			break;
2998*efd4c9b6SSteve Lawrence 		case ZS_USER_KERNEL:
2999*efd4c9b6SSteve Lawrence 			v = 0;
3000*efd4c9b6SSteve Lawrence 			break;
3001*efd4c9b6SSteve Lawrence 		default:
3002*efd4c9b6SSteve Lawrence 			assert(0);
3003*efd4c9b6SSteve Lawrence 		}
3004*efd4c9b6SSteve Lawrence 		break;
3005*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_LOFI:
3006*efd4c9b6SSteve Lawrence 		switch (user) {
3007*efd4c9b6SSteve Lawrence 		case ZS_USER_ALL:
3008*efd4c9b6SSteve Lawrence 		case ZS_USER_ZONES:
3009*efd4c9b6SSteve Lawrence 			v = zs_lofi_usage_all(u);
3010*efd4c9b6SSteve Lawrence 			break;
3011*efd4c9b6SSteve Lawrence 		case ZS_USER_FREE:
3012*efd4c9b6SSteve Lawrence 			v = zs_lofi_total(u) - zs_lofi_usage_all(u);
3013*efd4c9b6SSteve Lawrence 			break;
3014*efd4c9b6SSteve Lawrence 		case ZS_USER_KERNEL:
3015*efd4c9b6SSteve Lawrence 			v = 0;
3016*efd4c9b6SSteve Lawrence 			break;
3017*efd4c9b6SSteve Lawrence 		default:
3018*efd4c9b6SSteve Lawrence 			assert(0);
3019*efd4c9b6SSteve Lawrence 		}
3020*efd4c9b6SSteve Lawrence 		break;
3021*efd4c9b6SSteve Lawrence 
3022*efd4c9b6SSteve Lawrence 	default:
3023*efd4c9b6SSteve Lawrence 		assert(0);
3024*efd4c9b6SSteve Lawrence 	}
3025*efd4c9b6SSteve Lawrence 	return (v);
3026*efd4c9b6SSteve Lawrence }
3027*efd4c9b6SSteve Lawrence 
3028*efd4c9b6SSteve Lawrence /*
3029*efd4c9b6SSteve Lawrence  * Get used resource as a percent of total resource.
3030*efd4c9b6SSteve Lawrence  */
3031*efd4c9b6SSteve Lawrence uint_t
zs_resource_used_pct(zs_usage_t * u,int res,int user)3032*efd4c9b6SSteve Lawrence zs_resource_used_pct(zs_usage_t *u, int res, int user)
3033*efd4c9b6SSteve Lawrence {
3034*efd4c9b6SSteve Lawrence 	uint64_t v;
3035*efd4c9b6SSteve Lawrence 
3036*efd4c9b6SSteve Lawrence 	switch (res)  {
3037*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_CPU:
3038*efd4c9b6SSteve Lawrence 		switch (user) {
3039*efd4c9b6SSteve Lawrence 		case ZS_USER_ALL:
3040*efd4c9b6SSteve Lawrence 			v = zs_cpu_usage_all_pct(u);
3041*efd4c9b6SSteve Lawrence 			break;
3042*efd4c9b6SSteve Lawrence 		case ZS_USER_KERNEL:
3043*efd4c9b6SSteve Lawrence 			v = zs_cpu_usage_kernel_pct(u);
3044*efd4c9b6SSteve Lawrence 			break;
3045*efd4c9b6SSteve Lawrence 		case ZS_USER_ZONES:
3046*efd4c9b6SSteve Lawrence 			v = zs_cpu_usage_zones_pct(u);
3047*efd4c9b6SSteve Lawrence 			break;
3048*efd4c9b6SSteve Lawrence 		case ZS_USER_FREE:
3049*efd4c9b6SSteve Lawrence 			v = zs_cpu_usage_idle_pct(u);
3050*efd4c9b6SSteve Lawrence 			break;
3051*efd4c9b6SSteve Lawrence 		default:
3052*efd4c9b6SSteve Lawrence 			assert(0);
3053*efd4c9b6SSteve Lawrence 		}
3054*efd4c9b6SSteve Lawrence 		break;
3055*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_RAM_RSS:
3056*efd4c9b6SSteve Lawrence 		switch (user) {
3057*efd4c9b6SSteve Lawrence 		case ZS_USER_ALL:
3058*efd4c9b6SSteve Lawrence 			v = zs_physical_memory_usage_all_pct(u);
3059*efd4c9b6SSteve Lawrence 			break;
3060*efd4c9b6SSteve Lawrence 		case ZS_USER_KERNEL:
3061*efd4c9b6SSteve Lawrence 			v = zs_physical_memory_usage_kernel_pct(u);
3062*efd4c9b6SSteve Lawrence 			break;
3063*efd4c9b6SSteve Lawrence 		case ZS_USER_ZONES:
3064*efd4c9b6SSteve Lawrence 			v = zs_physical_memory_usage_zones_pct(u);
3065*efd4c9b6SSteve Lawrence 			break;
3066*efd4c9b6SSteve Lawrence 		case ZS_USER_FREE:
3067*efd4c9b6SSteve Lawrence 			v = zs_physical_memory_usage_free_pct(u);
3068*efd4c9b6SSteve Lawrence 			break;
3069*efd4c9b6SSteve Lawrence 		default:
3070*efd4c9b6SSteve Lawrence 			assert(0);
3071*efd4c9b6SSteve Lawrence 		}
3072*efd4c9b6SSteve Lawrence 		break;
3073*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_RAM_LOCKED:
3074*efd4c9b6SSteve Lawrence 		switch (user) {
3075*efd4c9b6SSteve Lawrence 		case ZS_USER_ALL:
3076*efd4c9b6SSteve Lawrence 			v = zs_locked_memory_usage_all_pct(u);
3077*efd4c9b6SSteve Lawrence 			break;
3078*efd4c9b6SSteve Lawrence 		case ZS_USER_KERNEL:
3079*efd4c9b6SSteve Lawrence 			v = zs_locked_memory_usage_kernel_pct(u);
3080*efd4c9b6SSteve Lawrence 			break;
3081*efd4c9b6SSteve Lawrence 		case ZS_USER_ZONES:
3082*efd4c9b6SSteve Lawrence 			v = zs_locked_memory_usage_zones_pct(u);
3083*efd4c9b6SSteve Lawrence 			break;
3084*efd4c9b6SSteve Lawrence 		case ZS_USER_FREE:
3085*efd4c9b6SSteve Lawrence 			v = zs_locked_memory_usage_free_pct(u);
3086*efd4c9b6SSteve Lawrence 			break;
3087*efd4c9b6SSteve Lawrence 		default:
3088*efd4c9b6SSteve Lawrence 			assert(0);
3089*efd4c9b6SSteve Lawrence 		}
3090*efd4c9b6SSteve Lawrence 		break;
3091*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_VM:
3092*efd4c9b6SSteve Lawrence 		switch (user) {
3093*efd4c9b6SSteve Lawrence 		case ZS_USER_ALL:
3094*efd4c9b6SSteve Lawrence 			v = zs_virtual_memory_usage_all_pct(u);
3095*efd4c9b6SSteve Lawrence 			break;
3096*efd4c9b6SSteve Lawrence 		case ZS_USER_KERNEL:
3097*efd4c9b6SSteve Lawrence 			v = zs_virtual_memory_usage_kernel_pct(u);
3098*efd4c9b6SSteve Lawrence 			break;
3099*efd4c9b6SSteve Lawrence 		case ZS_USER_ZONES:
3100*efd4c9b6SSteve Lawrence 			v = zs_virtual_memory_usage_zones_pct(u);
3101*efd4c9b6SSteve Lawrence 			break;
3102*efd4c9b6SSteve Lawrence 		case ZS_USER_FREE:
3103*efd4c9b6SSteve Lawrence 			v = zs_virtual_memory_usage_free_pct(u);
3104*efd4c9b6SSteve Lawrence 			break;
3105*efd4c9b6SSteve Lawrence 		default:
3106*efd4c9b6SSteve Lawrence 			assert(0);
3107*efd4c9b6SSteve Lawrence 		}
3108*efd4c9b6SSteve Lawrence 		break;
3109*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_DISK_SWAP:
3110*efd4c9b6SSteve Lawrence 		switch (user) {
3111*efd4c9b6SSteve Lawrence 		case ZS_USER_ALL:
3112*efd4c9b6SSteve Lawrence 			v = zs_disk_swap_usage_all_pct(u);
3113*efd4c9b6SSteve Lawrence 			break;
3114*efd4c9b6SSteve Lawrence 		case ZS_USER_FREE:
3115*efd4c9b6SSteve Lawrence 			v = zs_disk_swap_usage_free_pct(u);
3116*efd4c9b6SSteve Lawrence 			break;
3117*efd4c9b6SSteve Lawrence 		case ZS_USER_KERNEL:
3118*efd4c9b6SSteve Lawrence 		case ZS_USER_ZONES:
3119*efd4c9b6SSteve Lawrence 			/* FALLTHROUGH */
3120*efd4c9b6SSteve Lawrence 		default:
3121*efd4c9b6SSteve Lawrence 			assert(0);
3122*efd4c9b6SSteve Lawrence 		}
3123*efd4c9b6SSteve Lawrence 		break;
3124*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_LWPS:
3125*efd4c9b6SSteve Lawrence 		switch (user) {
3126*efd4c9b6SSteve Lawrence 		case ZS_USER_ALL:
3127*efd4c9b6SSteve Lawrence 		case ZS_USER_ZONES:
3128*efd4c9b6SSteve Lawrence 			v = zs_lwps_usage_all_pct(u);
3129*efd4c9b6SSteve Lawrence 			break;
3130*efd4c9b6SSteve Lawrence 		case ZS_USER_FREE:
3131*efd4c9b6SSteve Lawrence 			v = ZSD_PCT_INT - zs_lwps_usage_all_pct(u);
3132*efd4c9b6SSteve Lawrence 			break;
3133*efd4c9b6SSteve Lawrence 		case ZS_USER_KERNEL:
3134*efd4c9b6SSteve Lawrence 			v = 0;
3135*efd4c9b6SSteve Lawrence 			break;
3136*efd4c9b6SSteve Lawrence 		default:
3137*efd4c9b6SSteve Lawrence 			assert(0);
3138*efd4c9b6SSteve Lawrence 		}
3139*efd4c9b6SSteve Lawrence 		break;
3140*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_PROCESSES:
3141*efd4c9b6SSteve Lawrence 		switch (user) {
3142*efd4c9b6SSteve Lawrence 		case ZS_USER_ALL:
3143*efd4c9b6SSteve Lawrence 		case ZS_USER_ZONES:
3144*efd4c9b6SSteve Lawrence 			v = zs_processes_usage_all_pct(u);
3145*efd4c9b6SSteve Lawrence 			break;
3146*efd4c9b6SSteve Lawrence 		case ZS_USER_FREE:
3147*efd4c9b6SSteve Lawrence 			v = ZSD_PCT_INT - zs_processes_usage_all_pct(u);
3148*efd4c9b6SSteve Lawrence 			break;
3149*efd4c9b6SSteve Lawrence 		case ZS_USER_KERNEL:
3150*efd4c9b6SSteve Lawrence 			v = 0;
3151*efd4c9b6SSteve Lawrence 			break;
3152*efd4c9b6SSteve Lawrence 		default:
3153*efd4c9b6SSteve Lawrence 			assert(0);
3154*efd4c9b6SSteve Lawrence 		}
3155*efd4c9b6SSteve Lawrence 		break;
3156*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_SHM_MEMORY:
3157*efd4c9b6SSteve Lawrence 		switch (user) {
3158*efd4c9b6SSteve Lawrence 		case ZS_USER_ALL:
3159*efd4c9b6SSteve Lawrence 		case ZS_USER_ZONES:
3160*efd4c9b6SSteve Lawrence 			v = zs_shm_usage_all_pct(u);
3161*efd4c9b6SSteve Lawrence 			break;
3162*efd4c9b6SSteve Lawrence 		case ZS_USER_FREE:
3163*efd4c9b6SSteve Lawrence 			v = ZSD_PCT_INT - zs_shm_usage_all_pct(u);
3164*efd4c9b6SSteve Lawrence 			break;
3165*efd4c9b6SSteve Lawrence 		case ZS_USER_KERNEL:
3166*efd4c9b6SSteve Lawrence 			v = 0;
3167*efd4c9b6SSteve Lawrence 			break;
3168*efd4c9b6SSteve Lawrence 		default:
3169*efd4c9b6SSteve Lawrence 			assert(0);
3170*efd4c9b6SSteve Lawrence 		}
3171*efd4c9b6SSteve Lawrence 		break;
3172*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_SHM_IDS:
3173*efd4c9b6SSteve Lawrence 			switch (user) {
3174*efd4c9b6SSteve Lawrence 		case ZS_USER_ALL:
3175*efd4c9b6SSteve Lawrence 		case ZS_USER_ZONES:
3176*efd4c9b6SSteve Lawrence 			v = zs_shmids_usage_all_pct(u);
3177*efd4c9b6SSteve Lawrence 			break;
3178*efd4c9b6SSteve Lawrence 		case ZS_USER_FREE:
3179*efd4c9b6SSteve Lawrence 			v = ZSD_PCT_INT - zs_shmids_usage_all_pct(u);
3180*efd4c9b6SSteve Lawrence 			break;
3181*efd4c9b6SSteve Lawrence 		case ZS_USER_KERNEL:
3182*efd4c9b6SSteve Lawrence 			v = 0;
3183*efd4c9b6SSteve Lawrence 			break;
3184*efd4c9b6SSteve Lawrence 		default:
3185*efd4c9b6SSteve Lawrence 			assert(0);
3186*efd4c9b6SSteve Lawrence 		}
3187*efd4c9b6SSteve Lawrence 		break;
3188*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_SEM_IDS:
3189*efd4c9b6SSteve Lawrence 			switch (user) {
3190*efd4c9b6SSteve Lawrence 		case ZS_USER_ALL:
3191*efd4c9b6SSteve Lawrence 		case ZS_USER_ZONES:
3192*efd4c9b6SSteve Lawrence 			v = zs_semids_usage_all_pct(u);
3193*efd4c9b6SSteve Lawrence 			break;
3194*efd4c9b6SSteve Lawrence 		case ZS_USER_FREE:
3195*efd4c9b6SSteve Lawrence 			v = ZSD_PCT_INT - zs_semids_usage_all_pct(u);
3196*efd4c9b6SSteve Lawrence 			break;
3197*efd4c9b6SSteve Lawrence 		case ZS_USER_KERNEL:
3198*efd4c9b6SSteve Lawrence 			v = 0;
3199*efd4c9b6SSteve Lawrence 			break;
3200*efd4c9b6SSteve Lawrence 		default:
3201*efd4c9b6SSteve Lawrence 			assert(0);
3202*efd4c9b6SSteve Lawrence 		}
3203*efd4c9b6SSteve Lawrence 		break;
3204*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_MSG_IDS:
3205*efd4c9b6SSteve Lawrence 		switch (user) {
3206*efd4c9b6SSteve Lawrence 		case ZS_USER_ALL:
3207*efd4c9b6SSteve Lawrence 		case ZS_USER_ZONES:
3208*efd4c9b6SSteve Lawrence 			v = zs_msgids_usage_all_pct(u);
3209*efd4c9b6SSteve Lawrence 			break;
3210*efd4c9b6SSteve Lawrence 		case ZS_USER_FREE:
3211*efd4c9b6SSteve Lawrence 			v = ZSD_PCT_INT - zs_msgids_usage_all_pct(u);
3212*efd4c9b6SSteve Lawrence 			break;
3213*efd4c9b6SSteve Lawrence 		case ZS_USER_KERNEL:
3214*efd4c9b6SSteve Lawrence 			v = 0;
3215*efd4c9b6SSteve Lawrence 			break;
3216*efd4c9b6SSteve Lawrence 		default:
3217*efd4c9b6SSteve Lawrence 			assert(0);
3218*efd4c9b6SSteve Lawrence 		}
3219*efd4c9b6SSteve Lawrence 		break;
3220*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_LOFI:
3221*efd4c9b6SSteve Lawrence 		switch (user) {
3222*efd4c9b6SSteve Lawrence 		case ZS_USER_ALL:
3223*efd4c9b6SSteve Lawrence 		case ZS_USER_ZONES:
3224*efd4c9b6SSteve Lawrence 			v = zs_lofi_usage_all_pct(u);
3225*efd4c9b6SSteve Lawrence 			break;
3226*efd4c9b6SSteve Lawrence 		case ZS_USER_FREE:
3227*efd4c9b6SSteve Lawrence 			v = ZSD_PCT_INT - zs_lofi_usage_all_pct(u);
3228*efd4c9b6SSteve Lawrence 			break;
3229*efd4c9b6SSteve Lawrence 		case ZS_USER_KERNEL:
3230*efd4c9b6SSteve Lawrence 			v = 0;
3231*efd4c9b6SSteve Lawrence 			break;
3232*efd4c9b6SSteve Lawrence 		default:
3233*efd4c9b6SSteve Lawrence 			assert(0);
3234*efd4c9b6SSteve Lawrence 		}
3235*efd4c9b6SSteve Lawrence 		break;
3236*efd4c9b6SSteve Lawrence 	default:
3237*efd4c9b6SSteve Lawrence 		assert(0);
3238*efd4c9b6SSteve Lawrence 	}
3239*efd4c9b6SSteve Lawrence 
3240*efd4c9b6SSteve Lawrence 	return (v);
3241*efd4c9b6SSteve Lawrence }
3242*efd4c9b6SSteve Lawrence 
3243*efd4c9b6SSteve Lawrence /*
3244*efd4c9b6SSteve Lawrence  * Get resource used by individual zone.
3245*efd4c9b6SSteve Lawrence  */
3246*efd4c9b6SSteve Lawrence uint64_t
zs_resource_used_zone_uint64(zs_zone_t * z,int res)3247*efd4c9b6SSteve Lawrence zs_resource_used_zone_uint64(zs_zone_t *z, int res)
3248*efd4c9b6SSteve Lawrence {
3249*efd4c9b6SSteve Lawrence 	uint64_t v;
3250*efd4c9b6SSteve Lawrence 
3251*efd4c9b6SSteve Lawrence 	switch (res)  {
3252*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_CPU:
3253*efd4c9b6SSteve Lawrence 		v = zs_cpu_usage_zone_cpu(z);
3254*efd4c9b6SSteve Lawrence 		break;
3255*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_RAM_RSS:
3256*efd4c9b6SSteve Lawrence 		v = zs_physical_memory_usage_zone(z);
3257*efd4c9b6SSteve Lawrence 		break;
3258*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_RAM_LOCKED:
3259*efd4c9b6SSteve Lawrence 		v = zs_locked_memory_usage_zone(z);
3260*efd4c9b6SSteve Lawrence 		break;
3261*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_VM:
3262*efd4c9b6SSteve Lawrence 		v = zs_virtual_memory_usage_zone(z);
3263*efd4c9b6SSteve Lawrence 		break;
3264*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_DISK_SWAP:
3265*efd4c9b6SSteve Lawrence 		assert(0);
3266*efd4c9b6SSteve Lawrence 		break;
3267*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_LWPS:
3268*efd4c9b6SSteve Lawrence 		v = zs_lwps_usage_zone(z);
3269*efd4c9b6SSteve Lawrence 		break;
3270*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_PROCESSES:
3271*efd4c9b6SSteve Lawrence 		v = zs_processes_usage_zone(z);
3272*efd4c9b6SSteve Lawrence 		break;
3273*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_SHM_MEMORY:
3274*efd4c9b6SSteve Lawrence 		v = zs_shm_usage_zone(z);
3275*efd4c9b6SSteve Lawrence 		break;
3276*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_SHM_IDS:
3277*efd4c9b6SSteve Lawrence 		v = zs_shmids_usage_zone(z);
3278*efd4c9b6SSteve Lawrence 		break;
3279*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_SEM_IDS:
3280*efd4c9b6SSteve Lawrence 		v = zs_semids_usage_zone(z);
3281*efd4c9b6SSteve Lawrence 		break;
3282*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_MSG_IDS:
3283*efd4c9b6SSteve Lawrence 		v = zs_msgids_usage_zone(z);
3284*efd4c9b6SSteve Lawrence 		break;
3285*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_LOFI:
3286*efd4c9b6SSteve Lawrence 		v = zs_lofi_usage_zone(z);
3287*efd4c9b6SSteve Lawrence 		break;
3288*efd4c9b6SSteve Lawrence 	default:
3289*efd4c9b6SSteve Lawrence 		assert(0);
3290*efd4c9b6SSteve Lawrence 	}
3291*efd4c9b6SSteve Lawrence 	return (v);
3292*efd4c9b6SSteve Lawrence }
3293*efd4c9b6SSteve Lawrence 
3294*efd4c9b6SSteve Lawrence /*
3295*efd4c9b6SSteve Lawrence  * Get resource used by individual zone as percent
3296*efd4c9b6SSteve Lawrence  */
3297*efd4c9b6SSteve Lawrence uint_t
zs_resource_used_zone_pct(zs_zone_t * z,int res)3298*efd4c9b6SSteve Lawrence zs_resource_used_zone_pct(zs_zone_t *z, int res)
3299*efd4c9b6SSteve Lawrence {
3300*efd4c9b6SSteve Lawrence 	uint_t v;
3301*efd4c9b6SSteve Lawrence 
3302*efd4c9b6SSteve Lawrence 	switch (res)  {
3303*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_CPU:
3304*efd4c9b6SSteve Lawrence 		v = zs_cpu_usage_zone_pct(z);
3305*efd4c9b6SSteve Lawrence 		break;
3306*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_RAM_RSS:
3307*efd4c9b6SSteve Lawrence 		v = zs_physical_memory_usage_zone_pct(z);
3308*efd4c9b6SSteve Lawrence 		break;
3309*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_RAM_LOCKED:
3310*efd4c9b6SSteve Lawrence 		v = zs_locked_memory_usage_zone_pct(z);
3311*efd4c9b6SSteve Lawrence 		break;
3312*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_VM:
3313*efd4c9b6SSteve Lawrence 		v = zs_virtual_memory_usage_zone_pct(z);
3314*efd4c9b6SSteve Lawrence 		break;
3315*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_DISK_SWAP:
3316*efd4c9b6SSteve Lawrence 		assert(0);
3317*efd4c9b6SSteve Lawrence 		break;
3318*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_LWPS:
3319*efd4c9b6SSteve Lawrence 		v = zs_lwps_usage_zone_pct(z);
3320*efd4c9b6SSteve Lawrence 		break;
3321*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_PROCESSES:
3322*efd4c9b6SSteve Lawrence 		v = zs_processes_usage_zone_pct(z);
3323*efd4c9b6SSteve Lawrence 		break;
3324*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_SHM_MEMORY:
3325*efd4c9b6SSteve Lawrence 		v = zs_shm_usage_zone_pct(z);
3326*efd4c9b6SSteve Lawrence 		break;
3327*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_SHM_IDS:
3328*efd4c9b6SSteve Lawrence 		v = zs_shmids_usage_zone_pct(z);
3329*efd4c9b6SSteve Lawrence 		break;
3330*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_SEM_IDS:
3331*efd4c9b6SSteve Lawrence 		v = zs_semids_usage_zone_pct(z);
3332*efd4c9b6SSteve Lawrence 		break;
3333*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_MSG_IDS:
3334*efd4c9b6SSteve Lawrence 		v = zs_msgids_usage_zone_pct(z);
3335*efd4c9b6SSteve Lawrence 		break;
3336*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_LOFI:
3337*efd4c9b6SSteve Lawrence 		v = zs_lofi_usage_zone_pct(z);
3338*efd4c9b6SSteve Lawrence 		break;
3339*efd4c9b6SSteve Lawrence 	default:
3340*efd4c9b6SSteve Lawrence 		assert(0);
3341*efd4c9b6SSteve Lawrence 	}
3342*efd4c9b6SSteve Lawrence 	return (v);
3343*efd4c9b6SSteve Lawrence }
3344*efd4c9b6SSteve Lawrence 
3345*efd4c9b6SSteve Lawrence /*
3346*efd4c9b6SSteve Lawrence  * Get total time available for a resource
3347*efd4c9b6SSteve Lawrence  */
3348*efd4c9b6SSteve Lawrence void
zs_resource_total_time(zs_usage_t * u,int res,timestruc_t * t)3349*efd4c9b6SSteve Lawrence zs_resource_total_time(zs_usage_t *u, int res, timestruc_t *t)
3350*efd4c9b6SSteve Lawrence {
3351*efd4c9b6SSteve Lawrence 	switch (res)  {
3352*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_CPU:
3353*efd4c9b6SSteve Lawrence 		zs_cpu_total_time(u, t);
3354*efd4c9b6SSteve Lawrence 		break;
3355*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_RAM_RSS:
3356*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_RAM_LOCKED:
3357*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_VM:
3358*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_DISK_SWAP:
3359*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_LWPS:
3360*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_PROCESSES:
3361*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_SHM_MEMORY:
3362*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_SHM_IDS:
3363*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_SEM_IDS:
3364*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_MSG_IDS:
3365*efd4c9b6SSteve Lawrence 		/* FALLTHROUGH */
3366*efd4c9b6SSteve Lawrence 	default:
3367*efd4c9b6SSteve Lawrence 		assert(0);
3368*efd4c9b6SSteve Lawrence 	}
3369*efd4c9b6SSteve Lawrence }
3370*efd4c9b6SSteve Lawrence 
3371*efd4c9b6SSteve Lawrence /*
3372*efd4c9b6SSteve Lawrence  * Get total time used for a resource
3373*efd4c9b6SSteve Lawrence  */
3374*efd4c9b6SSteve Lawrence void
zs_resource_used_time(zs_usage_t * u,int res,int user,timestruc_t * t)3375*efd4c9b6SSteve Lawrence zs_resource_used_time(zs_usage_t *u, int res, int user, timestruc_t *t)
3376*efd4c9b6SSteve Lawrence {
3377*efd4c9b6SSteve Lawrence 	switch (res)  {
3378*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_CPU:
3379*efd4c9b6SSteve Lawrence 		switch (user) {
3380*efd4c9b6SSteve Lawrence 		case ZS_USER_ALL:
3381*efd4c9b6SSteve Lawrence 			zs_cpu_usage_all(u, t);
3382*efd4c9b6SSteve Lawrence 			break;
3383*efd4c9b6SSteve Lawrence 		case ZS_USER_KERNEL:
3384*efd4c9b6SSteve Lawrence 			zs_cpu_usage_kernel(u, t);
3385*efd4c9b6SSteve Lawrence 			break;
3386*efd4c9b6SSteve Lawrence 		case ZS_USER_ZONES:
3387*efd4c9b6SSteve Lawrence 			zs_cpu_usage_zones(u, t);
3388*efd4c9b6SSteve Lawrence 			break;
3389*efd4c9b6SSteve Lawrence 		case ZS_USER_FREE:
3390*efd4c9b6SSteve Lawrence 			zs_cpu_usage_idle(u, t);
3391*efd4c9b6SSteve Lawrence 			break;
3392*efd4c9b6SSteve Lawrence 		default:
3393*efd4c9b6SSteve Lawrence 			assert(0);
3394*efd4c9b6SSteve Lawrence 		}
3395*efd4c9b6SSteve Lawrence 		break;
3396*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_RAM_RSS:
3397*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_RAM_LOCKED:
3398*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_VM:
3399*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_DISK_SWAP:
3400*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_LWPS:
3401*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_PROCESSES:
3402*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_SHM_MEMORY:
3403*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_SHM_IDS:
3404*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_SEM_IDS:
3405*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_MSG_IDS:
3406*efd4c9b6SSteve Lawrence 		/* FALLTHROUGH */
3407*efd4c9b6SSteve Lawrence 	default:
3408*efd4c9b6SSteve Lawrence 		assert(0);
3409*efd4c9b6SSteve Lawrence 	}
3410*efd4c9b6SSteve Lawrence }
3411*efd4c9b6SSteve Lawrence 
3412*efd4c9b6SSteve Lawrence /*
3413*efd4c9b6SSteve Lawrence  * Get total resource time used for a particular zone
3414*efd4c9b6SSteve Lawrence  */
3415*efd4c9b6SSteve Lawrence void
zs_resource_used_zone_time(zs_zone_t * z,int res,timestruc_t * t)3416*efd4c9b6SSteve Lawrence zs_resource_used_zone_time(zs_zone_t *z, int res, timestruc_t *t)
3417*efd4c9b6SSteve Lawrence {
3418*efd4c9b6SSteve Lawrence 	switch (res)  {
3419*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_CPU:
3420*efd4c9b6SSteve Lawrence 		zs_cpu_usage_zone(z, t);
3421*efd4c9b6SSteve Lawrence 		break;
3422*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_RAM_RSS:
3423*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_RAM_LOCKED:
3424*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_VM:
3425*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_DISK_SWAP:
3426*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_SHM_MEMORY:
3427*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_LWPS:
3428*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_PROCESSES:
3429*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_SHM_IDS:
3430*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_SEM_IDS:
3431*efd4c9b6SSteve Lawrence 	case ZS_RESOURCE_MSG_IDS:
3432*efd4c9b6SSteve Lawrence 		/* FALLTHROUGH */
3433*efd4c9b6SSteve Lawrence 	default:
3434*efd4c9b6SSteve Lawrence 		assert(0);
3435*efd4c9b6SSteve Lawrence 	}
3436*efd4c9b6SSteve Lawrence }
3437*efd4c9b6SSteve Lawrence 
3438*efd4c9b6SSteve Lawrence 
3439*efd4c9b6SSteve Lawrence int
zs_zone_list(zs_usage_t * usage,zs_zone_t ** zonelist,int num)3440*efd4c9b6SSteve Lawrence zs_zone_list(zs_usage_t *usage, zs_zone_t **zonelist, int num)
3441*efd4c9b6SSteve Lawrence {
3442*efd4c9b6SSteve Lawrence 	int i = 0;
3443*efd4c9b6SSteve Lawrence 	zs_zone_t *zone, *tmp;
3444*efd4c9b6SSteve Lawrence 
3445*efd4c9b6SSteve Lawrence 	/* copy what fits of the zone list into the buffer */
3446*efd4c9b6SSteve Lawrence 	for (zone = list_head(&usage->zsu_zone_list); zone != NULL;
3447*efd4c9b6SSteve Lawrence 	    zone = list_next(&usage->zsu_zone_list, zone)) {
3448*efd4c9b6SSteve Lawrence 
3449*efd4c9b6SSteve Lawrence 		/* put the global zone at the first position */
3450*efd4c9b6SSteve Lawrence 		if (i < num) {
3451*efd4c9b6SSteve Lawrence 			if (zone->zsz_id == GLOBAL_ZONEID) {
3452*efd4c9b6SSteve Lawrence 				tmp = zonelist[0];
3453*efd4c9b6SSteve Lawrence 				zonelist[i] = tmp;
3454*efd4c9b6SSteve Lawrence 				zonelist[0] = zone;
3455*efd4c9b6SSteve Lawrence 			} else {
3456*efd4c9b6SSteve Lawrence 				zonelist[i] = zone;
3457*efd4c9b6SSteve Lawrence 			}
3458*efd4c9b6SSteve Lawrence 		}
3459*efd4c9b6SSteve Lawrence 		i++;
3460*efd4c9b6SSteve Lawrence 	}
3461*efd4c9b6SSteve Lawrence 	return (i);
3462*efd4c9b6SSteve Lawrence }
3463*efd4c9b6SSteve Lawrence 
3464*efd4c9b6SSteve Lawrence zs_zone_t *
zs_zone_first(zs_usage_t * usage)3465*efd4c9b6SSteve Lawrence zs_zone_first(zs_usage_t *usage)
3466*efd4c9b6SSteve Lawrence {
3467*efd4c9b6SSteve Lawrence 	return (list_head(&usage->zsu_zone_list));
3468*efd4c9b6SSteve Lawrence }
3469*efd4c9b6SSteve Lawrence 
3470*efd4c9b6SSteve Lawrence zs_zone_t *
zs_zone_next(zs_usage_t * usage,zs_zone_t * zone)3471*efd4c9b6SSteve Lawrence zs_zone_next(zs_usage_t *usage, zs_zone_t *zone)
3472*efd4c9b6SSteve Lawrence {
3473*efd4c9b6SSteve Lawrence 	return (list_next(&usage->zsu_zone_list, zone));
3474*efd4c9b6SSteve Lawrence }
3475*efd4c9b6SSteve Lawrence 
3476*efd4c9b6SSteve Lawrence 
3477*efd4c9b6SSteve Lawrence /*
3478*efd4c9b6SSteve Lawrence  * Gets a zone property
3479*efd4c9b6SSteve Lawrence  */
3480*efd4c9b6SSteve Lawrence void
zs_zone_property(zs_zone_t * zone,int prop,zs_property_t * p)3481*efd4c9b6SSteve Lawrence zs_zone_property(zs_zone_t *zone, int prop, zs_property_t *p)
3482*efd4c9b6SSteve Lawrence {
3483*efd4c9b6SSteve Lawrence 	switch (prop) {
3484*efd4c9b6SSteve Lawrence 	case ZS_ZONE_PROP_NAME:
3485*efd4c9b6SSteve Lawrence 		p->zsp_type = ZS_PROP_TYPE_STRING;
3486*efd4c9b6SSteve Lawrence 		p->zsp_id = prop;
3487*efd4c9b6SSteve Lawrence 		(void) zs_zone_name(zone, p->zsp_v.zsv_string,
3488*efd4c9b6SSteve Lawrence 		    sizeof (p->zsp_v.zsv_string));
3489*efd4c9b6SSteve Lawrence 		break;
3490*efd4c9b6SSteve Lawrence 	case ZS_ZONE_PROP_ID:
3491*efd4c9b6SSteve Lawrence 		p->zsp_type = ZS_PROP_TYPE_INT;
3492*efd4c9b6SSteve Lawrence 		p->zsp_id = prop;
3493*efd4c9b6SSteve Lawrence 		p->zsp_v.zsv_int = zs_zone_id(zone);
3494*efd4c9b6SSteve Lawrence 		break;
3495*efd4c9b6SSteve Lawrence 	case ZS_ZONE_PROP_IPTYPE:
3496*efd4c9b6SSteve Lawrence 		p->zsp_type = ZS_PROP_TYPE_UINT;
3497*efd4c9b6SSteve Lawrence 		p->zsp_id = prop;
3498*efd4c9b6SSteve Lawrence 		p->zsp_v.zsv_uint = zs_zone_iptype(zone);
3499*efd4c9b6SSteve Lawrence 		break;
3500*efd4c9b6SSteve Lawrence 	case ZS_ZONE_PROP_CPUTYPE:
3501*efd4c9b6SSteve Lawrence 		p->zsp_type = ZS_PROP_TYPE_UINT;
3502*efd4c9b6SSteve Lawrence 		p->zsp_id = prop;
3503*efd4c9b6SSteve Lawrence 		p->zsp_v.zsv_uint = zs_zone_cputype(zone);
3504*efd4c9b6SSteve Lawrence 		break;
3505*efd4c9b6SSteve Lawrence 	case ZS_ZONE_PROP_SCHEDULERS:
3506*efd4c9b6SSteve Lawrence 		p->zsp_type = ZS_PROP_TYPE_UINT;
3507*efd4c9b6SSteve Lawrence 		p->zsp_id = prop;
3508*efd4c9b6SSteve Lawrence 		p->zsp_v.zsv_uint = zs_zone_schedulers(zone);
3509*efd4c9b6SSteve Lawrence 		break;
3510*efd4c9b6SSteve Lawrence 	case ZS_ZONE_PROP_CPU_SHARES:
3511*efd4c9b6SSteve Lawrence 		p->zsp_type = ZS_PROP_TYPE_UINT64;
3512*efd4c9b6SSteve Lawrence 		p->zsp_id = prop;
3513*efd4c9b6SSteve Lawrence 		p->zsp_v.zsv_uint64 = zs_zone_cpu_shares(zone);
3514*efd4c9b6SSteve Lawrence 		break;
3515*efd4c9b6SSteve Lawrence 	case ZS_ZONE_PROP_POOLNAME:
3516*efd4c9b6SSteve Lawrence 		p->zsp_type = ZS_PROP_TYPE_STRING;
3517*efd4c9b6SSteve Lawrence 		p->zsp_id = prop;
3518*efd4c9b6SSteve Lawrence 		(void) zs_zone_poolname(zone, p->zsp_v.zsv_string,
3519*efd4c9b6SSteve Lawrence 		    sizeof (p->zsp_v.zsv_string));
3520*efd4c9b6SSteve Lawrence 		break;
3521*efd4c9b6SSteve Lawrence 	case ZS_ZONE_PROP_PSETNAME:
3522*efd4c9b6SSteve Lawrence 		p->zsp_type = ZS_PROP_TYPE_STRING;
3523*efd4c9b6SSteve Lawrence 		p->zsp_id = prop;
3524*efd4c9b6SSteve Lawrence 		(void) zs_zone_psetname(zone, p->zsp_v.zsv_string,
3525*efd4c9b6SSteve Lawrence 		    sizeof (p->zsp_v.zsv_string));
3526*efd4c9b6SSteve Lawrence 		break;
3527*efd4c9b6SSteve Lawrence 	/* Not implemented */
3528*efd4c9b6SSteve Lawrence 	case ZS_ZONE_PROP_DEFAULT_SCHED:
3529*efd4c9b6SSteve Lawrence 	case ZS_ZONE_PROP_UPTIME:
3530*efd4c9b6SSteve Lawrence 	case ZS_ZONE_PROP_BOOTTIME:
3531*efd4c9b6SSteve Lawrence 		/* FALLTHROUGH */
3532*efd4c9b6SSteve Lawrence 	default:
3533*efd4c9b6SSteve Lawrence 		assert(0);
3534*efd4c9b6SSteve Lawrence 	}
3535*efd4c9b6SSteve Lawrence }
3536*efd4c9b6SSteve Lawrence 
3537*efd4c9b6SSteve Lawrence int
zs_zone_limit_type(int limit)3538*efd4c9b6SSteve Lawrence zs_zone_limit_type(int limit)
3539*efd4c9b6SSteve Lawrence {
3540*efd4c9b6SSteve Lawrence 	switch (limit) {
3541*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_CPU:
3542*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_CPU_SHARES:
3543*efd4c9b6SSteve Lawrence 		return (ZS_LIMIT_TYPE_TIME);
3544*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_RAM_RSS:
3545*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_RAM_LOCKED:
3546*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_VM:
3547*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_SHM_MEMORY:
3548*efd4c9b6SSteve Lawrence 		return (ZS_LIMIT_TYPE_BYTES);
3549*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_LWPS:
3550*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_PROCESSES:
3551*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_SHM_IDS:
3552*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_MSG_IDS:
3553*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_SEM_IDS:
3554*efd4c9b6SSteve Lawrence 		return (ZS_LIMIT_TYPE_COUNT);
3555*efd4c9b6SSteve Lawrence 	default:
3556*efd4c9b6SSteve Lawrence 		assert(0);
3557*efd4c9b6SSteve Lawrence 		return (0);
3558*efd4c9b6SSteve Lawrence 	}
3559*efd4c9b6SSteve Lawrence }
3560*efd4c9b6SSteve Lawrence /*
3561*efd4c9b6SSteve Lawrence  * Gets the zones limit.  Returns ZS_LIMIT_NONE if no limit set.
3562*efd4c9b6SSteve Lawrence  */
3563*efd4c9b6SSteve Lawrence uint64_t
zs_zone_limit_uint64(zs_zone_t * z,int limit)3564*efd4c9b6SSteve Lawrence zs_zone_limit_uint64(zs_zone_t *z, int limit)
3565*efd4c9b6SSteve Lawrence {
3566*efd4c9b6SSteve Lawrence 	uint64_t v;
3567*efd4c9b6SSteve Lawrence 
3568*efd4c9b6SSteve Lawrence 	switch (limit) {
3569*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_CPU:
3570*efd4c9b6SSteve Lawrence 		v = zs_zone_cpu_cap(z);
3571*efd4c9b6SSteve Lawrence 		break;
3572*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_CPU_SHARES:
3573*efd4c9b6SSteve Lawrence 		v = zs_zone_cpu_shares(z);
3574*efd4c9b6SSteve Lawrence 		break;
3575*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_RAM_RSS:
3576*efd4c9b6SSteve Lawrence 		v = zs_zone_physical_memory_cap(z);
3577*efd4c9b6SSteve Lawrence 		break;
3578*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_RAM_LOCKED:
3579*efd4c9b6SSteve Lawrence 		v = zs_zone_locked_memory_cap(z);
3580*efd4c9b6SSteve Lawrence 		break;
3581*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_VM:
3582*efd4c9b6SSteve Lawrence 		v = zs_zone_virtual_memory_cap(z);
3583*efd4c9b6SSteve Lawrence 		break;
3584*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_LWPS:
3585*efd4c9b6SSteve Lawrence 		v = z->zsz_lwps_cap;
3586*efd4c9b6SSteve Lawrence 		break;
3587*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_PROCESSES:
3588*efd4c9b6SSteve Lawrence 		v = z->zsz_processes_cap;
3589*efd4c9b6SSteve Lawrence 		break;
3590*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_SHM_MEMORY:
3591*efd4c9b6SSteve Lawrence 		v = z->zsz_shm_cap;
3592*efd4c9b6SSteve Lawrence 		break;
3593*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_SHM_IDS:
3594*efd4c9b6SSteve Lawrence 		v = z->zsz_shmids_cap;
3595*efd4c9b6SSteve Lawrence 		break;
3596*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_SEM_IDS:
3597*efd4c9b6SSteve Lawrence 		v = z->zsz_semids_cap;
3598*efd4c9b6SSteve Lawrence 		break;
3599*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_MSG_IDS:
3600*efd4c9b6SSteve Lawrence 		v = z->zsz_msgids_cap;
3601*efd4c9b6SSteve Lawrence 		break;
3602*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_LOFI:
3603*efd4c9b6SSteve Lawrence 		v = z->zsz_lofi_cap;
3604*efd4c9b6SSteve Lawrence 		break;
3605*efd4c9b6SSteve Lawrence 	default:
3606*efd4c9b6SSteve Lawrence 		assert(0);
3607*efd4c9b6SSteve Lawrence 	}
3608*efd4c9b6SSteve Lawrence 	return (v);
3609*efd4c9b6SSteve Lawrence }
3610*efd4c9b6SSteve Lawrence 
3611*efd4c9b6SSteve Lawrence /*
3612*efd4c9b6SSteve Lawrence  * Gets the amount of resource used for a limit.  Returns ZS_LIMIT_NONE if
3613*efd4c9b6SSteve Lawrence  * no limit configured.
3614*efd4c9b6SSteve Lawrence  */
3615*efd4c9b6SSteve Lawrence uint64_t
zs_zone_limit_used_uint64(zs_zone_t * z,int limit)3616*efd4c9b6SSteve Lawrence zs_zone_limit_used_uint64(zs_zone_t *z, int limit)
3617*efd4c9b6SSteve Lawrence {
3618*efd4c9b6SSteve Lawrence 	uint64_t v;
3619*efd4c9b6SSteve Lawrence 
3620*efd4c9b6SSteve Lawrence 	switch (limit) {
3621*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_CPU:
3622*efd4c9b6SSteve Lawrence 		v = zs_zone_cpu_cap_used(z);
3623*efd4c9b6SSteve Lawrence 		break;
3624*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_CPU_SHARES:
3625*efd4c9b6SSteve Lawrence 		v = zs_zone_cpu_shares_used(z);
3626*efd4c9b6SSteve Lawrence 		break;
3627*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_RAM_RSS:
3628*efd4c9b6SSteve Lawrence 		v = zs_zone_physical_memory_cap_used(z);
3629*efd4c9b6SSteve Lawrence 		break;
3630*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_RAM_LOCKED:
3631*efd4c9b6SSteve Lawrence 		v = zs_zone_locked_memory_cap_used(z);
3632*efd4c9b6SSteve Lawrence 		break;
3633*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_VM:
3634*efd4c9b6SSteve Lawrence 		v = zs_zone_virtual_memory_cap_used(z);
3635*efd4c9b6SSteve Lawrence 		break;
3636*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_LWPS:
3637*efd4c9b6SSteve Lawrence 		v = z->zsz_lwps;
3638*efd4c9b6SSteve Lawrence 		break;
3639*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_PROCESSES:
3640*efd4c9b6SSteve Lawrence 		v = z->zsz_processes;
3641*efd4c9b6SSteve Lawrence 		break;
3642*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_SHM_MEMORY:
3643*efd4c9b6SSteve Lawrence 		v = z->zsz_shm;
3644*efd4c9b6SSteve Lawrence 		break;
3645*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_SHM_IDS:
3646*efd4c9b6SSteve Lawrence 		v = z->zsz_shmids;
3647*efd4c9b6SSteve Lawrence 		break;
3648*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_SEM_IDS:
3649*efd4c9b6SSteve Lawrence 		v = z->zsz_semids;
3650*efd4c9b6SSteve Lawrence 		break;
3651*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_MSG_IDS:
3652*efd4c9b6SSteve Lawrence 		v = z->zsz_msgids;
3653*efd4c9b6SSteve Lawrence 		break;
3654*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_LOFI:
3655*efd4c9b6SSteve Lawrence 		v = z->zsz_lofi;
3656*efd4c9b6SSteve Lawrence 		break;
3657*efd4c9b6SSteve Lawrence 	default:
3658*efd4c9b6SSteve Lawrence 		assert(0);
3659*efd4c9b6SSteve Lawrence 	}
3660*efd4c9b6SSteve Lawrence 	return (v);
3661*efd4c9b6SSteve Lawrence }
3662*efd4c9b6SSteve Lawrence 
3663*efd4c9b6SSteve Lawrence /*
3664*efd4c9b6SSteve Lawrence  * Gets time used under limit.  Time is zero if no limit is configured
3665*efd4c9b6SSteve Lawrence  */
3666*efd4c9b6SSteve Lawrence void
zs_zone_limit_time(zs_zone_t * z,int limit,timestruc_t * v)3667*efd4c9b6SSteve Lawrence zs_zone_limit_time(zs_zone_t *z, int limit, timestruc_t *v)
3668*efd4c9b6SSteve Lawrence {
3669*efd4c9b6SSteve Lawrence 	switch (limit) {
3670*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_CPU:
3671*efd4c9b6SSteve Lawrence 		if (z->zsz_cpu_cap == ZS_LIMIT_NONE) {
3672*efd4c9b6SSteve Lawrence 			v->tv_sec = 0;
3673*efd4c9b6SSteve Lawrence 			v->tv_nsec = 0;
3674*efd4c9b6SSteve Lawrence 			break;
3675*efd4c9b6SSteve Lawrence 		}
3676*efd4c9b6SSteve Lawrence 		zs_zone_cpu_cap_time(z, v);
3677*efd4c9b6SSteve Lawrence 		break;
3678*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_CPU_SHARES:
3679*efd4c9b6SSteve Lawrence 		if (z->zsz_cpu_shares == ZS_LIMIT_NONE ||
3680*efd4c9b6SSteve Lawrence 		    z->zsz_cpu_shares == ZS_SHARES_UNLIMITED ||
3681*efd4c9b6SSteve Lawrence 		    z->zsz_cpu_shares == 0 ||
3682*efd4c9b6SSteve Lawrence 		    (z->zsz_scheds & ZS_SCHED_FSS) == 0) {
3683*efd4c9b6SSteve Lawrence 			v->tv_sec = 0;
3684*efd4c9b6SSteve Lawrence 			v->tv_nsec = 0;
3685*efd4c9b6SSteve Lawrence 			break;
3686*efd4c9b6SSteve Lawrence 		}
3687*efd4c9b6SSteve Lawrence 		zs_zone_cpu_share_time(z, v);
3688*efd4c9b6SSteve Lawrence 		break;
3689*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_RAM_RSS:
3690*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_RAM_LOCKED:
3691*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_VM:
3692*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_SHM_MEMORY:
3693*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_LWPS:
3694*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_PROCESSES:
3695*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_SHM_IDS:
3696*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_MSG_IDS:
3697*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_SEM_IDS:
3698*efd4c9b6SSteve Lawrence 		/* FALLTHROUGH */
3699*efd4c9b6SSteve Lawrence 	default:
3700*efd4c9b6SSteve Lawrence 		assert(0);
3701*efd4c9b6SSteve Lawrence 	}
3702*efd4c9b6SSteve Lawrence }
3703*efd4c9b6SSteve Lawrence 
3704*efd4c9b6SSteve Lawrence /*
3705*efd4c9b6SSteve Lawrence  * Errno is set on error:
3706*efd4c9b6SSteve Lawrence  *
3707*efd4c9b6SSteve Lawrence  *	EINVAL: No such property
3708*efd4c9b6SSteve Lawrence  *	ENOENT: No time value for the specified limit.
3709*efd4c9b6SSteve Lawrence  *	ESRCH:  No limit is configured.
3710*efd4c9b6SSteve Lawrence  *
3711*efd4c9b6SSteve Lawrence  * If no limit is configured, the value will be ZS_PCT_NONE
3712*efd4c9b6SSteve Lawrence  */
3713*efd4c9b6SSteve Lawrence void
zs_zone_limit_used_time(zs_zone_t * z,int limit,timestruc_t * t)3714*efd4c9b6SSteve Lawrence zs_zone_limit_used_time(zs_zone_t *z, int limit, timestruc_t *t)
3715*efd4c9b6SSteve Lawrence {
3716*efd4c9b6SSteve Lawrence 	switch (limit) {
3717*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_CPU:
3718*efd4c9b6SSteve Lawrence 		if (z->zsz_cpu_cap == ZS_LIMIT_NONE) {
3719*efd4c9b6SSteve Lawrence 			t->tv_sec = 0;
3720*efd4c9b6SSteve Lawrence 			t->tv_nsec = 0;
3721*efd4c9b6SSteve Lawrence 			break;
3722*efd4c9b6SSteve Lawrence 		}
3723*efd4c9b6SSteve Lawrence 		zs_zone_cpu_cap_time_used(z, t);
3724*efd4c9b6SSteve Lawrence 		break;
3725*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_CPU_SHARES:
3726*efd4c9b6SSteve Lawrence 		if (z->zsz_cpu_shares == ZS_LIMIT_NONE ||
3727*efd4c9b6SSteve Lawrence 		    z->zsz_cpu_shares == ZS_SHARES_UNLIMITED ||
3728*efd4c9b6SSteve Lawrence 		    z->zsz_cpu_shares == 0 ||
3729*efd4c9b6SSteve Lawrence 		    (z->zsz_scheds & ZS_SCHED_FSS) == 0) {
3730*efd4c9b6SSteve Lawrence 			t->tv_sec = 0;
3731*efd4c9b6SSteve Lawrence 			t->tv_nsec = 0;
3732*efd4c9b6SSteve Lawrence 			break;
3733*efd4c9b6SSteve Lawrence 		}
3734*efd4c9b6SSteve Lawrence 		zs_zone_cpu_share_time_used(z, t);
3735*efd4c9b6SSteve Lawrence 		break;
3736*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_RAM_RSS:
3737*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_RAM_LOCKED:
3738*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_VM:
3739*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_SHM_MEMORY:
3740*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_LWPS:
3741*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_PROCESSES:
3742*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_SHM_IDS:
3743*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_MSG_IDS:
3744*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_SEM_IDS:
3745*efd4c9b6SSteve Lawrence 		/* FALLTHROUGH */
3746*efd4c9b6SSteve Lawrence 	default:
3747*efd4c9b6SSteve Lawrence 		assert(0);
3748*efd4c9b6SSteve Lawrence 	}
3749*efd4c9b6SSteve Lawrence }
3750*efd4c9b6SSteve Lawrence 
3751*efd4c9b6SSteve Lawrence /*
3752*efd4c9b6SSteve Lawrence  * Get a zones usage as a percent of the limit.  Return ZS_PCT_NONE if
3753*efd4c9b6SSteve Lawrence  * no limit is configured.
3754*efd4c9b6SSteve Lawrence  */
3755*efd4c9b6SSteve Lawrence uint_t
zs_zone_limit_used_pct(zs_zone_t * z,int limit)3756*efd4c9b6SSteve Lawrence zs_zone_limit_used_pct(zs_zone_t *z, int limit)
3757*efd4c9b6SSteve Lawrence {
3758*efd4c9b6SSteve Lawrence 	uint_t v;
3759*efd4c9b6SSteve Lawrence 
3760*efd4c9b6SSteve Lawrence 	switch (limit) {
3761*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_CPU:
3762*efd4c9b6SSteve Lawrence 		v = zs_zone_cpu_cap_pct(z);
3763*efd4c9b6SSteve Lawrence 		break;
3764*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_CPU_SHARES:
3765*efd4c9b6SSteve Lawrence 		v = zs_zone_cpu_shares_pct(z);
3766*efd4c9b6SSteve Lawrence 		break;
3767*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_RAM_RSS:
3768*efd4c9b6SSteve Lawrence 		v = zs_zone_physical_memory_cap_pct(z);
3769*efd4c9b6SSteve Lawrence 		break;
3770*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_RAM_LOCKED:
3771*efd4c9b6SSteve Lawrence 		v = zs_zone_locked_memory_cap_pct(z);
3772*efd4c9b6SSteve Lawrence 		break;
3773*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_VM:
3774*efd4c9b6SSteve Lawrence 		v = zs_zone_virtual_memory_cap_pct(z);
3775*efd4c9b6SSteve Lawrence 		break;
3776*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_LWPS:
3777*efd4c9b6SSteve Lawrence 		v = zs_lwps_zone_cap_pct(z);
3778*efd4c9b6SSteve Lawrence 		break;
3779*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_PROCESSES:
3780*efd4c9b6SSteve Lawrence 		v = zs_processes_zone_cap_pct(z);
3781*efd4c9b6SSteve Lawrence 		break;
3782*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_SHM_MEMORY:
3783*efd4c9b6SSteve Lawrence 		v = zs_shm_zone_cap_pct(z);
3784*efd4c9b6SSteve Lawrence 		break;
3785*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_SHM_IDS:
3786*efd4c9b6SSteve Lawrence 		v = zs_shmids_zone_cap_pct(z);
3787*efd4c9b6SSteve Lawrence 		break;
3788*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_SEM_IDS:
3789*efd4c9b6SSteve Lawrence 		v = zs_semids_zone_cap_pct(z);
3790*efd4c9b6SSteve Lawrence 		break;
3791*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_MSG_IDS:
3792*efd4c9b6SSteve Lawrence 		v = zs_msgids_zone_cap_pct(z);
3793*efd4c9b6SSteve Lawrence 		break;
3794*efd4c9b6SSteve Lawrence 	case ZS_LIMIT_LOFI:
3795*efd4c9b6SSteve Lawrence 		v = zs_lofi_zone_cap_pct(z);
3796*efd4c9b6SSteve Lawrence 		break;
3797*efd4c9b6SSteve Lawrence 	default:
3798*efd4c9b6SSteve Lawrence 		assert(0);
3799*efd4c9b6SSteve Lawrence 	}
3800*efd4c9b6SSteve Lawrence 	return (v);
3801*efd4c9b6SSteve Lawrence }
3802*efd4c9b6SSteve Lawrence 
3803*efd4c9b6SSteve Lawrence int
zs_pset_list(zs_usage_t * usage,zs_pset_t ** psetlist,int num)3804*efd4c9b6SSteve Lawrence zs_pset_list(zs_usage_t *usage, zs_pset_t **psetlist, int num)
3805*efd4c9b6SSteve Lawrence {
3806*efd4c9b6SSteve Lawrence 	int i = 0;
3807*efd4c9b6SSteve Lawrence 	zs_pset_t *pset, *tmp;
3808*efd4c9b6SSteve Lawrence 
3809*efd4c9b6SSteve Lawrence 	/* copy what fits of the pset list into the buffer */
3810*efd4c9b6SSteve Lawrence 	for (pset = list_head(&usage->zsu_pset_list); pset != NULL;
3811*efd4c9b6SSteve Lawrence 	    pset = list_next(&usage->zsu_pset_list, pset)) {
3812*efd4c9b6SSteve Lawrence 
3813*efd4c9b6SSteve Lawrence 		/* put the default pset at the first position */
3814*efd4c9b6SSteve Lawrence 		if (i < num) {
3815*efd4c9b6SSteve Lawrence 			if (pset->zsp_id == ZS_PSET_DEFAULT) {
3816*efd4c9b6SSteve Lawrence 				tmp = psetlist[0];
3817*efd4c9b6SSteve Lawrence 				psetlist[i] = tmp;
3818*efd4c9b6SSteve Lawrence 				psetlist[0] = pset;
3819*efd4c9b6SSteve Lawrence 			} else {
3820*efd4c9b6SSteve Lawrence 				psetlist[i] = pset;
3821*efd4c9b6SSteve Lawrence 			}
3822*efd4c9b6SSteve Lawrence 		}
3823*efd4c9b6SSteve Lawrence 		i++;
3824*efd4c9b6SSteve Lawrence 	}
3825*efd4c9b6SSteve Lawrence 	return (i);
3826*efd4c9b6SSteve Lawrence }
3827*efd4c9b6SSteve Lawrence 
3828*efd4c9b6SSteve Lawrence zs_pset_t *
zs_pset_first(zs_usage_t * usage)3829*efd4c9b6SSteve Lawrence zs_pset_first(zs_usage_t *usage)
3830*efd4c9b6SSteve Lawrence {
3831*efd4c9b6SSteve Lawrence 	return (list_head(&usage->zsu_pset_list));
3832*efd4c9b6SSteve Lawrence }
3833*efd4c9b6SSteve Lawrence 
3834*efd4c9b6SSteve Lawrence zs_pset_t *
zs_pset_next(zs_usage_t * usage,zs_pset_t * pset)3835*efd4c9b6SSteve Lawrence zs_pset_next(zs_usage_t *usage, zs_pset_t *pset)
3836*efd4c9b6SSteve Lawrence {
3837*efd4c9b6SSteve Lawrence 	return (list_next(&usage->zsu_pset_list, pset));
3838*efd4c9b6SSteve Lawrence }
3839*efd4c9b6SSteve Lawrence 
3840*efd4c9b6SSteve Lawrence /*
3841*efd4c9b6SSteve Lawrence  * Get various properties on a pset.
3842*efd4c9b6SSteve Lawrence  */
3843*efd4c9b6SSteve Lawrence void
zs_pset_property(zs_pset_t * pset,int prop,zs_property_t * p)3844*efd4c9b6SSteve Lawrence zs_pset_property(zs_pset_t *pset, int prop, zs_property_t *p)
3845*efd4c9b6SSteve Lawrence {
3846*efd4c9b6SSteve Lawrence 	switch (prop) {
3847*efd4c9b6SSteve Lawrence 
3848*efd4c9b6SSteve Lawrence 	case ZS_PSET_PROP_NAME:
3849*efd4c9b6SSteve Lawrence 		p->zsp_type = ZS_PROP_TYPE_STRING;
3850*efd4c9b6SSteve Lawrence 		p->zsp_id = prop;
3851*efd4c9b6SSteve Lawrence 		(void) zs_pset_name(pset, p->zsp_v.zsv_string,
3852*efd4c9b6SSteve Lawrence 		    sizeof (p->zsp_v.zsv_string));
3853*efd4c9b6SSteve Lawrence 		break;
3854*efd4c9b6SSteve Lawrence 	case ZS_PSET_PROP_ID:
3855*efd4c9b6SSteve Lawrence 		p->zsp_type = ZS_PROP_TYPE_INT;
3856*efd4c9b6SSteve Lawrence 		p->zsp_id = prop;
3857*efd4c9b6SSteve Lawrence 		p->zsp_v.zsv_int = zs_pset_id(pset);
3858*efd4c9b6SSteve Lawrence 		break;
3859*efd4c9b6SSteve Lawrence 	case ZS_PSET_PROP_CPUTYPE:
3860*efd4c9b6SSteve Lawrence 		p->zsp_type = ZS_PROP_TYPE_UINT;
3861*efd4c9b6SSteve Lawrence 		p->zsp_id = prop;
3862*efd4c9b6SSteve Lawrence 		p->zsp_v.zsv_uint = zs_pset_cputype(pset);
3863*efd4c9b6SSteve Lawrence 		break;
3864*efd4c9b6SSteve Lawrence 	case ZS_PSET_PROP_SIZE:
3865*efd4c9b6SSteve Lawrence 		p->zsp_type = ZS_PROP_TYPE_UINT64;
3866*efd4c9b6SSteve Lawrence 		p->zsp_id = prop;
3867*efd4c9b6SSteve Lawrence 		p->zsp_v.zsv_uint64 = zs_pset_size(pset);
3868*efd4c9b6SSteve Lawrence 		break;
3869*efd4c9b6SSteve Lawrence 	case ZS_PSET_PROP_ONLINE:
3870*efd4c9b6SSteve Lawrence 		p->zsp_type = ZS_PROP_TYPE_UINT64;
3871*efd4c9b6SSteve Lawrence 		p->zsp_id = prop;
3872*efd4c9b6SSteve Lawrence 		p->zsp_v.zsv_uint64 = zs_pset_online(pset);
3873*efd4c9b6SSteve Lawrence 		break;
3874*efd4c9b6SSteve Lawrence 	case ZS_PSET_PROP_MIN:
3875*efd4c9b6SSteve Lawrence 		p->zsp_type = ZS_PROP_TYPE_UINT64;
3876*efd4c9b6SSteve Lawrence 		p->zsp_id = prop;
3877*efd4c9b6SSteve Lawrence 		p->zsp_v.zsv_uint64 = zs_pset_min(pset);
3878*efd4c9b6SSteve Lawrence 		break;
3879*efd4c9b6SSteve Lawrence 	case ZS_PSET_PROP_MAX:
3880*efd4c9b6SSteve Lawrence 		p->zsp_type = ZS_PROP_TYPE_UINT64;
3881*efd4c9b6SSteve Lawrence 		p->zsp_id = prop;
3882*efd4c9b6SSteve Lawrence 		p->zsp_v.zsv_uint64 = zs_pset_max(pset);
3883*efd4c9b6SSteve Lawrence 		break;
3884*efd4c9b6SSteve Lawrence 	case ZS_PSET_PROP_CPU_SHARES:
3885*efd4c9b6SSteve Lawrence 		p->zsp_type = ZS_PROP_TYPE_UINT64;
3886*efd4c9b6SSteve Lawrence 		p->zsp_id = prop;
3887*efd4c9b6SSteve Lawrence 		p->zsp_v.zsv_uint64 = zs_pset_cpu_shares(pset);
3888*efd4c9b6SSteve Lawrence 		break;
3889*efd4c9b6SSteve Lawrence 	case ZS_PSET_PROP_SCHEDULERS:
3890*efd4c9b6SSteve Lawrence 		p->zsp_type = ZS_PROP_TYPE_UINT;
3891*efd4c9b6SSteve Lawrence 		p->zsp_id = prop;
3892*efd4c9b6SSteve Lawrence 		p->zsp_v.zsv_uint = zs_pset_schedulers(pset);
3893*efd4c9b6SSteve Lawrence 		break;
3894*efd4c9b6SSteve Lawrence 	/* Not implemented */
3895*efd4c9b6SSteve Lawrence 	case ZS_PSET_PROP_CREATETIME:
3896*efd4c9b6SSteve Lawrence 	case ZS_PSET_PROP_LOAD_1MIN:
3897*efd4c9b6SSteve Lawrence 	case ZS_PSET_PROP_LOAD_5MIN:
3898*efd4c9b6SSteve Lawrence 	case ZS_PSET_PROP_LOAD_15MIN:
3899*efd4c9b6SSteve Lawrence 		/* FALLTHROUGH */
3900*efd4c9b6SSteve Lawrence 	default:
3901*efd4c9b6SSteve Lawrence 		assert(0);
3902*efd4c9b6SSteve Lawrence 	}
3903*efd4c9b6SSteve Lawrence }
3904*efd4c9b6SSteve Lawrence 
3905*efd4c9b6SSteve Lawrence void
zs_pset_total_time(zs_pset_t * pset,timestruc_t * t)3906*efd4c9b6SSteve Lawrence zs_pset_total_time(zs_pset_t *pset, timestruc_t *t)
3907*efd4c9b6SSteve Lawrence {
3908*efd4c9b6SSteve Lawrence 	*t = pset->zsp_total_time;
3909*efd4c9b6SSteve Lawrence }
3910*efd4c9b6SSteve Lawrence 
3911*efd4c9b6SSteve Lawrence uint64_t
zs_pset_total_cpus(zs_pset_t * pset)3912*efd4c9b6SSteve Lawrence zs_pset_total_cpus(zs_pset_t *pset)
3913*efd4c9b6SSteve Lawrence {
3914*efd4c9b6SSteve Lawrence 	return (pset->zsp_online * ZSD_ONE_CPU);
3915*efd4c9b6SSteve Lawrence }
3916*efd4c9b6SSteve Lawrence 
3917*efd4c9b6SSteve Lawrence /*
3918*efd4c9b6SSteve Lawrence  * Get total time used for pset
3919*efd4c9b6SSteve Lawrence  */
3920*efd4c9b6SSteve Lawrence void
zs_pset_used_time(zs_pset_t * pset,int user,timestruc_t * t)3921*efd4c9b6SSteve Lawrence zs_pset_used_time(zs_pset_t *pset, int user, timestruc_t *t)
3922*efd4c9b6SSteve Lawrence {
3923*efd4c9b6SSteve Lawrence 	switch (user) {
3924*efd4c9b6SSteve Lawrence 	case ZS_USER_ALL:
3925*efd4c9b6SSteve Lawrence 		zs_pset_usage_all(pset, t);
3926*efd4c9b6SSteve Lawrence 		break;
3927*efd4c9b6SSteve Lawrence 	case ZS_USER_KERNEL:
3928*efd4c9b6SSteve Lawrence 		zs_pset_usage_kernel(pset, t);
3929*efd4c9b6SSteve Lawrence 		break;
3930*efd4c9b6SSteve Lawrence 	case ZS_USER_ZONES:
3931*efd4c9b6SSteve Lawrence 		zs_pset_usage_zones(pset, t);
3932*efd4c9b6SSteve Lawrence 		break;
3933*efd4c9b6SSteve Lawrence 	case ZS_USER_FREE:
3934*efd4c9b6SSteve Lawrence 		zs_pset_usage_idle(pset, t);
3935*efd4c9b6SSteve Lawrence 		break;
3936*efd4c9b6SSteve Lawrence 	default:
3937*efd4c9b6SSteve Lawrence 		assert(0);
3938*efd4c9b6SSteve Lawrence 	}
3939*efd4c9b6SSteve Lawrence }
3940*efd4c9b6SSteve Lawrence 
3941*efd4c9b6SSteve Lawrence /*
3942*efd4c9b6SSteve Lawrence  * Returns 0 on success.  -1 on failure.
3943*efd4c9b6SSteve Lawrence  *
3944*efd4c9b6SSteve Lawrence  * ERRORS
3945*efd4c9b6SSteve Lawrence  *      EINVAL:  Invalid user.
3946*efd4c9b6SSteve Lawrence  *
3947*efd4c9b6SSteve Lawrence  */
3948*efd4c9b6SSteve Lawrence uint64_t
zs_pset_used_cpus(zs_pset_t * pset,int user)3949*efd4c9b6SSteve Lawrence zs_pset_used_cpus(zs_pset_t *pset, int user)
3950*efd4c9b6SSteve Lawrence {
3951*efd4c9b6SSteve Lawrence 	uint_t v;
3952*efd4c9b6SSteve Lawrence 
3953*efd4c9b6SSteve Lawrence 	switch (user) {
3954*efd4c9b6SSteve Lawrence 	case ZS_USER_ALL:
3955*efd4c9b6SSteve Lawrence 		v = zs_pset_usage_all_cpus(pset);
3956*efd4c9b6SSteve Lawrence 		break;
3957*efd4c9b6SSteve Lawrence 	case ZS_USER_KERNEL:
3958*efd4c9b6SSteve Lawrence 		v = zs_pset_usage_kernel_cpus(pset);
3959*efd4c9b6SSteve Lawrence 		break;
3960*efd4c9b6SSteve Lawrence 	case ZS_USER_ZONES:
3961*efd4c9b6SSteve Lawrence 		v = zs_pset_usage_zones_cpus(pset);
3962*efd4c9b6SSteve Lawrence 		break;
3963*efd4c9b6SSteve Lawrence 	case ZS_USER_FREE:
3964*efd4c9b6SSteve Lawrence 		v = zs_pset_usage_idle_cpus(pset);
3965*efd4c9b6SSteve Lawrence 		break;
3966*efd4c9b6SSteve Lawrence 	default:
3967*efd4c9b6SSteve Lawrence 		assert(0);
3968*efd4c9b6SSteve Lawrence 	}
3969*efd4c9b6SSteve Lawrence 	return (v);
3970*efd4c9b6SSteve Lawrence }
3971*efd4c9b6SSteve Lawrence /*
3972*efd4c9b6SSteve Lawrence  * Get percent of pset cpu time used
3973*efd4c9b6SSteve Lawrence  */
3974*efd4c9b6SSteve Lawrence uint_t
zs_pset_used_pct(zs_pset_t * pset,int user)3975*efd4c9b6SSteve Lawrence zs_pset_used_pct(zs_pset_t *pset, int user)
3976*efd4c9b6SSteve Lawrence {
3977*efd4c9b6SSteve Lawrence 	uint_t v;
3978*efd4c9b6SSteve Lawrence 
3979*efd4c9b6SSteve Lawrence 	switch (user) {
3980*efd4c9b6SSteve Lawrence 	case ZS_USER_ALL:
3981*efd4c9b6SSteve Lawrence 		v = zs_pset_usage_all_pct(pset);
3982*efd4c9b6SSteve Lawrence 		break;
3983*efd4c9b6SSteve Lawrence 	case ZS_USER_KERNEL:
3984*efd4c9b6SSteve Lawrence 		v = zs_pset_usage_kernel_pct(pset);
3985*efd4c9b6SSteve Lawrence 		break;
3986*efd4c9b6SSteve Lawrence 	case ZS_USER_ZONES:
3987*efd4c9b6SSteve Lawrence 		v = zs_pset_usage_zones_pct(pset);
3988*efd4c9b6SSteve Lawrence 		break;
3989*efd4c9b6SSteve Lawrence 	case ZS_USER_FREE:
3990*efd4c9b6SSteve Lawrence 		v = zs_pset_usage_idle_pct(pset);
3991*efd4c9b6SSteve Lawrence 		break;
3992*efd4c9b6SSteve Lawrence 	default:
3993*efd4c9b6SSteve Lawrence 		assert(0);
3994*efd4c9b6SSteve Lawrence 	}
3995*efd4c9b6SSteve Lawrence 	return (v);
3996*efd4c9b6SSteve Lawrence }
3997*efd4c9b6SSteve Lawrence 
3998*efd4c9b6SSteve Lawrence int
zs_pset_zone_list(zs_pset_t * pset,zs_pset_zone_t ** zonelist,int num)3999*efd4c9b6SSteve Lawrence zs_pset_zone_list(zs_pset_t *pset, zs_pset_zone_t **zonelist, int num)
4000*efd4c9b6SSteve Lawrence {
4001*efd4c9b6SSteve Lawrence 	int i = 0;
4002*efd4c9b6SSteve Lawrence 	zs_pset_zone_t *zone, *tmp;
4003*efd4c9b6SSteve Lawrence 
4004*efd4c9b6SSteve Lawrence 	/* copy what fits of the pset's zone list into the buffer */
4005*efd4c9b6SSteve Lawrence 	for (zone = list_head(&pset->zsp_usage_list); zone != NULL;
4006*efd4c9b6SSteve Lawrence 	    zone = list_next(&pset->zsp_usage_list, zone)) {
4007*efd4c9b6SSteve Lawrence 
4008*efd4c9b6SSteve Lawrence 		/* put the global zone at the first position */
4009*efd4c9b6SSteve Lawrence 		if (i < num) {
4010*efd4c9b6SSteve Lawrence 			if (zone->zspz_zone->zsz_id == GLOBAL_ZONEID) {
4011*efd4c9b6SSteve Lawrence 				tmp = zonelist[0];
4012*efd4c9b6SSteve Lawrence 				zonelist[i] = tmp;
4013*efd4c9b6SSteve Lawrence 				zonelist[0] = zone;
4014*efd4c9b6SSteve Lawrence 			} else {
4015*efd4c9b6SSteve Lawrence 				zonelist[i] = zone;
4016*efd4c9b6SSteve Lawrence 			}
4017*efd4c9b6SSteve Lawrence 		}
4018*efd4c9b6SSteve Lawrence 		i++;
4019*efd4c9b6SSteve Lawrence 	}
4020*efd4c9b6SSteve Lawrence 	return (i);
4021*efd4c9b6SSteve Lawrence }
4022*efd4c9b6SSteve Lawrence 
4023*efd4c9b6SSteve Lawrence zs_pset_zone_t *
zs_pset_zone_first(zs_pset_t * pset)4024*efd4c9b6SSteve Lawrence zs_pset_zone_first(zs_pset_t *pset)
4025*efd4c9b6SSteve Lawrence {
4026*efd4c9b6SSteve Lawrence 	return (list_head(&pset->zsp_usage_list));
4027*efd4c9b6SSteve Lawrence }
4028*efd4c9b6SSteve Lawrence 
4029*efd4c9b6SSteve Lawrence zs_pset_zone_t *
zs_pset_zone_next(zs_pset_t * pset,zs_pset_zone_t * pz)4030*efd4c9b6SSteve Lawrence zs_pset_zone_next(zs_pset_t *pset, zs_pset_zone_t *pz)
4031*efd4c9b6SSteve Lawrence {
4032*efd4c9b6SSteve Lawrence 	return (list_next(&pset->zsp_usage_list, pz));
4033*efd4c9b6SSteve Lawrence }
4034*efd4c9b6SSteve Lawrence 
4035*efd4c9b6SSteve Lawrence zs_pset_t *
zs_pset_zone_get_pset(zs_pset_zone_t * pz)4036*efd4c9b6SSteve Lawrence zs_pset_zone_get_pset(zs_pset_zone_t *pz)
4037*efd4c9b6SSteve Lawrence {
4038*efd4c9b6SSteve Lawrence 	return (pz->zspz_pset);
4039*efd4c9b6SSteve Lawrence }
4040*efd4c9b6SSteve Lawrence 
4041*efd4c9b6SSteve Lawrence zs_zone_t *
zs_pset_zone_get_zone(zs_pset_zone_t * pz)4042*efd4c9b6SSteve Lawrence zs_pset_zone_get_zone(zs_pset_zone_t *pz)
4043*efd4c9b6SSteve Lawrence {
4044*efd4c9b6SSteve Lawrence 	return (pz->zspz_zone);
4045*efd4c9b6SSteve Lawrence }
4046*efd4c9b6SSteve Lawrence 
4047*efd4c9b6SSteve Lawrence /*
4048*efd4c9b6SSteve Lawrence  * Get a property describing a zone's usage of a pset
4049*efd4c9b6SSteve Lawrence  */
4050*efd4c9b6SSteve Lawrence void
zs_pset_zone_property(zs_pset_zone_t * pz,int prop,zs_property_t * p)4051*efd4c9b6SSteve Lawrence zs_pset_zone_property(zs_pset_zone_t *pz, int prop, zs_property_t *p)
4052*efd4c9b6SSteve Lawrence {
4053*efd4c9b6SSteve Lawrence 	switch (prop) {
4054*efd4c9b6SSteve Lawrence 
4055*efd4c9b6SSteve Lawrence 	case ZS_PZ_PROP_CPU_CAP:
4056*efd4c9b6SSteve Lawrence 		p->zsp_type = ZS_PROP_TYPE_UINT64;
4057*efd4c9b6SSteve Lawrence 		p->zsp_id = prop;
4058*efd4c9b6SSteve Lawrence 		p->zsp_v.zsv_uint64 = (int)zs_pset_zone_cpu_cap(pz);
4059*efd4c9b6SSteve Lawrence 		break;
4060*efd4c9b6SSteve Lawrence 	case ZS_PZ_PROP_CPU_SHARES:
4061*efd4c9b6SSteve Lawrence 		p->zsp_type = ZS_PROP_TYPE_UINT64;
4062*efd4c9b6SSteve Lawrence 		p->zsp_id = prop;
4063*efd4c9b6SSteve Lawrence 		p->zsp_v.zsv_uint64 = (int)zs_pset_zone_cpu_shares(pz);
4064*efd4c9b6SSteve Lawrence 		break;
4065*efd4c9b6SSteve Lawrence 	case ZS_PZ_PROP_SCHEDULERS:
4066*efd4c9b6SSteve Lawrence 		p->zsp_type = ZS_PROP_TYPE_UINT;
4067*efd4c9b6SSteve Lawrence 		p->zsp_id = prop;
4068*efd4c9b6SSteve Lawrence 		p->zsp_v.zsv_uint = (int)zs_pset_zone_schedulers(pz);
4069*efd4c9b6SSteve Lawrence 		break;
4070*efd4c9b6SSteve Lawrence 	default:
4071*efd4c9b6SSteve Lawrence 		assert(0);
4072*efd4c9b6SSteve Lawrence 	}
4073*efd4c9b6SSteve Lawrence }
4074*efd4c9b6SSteve Lawrence 
4075*efd4c9b6SSteve Lawrence void
zs_pset_zone_used_time(zs_pset_zone_t * pz,timestruc_t * t)4076*efd4c9b6SSteve Lawrence zs_pset_zone_used_time(zs_pset_zone_t *pz, timestruc_t *t)
4077*efd4c9b6SSteve Lawrence {
4078*efd4c9b6SSteve Lawrence 	zs_pset_zone_usage_time(pz, t);
4079*efd4c9b6SSteve Lawrence }
4080*efd4c9b6SSteve Lawrence 
4081*efd4c9b6SSteve Lawrence uint64_t
zs_pset_zone_used_cpus(zs_pset_zone_t * pz)4082*efd4c9b6SSteve Lawrence zs_pset_zone_used_cpus(zs_pset_zone_t *pz)
4083*efd4c9b6SSteve Lawrence {
4084*efd4c9b6SSteve Lawrence 	return (zs_pset_zone_usage_cpus(pz));
4085*efd4c9b6SSteve Lawrence }
4086*efd4c9b6SSteve Lawrence 
4087*efd4c9b6SSteve Lawrence /*
4088*efd4c9b6SSteve Lawrence  * Get percent of a psets cpus used by a zone
4089*efd4c9b6SSteve Lawrence  */
4090*efd4c9b6SSteve Lawrence uint_t
zs_pset_zone_used_pct(zs_pset_zone_t * pz,int type)4091*efd4c9b6SSteve Lawrence zs_pset_zone_used_pct(zs_pset_zone_t *pz, int type)
4092*efd4c9b6SSteve Lawrence {
4093*efd4c9b6SSteve Lawrence 	uint_t v;
4094*efd4c9b6SSteve Lawrence 
4095*efd4c9b6SSteve Lawrence 	switch (type) {
4096*efd4c9b6SSteve Lawrence 	case ZS_PZ_PCT_PSET:
4097*efd4c9b6SSteve Lawrence 		v = zs_pset_zone_usage_pct_pset(pz);
4098*efd4c9b6SSteve Lawrence 		break;
4099*efd4c9b6SSteve Lawrence 	case ZS_PZ_PCT_CPU_CAP:
4100*efd4c9b6SSteve Lawrence 		v = zs_pset_zone_usage_pct_cpu_cap(pz);
4101*efd4c9b6SSteve Lawrence 		break;
4102*efd4c9b6SSteve Lawrence 	case ZS_PZ_PCT_PSET_SHARES:
4103*efd4c9b6SSteve Lawrence 		v = zs_pset_zone_usage_pct_pset_shares(pz);
4104*efd4c9b6SSteve Lawrence 		break;
4105*efd4c9b6SSteve Lawrence 	case ZS_PZ_PCT_CPU_SHARES:
4106*efd4c9b6SSteve Lawrence 		v = zs_pset_zone_usage_pct_cpu_shares(pz);
4107*efd4c9b6SSteve Lawrence 		break;
4108*efd4c9b6SSteve Lawrence 	default:
4109*efd4c9b6SSteve Lawrence 		assert(0);
4110*efd4c9b6SSteve Lawrence 	}
4111*efd4c9b6SSteve Lawrence 	return (v);
4112*efd4c9b6SSteve Lawrence }
4113*efd4c9b6SSteve Lawrence 
4114*efd4c9b6SSteve Lawrence /*
4115*efd4c9b6SSteve Lawrence  * returns similar to malloc
4116*efd4c9b6SSteve Lawrence  */
4117*efd4c9b6SSteve Lawrence zs_property_t *
zs_property_alloc()4118*efd4c9b6SSteve Lawrence zs_property_alloc()
4119*efd4c9b6SSteve Lawrence {
4120*efd4c9b6SSteve Lawrence 	return ((zs_property_t *)malloc(sizeof (zs_property_t)));
4121*efd4c9b6SSteve Lawrence }
4122*efd4c9b6SSteve Lawrence 
4123*efd4c9b6SSteve Lawrence size_t
zs_property_size()4124*efd4c9b6SSteve Lawrence zs_property_size()
4125*efd4c9b6SSteve Lawrence {
4126*efd4c9b6SSteve Lawrence 	return (sizeof (zs_property_t));
4127*efd4c9b6SSteve Lawrence }
4128*efd4c9b6SSteve Lawrence 
4129*efd4c9b6SSteve Lawrence void
zs_property_free(zs_property_t * p)4130*efd4c9b6SSteve Lawrence zs_property_free(zs_property_t *p)
4131*efd4c9b6SSteve Lawrence {
4132*efd4c9b6SSteve Lawrence 	free(p);
4133*efd4c9b6SSteve Lawrence }
4134*efd4c9b6SSteve Lawrence 
4135*efd4c9b6SSteve Lawrence int
zs_property_type(zs_property_t * p)4136*efd4c9b6SSteve Lawrence zs_property_type(zs_property_t *p)
4137*efd4c9b6SSteve Lawrence {
4138*efd4c9b6SSteve Lawrence 	return (p->zsp_type);
4139*efd4c9b6SSteve Lawrence }
4140*efd4c9b6SSteve Lawrence 
4141*efd4c9b6SSteve Lawrence int
zs_property_id(zs_property_t * p)4142*efd4c9b6SSteve Lawrence zs_property_id(zs_property_t *p)
4143*efd4c9b6SSteve Lawrence {
4144*efd4c9b6SSteve Lawrence 	return (p->zsp_id);
4145*efd4c9b6SSteve Lawrence }
4146*efd4c9b6SSteve Lawrence 
4147*efd4c9b6SSteve Lawrence char *
zs_property_string(zs_property_t * p)4148*efd4c9b6SSteve Lawrence zs_property_string(zs_property_t *p)
4149*efd4c9b6SSteve Lawrence {
4150*efd4c9b6SSteve Lawrence 	assert(p->zsp_type == ZS_PROP_TYPE_STRING);
4151*efd4c9b6SSteve Lawrence 	return (p->zsp_v.zsv_string);
4152*efd4c9b6SSteve Lawrence }
4153*efd4c9b6SSteve Lawrence 
4154*efd4c9b6SSteve Lawrence double
zs_property_double(zs_property_t * p)4155*efd4c9b6SSteve Lawrence zs_property_double(zs_property_t *p)
4156*efd4c9b6SSteve Lawrence {
4157*efd4c9b6SSteve Lawrence 	assert(p->zsp_type == ZS_PROP_TYPE_DOUBLE);
4158*efd4c9b6SSteve Lawrence 	return (p->zsp_v.zsv_double);
4159*efd4c9b6SSteve Lawrence }
4160*efd4c9b6SSteve Lawrence 
4161*efd4c9b6SSteve Lawrence void
zs_property_time(zs_property_t * p,timestruc_t * t)4162*efd4c9b6SSteve Lawrence zs_property_time(zs_property_t *p, timestruc_t *t)
4163*efd4c9b6SSteve Lawrence {
4164*efd4c9b6SSteve Lawrence 	assert(p->zsp_type == ZS_PROP_TYPE_TIME);
4165*efd4c9b6SSteve Lawrence 	*t = p->zsp_v.zsv_ts;
4166*efd4c9b6SSteve Lawrence }
4167*efd4c9b6SSteve Lawrence 
4168*efd4c9b6SSteve Lawrence uint64_t
zs_property_uint64(zs_property_t * p)4169*efd4c9b6SSteve Lawrence zs_property_uint64(zs_property_t *p)
4170*efd4c9b6SSteve Lawrence {
4171*efd4c9b6SSteve Lawrence 	assert(p->zsp_type == ZS_PROP_TYPE_UINT64);
4172*efd4c9b6SSteve Lawrence 	return (p->zsp_v.zsv_uint64);
4173*efd4c9b6SSteve Lawrence }
4174*efd4c9b6SSteve Lawrence 
4175*efd4c9b6SSteve Lawrence int64_t
zs_property_int64(zs_property_t * p)4176*efd4c9b6SSteve Lawrence zs_property_int64(zs_property_t *p)
4177*efd4c9b6SSteve Lawrence {
4178*efd4c9b6SSteve Lawrence 	assert(p->zsp_type == ZS_PROP_TYPE_INT64);
4179*efd4c9b6SSteve Lawrence 	return (p->zsp_v.zsv_int64);
4180*efd4c9b6SSteve Lawrence }
4181*efd4c9b6SSteve Lawrence 
4182*efd4c9b6SSteve Lawrence uint_t
zs_property_uint(zs_property_t * p)4183*efd4c9b6SSteve Lawrence zs_property_uint(zs_property_t *p)
4184*efd4c9b6SSteve Lawrence {
4185*efd4c9b6SSteve Lawrence 	assert(p->zsp_type == ZS_PROP_TYPE_UINT);
4186*efd4c9b6SSteve Lawrence 	return (p->zsp_v.zsv_uint);
4187*efd4c9b6SSteve Lawrence }
4188*efd4c9b6SSteve Lawrence 
4189*efd4c9b6SSteve Lawrence int
zs_property_int(zs_property_t * p)4190*efd4c9b6SSteve Lawrence zs_property_int(zs_property_t *p)
4191*efd4c9b6SSteve Lawrence {
4192*efd4c9b6SSteve Lawrence 	assert(p->zsp_type == ZS_PROP_TYPE_INT);
4193*efd4c9b6SSteve Lawrence 	return (p->zsp_v.zsv_uint);
4194*efd4c9b6SSteve Lawrence }
4195