1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
24  */
25 
26 #ifndef _ZONESTAT_H
27 #define	_ZONESTAT_H
28 
29 
30 
31 #include <limits.h>
32 #include <sys/types.h>
33 #include <sys/time.h>
34 #include <sys/param.h>
35 #include <sys/pset.h>
36 #include <sys/zone.h>
37 
38 #ifdef __cplusplus
39 extern "C" {
40 #endif
41 
42 #define	ZS_IPTYPE_SHARED	1
43 #define	ZS_IPTYPE_EXCLUSIVE	2
44 
45 #define	ZS_CPUTYPE_DEFAULT_PSET	1
46 #define	ZS_CPUTYPE_POOL_PSET	2
47 #define	ZS_CPUTYPE_PSRSET_PSET	3
48 #define	ZS_CPUTYPE_DEDICATED	4
49 
50 
51 #define	ZS_LIMIT_NONE			(UINT64_MAX)
52 #define	ZS_PCT_NONE			(UINT_MAX)
53 #define	ZS_SHARES_UNLIMITED		(UINT16_MAX)
54 
55 #define	ZS_ZONENAME_MAX			ZONENAME_MAX
56 #define	ZS_PSETNAME_MAX			(1024 + 1)
57 #define	ZS_POOLNAME_MAX			(1024 + 1)
58 
59 #define	ZS_RESOURCE_TYPE_TIME		1
60 #define	ZS_RESOURCE_TYPE_COUNT		2
61 #define	ZS_RESOURCE_TYPE_BYTES		3
62 
63 #define	ZS_LIMIT_TYPE_TIME		1
64 #define	ZS_LIMIT_TYPE_COUNT		2
65 #define	ZS_LIMIT_TYPE_BYTES		3
66 
67 #define	ZS_PROP_TYPE_STRING		1
68 #define	ZS_PROP_TYPE_TIME		2
69 #define	ZS_PROP_TYPE_UINT64		3
70 #define	ZS_PROP_TYPE_INT64		4
71 #define	ZS_PROP_TYPE_UINT		5
72 #define	ZS_PROP_TYPE_INT		6
73 #define	ZS_PROP_TYPE_DOUBLE		7
74 
75 #define	ZS_SCHED_TS			0x1
76 #define	ZS_SCHED_IA			0x2
77 #define	ZS_SCHED_RT			0x4
78 #define	ZS_SCHED_FX			0x8
79 #define	ZS_SCHED_FX_60			0x10
80 #define	ZS_SCHED_FSS			0x20
81 #define	ZS_SCHED_CONFLICT		0x40
82 
83 #define	ZS_RESOURCE_PROP_CPU_TOTAL	1
84 #define	ZS_RESOURCE_PROP_CPU_ONLINE	2
85 #define	ZS_RESOURCE_PROP_CPU_LOAD_1MIN	3
86 #define	ZS_RESOURCE_PROP_CPU_LOAD_5MIN	4
87 #define	ZS_RESOURCE_PROP_CPU_LOAD_15MIN	5
88 
89 #define	ZS_RESOURCE_CPU			1
90 #define	ZS_RESOURCE_RAM_RSS		2
91 #define	ZS_RESOURCE_RAM_LOCKED		3
92 #define	ZS_RESOURCE_VM			4
93 #define	ZS_RESOURCE_DISK_SWAP		5
94 #define	ZS_RESOURCE_LWPS		6
95 #define	ZS_RESOURCE_PROCESSES		7
96 #define	ZS_RESOURCE_SHM_MEMORY		8
97 #define	ZS_RESOURCE_SHM_IDS		9
98 #define	ZS_RESOURCE_SEM_IDS		10
99 #define	ZS_RESOURCE_MSG_IDS		11
100 #define	ZS_RESOURCE_LOFI		12
101 
102 #define	ZS_USER_ALL			1
103 #define	ZS_USER_KERNEL			2
104 #define	ZS_USER_ZONES			3
105 #define	ZS_USER_FREE			4
106 
107 #define	ZS_LIMIT_CPU			1
108 #define	ZS_LIMIT_CPU_SHARES		2
109 #define	ZS_LIMIT_RAM_RSS		3
110 #define	ZS_LIMIT_RAM_LOCKED		4
111 #define	ZS_LIMIT_VM			5
112 #define	ZS_LIMIT_LWPS			6
113 #define	ZS_LIMIT_PROCESSES		7
114 #define	ZS_LIMIT_SHM_MEMORY		8
115 #define	ZS_LIMIT_SHM_IDS		9
116 #define	ZS_LIMIT_MSG_IDS		10
117 #define	ZS_LIMIT_SEM_IDS		11
118 #define	ZS_LIMIT_LOFI			12
119 
120 #define	ZS_ZONE_PROP_NAME		1
121 #define	ZS_ZONE_PROP_ID			2
122 #define	ZS_ZONE_PROP_IPTYPE		3
123 #define	ZS_ZONE_PROP_CPUTYPE		4
124 #define	ZS_ZONE_PROP_DEFAULT_SCHED	5
125 #define	ZS_ZONE_PROP_SCHEDULERS		6
126 #define	ZS_ZONE_PROP_CPU_SHARES		7
127 #define	ZS_ZONE_PROP_POOLNAME		8
128 #define	ZS_ZONE_PROP_PSETNAME		9
129 #define	ZS_ZONE_PROP_UPTIME		10
130 #define	ZS_ZONE_PROP_BOOTTIME		11
131 
132 #define	ZS_PSET_PROP_NAME		1
133 #define	ZS_PSET_PROP_ID			2
134 #define	ZS_PSET_PROP_CPUTYPE		3
135 #define	ZS_PSET_PROP_SIZE		4
136 #define	ZS_PSET_PROP_ONLINE		5
137 #define	ZS_PSET_PROP_MIN		6
138 #define	ZS_PSET_PROP_MAX		7
139 #define	ZS_PSET_PROP_CPU_SHARES		8
140 #define	ZS_PSET_PROP_SCHEDULERS		9
141 #define	ZS_PSET_PROP_CREATETIME		10
142 #define	ZS_PSET_PROP_LOAD_1MIN		11
143 #define	ZS_PSET_PROP_LOAD_5MIN		12
144 #define	ZS_PSET_PROP_LOAD_15MIN		13
145 
146 #define	ZS_PZ_PROP_SCHEDULERS	1
147 #define	ZS_PZ_PROP_CPU_SHARES	2
148 #define	ZS_PZ_PROP_CPU_CAP	4
149 
150 #define	ZS_COMPUTE_USAGE_INTERVAL	1
151 #define	ZS_COMPUTE_USAGE_TOTAL		2
152 #define	ZS_COMPUTE_USAGE_AVERAGE	3
153 #define	ZS_COMPUTE_USAGE_HIGH		4
154 
155 #define	ZS_COMPUTE_SET_TOTAL		1
156 #define	ZS_COMPUTE_SET_AVERAGE		2
157 #define	ZS_COMPUTE_SET_HIGH		3
158 
159 #define	ZS_PZ_PCT_PSET		1
160 #define	ZS_PZ_PCT_CPU_CAP	2
161 #define	ZS_PZ_PCT_PSET_SHARES	3
162 #define	ZS_PZ_PCT_CPU_SHARES	4
163 
164 
165 /* Per-client handle to libzonestat */
166 typedef struct zs_ctl zs_ctl_t;
167 
168 /*
169  * These usage structure contains the system's utilization (overall, zones,
170  * psets, memory) at a given point in time.
171  */
172 typedef struct zs_usage zs_usage_t;
173 
174 /*
175  * The usage set is for computations on multiple usage structures to describe
176  * a range of time.
177  */
178 typedef struct zs_usage_set zs_usage_set_t;
179 
180 /*
181  * The following structures desribe each zone, pset, and each zone's usage
182  * of each pset.  Each usage structure (above) contains lists of these that
183  * can be traversed.
184  */
185 typedef struct zs_zone zs_zone_t;
186 typedef struct zs_pset zs_pset_t;
187 typedef struct zs_pset_zone zs_pset_zone_t;
188 
189 /*
190  * Opaque structure for properties.
191  */
192 typedef struct zs_property zs_property_t;
193 
194 
195 /* functions for opening/closing a handle for reading current usage */
196 zs_ctl_t *zs_open();
197 void zs_close(zs_ctl_t *);
198 
199 /* function for reading current resource usage */
200 zs_usage_t *zs_usage_read(zs_ctl_t *);
201 
202 /* functions for manimulating usage data: zs_usage */
203 zs_usage_t *zs_usage_compute(zs_usage_t *, zs_usage_t *, zs_usage_t *, int);
204 void zs_usage_free(zs_usage_t *);
205 
206 /* functions for manipulating sets of usage data: zs_usage_set */
207 zs_usage_set_t *zs_usage_set_alloc();
208 void zs_usage_set_free(zs_usage_set_t *);
209 int zs_usage_set_add(zs_usage_set_t *, zs_usage_t *);
210 int zs_usage_set_count(zs_usage_set_t *);
211 zs_usage_t *zs_usage_set_compute(zs_usage_set_t *, int);
212 
213 /* functions for overall system resources: zs_resource */
214 void zs_resource_property(zs_usage_t *, int, int, zs_property_t *);
215 int zs_resource_type(int);
216 uint64_t zs_resource_total_uint64(zs_usage_t *, int);
217 uint64_t zs_resource_used_uint64(zs_usage_t *, int, int);
218 uint64_t zs_resource_used_zone_uint64(zs_zone_t *, int);
219 void zs_resource_total_time(zs_usage_t *, int, timestruc_t *);
220 void zs_resource_used_time(zs_usage_t *, int, int, timestruc_t *);
221 void zs_resource_used_zone_time(zs_zone_t *, int, timestruc_t *);
222 uint_t zs_resource_used_pct(zs_usage_t *, int, int);
223 uint_t zs_resource_used_zone_pct(zs_zone_t *, int);
224 
225 /* functions for individual zone usage: zs_zone */
226 int zs_zone_list(zs_usage_t *, zs_zone_t **, int);
227 zs_zone_t *zs_zone_first(zs_usage_t *);
228 zs_zone_t *zs_zone_next(zs_usage_t *, zs_zone_t *);
229 void zs_zone_property(zs_zone_t *, int, zs_property_t *);
230 int zs_zone_limit_type(int);
231 uint64_t zs_zone_limit_uint64(zs_zone_t *, int);
232 uint64_t zs_zone_limit_used_uint64(zs_zone_t *, int);
233 void zs_zone_limit_time(zs_zone_t *, int, timestruc_t *);
234 void zs_zone_limit_used_time(zs_zone_t *, int, timestruc_t *);
235 uint_t zs_zone_limit_used_pct(zs_zone_t *, int);
236 
237 /* functions for individual psets: zs_pset_list */
238 int zs_pset_list(zs_usage_t *, zs_pset_t **, int);
239 zs_pset_t *zs_pset_first(zs_usage_t *);
240 zs_pset_t *zs_pset_next(zs_usage_t *, zs_pset_t *);
241 void zs_pset_property(zs_pset_t *, int, zs_property_t *);
242 void zs_pset_total_time(zs_pset_t *, timestruc_t *);
243 uint64_t zs_pset_total_cpus(zs_pset_t *);
244 void zs_pset_used_time(zs_pset_t *, int, timestruc_t *);
245 uint64_t zs_pset_used_cpus(zs_pset_t *, int);
246 uint_t zs_pset_used_pct(zs_pset_t *, int);
247 
248 /* functions for a pset's per-zone usage: zs_pset_zone */
249 int zs_pset_zone_list(zs_pset_t *, zs_pset_zone_t **, int);
250 zs_pset_zone_t *zs_pset_zone_first(zs_pset_t *);
251 zs_pset_zone_t *zs_pset_zone_next(zs_pset_t *, zs_pset_zone_t *);
252 zs_zone_t *zs_pset_zone_get_zone(zs_pset_zone_t *);
253 zs_pset_t *zs_pset_zone_get_pset(zs_pset_zone_t *);
254 void zs_pset_zone_property(zs_pset_zone_t *, int, zs_property_t *);
255 void zs_pset_zone_used_time(zs_pset_zone_t *, timestruc_t *);
256 uint64_t zs_pset_zone_used_cpus(zs_pset_zone_t *);
257 uint_t zs_pset_zone_used_pct(zs_pset_zone_t *, int);
258 
259 /* functions for accessing properties */
260 zs_property_t *zs_property_alloc();
261 size_t zs_property_size();
262 void zs_property_free(zs_property_t *);
263 int zs_property_type(zs_property_t *);
264 int zs_property_id(zs_property_t *);
265 char *zs_property_string(zs_property_t *);
266 double zs_property_double(zs_property_t *);
267 void zs_property_time(zs_property_t *, timestruc_t *);
268 uint64_t zs_property_uint64(zs_property_t *);
269 int64_t zs_property_int64(zs_property_t *);
270 uint_t zs_property_uint(zs_property_t *);
271 int zs_property_int(zs_property_t *);
272 
273 #ifdef __cplusplus
274 }
275 #endif
276 
277 #endif	/* _ZONESTAT_H */
278