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_IMPL_H
27 #define	_ZONESTAT_IMPL_H
28 
29 #include <zonestat.h>
30 #include <sys/list.h>
31 #include <sys/priv_const.h>
32 
33 #ifdef __cplusplus
34 extern "C" {
35 
36 #endif
37 
38 #define	ZS_VERSION	1
39 
40 #define	ZS_PSET_DEFAULT		PS_NONE
41 #define	ZS_PSET_MULTI		PS_MYID
42 #define	ZS_PSET_ERROR		PS_QUERY
43 
44 #define	ZS_DOOR_PATH		"/etc/svc/volatile/zonestat_door"
45 
46 #define	ZSD_CMD_READ		1
47 #define	ZSD_CMD_CONNECT		2
48 #define	ZSD_CMD_NEW_ZONE	3
49 
50 /* The following read commands are unimplemented */
51 #define	ZSD_CMD_READ_TIME	3
52 #define	ZSD_CMD_READ_SET	4
53 #define	ZSD_CMD_READ_SET_TIME	5
54 
55 #define	ZSD_STATUS_OK			0
56 #define	ZSD_STATUS_VERSION_MISMATCH	1
57 #define	ZSD_STATUS_PERMISSION		2
58 #define	ZSD_STATUS_INTERNAL_ERROR	3
59 
60 #define	TIMESTRUC_ADD_NANOSEC(ts, nsec)				\
61 	{							\
62 		(ts).tv_sec += (time_t)((nsec) / NANOSEC);	\
63 		(ts).tv_nsec += (long)((nsec) % NANOSEC);	\
64 		if ((ts).tv_nsec > NANOSEC) {			\
65 			(ts).tv_sec += (ts).tv_nsec / NANOSEC;	\
66 			(ts).tv_nsec = (ts).tv_nsec % NANOSEC;	\
67 		}						\
68 	}
69 
70 #define	TIMESTRUC_ADD_TIMESTRUC(ts, add)			\
71 	{							\
72 		(ts).tv_sec += (add).tv_sec;			\
73 		(ts).tv_nsec += (add).tv_nsec;			\
74 		if ((ts).tv_nsec > NANOSEC) {			\
75 			(ts).tv_sec += (ts).tv_nsec / NANOSEC;	\
76 			(ts).tv_nsec = (ts).tv_nsec % NANOSEC;	\
77 		}						\
78 	}
79 
80 #define	TIMESTRUC_DELTA(delta, new, old)			\
81 	{							\
82 		(delta).tv_sec = (new).tv_sec - (old).tv_sec;	\
83 		(delta).tv_nsec = (new).tv_nsec - (old).tv_nsec;\
84 		if ((delta).tv_nsec < 0) {			\
85 			delta.tv_nsec += NANOSEC;		\
86 			delta.tv_sec -= 1;			\
87 		}						\
88 		if ((delta).tv_sec < 0) {			\
89 			delta.tv_sec = 0;			\
90 			delta.tv_nsec = 0;			\
91 		}						\
92 	}
93 
94 typedef struct zs_system {
95 
96 	uint64_t zss_ram_total;
97 	uint64_t zss_ram_kern;
98 	uint64_t zss_ram_zones;
99 
100 	uint64_t zss_locked_kern;
101 	uint64_t zss_locked_zones;
102 
103 	uint64_t zss_vm_total;
104 	uint64_t zss_vm_kern;
105 	uint64_t zss_vm_zones;
106 
107 	uint64_t zss_swap_total;
108 	uint64_t zss_swap_used;
109 
110 	timestruc_t zss_cpu_total_time;
111 	timestruc_t zss_cpu_usage_kern;
112 	timestruc_t zss_cpu_usage_zones;
113 
114 	uint64_t zss_processes_max;
115 	uint64_t zss_lwps_max;
116 	uint64_t zss_shm_max;
117 	uint64_t zss_shmids_max;
118 	uint64_t zss_semids_max;
119 	uint64_t zss_msgids_max;
120 	uint64_t zss_lofi_max;
121 
122 	uint64_t zss_processes;
123 	uint64_t zss_lwps;
124 	uint64_t zss_shm;
125 	uint64_t zss_shmids;
126 	uint64_t zss_semids;
127 	uint64_t zss_msgids;
128 	uint64_t zss_lofi;
129 
130 	uint64_t zss_ncpus;
131 	uint64_t zss_ncpus_online;
132 
133 } zs_system_t;
134 
135 struct zs_pset_zone {
136 
137 	list_node_t	zspz_next;
138 	struct zs_pset	*zspz_pset;
139 	struct zs_zone	*zspz_zone;
140 	zoneid_t	zspz_zoneid;
141 	time_t		zspz_start;
142 	hrtime_t	zspz_hrstart;
143 	uint_t		zspz_intervals;
144 
145 	uint64_t	zspz_cpu_shares;
146 	uint_t		zspz_scheds;
147 
148 	timestruc_t	zspz_cpu_usage;
149 
150 };
151 
152 struct zs_ctl {
153 	int	 zsctl_door;
154 	uint64_t zsctl_gen;
155 	zs_usage_t *zsctl_start;
156 };
157 
158 struct zs_zone {
159 	list_node_t	zsz_next;
160 	struct zs_system *zsz_system;
161 	char		zsz_name[ZS_ZONENAME_MAX];
162 	char		zsz_pool[ZS_POOLNAME_MAX];
163 	char		zsz_pset[ZS_PSETNAME_MAX];
164 	zoneid_t	zsz_id;
165 	uint_t		zsz_cputype;
166 	uint_t		zsz_iptype;
167 	time_t		zsz_start;
168 	hrtime_t	zsz_hrstart;
169 	uint_t		zsz_intervals;
170 
171 	uint_t		zsz_scheds;
172 	uint64_t	zsz_cpu_shares;
173 	uint64_t	zsz_cpu_cap;
174 	uint64_t	zsz_ram_cap;
175 	uint64_t	zsz_vm_cap;
176 	uint64_t	zsz_locked_cap;
177 
178 	uint64_t	zsz_cpus_online;
179 	timestruc_t	zsz_cpu_usage;
180 	timestruc_t	zsz_pset_time;
181 	timestruc_t	zsz_cap_time;
182 	timestruc_t	zsz_share_time;
183 
184 	uint64_t	zsz_usage_ram;
185 	uint64_t	zsz_usage_locked;
186 	uint64_t	zsz_usage_vm;
187 
188 	uint64_t	zsz_processes_cap;
189 	uint64_t	zsz_lwps_cap;
190 	uint64_t	zsz_shm_cap;
191 	uint64_t	zsz_shmids_cap;
192 	uint64_t	zsz_semids_cap;
193 	uint64_t	zsz_msgids_cap;
194 	uint64_t	zsz_lofi_cap;
195 
196 	uint64_t	zsz_processes;
197 	uint64_t	zsz_lwps;
198 	uint64_t	zsz_shm;
199 	uint64_t	zsz_shmids;
200 	uint64_t	zsz_semids;
201 	uint64_t	zsz_msgids;
202 	uint64_t	zsz_lofi;
203 
204 };
205 
206 struct zs_pset {
207 	list_node_t	zsp_next;
208 	char		zsp_name[ZS_PSETNAME_MAX];
209 	psetid_t	zsp_id;
210 	uint_t		zsp_cputype;
211 	time_t		zsp_start;
212 	hrtime_t	zsp_hrstart;
213 	uint_t		zsp_intervals;
214 
215 	uint64_t	zsp_online;
216 	uint64_t	zsp_size;
217 	uint64_t	zsp_min;
218 	uint64_t	zsp_max;
219 	int64_t		zsp_importance;
220 
221 	uint_t		zsp_scheds;
222 	uint64_t	zsp_cpu_shares;
223 	timestruc_t	zsp_total_time;
224 	timestruc_t	zsp_usage_kern;
225 	timestruc_t	zsp_usage_zones;
226 
227 	uint_t		zsp_nusage;
228 	list_t		zsp_usage_list;
229 };
230 
231 struct zs_usage {
232 	time_t		zsu_start;
233 	hrtime_t	zsu_hrstart;
234 	time_t		zsu_time;
235 	hrtime_t	zsu_hrtime;
236 	uint64_t	zsu_size;
237 	uint_t		zsu_intervals;
238 	uint64_t	zsu_gen;
239 	boolean_t	zsu_mmap;
240 	uint_t		zsu_nzones;
241 	uint_t		zsu_npsets;
242 	zs_system_t	*zsu_system;
243 	list_t		zsu_zone_list;
244 	list_t		zsu_pset_list;
245 };
246 
247 struct zs_usage_set {
248 	struct zs_usage *zsus_total;
249 	struct zs_usage *zsus_avg;
250 	struct zs_usage *zsus_high;
251 	uint_t		zsus_count;
252 };
253 
254 struct zs_property {
255 	int zsp_type;
256 	int zsp_id;
257 	union zsp_value_union {
258 		char zsv_string[ZS_PSETNAME_MAX];
259 		timestruc_t zsv_ts;
260 		double zsv_double;
261 		uint64_t zsv_uint64;
262 		int64_t zsv_int64;
263 		uint_t zsv_uint;
264 		int zsv_int;
265 	} zsp_v;
266 };
267 
268 typedef struct zs_usage_cache {
269 	int zsuc_ref;
270 	uint_t zsuc_size;
271 	uint64_t zsuc_gen;
272 	zs_usage_t *zsuc_usage;
273 } zs_usage_cache_t;
274 
275 
276 #ifdef __cplusplus
277 }
278 #endif
279 
280 #endif	/* _ZONESTAT_IMPL_H */
281