4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License"). You may not use this file except in compliance
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
23 * Copyright 2014 Garrett D'Amore <garrett@damore.org>
25 * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
26 * Use is subject to license terms.
33 * latency group definitions for user
41 #include <sys/inttypes.h>
43 #include <sys/procset.h>
44 #include <sys/processor.h>
46 #include <sys/types.h>
50 * lgroup interface version
52 #define LGRP_VER_NONE 0 /* no lgroup interface version */
53 #define LGRP_VER_CURRENT 2 /* current lgroup interface version */
57 * lgroup system call subcodes
59 #define LGRP_SYS_MEMINFO 0 /* meminfo(2) aka MISYS_MEMINFO */
60 #define LGRP_SYS_GENERATION 1 /* lgrp_generation() */
61 #define LGRP_SYS_VERSION 2 /* lgrp_version() */
62 #define LGRP_SYS_SNAPSHOT 3 /* lgrp_snapshot() */
63 #define LGRP_SYS_AFFINITY_GET 4 /* lgrp_affinity_set() */
64 #define LGRP_SYS_AFFINITY_SET 5 /* lgrp_affinity_get() */
65 #define LGRP_SYS_LATENCY 6 /* lgrp_latency() */
66 #define LGRP_SYS_HOME 7 /* lgrp_home() */
72 #define LGRP_RSRC_COUNT 2 /* no. of resource types in lgroup */
73 #define LGRP_RSRC_CPU 0 /* CPU resources */
74 #define LGRP_RSRC_MEM 1 /* memory resources */
76 typedef int lgrp_rsrc_t
;
83 #define LGRP_AFF_NONE 0x0 /* no affinity */
84 #define LGRP_AFF_WEAK 0x10 /* weak affinity */
85 #define LGRP_AFF_STRONG 0x100 /* strong affinity */
87 typedef int lgrp_affinity_t
;
90 * Arguments to lgrp_affinity_{get,set}()
92 typedef struct lgrp_affinity_args
{
93 idtype_t idtype
; /* ID type */
95 lgrp_id_t lgrp
; /* lgroup */
96 lgrp_affinity_t aff
; /* affinity */
97 } lgrp_affinity_args_t
;
101 * Flags to specify contents of lgroups desired
103 typedef enum lgrp_content
{
104 LGRP_CONTENT_ALL
, /* everything in lgroup */
105 /* everything in lgroup's hierarchy (for compatability) */
106 LGRP_CONTENT_HIERARCHY
= LGRP_CONTENT_ALL
,
107 LGRP_CONTENT_DIRECT
/* what's directly contained in lgroup */
112 * Flags for lgrp_latency_cookie() specifying what hardware resources to get
115 typedef enum lgrp_lat_between
{
116 LGRP_LAT_CPU_TO_MEM
/* latency between CPU and memory */
117 } lgrp_lat_between_t
;
121 * lgroup memory size type
123 typedef longlong_t lgrp_mem_size_t
;
127 * lgroup memory size flags
129 typedef enum lgrp_mem_size_flag
{
130 LGRP_MEM_SZ_FREE
, /* free memory */
131 LGRP_MEM_SZ_INSTALLED
/* installed memory */
132 } lgrp_mem_size_flag_t
;
138 typedef enum lgrp_view
{
139 LGRP_VIEW_CALLER
, /* what's available to the caller */
140 LGRP_VIEW_OS
/* what's available to operating system */
145 * lgroup information needed by user
147 typedef struct lgrp_info
{
148 lgrp_id_t info_lgrpid
; /* lgroup ID */
149 int info_latency
; /* latency */
150 ulong_t
*info_parents
; /* parent lgroups */
151 ulong_t
*info_children
; /* children lgroups */
152 ulong_t
*info_rset
; /* lgroup resources */
153 pgcnt_t info_mem_free
; /* free memory */
154 pgcnt_t info_mem_install
; /* installed memory */
155 processorid_t
*info_cpuids
; /* CPU IDs */
156 int info_ncpus
; /* number of CPUs */
161 * Type of lgroup cookie to use with interface routines
163 typedef uintptr_t lgrp_cookie_t
;
165 #define LGRP_COOKIE_NONE 0 /* no cookie */
169 * Type of lgroup generation number
171 typedef uint_t lgrp_gen_t
;
175 * Format of lgroup hierarchy snapshot
177 typedef struct lgrp_snapshot_header
{
178 int ss_version
; /* lgroup interface version */
179 int ss_levels
; /* levels of hierarchy */
180 int ss_nlgrps
; /* number of lgroups */
181 int ss_nlgrps_os
; /* number of lgroups (OS view) */
182 int ss_nlgrps_max
; /* maximum number of lgroups */
183 int ss_root
; /* root lgroup */
184 int ss_ncpus
; /* total number of CPUs */
185 lgrp_view_t ss_view
; /* view of lgroup hierarchy */
186 psetid_t ss_pset
; /* caller's pset ID */
187 lgrp_gen_t ss_gen
; /* snapshot generation ID */
188 size_t ss_size
; /* total size of snapshot */
189 uintptr_t ss_magic
; /* snapshot magic number */
190 lgrp_info_t
*ss_info
; /* lgroup info array */
191 processorid_t
*ss_cpuids
; /* lgroup CPU ID array */
192 ulong_t
*ss_lgrpset
; /* bit mask of available lgroups */
193 ulong_t
*ss_parents
; /* lgroup parent bit masks */
194 ulong_t
*ss_children
; /* lgroup children bit masks */
195 ulong_t
*ss_rsets
; /* lgroup resource set bit masks */
196 int **ss_latencies
; /* latencies between lgroups */
197 } lgrp_snapshot_header_t
;
202 * lgroup information needed by 32-bit user
204 typedef struct lgrp_info32
{
205 int info_lgrpid
; /* lgroup ID */
206 int info_latency
; /* latency */
207 caddr32_t info_parents
; /* parent lgroups */
208 caddr32_t info_children
; /* children lgroups */
209 caddr32_t info_rset
; /* lgroup resources */
210 uint32_t info_mem_free
; /* free memory */
211 uint32_t info_mem_install
; /* installed memory */
212 caddr32_t info_cpuids
; /* CPU IDs */
213 int info_ncpus
; /* number of CPUs */
218 * Format of lgroup hierarchy snapshot for 32-bit programs
220 typedef struct lgrp_snapshot_header32
{
221 int ss_version
; /* lgroup interface version */
222 int ss_levels
; /* levels of hierarchy */
223 int ss_nlgrps
; /* number of lgroups */
224 int ss_nlgrps_os
; /* number of lgroups (OS view) */
225 int ss_nlgrps_max
; /* maximum number of lgroups */
226 int ss_root
; /* root lgroup */
227 int ss_ncpus
; /* total number of CPUs */
228 int ss_view
; /* view of lgroup hierarchy */
229 int ss_pset
; /* caller's pset ID */
230 uint_t ss_gen
; /* snapshot generation ID */
231 size32_t ss_size
; /* total size of snapshot */
232 uint32_t ss_magic
; /* snapshot magic number */
233 caddr32_t ss_info
; /* lgroup info array */
234 caddr32_t ss_cpuids
; /* lgroup CPU ID array */
235 caddr32_t ss_lgrpset
; /* bit mask of available lgroups */
236 caddr32_t ss_parents
; /* lgroup parent bit masks */
237 caddr32_t ss_children
; /* lgroup children bit masks */
238 caddr32_t ss_rsets
; /* lgroup resource set bit masks */
239 caddr32_t ss_latencies
; /* latencies between lgroups */
240 } lgrp_snapshot_header32_t
;
242 #endif /* _SYSCALL32 */
245 #if (!defined(_KERNEL) && !defined(_KMEMUSER))
247 lgrp_affinity_t
lgrp_affinity_get(idtype_t idtype
, id_t id
, lgrp_id_t lgrp
);
249 int lgrp_affinity_set(idtype_t idtype
, id_t id
, lgrp_id_t lgrp
,
250 lgrp_affinity_t aff
);
252 int lgrp_children(lgrp_cookie_t cookie
, lgrp_id_t lgrp
,
253 lgrp_id_t
*children
, uint_t count
);
255 int lgrp_cookie_stale(lgrp_cookie_t cookie
);
257 int lgrp_cpus(lgrp_cookie_t cookie
, lgrp_id_t lgrp
,
258 processorid_t
*cpuids
, uint_t count
, lgrp_content_t content
);
260 int lgrp_fini(lgrp_cookie_t cookie
);
262 int lgrp_latency(lgrp_id_t from
, lgrp_id_t to
);
264 int lgrp_latency_cookie(lgrp_cookie_t cookie
, lgrp_id_t from
,
265 lgrp_id_t to
, lgrp_lat_between_t between
);
267 lgrp_id_t
lgrp_home(idtype_t idtype
, id_t id
);
269 lgrp_cookie_t
lgrp_init(lgrp_view_t view
);
271 lgrp_mem_size_t
lgrp_mem_size(lgrp_cookie_t cookie
, lgrp_id_t lgrp
,
272 lgrp_mem_size_flag_t type
, lgrp_content_t content
);
274 int lgrp_nlgrps(lgrp_cookie_t cookie
);
276 int lgrp_parents(lgrp_cookie_t cookie
, lgrp_id_t lgrp
,
277 lgrp_id_t
*parents
, uint_t count
);
279 int lgrp_resources(lgrp_cookie_t cookie
, lgrp_id_t lgrp
,
280 lgrp_id_t
*lgrps
, uint_t count
, lgrp_rsrc_t type
);
282 lgrp_id_t
lgrp_root(lgrp_cookie_t cookie
);
284 int lgrp_version(int version
);
286 lgrp_view_t
lgrp_view(lgrp_cookie_t cookie
);
288 #endif /* !_KERNEL && !_KMEMUSER */
294 #endif /* _LGRP_USER_H */