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 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 * 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 * 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 * 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 * 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, ¶ms) != 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 * 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 * 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, ¶ms) != 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 * 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 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 * 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 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 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 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 * 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 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 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 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 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 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 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 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 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 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 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 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 * 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 * 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 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 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 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 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 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 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 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 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 * 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 * 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 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 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 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 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 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 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 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 * 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 * 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 * 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 * 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 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 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 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 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 * 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 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 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 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 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 * 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 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 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 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 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 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 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