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, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 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. 13 * 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] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * Copyright 2014 Garrett D'Amore <garrett@damore.org> 24 * Copyright 2017 RackTop Systems. 25 * 26 * Copyright 2004 Sun Microsystems, Inc. All rights reserved. 27 * Use is subject to license terms. 28 */ 29 30 #ifndef _LGRP_USER_H 31 #define _LGRP_USER_H 32 33 /* 34 * latency group definitions for user 35 */ 36 37 #ifdef __cplusplus 38 extern "C" { 39 #endif 40 41 42 #include <sys/inttypes.h> 43 #include <sys/lgrp.h> 44 #include <sys/procset.h> 45 #include <sys/processor.h> 46 #include <sys/pset.h> 47 #include <sys/types.h> 48 49 50 /* 51 * lgroup interface version 52 */ 53 #define LGRP_VER_NONE 0 /* no lgroup interface version */ 54 #define LGRP_VER_CURRENT 2 /* current lgroup interface version */ 55 56 57 /* 58 * lgroup system call subcodes 59 */ 60 #define LGRP_SYS_MEMINFO 0 /* meminfo(2) aka MISYS_MEMINFO */ 61 #define LGRP_SYS_GENERATION 1 /* lgrp_generation() */ 62 #define LGRP_SYS_VERSION 2 /* lgrp_version() */ 63 #define LGRP_SYS_SNAPSHOT 3 /* lgrp_snapshot() */ 64 #define LGRP_SYS_AFFINITY_GET 4 /* lgrp_affinity_set() */ 65 #define LGRP_SYS_AFFINITY_SET 5 /* lgrp_affinity_get() */ 66 #define LGRP_SYS_LATENCY 6 /* lgrp_latency() */ 67 #define LGRP_SYS_HOME 7 /* lgrp_home() */ 68 69 70 /* 71 * lgroup resources 72 */ 73 #define LGRP_RSRC_COUNT 2 /* no. of resource types in lgroup */ 74 #define LGRP_RSRC_CPU 0 /* CPU resources */ 75 #define LGRP_RSRC_MEM 1 /* memory resources */ 76 77 typedef int lgrp_rsrc_t; 78 79 80 81 /* 82 * lgroup affinity 83 */ 84 #define LGRP_AFF_NONE 0x0 /* no affinity */ 85 #define LGRP_AFF_WEAK 0x10 /* weak affinity */ 86 #define LGRP_AFF_STRONG 0x100 /* strong affinity */ 87 88 typedef int lgrp_affinity_t; 89 90 /* 91 * Arguments to lgrp_affinity_{get,set}() 92 */ 93 typedef struct lgrp_affinity_args { 94 idtype_t idtype; /* ID type */ 95 id_t id; /* ID */ 96 lgrp_id_t lgrp; /* lgroup */ 97 lgrp_affinity_t aff; /* affinity */ 98 } lgrp_affinity_args_t; 99 100 101 /* 102 * Flags to specify contents of lgroups desired 103 */ 104 typedef enum lgrp_content { 105 LGRP_CONTENT_ALL, /* everything in lgroup */ 106 /* everything in lgroup's hierarchy (for compatability) */ 107 LGRP_CONTENT_HIERARCHY = LGRP_CONTENT_ALL, 108 LGRP_CONTENT_DIRECT /* what's directly contained in lgroup */ 109 } lgrp_content_t; 110 111 112 /* 113 * Flags for lgrp_latency_cookie() specifying what hardware resources to get 114 * latency between 115 */ 116 typedef enum lgrp_lat_between { 117 LGRP_LAT_CPU_TO_MEM /* latency between CPU and memory */ 118 } lgrp_lat_between_t; 119 120 121 /* 122 * lgroup memory size type 123 */ 124 typedef longlong_t lgrp_mem_size_t; 125 126 127 /* 128 * lgroup memory size flags 129 */ 130 typedef enum lgrp_mem_size_flag { 131 LGRP_MEM_SZ_FREE, /* free memory */ 132 LGRP_MEM_SZ_INSTALLED /* installed memory */ 133 } lgrp_mem_size_flag_t; 134 135 136 /* 137 * View of lgroups 138 */ 139 typedef enum lgrp_view { 140 LGRP_VIEW_CALLER, /* what's available to the caller */ 141 LGRP_VIEW_OS /* what's available to operating system */ 142 } lgrp_view_t; 143 144 145 /* 146 * lgroup information needed by user 147 */ 148 typedef struct lgrp_info { 149 lgrp_id_t info_lgrpid; /* lgroup ID */ 150 int info_latency; /* latency */ 151 ulong_t *info_parents; /* parent lgroups */ 152 ulong_t *info_children; /* children lgroups */ 153 ulong_t *info_rset; /* lgroup resources */ 154 pgcnt_t info_mem_free; /* free memory */ 155 pgcnt_t info_mem_install; /* installed memory */ 156 processorid_t *info_cpuids; /* CPU IDs */ 157 int info_ncpus; /* number of CPUs */ 158 } lgrp_info_t; 159 160 161 /* 162 * Type of lgroup cookie to use with interface routines 163 */ 164 typedef uintptr_t lgrp_cookie_t; 165 166 #define LGRP_COOKIE_NONE 0 /* no cookie */ 167 168 169 /* 170 * Type of lgroup generation number 171 */ 172 typedef uint_t lgrp_gen_t; 173 174 175 /* 176 * Format of lgroup hierarchy snapshot 177 */ 178 typedef struct lgrp_snapshot_header { 179 int ss_version; /* lgroup interface version */ 180 int ss_levels; /* levels of hierarchy */ 181 int ss_nlgrps; /* number of lgroups */ 182 int ss_nlgrps_os; /* number of lgroups (OS view) */ 183 int ss_nlgrps_max; /* maximum number of lgroups */ 184 int ss_root; /* root lgroup */ 185 int ss_ncpus; /* total number of CPUs */ 186 lgrp_view_t ss_view; /* view of lgroup hierarchy */ 187 psetid_t ss_pset; /* caller's pset ID */ 188 lgrp_gen_t ss_gen; /* snapshot generation ID */ 189 size_t ss_size; /* total size of snapshot */ 190 uintptr_t ss_magic; /* snapshot magic number */ 191 lgrp_info_t *ss_info; /* lgroup info array */ 192 processorid_t *ss_cpuids; /* lgroup CPU ID array */ 193 ulong_t *ss_lgrpset; /* bit mask of available lgroups */ 194 ulong_t *ss_parents; /* lgroup parent bit masks */ 195 ulong_t *ss_children; /* lgroup children bit masks */ 196 ulong_t *ss_rsets; /* lgroup resource set bit masks */ 197 int **ss_latencies; /* latencies between lgroups */ 198 } lgrp_snapshot_header_t; 199 200 201 #ifdef _SYSCALL32 202 /* 203 * lgroup information needed by 32-bit user 204 */ 205 typedef struct lgrp_info32 { 206 int info_lgrpid; /* lgroup ID */ 207 int info_latency; /* latency */ 208 caddr32_t info_parents; /* parent lgroups */ 209 caddr32_t info_children; /* children lgroups */ 210 caddr32_t info_rset; /* lgroup resources */ 211 uint32_t info_mem_free; /* free memory */ 212 uint32_t info_mem_install; /* installed memory */ 213 caddr32_t info_cpuids; /* CPU IDs */ 214 int info_ncpus; /* number of CPUs */ 215 } lgrp_info32_t; 216 217 218 /* 219 * Format of lgroup hierarchy snapshot for 32-bit programs 220 */ 221 typedef struct lgrp_snapshot_header32 { 222 int ss_version; /* lgroup interface version */ 223 int ss_levels; /* levels of hierarchy */ 224 int ss_nlgrps; /* number of lgroups */ 225 int ss_nlgrps_os; /* number of lgroups (OS view) */ 226 int ss_nlgrps_max; /* maximum number of lgroups */ 227 int ss_root; /* root lgroup */ 228 int ss_ncpus; /* total number of CPUs */ 229 int ss_view; /* view of lgroup hierarchy */ 230 int ss_pset; /* caller's pset ID */ 231 uint_t ss_gen; /* snapshot generation ID */ 232 size32_t ss_size; /* total size of snapshot */ 233 uint32_t ss_magic; /* snapshot magic number */ 234 caddr32_t ss_info; /* lgroup info array */ 235 caddr32_t ss_cpuids; /* lgroup CPU ID array */ 236 caddr32_t ss_lgrpset; /* bit mask of available lgroups */ 237 caddr32_t ss_parents; /* lgroup parent bit masks */ 238 caddr32_t ss_children; /* lgroup children bit masks */ 239 caddr32_t ss_rsets; /* lgroup resource set bit masks */ 240 caddr32_t ss_latencies; /* latencies between lgroups */ 241 } lgrp_snapshot_header32_t; 242 243 #endif /* _SYSCALL32 */ 244 245 246 #if !defined(_KERNEL) && !defined(_FAKE_KERNEL) && !defined(_KMEMUSER) 247 248 lgrp_affinity_t lgrp_affinity_get(idtype_t idtype, id_t id, lgrp_id_t lgrp); 249 250 int lgrp_affinity_set(idtype_t idtype, id_t id, lgrp_id_t lgrp, 251 lgrp_affinity_t aff); 252 253 int lgrp_children(lgrp_cookie_t cookie, lgrp_id_t lgrp, 254 lgrp_id_t *children, uint_t count); 255 256 int lgrp_cookie_stale(lgrp_cookie_t cookie); 257 258 int lgrp_cpus(lgrp_cookie_t cookie, lgrp_id_t lgrp, 259 processorid_t *cpuids, uint_t count, lgrp_content_t content); 260 261 int lgrp_fini(lgrp_cookie_t cookie); 262 263 int lgrp_latency(lgrp_id_t from, lgrp_id_t to); 264 265 int lgrp_latency_cookie(lgrp_cookie_t cookie, lgrp_id_t from, 266 lgrp_id_t to, lgrp_lat_between_t between); 267 268 lgrp_id_t lgrp_home(idtype_t idtype, id_t id); 269 270 lgrp_cookie_t lgrp_init(lgrp_view_t view); 271 272 lgrp_mem_size_t lgrp_mem_size(lgrp_cookie_t cookie, lgrp_id_t lgrp, 273 lgrp_mem_size_flag_t type, lgrp_content_t content); 274 275 int lgrp_nlgrps(lgrp_cookie_t cookie); 276 277 int lgrp_parents(lgrp_cookie_t cookie, lgrp_id_t lgrp, 278 lgrp_id_t *parents, uint_t count); 279 280 int lgrp_resources(lgrp_cookie_t cookie, lgrp_id_t lgrp, 281 lgrp_id_t *lgrps, uint_t count, lgrp_rsrc_t type); 282 283 lgrp_id_t lgrp_root(lgrp_cookie_t cookie); 284 285 int lgrp_version(int version); 286 287 lgrp_view_t lgrp_view(lgrp_cookie_t cookie); 288 289 #endif /* !_KERNEL && !_FAKE_KERNEL && !_KMEMUSER */ 290 291 #ifdef __cplusplus 292 } 293 #endif 294 295 #endif /* _LGRP_USER_H */