efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * CDDL HEADER START
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * The contents of this file are subject to the terms of the
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Common Development and Distribution License (the "License").
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * You may not use this file except in compliance with the License.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * or http://www.opensolaris.org/os/licensing.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * See the License for the specific language governing permissions
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * and limitations under the License.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * When distributing Covered Code, include this CDDL HEADER in each
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * If applicable, add the following below this CDDL HEADER, with the
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * fields enclosed by brackets "[]" replaced with your own identifying
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * information: Portions Copyright [yyyy] [name of copyright owner]
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * CDDL HEADER END
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <alloca.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <assert.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <errno.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <langinfo.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <libintl.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <libscf.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <signal.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <stdarg.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <stdio.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <stdlib.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <strings.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <sys/fxpriocntl.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <sys/priocntl.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <sys/types.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <time.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <unistd.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <zonestat.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceextern char *optarg;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceextern int optind, opterr, optopt;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_OK 0
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_ERROR 1
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_USAGE 2
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_UNIX_TIMESTAMP 1
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_ISO_TIMESTAMP 2
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_DATE_TIMESTAMP 3
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_RES_PHYSICAL_MEMORY 0x1
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_RES_VIRTUAL_MEMORY 0x2
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_RES_LOCKED_MEMORY 0x4
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_RES_MEMORY 0x7
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_RES_DEFAULT_PSET 0x10
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_RES_PSETS 0x20
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_RES_SUMMARY 0x40
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_RES_PROCESSES 0x100
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_RES_LWPS 0x200
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_RES_LOFI 0x400
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_RES_LIMITS 0x700
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_RES_SHM_MEMORY 0x1000
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_RES_SHM_IDS 0x2000
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_RES_SEM_IDS 0x4000
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_RES_MSG_IDS 0x8000
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_RES_SYSV 0xF000
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_RES_ALL 0xF777
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZONESTAT_PHYSICAL_MEMORY "physical-memory"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZONESTAT_VIRTUAL_MEMORY "virtual-memory"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZONESTAT_LOCKED_MEMORY "locked-memory"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZONESTAT_MEMORY "memory"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZONESTAT_DEFAULT_PSET "default-pset"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZONESTAT_POOL_PSET "pool-pset"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZONESTAT_PSRSET_PSET "psrset-pset"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZONESTAT_DEDICATED_CPU "dedicated-cpu"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZONESTAT_PROCESSOR_SET "processor-set"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZONESTAT_PSETS "psets"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZONESTAT_SUMMARY "summary"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZONESTAT_PROCESSES "processes"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZONESTAT_LWPS "lwps"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZONESTAT_LOFI "lofi"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZONESTAT_LIMITS "limits"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZONESTAT_SHM_MEMORY "shm-memory"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZONESTAT_SHM_IDS "shm-ids"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZONESTAT_SEM_IDS "sem-ids"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZONESTAT_MSG_IDS "msg-ids"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZONESTAT_SYSV "sysv"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZONESTAT_ALL "all"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZONESTAT_NAME_MEM_DEFAULT "mem_default"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZONESTAT_NAME_VM_DEFAULT "vm_default"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZONESTAT_NAME_AVERAGE "average"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZONESTAT_NAME_HIGH "high"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZONESTAT_NAME_RESOURCE "resource"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZONESTAT_NAME_TOTAL "total"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZONESTAT_NAME_SYSTEM "system"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZONESTAT_NAME_ZONES "zones"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZONESTAT_NAME_HEADER "header"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZONESTAT_NAME_FOOTER "footer"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZONESTAT_NAME_NAME "name"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZONESTAT_NAME_USED "used"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZONESTAT_NAME_CAP "cap"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZONESTAT_NAME_PCAP "pcap"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZONESTAT_NAME_SHR "shr"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZONESTAT_NAME_PSHRU "pshru"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZONESTAT_NAME_CPU "cpu"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZONESTAT_NAME_PHYSICAL_MEMORY ZONESTAT_PHYSICAL_MEMORY
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZONESTAT_NAME_VIRTUAL_MEMORY ZONESTAT_VIRTUAL_MEMORY
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZONESTAT_NAME_SYSTEM_LIMIT "system-limit"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_REPORT_FMT_INTERVAL 0
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_REPORT_FMT_TOTAL 1
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_REPORT_FMT_AVERAGE 2
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_REPORT_FMT_HIGH 3
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_REPORT_FMT_END 4
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_REPORT_TEXT_INTERVAL "interval"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_REPORT_TEXT_TOTAL "report-total"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_REPORT_TEXT_AVERAGE "report-average"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_REPORT_TEXT_HIGH "report-high"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_REPORT_TEXT_END "footer"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_DURATION_INF ((int)INT_MAX)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_INTERVAL_DEFAULT ((int)INT_MAX)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_REPORT_END ((int)INT_MAX)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_SORT_CPU 1
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_SORT_PHYSICAL 2
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_SORT_VIRTUAL 3
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_SORT_USED 4
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_SORT_CAP 5
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_SORT_PCAP 6
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_SORT_SHR 7
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_SORT_PSHRU 8
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_SORT_NAME 9
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_SORT_MAX 10
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_SUM_MIN_ZONENAME 19
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_SUM_HDR_FORMAT "%23s %17s %17s\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_SUM_ZONE_FORMAT "%5s %5s %5s %5s %5s %5s %5s %5s %5s %5s\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_CPU_MIN_PSETNAME 22
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_CPU_MIN_ZONENAME 36
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_CPU_RES_FORMAT "%13s %11s %11s\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_CPU_ZONE_FORMAT "%5s %5s %5s %5s %6s %5s %5s\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_RESOURCE_MIN_RESNAME 28
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_RESOURCE_MIN_ZONENAME 36
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_RESOURCE_FORMAT "%13s\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_RESOURCE_ZONE_FORMAT "%5s %5s %5s %5s\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZS_UINT64_STRLEN 20
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZS_PCT_STRLEN 10
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZS_TIME_STRLEN 20
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZS_NAME_STRLEN 10
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencetime_t g_now_time;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencetime_t g_boot_time;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencetime_t g_start_time;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencetime_t g_end_time;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceint g_interval;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceint g_count;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceint g_report_count;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencetime_t g_seconds;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceint g_resources;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezs_ctl_t *g_zsctl;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceboolean_t g_quit = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezs_zone_t **g_zone_list;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceint g_zone_num;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezs_pset_zone_t **g_pz_list;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceint g_pz_num;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezs_pset_t **g_pset_list;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceint g_pset_num;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceint g_sort_by;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceint g_sorts[ZSTAT_SORT_MAX];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceint g_sort_summary;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencesize_t g_max_zonename;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/* Storage for command line arguments. */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencechar **arg_zonenames;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceint arg_zonename_count;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencechar **arg_resnames;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceint arg_resname_count;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencechar **arg_restypes;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceint arg_restype_count;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencechar ** arg_reports;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceint arg_report_count;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencechar ** arg_sort_list;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceint arg_sort_count;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencechar ** arg_line_list;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceint arg_line_count;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencetime_t arg_starttime;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencetime_t arg_endtime;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceuint_t arg_timestamp = ZSTAT_DATE_TIMESTAMP;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceint arg_interval = 5;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceint arg_duration = -1;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceint arg_report = -1;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/* Options with or as arguments */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceboolean_t opt_zonenames = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceboolean_t opt_resnames = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceboolean_t opt_restypes = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceboolean_t opt_start = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceboolean_t opt_end = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceboolean_t opt_in = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceboolean_t opt_out = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceboolean_t opt_timestamp = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceboolean_t opt_report = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceboolean_t opt_sort = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceboolean_t opt_report_high = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceboolean_t opt_report_total = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceboolean_t opt_report_average = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceboolean_t opt_line_resource = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceboolean_t opt_line_total = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceboolean_t opt_line_system = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceboolean_t opt_line_zones = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceboolean_t opt_line_header = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceboolean_t opt_line_any = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/* Options without arguments */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceboolean_t opt_quiet_intervals = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceboolean_t opt_parseable = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceboolean_t opt_debug = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic int
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezonestat_usage(boolean_t explicit)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence FILE *fd = explicit ? stdout : stderr;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) fprintf(fd, gettext("Usage:\n"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) fprintf(fd,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" zonestat [-z zonelist] [-r reslist] [-n namelist]\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" [-T u | d | i] [-R reports] [-q] [-p [-P lines]] [-S cols]\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" interval [duration [report]]\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence"\n");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) fprintf(fd, gettext(
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" Options:\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" %s Report resources of specified types.\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" Valid resource types are:\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" \"%s\"\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" \"%s\"\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" \"%s\"\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" \"%s\"\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" \"%s\", \"%s\", \"%s\"\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" \"%s\", \"%s\", \"%s\", \"%s\"\n"),
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "-r",
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_VIRTUAL_MEMORY, ZONESTAT_PHYSICAL_MEMORY,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_LOCKED_MEMORY, ZONESTAT_PROCESSOR_SET,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_PROCESSES, ZONESTAT_LWPS, ZONESTAT_LOFI,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_SHM_MEMORY, ZONESTAT_SHM_IDS, ZONESTAT_SEM_IDS,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_MSG_IDS);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) fprintf(fd, gettext(
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" The following resource nicknames can also be specified:\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" \"%s\"\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" \"%s\"\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" \"%s\"\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" \"%s\"\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" \"%s\"\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" \"%s\"\n"),
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_SUMMARY, ZONESTAT_MEMORY, ZONESTAT_PSETS,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_DEFAULT_PSET, ZONESTAT_LIMITS, ZONESTAT_SYSV);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) fprintf(fd, gettext(
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" %s Report resources used by zones\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" %s Report resources with specific names.\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" Valid resource names are:\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" \"%s\"\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" \"%s\"\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" Name of a pool processor set\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" Id of a processor set created with psrset(1m)\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" Name of a zone using dedicated-cpu\n"),
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "-z", "-n",
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_NAME_MEM_DEFAULT, ZONESTAT_NAME_VM_DEFAULT);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(gettext(
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" %s Print timestamp. Valid timestamps are:\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" \"%s\"\tDate as specifed by date(1) command\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" \"%s\"\tUnix time as returned by time(2)\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" \"%s\"\tISO 8601 timestamp \"%s\"\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" %s Print reports at end or after each report interval.\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" Valid reports are:\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" \"%s\"\tUsage of each zone\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" \"%s\"\tUsage of each zone while running\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" \"%s\"\tMaximum usage of each zone\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" %s Quiet. Do not print intervals. Only print reports.\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" %s Machine parseable output.\n"),
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "-T", "d", "u", "i", "YYYYMMDDThhmmssZ",
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "-R", ZONESTAT_NAME_TOTAL, ZONESTAT_NAME_AVERAGE,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_NAME_HIGH,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "-q", "-p");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(gettext(
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" %s Select desired lines in parseable output.\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" \"%s\"\tLines describing each resource\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" \"%s\"\tTotal usage of each resource\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" \"%s\"\tSystem usage of each resource\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" \"%s\"\tPer-zone usage of each resource\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" \"%s\"\tHeader lines between intervals and reports\n"),
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "-P", ZONESTAT_NAME_RESOURCE, ZONESTAT_NAME_TOTAL,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_NAME_SYSTEM, ZONESTAT_NAME_ZONES, ZONESTAT_NAME_HEADER);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(gettext(
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" %s Sort output by the specified columns:\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" \"%s\"\tby name alphanumerically\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" \"%s\"\tby percent of resource used\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" \"%s\"\tby configured cap\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" \"%s\"\tby percent of cap used\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" \"%s\"\tby shares configured\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" \"%s\"\tby percent of share used\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" \"%s\"\tSort summary by cpu\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" \"%s\"\tSort summary by physical memory\n"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence" \"%s\"\tSort summary by virtual memory\n"),
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "-S", ZONESTAT_NAME_NAME, ZONESTAT_NAME_USED, ZONESTAT_NAME_CAP,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_NAME_PCAP, ZONESTAT_NAME_SHR, ZONESTAT_NAME_PSHRU,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_NAME_CPU, ZONESTAT_NAME_PHYSICAL_MEMORY,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_NAME_VIRTUAL_MEMORY);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (!explicit)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) fputs("\n", fd);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (ZSTAT_USAGE);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/* PRINTFLIKE1 */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic int
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezonestat_error(const char *fmt, ...)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence va_list alist;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence va_start(alist, fmt);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) fprintf(stderr, "zonestat: Error: ");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) vfprintf(stderr, fmt, alist);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) fprintf(stderr, "\n");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence va_end(alist);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (ZSTAT_ERROR);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezonestat_determine_lines()
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int i;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence boolean_t fail = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (arg_line_count == 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence opt_line_resource = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence opt_line_total = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence opt_line_system = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence opt_line_zones = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence opt_line_header = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (i = 0; i < arg_line_count; i++) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (strcmp(arg_line_list[i], ZONESTAT_NAME_RESOURCE) == 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence opt_line_resource = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else if (strcmp(arg_line_list[i], ZONESTAT_NAME_TOTAL) == 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence opt_line_total = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else if (strcmp(arg_line_list[i], ZONESTAT_NAME_SYSTEM) == 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence opt_line_system = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else if (strcmp(arg_line_list[i], ZONESTAT_NAME_ZONES) == 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence opt_line_zones = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else if (strcmp(arg_line_list[i], ZONESTAT_NAME_HEADER) == 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence opt_line_header = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) zonestat_error(gettext("Unknown -O arg: %s"),
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence arg_line_list[i]);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence fail = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (fail == B_TRUE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence exit(zonestat_usage(B_FALSE));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezonestat_determine_reports()
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int i;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence boolean_t fail = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (i = 0; i < arg_report_count; i++) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (strcmp(arg_reports[i], ZONESTAT_NAME_TOTAL) == 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence opt_report_total = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else if (strcmp(arg_reports[i], ZONESTAT_NAME_AVERAGE) == 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence opt_report_average = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else if (strcmp(arg_reports[i], ZONESTAT_NAME_HIGH) == 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence opt_report_high = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) zonestat_error(gettext("Unknown -R arg: %s"),
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence arg_reports[i]);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence fail = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (fail == B_TRUE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence exit(zonestat_usage(B_FALSE));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Compares list of -S sort arguments to the list of known sorts. Only
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * one of cpu, physical memory, and virtual memory can be specified.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezonestat_determine_sort()
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int i, count = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence boolean_t fail = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (arg_sort_count == 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_sort_summary = ZS_RESOURCE_CPU;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_sorts[0] = ZSTAT_SORT_USED;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_sorts[1] = ZSTAT_SORT_NAME;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence arg_sort_count = 2;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (arg_sort_count > ZSTAT_SORT_MAX)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence exit(zonestat_error(gettext(
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "Too many -S sort columns specified")));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (i = 0; i < arg_sort_count; i++) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (strcmp(arg_sort_list[i], ZONESTAT_NAME_NAME) == 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_sorts[count++] = ZSTAT_SORT_NAME;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else if (strcmp(arg_sort_list[i], ZONESTAT_NAME_USED) == 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_sorts[count++] = ZSTAT_SORT_USED;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else if (strcmp(arg_sort_list[i], ZONESTAT_NAME_CAP) == 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_sorts[count++] = ZSTAT_SORT_CAP;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else if (strcmp(arg_sort_list[i], ZONESTAT_NAME_PCAP) == 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_sorts[count++] = ZSTAT_SORT_PCAP;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else if (strcmp(arg_sort_list[i], ZONESTAT_NAME_SHR) == 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_sorts[count++] = ZSTAT_SORT_SHR;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else if (strcmp(arg_sort_list[i], ZONESTAT_NAME_PSHRU) == 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_sorts[count++] = ZSTAT_SORT_PSHRU;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else if (strcmp(arg_sort_list[i], ZONESTAT_NAME_CPU) == 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (g_sort_summary != 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence fail = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_sort_summary = ZS_RESOURCE_CPU;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else if (strcmp(arg_sort_list[i],
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_NAME_PHYSICAL_MEMORY) == 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (g_sort_summary != 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence fail = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_sort_summary = ZS_RESOURCE_RAM_RSS;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else if (strcmp(arg_sort_list[i],
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_NAME_VIRTUAL_MEMORY) == 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (g_sort_summary != 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence fail = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_sort_summary = ZS_RESOURCE_VM;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) zonestat_error(gettext("Unknown -S arg: %s"),
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence arg_sort_list[i]);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence fail = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (g_sort_summary == 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_sort_summary = ZS_RESOURCE_CPU;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (fail == B_TRUE) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) zonestat_error(gettext(
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "-S: only one of \"%s\", \"%s\", or "
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "\"%s\" permitted"), "-S", ZONESTAT_NAME_CPU,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_NAME_PHYSICAL_MEMORY,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_NAME_VIRTUAL_MEMORY);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence exit(zonestat_usage(B_FALSE));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencetypedef struct zonestat_resource_struct {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char *zr_name;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t zr_flag;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence} zonestat_resource_t;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/* Used to map resource name strings to resource flags */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezonestat_resource_t g_resource_list[] = {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_PHYSICAL_MEMORY, ZSTAT_RES_PHYSICAL_MEMORY,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_VIRTUAL_MEMORY, ZSTAT_RES_VIRTUAL_MEMORY,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_LOCKED_MEMORY, ZSTAT_RES_LOCKED_MEMORY,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_MEMORY, ZSTAT_RES_MEMORY,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_PROCESSOR_SET, ZSTAT_RES_PSETS,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_PSETS, ZSTAT_RES_PSETS,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_DEFAULT_PSET, ZSTAT_RES_DEFAULT_PSET,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_PROCESSES, ZSTAT_RES_PROCESSES,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_LWPS, ZSTAT_RES_LWPS,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_LOFI, ZSTAT_RES_LOFI,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_LIMITS, ZSTAT_RES_LIMITS,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_SHM_MEMORY, ZSTAT_RES_SHM_MEMORY,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_SHM_IDS, ZSTAT_RES_SHM_IDS,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_SEM_IDS, ZSTAT_RES_SEM_IDS,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_MSG_IDS, ZSTAT_RES_MSG_IDS,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_SYSV, ZSTAT_RES_SYSV,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_SUMMARY, ZSTAT_RES_SUMMARY,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_ALL, ZSTAT_RES_ALL
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence};
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Compares list of resources passed to -r to the known list of
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * resources.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezonestat_determine_resources()
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int i, j, count;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence boolean_t found, fail = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (arg_restype_count == 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_resources = ZSTAT_RES_SUMMARY;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence count = sizeof (g_resource_list) / sizeof (zonestat_resource_t);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (i = 0; i < arg_restype_count; i++) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence found = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (j = 0; j < count; j++) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (strcmp(arg_restypes[i], g_resource_list[j].zr_name)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence == 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_resources |= g_resource_list[j].zr_flag;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence found = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (found == B_FALSE) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) zonestat_error(gettext("Unknown resource: %s"),
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence arg_restypes[i]);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence fail = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (fail == B_TRUE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence exit(zonestat_usage(B_FALSE));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Returns 1 if the name matches one of the specified zone names. 0
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * otherwise. Always matches if no zone names were specified.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic int
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezonestat_match_zonename(char *name)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int i;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (arg_zonename_count == 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (i = 0; i < arg_zonename_count; i++) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (strcmp(name, arg_zonenames[i]) == 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * compare name to base, ignoring prefix on name.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic int
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezonestat_match_with_prefix(char *prefix, char *name, char *base)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence size_t prefix_len;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence prefix_len = strlen(prefix);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (strncmp(name, prefix, prefix_len) == 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence name += prefix_len;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (strcmp(name, base) == 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Returns 1 if the resource matches one of the specified resource names. 0
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * otherwise. Always matches if no resource names were specified.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic int
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezonestat_match_resname(char *name)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int i;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (arg_resname_count == 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (i = 0; i < arg_resname_count; i++) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (strcmp(name, arg_resnames[i]) == 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (zonestat_match_with_prefix("SUNWtmp_", name,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence arg_resnames[i]))
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (zonestat_match_with_prefix("SUNWlegacy_pset_", name,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence arg_resnames[i]))
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Format unsigned uint64_t
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * 9999 9999
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * 99.9K 99999
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * 9999K 9999999
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * 99.9M 99999999
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * 9999M 9999999999
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * 99.9G 99999999999
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * 9999G 9999999999999
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * 99.9T 99999999999999
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * 9999T 9999999999999999
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * 99.9P 99999999999999999
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * 9999P 9999999999999999999
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * 99.9E UINT64_MAX
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceformat_uint64(uint64_t val, char *str, size_t len)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t high;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t low;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (val == UINT64_MAX) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(str, len, "-");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (val <= 9999) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(str, len, "%llu", val);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (val <= 99999) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence high = val / 1024;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence low = val * 10 / 1024 - (high * 10);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(str, len, "%llu%1.1lluK", high, low);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence val = val / 1024;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (val <= 9999 || opt_parseable) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence high = val;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(str, len, "%lluK", high);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (val <= 99999) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence high = val / 1024;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence low = val * 10 / 1024 - (high * 10);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(str, len, "%llu.%1.1lluM", high, low);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence val = val / 1024;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (val <= 9999) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence high = val;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(str, len, "%lluM", high);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (val <= 99999) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence high = val / 1024;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence low = val * 10 / 1024 - (high * 10);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(str, len, "%llu.%1.1lluG", high, low);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence val = val / 1024;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (val <= 9999) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence high = val;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(str, len, "%lluG", high);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (val <= 99999) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence high = val / 1024;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence low = val * 10 / 1024 - (high * 10);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(str, len, "%llu.%1.1lluT", high, low);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence val = val / 1024;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (val <= 9999) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence high = val;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(str, len, "%lluT", high);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (val <= 99999) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence high = val / 1024;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence low = val * 10 / 1024 - (high * 10);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(str, len, "%llu.%1.1lluP", high, low);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence val = val / 1024;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (val <= 9999) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence high = val;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(str, len, "%lluP", high);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence high = val / 1024;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence low = val * 10 / 1024 - (high * 10);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(str, len, "%llu.%1.1lluE", high, low);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceformat_pct(uint_t pct, char *str, size_t len)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t high;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t low;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pct == ZS_PCT_NONE) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(str, len, "-");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * pct's are printed as one of:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * #.##%
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * ##.#%
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * ###%
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * ####%
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * The value is fixed decimal. 10000 equals 100.00 percent.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Percents can exceed 100.00 percent. Percents greater than
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * 9999% will exceed the 5 column width.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pct <= 999 || opt_parseable) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence high = pct / 100;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence low = pct - (high * 100);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(str, len, "%u.%2.2u%%", high, low);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else if (pct <= 9999) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pct = pct / 10;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence high = pct / 10;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence low = pct - (high * 10);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(str, len, "%u.%1.1u%%", high, low);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pct = pct / 100;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(str, len, "%u%%", pct);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Cpu cap is 100 times the number of cpus allocated. It is formatted as a
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * decimal. Example, a cpu-cap of 50 is 0.50 cpus.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * The cpu cap value can go up to UINT_MAX, so handle all cases even though
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * the higher ones are nonsense.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Format Max cpu-cap value for format.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * 42.9M 4294967296
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * 9999K 999999999
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * 99.9K 9999999
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * 9999 999999
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * 999.9 99999
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * 9.99 999
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencevoid
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceformat_cpu(uint64_t cpu, char *str, size_t len)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t high;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t low;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* #.## cpus */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (cpu <= 999 || opt_parseable) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence high = cpu / 100;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence low = cpu - (high * 100);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(str, len, "%llu.%2.2llu", high, low);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* ##.# cpus */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (cpu <= 99999) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence high = cpu / 100;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence low = cpu - (high * 100);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(str, len, "%llu.%1.1llu", high, low);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* #### cpus */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (cpu <= 999999) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu = cpu / 100;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(str, len, "%llu", cpu);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* ##.#K cpus */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu = cpu / 1000;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (cpu <= 99999) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence high = cpu / 100;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence low = cpu - (high * 100);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(str, len, "%llu.%1.1lluK", high, low);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* ####K cpus */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (cpu <= 999999) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu = cpu / 100;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(str, len, "%lluK", cpu);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* ##.#M cpus */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu = cpu / 1000;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (cpu <= UINT_MAX) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence high = cpu / 100;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence low = cpu - (high * 100);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(str, len, "%llu.%1.1lluM", high, low);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(str, len, "error", high, low);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Format a timetruct as:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * HH:MM:SS.SS
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Human readable format omits the fractional seconds.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceformat_ts(timestruc_t *ts, char *str, size_t len, boolean_t human_readable)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t secs, mins, hours, pct;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence hours = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence mins = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence secs = ts->tv_sec;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pct = ts->tv_nsec / 1000 / 1000 / 10;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence while (pct >= 100) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pct -= 100;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence secs++;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (secs >= 60) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence mins = secs / 60;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence secs = secs % 60;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (mins >= 60) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence hours = mins / 60;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence mins = mins % 60;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (human_readable)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(str, len, "%llu:%2.2llu:%2.2llu", hours,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence mins, secs);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(str, len, "%llu-%2.2llu-%2.2llu.%2.2llu", hours,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence mins, secs, pct);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencechar *g_report_formats[] = {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZSTAT_REPORT_TEXT_INTERVAL,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZSTAT_REPORT_TEXT_TOTAL,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZSTAT_REPORT_TEXT_AVERAGE,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZSTAT_REPORT_TEXT_HIGH,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZSTAT_REPORT_TEXT_END
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence};
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/* Get the label for the current report type */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic char *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezonestat_get_plabel(int format)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (format >= sizeof (g_report_formats) / sizeof (char *))
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence exit(zonestat_error(gettext(
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "Internal error, invalid report format")));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (g_report_formats[format]);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_CPULINE "----------CPU----------"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_MEMLINE "----PHYSICAL-----"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSTAT_VMLINE "-----VIRTUAL-----"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezonestat_print_summary_header(size_t namewidth, int report_fmt, uint64_t cpu,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t online, uint64_t mem, uint64_t vm)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char str_cpu[ZS_UINT64_STRLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char str_online[ZS_UINT64_STRLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char str_mem[ZS_UINT64_STRLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char str_vm[ZS_UINT64_STRLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char name_format[ZS_NAME_STRLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char tot_cpu[sizeof (ZSTAT_CPULINE)];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char tot_mem[sizeof (ZSTAT_MEMLINE)];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char tot_vm[sizeof (ZSTAT_VMLINE)];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char *label;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence format_uint64(cpu, str_cpu, sizeof (str_cpu));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence format_uint64(online, str_online, sizeof (str_online));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence format_uint64(mem, str_mem, sizeof (str_mem));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence format_uint64(vm, str_vm, sizeof (str_vm));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (opt_parseable) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence label = zonestat_get_plabel(report_fmt);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf("%s:%s:[%s]:%s:%s:%s:%s\n", label,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_SUMMARY, ZONESTAT_NAME_RESOURCE, str_cpu,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence str_online, str_mem, str_vm);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(tot_cpu, sizeof (tot_cpu), "Cpus/Online: %s/%s",
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence str_cpu, str_online);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(tot_mem, sizeof (tot_mem), "Physical: %s", str_mem);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(tot_vm, sizeof (tot_vm), "Virtual: %s", str_vm);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Make first column as wide as longest zonename */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(name_format, sizeof (name_format), "%%-%ds ",
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence namewidth);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* LINTED */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(name_format, "SUMMARY");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(ZSTAT_SUM_HDR_FORMAT, tot_cpu, tot_mem,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence tot_vm);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* LINTED */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(name_format, "");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(ZSTAT_SUM_HDR_FORMAT, ZSTAT_CPULINE,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZSTAT_MEMLINE, ZSTAT_VMLINE);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(name_format, sizeof (name_format), "%%%ds ",
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence namewidth);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* LINTED */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(name_format, "ZONE");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(ZSTAT_SUM_ZONE_FORMAT, "USED", "%PART", "%CAP",
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "%SHRU", "USED", "PCT", "%CAP", "USED", "PCT", "%CAP");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezonestat_print_resource__header(size_t namelen, char *restype, char *size)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char name_format[ZS_NAME_STRLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (opt_parseable)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(name_format, sizeof (name_format), "%%-%ds ", namelen);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* LINTED */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(name_format, restype);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(ZSTAT_RESOURCE_FORMAT, size);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezonestat_print_resource_zone_header(size_t namelen)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char name_format[ZS_NAME_STRLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (opt_parseable)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(name_format, sizeof (name_format), "%%%ds ", namelen);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* LINTED */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(name_format, "ZONE");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(ZSTAT_RESOURCE_ZONE_FORMAT, "USED", "PCT", "CAP", "%CAP");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezonestat_print_timestamp(time_t t)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence static char *fmt = NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int len;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char dstr[64];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* We only need to retrieve this once per invocation */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (arg_timestamp == ZSTAT_UNIX_TIMESTAMP) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf("%ld", t);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else if (arg_timestamp == ZSTAT_ISO_TIMESTAMP) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence len = strftime(dstr, sizeof (dstr), "%Y%m%dT%H%M%SZ",
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence gmtime(&t));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (len > 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf("%s", dstr);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (fmt == NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence fmt = nl_langinfo(_DATE_FMT);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence len = strftime(dstr, sizeof (dstr), fmt, localtime(&t));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (len > 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf("%s", dstr);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezonestat_print_summary_zone(size_t namewidth, int report_fmt, char *name,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t cused, uint_t ppart, uint_t pccap, uint_t pshru, uint64_t mused,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t mpct, uint_t pmcap, uint64_t vused, uint_t vpct, uint_t pvcap)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char *label;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char str_cused[ZS_UINT64_STRLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char str_ppart[ZS_PCT_STRLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char str_pccap[ZS_PCT_STRLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char str_pshru[ZS_PCT_STRLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char str_mused[ZS_UINT64_STRLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char str_mpct[ZS_PCT_STRLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char str_pmcap[ZS_PCT_STRLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char str_vused[ZS_UINT64_STRLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char str_vpct[ZS_PCT_STRLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char str_pvcap[ZS_PCT_STRLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char name_format[ZS_NAME_STRLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence format_cpu(cused, str_cused, sizeof (str_cused));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence format_pct(ppart, str_ppart, sizeof (str_ppart));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence format_pct(pccap, str_pccap, sizeof (str_pccap));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence format_pct(pshru, str_pshru, sizeof (str_pshru));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence format_uint64(mused, str_mused, sizeof (str_mused));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence format_pct(mpct, str_mpct, sizeof (str_mpct));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence format_pct(pmcap, str_pmcap, sizeof (str_pmcap));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence format_uint64(vused, str_vused, sizeof (str_vused));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence format_pct(vpct, str_vpct, sizeof (str_vpct));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence format_pct(pvcap, str_pvcap, sizeof (str_pvcap));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (opt_parseable) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (opt_timestamp) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_timestamp(g_now_time);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(":");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence label = zonestat_get_plabel(report_fmt);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf("%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s\n",
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence label, ZONESTAT_SUMMARY, name, str_cused, str_ppart,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence str_pccap, str_pshru, str_mused, str_mpct, str_pmcap,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence str_vused, str_vpct, str_pvcap);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(name_format, sizeof (name_format), "%%%ds ",
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence namewidth);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* LINTED */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(name_format, name);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(ZSTAT_SUM_ZONE_FORMAT, str_cused, str_ppart,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence str_pccap, str_pshru, str_mused, str_mpct, str_pmcap, str_vused,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence str_vpct, str_pvcap);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezonestat_print_resource_(size_t namelen, int report_fmt, char *res,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char *name, uint64_t size)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char strsize[ZS_UINT64_STRLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char *label;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char name_format[ZS_NAME_STRLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence format_uint64(size, strsize, sizeof (strsize));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (opt_parseable) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (opt_timestamp) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_timestamp(g_now_time);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(":");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence label = zonestat_get_plabel(report_fmt);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf("%s:%s:%s:[%s]:%s\n", label, res, name,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_NAME_RESOURCE, strsize);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(name_format, sizeof (name_format), "%%-%ds ", namelen);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* LINTED */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(name_format, name);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(ZSTAT_RESOURCE_FORMAT, strsize);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezonestat_print_resource_zone(size_t namelen, int report_fmt, char *restype,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char *resname, char *name, uint64_t used, uint_t pct, uint64_t cap,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t pctcap)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char strused[ZS_UINT64_STRLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char strpct[ZS_PCT_STRLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char strcap[ZS_UINT64_STRLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char strpctcap[ZS_PCT_STRLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char name_format[ZS_NAME_STRLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char *label;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence format_uint64(used, strused, sizeof (strused));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence format_pct(pct, strpct, sizeof (strpct));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (cap == ZS_LIMIT_NONE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) strlcpy(strcap, "-", sizeof (strcap));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence format_uint64(cap, strcap, sizeof (strcap));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pctcap == ZS_PCT_NONE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) strlcpy(strpctcap, "-", sizeof (strpctcap));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence format_pct(pctcap, strpctcap, sizeof (strpctcap));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (opt_parseable) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (opt_timestamp) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_timestamp(g_now_time);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(":");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence label = zonestat_get_plabel(report_fmt);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf("%s:%s:%s:%s:%s:%s:%s:%s\n", label, restype,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence resname, name, strused, strpct, strcap, strpctcap);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(name_format, sizeof (name_format), "%%%ds ", namelen);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* LINTED */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(name_format, name);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(ZSTAT_RESOURCE_ZONE_FORMAT, strused, strpct, strcap,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence strpctcap);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Not thread safe.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezonestat_qsort(void *base, size_t nel, size_t width,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int (*compar)(const void *, const void *), int by)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_sort_by = by;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_max_zonename = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence qsort(base, nel, width, compar);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic int
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezonestat_zone_compare_resource(const void *a, const void *b)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_zone_t *zonea = *(zs_zone_t **)a;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_zone_t *zoneb = *(zs_zone_t **)b;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_property_t *prop, *propb;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t resa, resb;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t uinta, uintb;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int i, res;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence prop = alloca(zs_property_size());
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence propb = alloca(zs_property_size());
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (i = 0; i < arg_sort_count; i++) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Sort by order of selection */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence switch (g_sorts[i]) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence case ZSTAT_SORT_USED:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence resa = zs_resource_used_zone_uint64(zonea, g_sort_by);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence resb = zs_resource_used_zone_uint64(zoneb, g_sort_by);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence case ZSTAT_SORT_CAP:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence resa = zs_zone_limit_uint64(zonea, g_sort_by);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (resa == ZS_LIMIT_NONE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence resa = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence resb = zs_zone_limit_uint64(zoneb, g_sort_by);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (resb == ZS_LIMIT_NONE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence resb = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence case ZSTAT_SORT_PCAP:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uinta = zs_zone_limit_used_pct(zonea, g_sort_by);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uintb = zs_zone_limit_used_pct(zoneb, g_sort_by);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (uinta == ZS_PCT_NONE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence resa = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence resa = uinta;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (uintb == ZS_PCT_NONE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence resb = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence resb = uintb;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence case ZSTAT_SORT_SHR:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_zone_property(zonea, ZS_PZ_PROP_CPU_SHARES, prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence resa = zs_property_uint64(prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (resa == ZS_LIMIT_NONE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence resa = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_zone_property(zoneb, ZS_PZ_PROP_CPU_SHARES, prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence resb = zs_property_uint64(prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (resb == ZS_LIMIT_NONE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence resb = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence case ZSTAT_SORT_PSHRU:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uinta = zs_zone_limit_used_pct(zonea,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZS_LIMIT_CPU_SHARES);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uintb = zs_zone_limit_used_pct(zoneb,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZS_LIMIT_CPU_SHARES);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (uinta == ZS_PCT_NONE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence resa = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence resa = uinta;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (uintb == ZS_PCT_NONE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence resb = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence resb = uintb;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence case ZSTAT_SORT_NAME:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_zone_property(zonea, ZS_ZONE_PROP_NAME, prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_zone_property(zoneb, ZS_ZONE_PROP_NAME, propb);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence res = strcmp(zs_property_string(prop),
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_property_string(propb));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (res != 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (res);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence default:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence exit(zonestat_error(gettext("Internal sort error")));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (resa < resb)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (resb < resa)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (-1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* No difference, return 0 */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Sort psets. Default pset first, then shared psets, then dedicated
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * psets.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic int
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezonestat_pset_compare(const void *a, const void *b)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_pset_t *pseta = *(zs_pset_t **)a;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_pset_t *psetb = *(zs_pset_t **)b;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_property_t *p;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t typea, typeb;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence p = (zs_property_t *)alloca(zs_property_size());
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_pset_property(pseta, ZS_PSET_PROP_CPUTYPE, p);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence typea = zs_property_uint(p);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_pset_property(psetb, ZS_PSET_PROP_CPUTYPE, p);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence typeb = zs_property_uint(p);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (typea == ZS_CPUTYPE_DEFAULT_PSET)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (-1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (typeb == ZS_CPUTYPE_DEFAULT_PSET)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (typea == ZS_CPUTYPE_POOL_PSET)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (-1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (typeb == ZS_CPUTYPE_POOL_PSET)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (typea == ZS_CPUTYPE_PSRSET_PSET)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (-1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (typeb == ZS_CPUTYPE_PSRSET_PSET)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic int
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezonestat_pz_compare_usage(const void *a, const void *b)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_pset_zone_t *zonea = *(zs_pset_zone_t **)a;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_pset_zone_t *zoneb = *(zs_pset_zone_t **)b;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_property_t *prop, *propb;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t resa, resb;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t uinta, uintb;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int i, res;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence prop = alloca(zs_property_size());
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence propb = alloca(zs_property_size());
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (i = 0; i < arg_sort_count; i++) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Sort by order of selection */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence switch (g_sorts[i]) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence case ZSTAT_SORT_USED:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence resa = zs_pset_zone_used_cpus(zonea);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence resb = zs_pset_zone_used_cpus(zoneb);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence case ZSTAT_SORT_CAP:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_pset_zone_property(zonea, ZS_PZ_PROP_CPU_CAP,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence resa = zs_property_uint64(prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (resa == ZS_LIMIT_NONE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence resa = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_pset_zone_property(zoneb, ZS_PZ_PROP_CPU_CAP,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence resb = zs_property_uint64(prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (resb == ZS_LIMIT_NONE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence resb = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence case ZSTAT_SORT_PCAP:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uinta = zs_pset_zone_used_pct(zonea, ZS_PZ_PCT_CPU_CAP);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uintb = zs_pset_zone_used_pct(zoneb, ZS_PZ_PCT_CPU_CAP);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (uinta == ZS_PCT_NONE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence resa = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence resa = uinta;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (uintb == ZS_PCT_NONE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence resb = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence resb = uintb;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence case ZSTAT_SORT_SHR:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_pset_zone_property(zonea, ZS_PZ_PROP_CPU_SHARES,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence resa = zs_property_uint64(prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (resa == ZS_LIMIT_NONE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence resa = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_pset_zone_property(zoneb, ZS_PZ_PROP_CPU_SHARES,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence resb = zs_property_uint64(prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (resb == ZS_LIMIT_NONE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence resb = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence case ZSTAT_SORT_PSHRU:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uinta = zs_pset_zone_used_pct(zonea,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZS_PZ_PCT_CPU_SHARES);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uintb = zs_pset_zone_used_pct(zoneb,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZS_PZ_PCT_CPU_SHARES);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (uinta == ZS_PCT_NONE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence resa = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence resa = uinta;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (uintb == ZS_PCT_NONE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence resb = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence resb = uintb;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence case ZSTAT_SORT_NAME:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_zone_property(zs_pset_zone_get_zone(zonea),
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZS_ZONE_PROP_NAME, prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_zone_property(zs_pset_zone_get_zone(zoneb),
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZS_ZONE_PROP_NAME, propb);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence res = strcmp(zs_property_string(prop),
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_property_string(propb));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (res != 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (res);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence default:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence exit(zonestat_error(gettext("Internal sort error")));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (resa < resb)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (resb < resa)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (-1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* No difference, return 0 */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezonestat_print_summary(int report_fmt, zs_usage_t *u)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int num, i;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_zone_t *z;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t cpus, online, tot_mem, tot_vm;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t cused, mused, vused;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t ppart, pshru, pccap, mpct, pmcap, vpct, pvcap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char zonename[ZS_ZONENAME_MAX];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_property_t *prop;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence size_t namewidth = 0, len;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence prop = (zs_property_t *)alloca(zs_property_size());
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_resource_property(u, ZS_RESOURCE_CPU, ZS_RESOURCE_PROP_CPU_TOTAL,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpus = zs_property_uint64(prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_resource_property(u, ZS_RESOURCE_CPU,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZS_RESOURCE_PROP_CPU_ONLINE, prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence online = zs_property_uint64(prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence tot_mem = zs_resource_total_uint64(u, ZS_RESOURCE_RAM_RSS);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence tot_vm = zs_resource_total_uint64(u, ZS_RESOURCE_VM);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceagain:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence num = zs_zone_list(u, g_zone_list, g_zone_num);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (num > g_zone_num) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (g_zone_list != NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence free(g_zone_list);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_zone_list = (zs_zone_t **) malloc(sizeof (zs_zone_t *) * num);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_zone_num = num;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto again;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Find the longest zone name to set output width. */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence namewidth = ZSTAT_SUM_MIN_ZONENAME;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (i = 0; i < num; i++) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence z = g_zone_list[i];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) zs_zone_property(z, ZS_ZONE_PROP_NAME, prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence len = strlen(zs_property_string(prop));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (len > namewidth)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence namewidth = len;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_summary_header(namewidth, report_fmt, cpus, online,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence tot_mem, tot_vm);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_qsort(g_zone_list, num, sizeof (zs_zone_t *),
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_zone_compare_resource, g_sort_summary);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cused = zs_resource_used_uint64(u, ZS_RESOURCE_CPU, ZS_USER_ALL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence mused = zs_resource_used_uint64(u, ZS_RESOURCE_RAM_RSS, ZS_USER_ALL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vused = zs_resource_used_uint64(u, ZS_RESOURCE_VM, ZS_USER_ALL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ppart = zs_resource_used_pct(u, ZS_RESOURCE_CPU, ZS_USER_ALL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence mpct = zs_resource_used_pct(u, ZS_RESOURCE_RAM_RSS, ZS_USER_ALL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vpct = zs_resource_used_pct(u, ZS_RESOURCE_VM, ZS_USER_ALL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (opt_line_total) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(zonename, sizeof (zonename), "[%s]",
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_NAME_TOTAL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_summary_zone(namewidth, report_fmt, zonename,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cused, ppart, ZS_PCT_NONE, ZS_PCT_NONE, mused, mpct,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZS_PCT_NONE, vused, vpct, ZS_PCT_NONE);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cused = zs_resource_used_uint64(u, ZS_RESOURCE_CPU, ZS_USER_KERNEL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence mused = zs_resource_used_uint64(u, ZS_RESOURCE_RAM_RSS, ZS_USER_KERNEL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vused = zs_resource_used_uint64(u, ZS_RESOURCE_VM, ZS_USER_KERNEL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ppart = zs_resource_used_pct(u, ZS_RESOURCE_CPU, ZS_USER_KERNEL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence mpct = zs_resource_used_pct(u, ZS_RESOURCE_RAM_RSS, ZS_USER_KERNEL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vpct = zs_resource_used_pct(u, ZS_RESOURCE_VM, ZS_USER_KERNEL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (opt_line_system) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(zonename, sizeof (zonename), "[%s]",
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_NAME_SYSTEM);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_summary_zone(namewidth, report_fmt, zonename,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cused, ppart, ZS_PCT_NONE, ZS_PCT_NONE, mused, mpct,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZS_PCT_NONE, vused, vpct, ZS_PCT_NONE);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (i = 0; i < num; i++) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence z = g_zone_list[i];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_zone_property(z, ZS_ZONE_PROP_NAME, prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) strlcpy(zonename, zs_property_string(prop),
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sizeof (zonename));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cused = zs_resource_used_zone_uint64(z, ZS_RESOURCE_CPU);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence mused = zs_resource_used_zone_uint64(z, ZS_RESOURCE_RAM_RSS);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vused = zs_resource_used_zone_uint64(z, ZS_RESOURCE_VM);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ppart = zs_resource_used_zone_pct(z, ZS_RESOURCE_CPU);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence mpct = zs_resource_used_zone_pct(z, ZS_RESOURCE_RAM_RSS);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vpct = zs_resource_used_zone_pct(z, ZS_RESOURCE_VM);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pshru = zs_zone_limit_used_pct(z, ZS_LIMIT_CPU_SHARES);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pccap = zs_zone_limit_used_pct(z, ZS_LIMIT_CPU);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pmcap = zs_zone_limit_used_pct(z, ZS_LIMIT_RAM_RSS);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pvcap = zs_zone_limit_used_pct(z, ZS_LIMIT_VM);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_summary_zone(namewidth, report_fmt, zonename,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cused, ppart, pccap, pshru, mused, mpct, pmcap, vused, vpct,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pvcap);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (!opt_parseable)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf("\n");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) fflush(stdout);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezonestat_print_res(int report_fmt, char *header, char *sizename, char *resname,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char *name, zs_usage_t *u, int res, int limit)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_zone_t *zone;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char zonename[ZS_ZONENAME_MAX];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t size;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t used;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t pct;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t pctcap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_property_t *prop;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int num, i;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence size_t namelen, len;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence prop = (zs_property_t *)alloca(zs_property_size());
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* See if resource matches specified resource names */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (zonestat_match_resname(name) == 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence namelen = strlen(resname);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ZSTAT_RESOURCE_MIN_RESNAME > namelen)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence namelen = ZSTAT_RESOURCE_MIN_RESNAME;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_resource__header(namelen, header, sizename);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence size = zs_resource_total_uint64(u, res);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (opt_line_resource)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_resource_(namelen, report_fmt, resname, name,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence size);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceagain:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence num = zs_zone_list(u, g_zone_list, g_zone_num);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (num > g_zone_num) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (g_zone_list != NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence free(g_zone_list);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_zone_list = (zs_zone_t **) malloc(sizeof (zs_zone_t *) * num);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_zone_num = num;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto again;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence namelen = ZSTAT_RESOURCE_MIN_ZONENAME;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (i = 0; i < num; i++) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone = g_zone_list[i];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) zs_zone_property(zone, ZS_ZONE_PROP_NAME, prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence len = strlen(zs_property_string(prop));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (len > namelen)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence namelen = len;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_resource_zone_header(namelen);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence used = zs_resource_used_uint64(u, res, ZS_USER_ALL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pct = zs_resource_used_pct(u, res, ZS_USER_ALL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (opt_line_total) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(zonename, sizeof (zonename), "[%s]",
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_NAME_TOTAL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_resource_zone(namelen, report_fmt, resname,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence name, zonename, used, pct, ZS_LIMIT_NONE, ZS_PCT_NONE);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence used = zs_resource_used_uint64(u, res, ZS_USER_KERNEL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pct = zs_resource_used_pct(u, res, ZS_USER_KERNEL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (opt_line_system) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(zonename, sizeof (zonename), "[%s]",
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_NAME_SYSTEM);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_resource_zone(namelen, report_fmt, resname, name,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonename, used, pct, ZS_LIMIT_NONE, ZS_PCT_NONE);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_qsort(g_zone_list, num, sizeof (zs_zone_t *),
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_zone_compare_resource, res);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (i = 0; i < num; i++) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone = g_zone_list[i];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_zone_property(zone, ZS_ZONE_PROP_NAME, prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) strlcpy(zonename, zs_property_string(prop),
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sizeof (zonename));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (zonestat_match_zonename(zonename) == 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence continue;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence used = zs_resource_used_zone_uint64(zone, res);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pct = zs_resource_used_zone_pct(zone, res);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cap = zs_zone_limit_uint64(zone, limit);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pctcap = zs_zone_limit_used_pct(zone, limit);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (opt_line_zones)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_resource_zone(namelen, report_fmt,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence resname, name, zonename, used, pct, cap, pctcap);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (!opt_parseable)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf("\n");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezonestat_print_cpu_res_header(size_t namelen)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char name_format[ZS_NAME_STRLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (opt_parseable)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(name_format, sizeof (name_format), "%%-%ds ", namelen);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* LINTED */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(name_format, "PROCESSOR_SET");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(ZSTAT_CPU_RES_FORMAT, "TYPE", "ONLINE/CPUS", "MIN/MAX");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezonestat_print_cpu_zone_header(size_t namelen)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char name_format[ZS_NAME_STRLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (opt_parseable)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(name_format, sizeof (name_format), "%%%ds ", namelen);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* LINTED */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(name_format, "ZONE");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(ZSTAT_CPU_ZONE_FORMAT, "USED", "PCT", "CAP",
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "%CAP", "SHRS", "%SHR", "%SHRU");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezonestat_print_cpu_res(size_t namelen, int report_fmt, char *cputype,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char *name, uint64_t online, uint64_t size, uint64_t min, uint64_t max,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence timestruc_t *ts)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char online_str[ZS_UINT64_STRLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char size_str[ZS_UINT64_STRLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char min_str[ZS_UINT64_STRLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char max_str[ZS_UINT64_STRLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char cpus_str[ZS_UINT64_STRLEN + ZS_UINT64_STRLEN + 1];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char minmax_str[ZS_UINT64_STRLEN + ZS_UINT64_STRLEN + 1];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char ts_str[ZS_TIME_STRLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char name_format[ZS_NAME_STRLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char *label;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence format_uint64(online, online_str, sizeof (online_str));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence format_uint64(size, size_str, sizeof (size_str));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence format_uint64(min, min_str, sizeof (min_str));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence format_uint64(max, max_str, sizeof (max_str));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence format_ts(ts, ts_str, sizeof (ts_str), B_FALSE);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (opt_parseable) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (opt_timestamp) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_timestamp(g_now_time);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(":");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence label = zonestat_get_plabel(report_fmt);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf("%s:%s:%s:%s:[%s]:%s:%s:%s:%s:%s\n", label,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_PROCESSOR_SET, cputype, name,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_NAME_RESOURCE, online_str, size_str, min_str,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence max_str, ts_str);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(cpus_str, sizeof (cpus_str), "%s/%s", online_str,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence size_str);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(minmax_str, sizeof (minmax_str), "%s/%s", min_str,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence max_str);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(name_format, sizeof (name_format), "%%-%ds ", namelen);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* LINTED */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(name_format, name);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(ZSTAT_CPU_RES_FORMAT, cputype, cpus_str, minmax_str);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezonestat_print_cpu_zone(size_t namelen, int report_fmt, char *cputype,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char *name, char *zonename, uint64_t used, uint_t pct, uint64_t cap,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t pct_cap, uint64_t shares, uint_t scheds, uint_t pct_shares,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t pct_shares_used, timestruc_t *ts, boolean_t report_conflict)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char used_str[ZS_UINT64_STRLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char pct_str[ZS_PCT_STRLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char cap_str[ZS_UINT64_STRLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char pct_cap_str[ZS_PCT_STRLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char shares_str[ZS_UINT64_STRLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char pct_shares_str[ZS_PCT_STRLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char pct_shares_used_str[ZS_PCT_STRLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char ts_str[ZS_TIME_STRLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char name_format[ZS_NAME_STRLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char *label;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence format_cpu(used, used_str, sizeof (used_str));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence format_pct(pct, pct_str, sizeof (pct_str));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence format_ts(ts, ts_str, sizeof (ts_str), B_FALSE);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (cap == ZS_LIMIT_NONE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) strlcpy(cap_str, "-", sizeof (cap_str));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence format_cpu(cap, cap_str, sizeof (cap_str));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pct_cap == ZS_PCT_NONE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) strlcpy(pct_cap_str, "-", sizeof (pct_cap_str));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence format_pct(pct_cap, pct_cap_str, sizeof (pct_cap_str));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if ((scheds & ZS_SCHED_CONFLICT) &&
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (!(scheds & ZS_SCHED_FSS)))
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) strlcpy(shares_str, "no-fss", sizeof (shares_str));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else if (shares == ZS_LIMIT_NONE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) strlcpy(shares_str, "-", sizeof (shares_str));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else if (shares == ZS_SHARES_UNLIMITED)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) strlcpy(shares_str, "inf", sizeof (shares_str));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence format_uint64(shares, shares_str, sizeof (shares_str));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pct_shares == ZS_PCT_NONE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) strlcpy(pct_shares_str, "-", sizeof (pct_shares_str));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence format_pct(pct_shares, pct_shares_str,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sizeof (pct_shares_str));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pct_shares_used == ZS_PCT_NONE) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) strlcpy(pct_shares_used_str, "-",
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sizeof (pct_shares_used_str));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence format_pct(pct_shares_used, pct_shares_used_str,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sizeof (pct_shares_used_str));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (opt_parseable) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (opt_timestamp) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_timestamp(g_now_time);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(":");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence label = zonestat_get_plabel(report_fmt);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf("%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s\n", label,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_PROCESSOR_SET, cputype, name, zonename, used_str,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pct_str, cap_str, pct_cap_str, shares_str, pct_shares_str,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pct_shares_used_str, ts_str);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(name_format, sizeof (name_format), "%%%ds ",
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence namelen);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* LINTED */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(name_format, zonename);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(ZSTAT_CPU_ZONE_FORMAT, used_str,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pct_str, cap_str, pct_cap_str, shares_str, pct_shares_str,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pct_shares_used_str);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Report if zone has mix of schedulers conflicting with FSS */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (report_conflict && (scheds & ZS_SCHED_CONFLICT) &&
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (scheds & ZS_SCHED_FSS)) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* LINTED */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(name_format, "");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(" mixed schedulers found:");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(" FSS");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (scheds & ZS_SCHED_TS)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(", TS");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (scheds & ZS_SCHED_IA)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(", IA");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (scheds & ZS_SCHED_FX)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(", FX");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf("\n");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezonestat_print_pset(int report_fmt, zs_pset_t *pset, char *cputype)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_pset_zone_t *pz;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_zone_t *zone;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t cpus;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t size;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t min;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t max;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t scheds;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t used;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t pct;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t pct_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t shares;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t pct_shares;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t pct_shares_used;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char psetname[ZS_PSETNAME_MAX];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char zonename[ZS_PSETNAME_MAX];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char *name;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_property_t *prop;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence boolean_t zone_match;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int num, i;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence timestruc_t ts;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence size_t namelen, len;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence prop = (zs_property_t *)alloca(zs_property_size());
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_pset_property(pset, ZS_PSET_PROP_NAME, prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) strlcpy(psetname, zs_property_string(prop), sizeof (psetname));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Check if pset contains specified zone */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (arg_zonename_count > 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone_match = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (pz = zs_pset_zone_first(pset); pz != NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pz = zs_pset_zone_next(pset, pz)) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone = zs_pset_zone_get_zone(pz);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) zs_zone_property(zone, ZS_ZONE_PROP_NAME, prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) strlcpy(zonename, zs_property_string(prop),
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sizeof (zonename));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (zonestat_match_zonename(zonename) == 1) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone_match = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (zone_match == B_FALSE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (zonestat_match_resname(psetname) == 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_pset_property(pset, ZS_PSET_PROP_ONLINE, prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpus = zs_property_uint64(prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_pset_property(pset, ZS_PSET_PROP_SIZE, prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence size = zs_property_uint64(prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_pset_property(pset, ZS_PSET_PROP_MIN, prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence min = zs_property_uint64(prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_pset_property(pset, ZS_PSET_PROP_MAX, prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence max = zs_property_uint64(prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_pset_total_time(pset, &ts);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Strip off SUNWtmp_ from pset name */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence name = psetname;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (strncmp(psetname, "SUNWtmp_", strlen("SUNWtmp_")) == 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence name = strchr(psetname, '_');
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence name++;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Strip off SUNWlegacy_pst for psrset psets */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (strncmp(psetname, "SUNWlegacy_pset_",
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence strlen("SUNWlegacy_pset_")) == 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence name = strrchr(psetname, '_');
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence name++;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence namelen = strlen(name);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ZSTAT_CPU_MIN_PSETNAME > namelen)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence namelen = ZSTAT_CPU_MIN_PSETNAME;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_cpu_res_header(namelen);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (opt_line_resource)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_cpu_res(namelen, report_fmt, cputype, name, cpus,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence size, min, max, &ts);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceagain:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence num = zs_pset_zone_list(pset, g_pz_list, g_pz_num);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (num > g_pz_num) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (g_pz_list != NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence free(g_pz_list);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_pz_list = (zs_pset_zone_t **)malloc(
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sizeof (zs_pset_zone_t *) * num);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_pz_num = num;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto again;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Find longest zone name in pset */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence namelen = ZSTAT_CPU_MIN_ZONENAME;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (i = 0; i < num; i++) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pz = g_pz_list[i];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone = zs_pset_zone_get_zone(pz);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_zone_property(zone, ZS_ZONE_PROP_NAME, prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence len = strlen(zs_property_string(prop));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (len > namelen)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence namelen = len;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence qsort(g_pz_list, num, sizeof (zs_pset_zone_t *),
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_pz_compare_usage);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_cpu_zone_header(namelen);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_pset_property(pset, ZS_PSET_PROP_CPU_SHARES, prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence shares = zs_property_uint64(prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_pset_property(pset, ZS_PSET_PROP_SCHEDULERS, prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence scheds = zs_property_uint(prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_pset_used_time(pset, ZS_USER_ALL, &ts);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence used = zs_pset_used_cpus(pset, ZS_USER_ALL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pct = zs_pset_used_pct(pset, ZS_USER_ALL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (opt_line_total) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(zonename, sizeof (zonename), "[%s]",
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_NAME_TOTAL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_cpu_zone(namelen, report_fmt, cputype, name,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonename, used, pct, ZS_LIMIT_NONE, ZS_PCT_NONE, shares,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence scheds, ZS_PCT_NONE, ZS_PCT_NONE, &ts, B_FALSE);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_pset_used_time(pset, ZS_USER_KERNEL, &ts);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence used = zs_pset_used_cpus(pset, ZS_USER_KERNEL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pct = zs_pset_used_pct(pset, ZS_USER_KERNEL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (opt_line_system) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(zonename, sizeof (zonename), "[%s]",
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_NAME_SYSTEM);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_cpu_zone(namelen, report_fmt, cputype, name,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonename, used, pct, ZS_LIMIT_NONE, ZS_PCT_NONE,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZS_LIMIT_NONE, 0, ZS_PCT_NONE, ZS_PCT_NONE, &ts, B_FALSE);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (i = 0; i < num; i++) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pz = g_pz_list[i];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone = zs_pset_zone_get_zone(pz);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_zone_property(zone, ZS_ZONE_PROP_NAME, prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) strlcpy(zonename, zs_property_string(prop),
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sizeof (zonename));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (zonestat_match_zonename(zonename) == 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence continue;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_pset_zone_property(pz, ZS_PZ_PROP_CPU_CAP, prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cap = zs_property_uint64(prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_pset_zone_property(pz, ZS_PZ_PROP_CPU_SHARES, prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence shares = zs_property_uint64(prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_pset_zone_property(pz, ZS_PZ_PROP_SCHEDULERS, prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence scheds = zs_property_uint(prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence used = zs_pset_zone_used_cpus(pz);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_pset_zone_used_time(pz, &ts);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pct = zs_pset_zone_used_pct(pz, ZS_PZ_PCT_PSET);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pct_cap = zs_pset_zone_used_pct(pz, ZS_PZ_PCT_CPU_CAP);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pct_shares = zs_pset_zone_used_pct(pz, ZS_PZ_PCT_PSET_SHARES);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pct_shares_used = zs_pset_zone_used_pct(pz,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZS_PZ_PCT_CPU_SHARES);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (opt_line_zones)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_cpu_zone(namelen, report_fmt, cputype,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence name, zonename, used, pct, cap, pct_cap, shares,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence scheds, pct_shares, pct_shares_used, &ts, B_TRUE);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (!opt_parseable)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf("\n");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/* ARGSUSED */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezonestat_quithandler(int sig)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_quit = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezonestat_print_footer(int report_fmt)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char *label;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (!opt_parseable)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (opt_timestamp) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_timestamp(g_now_time);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(":");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence label = zonestat_get_plabel(report_fmt);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf("%s:%s:", label, ZONESTAT_NAME_FOOTER);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_timestamp(g_now_time);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf("%d:%ld\n", g_interval, g_seconds);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) fflush(stdout);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezonestat_print_header(int report_fmt)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char *label;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence timestruc_t ts;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char string[ZS_TIME_STRLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (!opt_parseable) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Human readable header */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (opt_timestamp) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_timestamp(g_now_time);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(", ");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (report_fmt == ZSTAT_REPORT_FMT_INTERVAL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ts.tv_sec = g_seconds;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ts.tv_nsec = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence format_ts(&ts, string, sizeof (string), B_TRUE);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf("Interval: %d, Duration: %s\n", g_count,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence string);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) fflush(stdout);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence switch (report_fmt) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence case ZSTAT_REPORT_FMT_TOTAL:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence label = "Report: Total Usage";
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence case ZSTAT_REPORT_FMT_AVERAGE:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence label = "Report: Average Usage";
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence case ZSTAT_REPORT_FMT_HIGH:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence label = "Report: High Usage";
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence default:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence exit(zonestat_error(gettext(
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "Internal error, invalid header")));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Left are the report header formats */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf("%s\n", label);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(" Start: ");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_timestamp(g_start_time);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf("\n End: ");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_timestamp(g_end_time);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf("\n");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ts.tv_sec = g_seconds;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ts.tv_nsec = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence format_ts(&ts, string, sizeof (string), B_TRUE);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(" Intervals: %d, Duration: %s\n",
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_count, string);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) fflush(stdout);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (!opt_line_header)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Parseable header */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (opt_timestamp) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_timestamp(g_now_time);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(":");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence label = zonestat_get_plabel(report_fmt);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf("%s:%s:", label, ZONESTAT_NAME_HEADER);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (report_fmt == ZSTAT_REPORT_FMT_INTERVAL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf("since-last-interval:");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_timestamp(g_now_time);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(":%d:%ld\n", g_count, g_seconds);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) fflush(stdout);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Left are the report header formats */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_timestamp(g_start_time);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(":");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_timestamp(g_end_time);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(":");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf("%d:%ld\n", g_interval, g_seconds);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) fflush(stdout);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezonestat_print_psets(int report_fmt, zs_usage_t *u)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_pset_t *pset;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char *psettype;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t cputype, num, i;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_property_t *p;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceagain:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence num = zs_pset_list(u, g_pset_list, g_pset_num);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (num > g_pset_num) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (g_pset_list != NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence free(g_pset_list);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_pset_list = (zs_pset_t **)malloc(
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sizeof (zs_pset_t *) * num);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_pset_num = num;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto again;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Sort, default pset first, then pool, psrset, and dedicated psets */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence qsort(g_pset_list, num, sizeof (zs_pset_t *), zonestat_pset_compare);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence p = (zs_property_t *)alloca(zs_property_size());
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (i = 0; i < num; i++) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset = g_pset_list[i];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) zs_pset_property(pset, ZS_PSET_PROP_CPUTYPE, p);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cputype = zs_property_uint(p);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (cputype == ZS_CPUTYPE_DEFAULT_PSET &&
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (g_resources & (ZSTAT_RES_PSETS |
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZSTAT_RES_DEFAULT_PSET))) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence psettype = ZONESTAT_DEFAULT_PSET;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else if (cputype == ZS_CPUTYPE_POOL_PSET &&
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (g_resources & ZSTAT_RES_PSETS)) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence psettype = ZONESTAT_POOL_PSET;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else if (cputype == ZS_CPUTYPE_PSRSET_PSET &&
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (g_resources & ZSTAT_RES_PSETS)) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence psettype = ZONESTAT_PSRSET_PSET;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else if (cputype == ZS_CPUTYPE_DEDICATED &&
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (g_resources & ZSTAT_RES_PSETS)) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence psettype = ZONESTAT_DEDICATED_CPU;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence continue;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_pset(report_fmt, pset, psettype);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezonestat_print_resources(int report_fmt, zs_usage_t *usage)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (g_resources & ZSTAT_RES_SUMMARY)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_summary(report_fmt, usage);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (g_resources & ZSTAT_RES_PHYSICAL_MEMORY)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_res(report_fmt, "PHYSICAL-MEMORY",
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "SYSTEM MEMORY", ZONESTAT_PHYSICAL_MEMORY,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_NAME_MEM_DEFAULT, usage,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZS_RESOURCE_RAM_RSS, ZS_LIMIT_RAM_RSS);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (g_resources & ZSTAT_RES_VIRTUAL_MEMORY)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_res(report_fmt, "VIRTUAL-MEMORY",
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "SYSTEM MEMORY", ZONESTAT_VIRTUAL_MEMORY,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_NAME_VM_DEFAULT, usage,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZS_RESOURCE_VM, ZS_LIMIT_VM);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (g_resources & ZSTAT_RES_LOCKED_MEMORY)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_res(report_fmt, "LOCKED-MEMORY", "SYSTEM MEMORY",
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_LOCKED_MEMORY, ZONESTAT_NAME_MEM_DEFAULT, usage,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZS_RESOURCE_RAM_LOCKED, ZS_LIMIT_RAM_LOCKED);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (g_resources & (ZSTAT_RES_PSETS | ZSTAT_RES_DEFAULT_PSET))
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_psets(report_fmt, usage);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (g_resources & ZSTAT_RES_PROCESSES)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_res(report_fmt, "PROCESSES", "SYSTEM LIMIT",
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_PROCESSES, ZONESTAT_NAME_SYSTEM_LIMIT,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage, ZS_RESOURCE_PROCESSES, ZS_LIMIT_PROCESSES);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (g_resources & ZSTAT_RES_LWPS)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_res(report_fmt, "LWPS", "SYSTEM LIMIT",
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_LWPS, ZONESTAT_NAME_SYSTEM_LIMIT, usage,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZS_RESOURCE_LWPS, ZS_LIMIT_LWPS);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (g_resources & ZSTAT_RES_LOFI)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_res(report_fmt, "LOFI", "SYSTEM LIMIT",
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_LOFI, ZONESTAT_NAME_SYSTEM_LIMIT,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage, ZS_RESOURCE_LOFI, ZS_LIMIT_LOFI);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (g_resources & ZSTAT_RES_SHM_MEMORY)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_res(report_fmt, "SHM_MEMORY", "SYSTEM LIMIT",
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_SHM_MEMORY, ZONESTAT_NAME_SYSTEM_LIMIT,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage, ZS_RESOURCE_SHM_MEMORY, ZS_LIMIT_SHM_MEMORY);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (g_resources & ZSTAT_RES_SHM_IDS)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_res(report_fmt, "SHM_IDS", "SYSTEM LIMIT",
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_SHM_IDS, ZONESTAT_NAME_SYSTEM_LIMIT,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage, ZS_RESOURCE_SHM_IDS, ZS_LIMIT_SHM_IDS);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (g_resources & ZSTAT_RES_SEM_IDS)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_res(report_fmt, "SEM_IDS", "SYSTEM LIMIT",
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_SEM_IDS, ZONESTAT_NAME_SYSTEM_LIMIT,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage, ZS_RESOURCE_SEM_IDS, ZS_LIMIT_SEM_IDS);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (g_resources & ZSTAT_RES_MSG_IDS)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_res(report_fmt, "MSG_IDS", "SYSTEM LIMIT",
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZONESTAT_MSG_IDS, ZONESTAT_NAME_SYSTEM_LIMIT,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage, ZS_RESOURCE_MSG_IDS, ZS_LIMIT_MSG_IDS);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Adds comma seperated list of names to array of names
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Returns new total number of names.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic size_t
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezonestat_parse_names(char *names, char ***namelist, size_t count)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence size_t num, i;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char *next, *string;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence string = strdup(names);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (string == NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence exit(zonestat_error(gettext("Out of Memory")));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* count names, delimiting with '\0'. */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence next = string;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence num = 1;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence while ((next = strchr(next, ',')) != NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *next++ = '\0';
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence num++;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Resise names array */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *namelist = realloc(*namelist, sizeof (char *) * (num + count));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (*namelist == NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence exit(zonestat_error(gettext("Out of Memory")));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* add names to names array */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence next = string;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (i = 0; i < num; i++) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (*namelist)[count + i] = next;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence next += strlen(next) + 1;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (count + num);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic int
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezonestat_extract_int(char *start, char *end, char **tail)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int val;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int save;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence save = *end;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *end = '\0';
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence errno = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence val = strtol(start, tail, 0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *end = save;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (errno != 0 || *tail == start)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (-1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (val);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * parses and [nh][nm][hs] notation into seconds
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic int
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezonestat_parse_time(char *string, boolean_t *formatted)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int seconds = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int minutes = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int hours = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char *this, *next, *end;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *formatted = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Look for special tokens */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (strcmp("default", string) == 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (ZSTAT_INTERVAL_DEFAULT);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (strcmp("inf", string) == 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (ZSTAT_DURATION_INF);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Look for hours */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence this = string;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence next = strchr(this, 'h');
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (next != NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if ((hours = zonestat_extract_int(this, next, &end)) == -1)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (-1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *formatted = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence this = next + 1;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence end++;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Look for minutes delimiter */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence next = strrchr(this, 'm');
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (next != NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if ((minutes = zonestat_extract_int(this, next, &end)) == -1)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (-1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *formatted = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence this = next + 1;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence end++;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Look for seconds delimiter */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence next = strrchr(this, 's');
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (next != NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if ((seconds = zonestat_extract_int(this, next, &end)) == -1)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (-1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *formatted = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence this = next + 1;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence end++;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* No delimiter found. Treat as seconds */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (*formatted == B_FALSE) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence errno = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence seconds = strtol(this, &end, 0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (errno != 0 || end == this)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (-1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (*end != '\0')
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (-1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence seconds += (minutes * 60);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence seconds += (hours * 60 * 60);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (seconds);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezonestat_print_reports(zs_usage_set_t *set)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_usage_t *usage_print;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (opt_report_total == B_TRUE) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage_print = zs_usage_set_compute(set,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZS_COMPUTE_SET_TOTAL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_header(ZSTAT_REPORT_FMT_TOTAL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_resources(ZSTAT_REPORT_FMT_TOTAL, usage_print);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_footer(ZSTAT_REPORT_FMT_TOTAL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) fflush(stdout);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (opt_report_average == B_TRUE) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage_print = zs_usage_set_compute(set,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZS_COMPUTE_SET_AVERAGE);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_header(ZSTAT_REPORT_FMT_AVERAGE);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_resources(ZSTAT_REPORT_FMT_AVERAGE, usage_print);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_footer(ZSTAT_REPORT_FMT_AVERAGE);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) fflush(stdout);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (opt_report_high == B_TRUE) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage_print = zs_usage_set_compute(set,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZS_COMPUTE_SET_HIGH);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_header(ZSTAT_REPORT_FMT_HIGH);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_resources(ZSTAT_REPORT_FMT_HIGH, usage_print);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_footer(ZSTAT_REPORT_FMT_HIGH);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) fflush(stdout);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezonestat_set_fx()
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pcinfo_t pcinfo;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pcparms_t pcparms;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) strlcpy(pcinfo.pc_clname, "FX", sizeof (pcinfo.pc_clname));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (priocntl(0, 0, PC_GETCID, (caddr_t)&pcinfo) == -1) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pcparms.pc_cid = pcinfo.pc_cid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ((fxparms_t *)pcparms.pc_clparms)->fx_upri = 60;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ((fxparms_t *)pcparms.pc_clparms)->fx_uprilim = 60;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ((fxparms_t *)pcparms.pc_clparms)->fx_tqsecs = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ((fxparms_t *)pcparms.pc_clparms)->fx_tqnsecs = FX_NOCHANGE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) priocntl(P_PID, getpid(), PC_SETPARMS, (caddr_t)&pcparms);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic time_t
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezonestat_time()
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence time_t t;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence t = time(NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (t < 0 && g_quit == B_FALSE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence exit(zonestat_error(gettext(
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "Unable to fetch current time")));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (t);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceint
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencemain(int argc, char *argv[])
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int arg;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence time_t now, next, start, next_report;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_usage_t *usage, *usage_last = NULL, *usage_print;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_usage_set_t *set;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence boolean_t formatted;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence scf_simple_prop_t *prop;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t *intervalp;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char *not_responding;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Process command line options and args */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence while ((arg = getopt(argc, argv, "z:r:n:T:R:qpP:S:D?"))
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence != EOF) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence switch (arg) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence case 'z':
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence opt_zonenames = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence arg_zonename_count = zonestat_parse_names(optarg,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence &arg_zonenames, arg_zonename_count);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence case 'r':
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence arg_restype_count = zonestat_parse_names(optarg,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence &arg_restypes, arg_restype_count);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence opt_restypes = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence case 'n':
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence opt_resnames = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence arg_resname_count = zonestat_parse_names(optarg,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence &arg_resnames, arg_resname_count);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence case 'R':
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence opt_report = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence arg_report_count = zonestat_parse_names(optarg,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence &arg_reports, arg_report_count);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence case 'S':
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence opt_sort = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence arg_sort_count = zonestat_parse_names(optarg,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence &arg_sort_list, arg_sort_count);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence case 'T':
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence opt_timestamp = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (strcmp(optarg, "u") == 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence arg_timestamp = ZSTAT_UNIX_TIMESTAMP;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else if (strcmp(optarg, "d") == 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence arg_timestamp = ZSTAT_DATE_TIMESTAMP;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else if (strcmp(optarg, "i") == 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence arg_timestamp = ZSTAT_ISO_TIMESTAMP;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) zonestat_error(gettext(
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "Invalid -T arg \"%s\". "
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "Must be 'u', 'i', or 'd'."), optarg);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (zonestat_usage(B_FALSE));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence case 'q':
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence opt_quiet_intervals = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence case 'p':
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence opt_parseable = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence case 'P':
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence opt_line_any = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence arg_line_count = zonestat_parse_names(optarg,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence &arg_line_list, arg_line_count);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence case 'D':
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence opt_debug = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence case '?':
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (zonestat_usage(B_TRUE));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence default:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (zonestat_usage(B_FALSE));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (opt_line_any & (!opt_parseable)) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) zonestat_error(gettext("-P requires -p"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (zonestat_usage(B_FALSE));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (opt_timestamp && arg_timestamp == ZSTAT_DATE_TIMESTAMP &&
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence opt_parseable) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) zonestat_error(gettext(
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "-T d invalid with -p. Use -T [u | i]"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (zonestat_usage(B_FALSE));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Default to ISO timetamp in parseable output */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (!opt_timestamp && opt_parseable)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence arg_timestamp = ZSTAT_ISO_TIMESTAMP;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Get the interval and count */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence optind++;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (argc >= optind) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if ((arg_interval = zonestat_parse_time(argv[optind - 1],
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence &formatted)) < 0 || arg_interval == 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) zonestat_error(gettext(
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "Invalid interval: \"%s\""), argv[optind - 1]);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (zonestat_usage(B_FALSE));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) zonestat_error(gettext("Interval required."));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (zonestat_usage(B_FALSE));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (arg_interval == ZSTAT_INTERVAL_DEFAULT) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Get the configured sample interval */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence prop = scf_simple_prop_get(NULL,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "svc:/system/zones-monitoring:default", "config",
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "sample_interval");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (prop == NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (zonestat_error(gettext(
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "Unable to fetch SMF property "
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "\"config/sample_interval\"")));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (scf_simple_prop_type(prop) != SCF_TYPE_COUNT) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (zonestat_error(gettext("Malformed SMF property "
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "\"config/sample_interval\". Must be of type "
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "\"count\"")));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence intervalp = scf_simple_prop_next_count(prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence arg_interval = *intervalp;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (arg_interval == 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (zonestat_error(gettext("Malformed SMF property "
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "\"config/sample_interval\". Must be greater than"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "zero")));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence scf_simple_prop_free(prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence optind++;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (argc >= optind) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if ((arg_duration = zonestat_parse_time(argv[optind - 1],
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence &formatted)) < 0 || arg_duration == 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) zonestat_error(gettext(
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "Invalid duration: \"%s\""), argv[optind - 1]);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (zonestat_usage(B_FALSE));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* If not formatted [nh][nm][ns], treat as count */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (arg_duration != ZSTAT_DURATION_INF &&
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence formatted == B_FALSE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence arg_duration *= arg_interval;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence arg_duration = ZSTAT_DURATION_INF;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence optind++;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (argc >= optind) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if ((arg_report = zonestat_parse_time(argv[optind - 1],
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence &formatted)) < 0 || arg_report == 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) zonestat_error(gettext(
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "Invalid report period: \"%s\""), argv[optind - 1]);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (zonestat_usage(B_FALSE));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* If not formatted as [nh][nm][ns] treat as count */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (formatted == B_FALSE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence arg_report *= arg_interval;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence arg_report = ZSTAT_REPORT_END;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (opt_quiet_intervals && (!opt_report)) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) zonestat_error(gettext("-q requires -R"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (zonestat_usage(B_FALSE));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Figure out what resources to report on */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_determine_resources();
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_determine_reports();
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_determine_lines();
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_determine_sort();
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Done parsing args beyond this point */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) signal(SIGINT, zonestat_quithandler);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) signal(SIGTERM, zonestat_quithandler);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) signal(SIGHUP, zonestat_quithandler);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Run at high priority to keep up with busy system */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_set_fx();
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence not_responding = gettext(
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "Zones monitoring service \"svc:/system/zones-monitoring:default\" "
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "not enabled or responding.");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Open zone statistics */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_zsctl = zs_open();
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (g_zsctl == NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (errno == EPERM)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (zonestat_error(gettext("Permission denied")));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (errno == EINTR || errno == ESRCH) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) zonestat_error(not_responding);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (3);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (errno == ENOTSUP)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (zonestat_error(gettext(
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "Mismatched zonestat version. "
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "Re-install system/zones package.")));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (zonestat_error(gettext(
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "Unexpected error. Unable to open zone statistics.")));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage_last = zs_usage_read(g_zsctl);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (usage_last == NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (errno == EINTR && g_quit == B_TRUE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) zonestat_error(not_responding);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (3);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence set = zs_usage_set_alloc(g_zsctl);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_start_time = g_now_time = start = now = zonestat_time();
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_interval = arg_interval;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_report_count = g_count = g_seconds = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (opt_quiet_intervals == B_FALSE && opt_parseable == B_FALSE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) printf(gettext(
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "Collecting data for first interval...\n"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (;;) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence time_t tosleep;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_now_time = now = zonestat_time();
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (arg_report != ZSTAT_REPORT_END)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence next_report = start + ((g_report_count + 1) *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence arg_report);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Sleep till next interval.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_count++;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence next = g_start_time + (g_count) * g_interval;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Skip to next interval if due to busy system, zonestat did
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * not complete in time.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence while (now >= g_start_time + ((g_count + 1) * g_interval))
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_count++;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence while (now < next) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Sleep until at next interval */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence tosleep = next - now;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) sleep(tosleep);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence now = zonestat_time();
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (g_quit == B_TRUE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto interval_loop_done;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_seconds = now - start;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_now_time = now;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if ((usage = zs_usage_read(g_zsctl)) == NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (errno == EINTR && g_quit == B_TRUE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) zonestat_error(not_responding);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (3);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Compute cpu used since last interval */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage_print = zs_usage_compute(NULL, usage_last,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage, ZS_COMPUTE_USAGE_INTERVAL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (usage_print == NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) zonestat_error(gettext("Out of Memory"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (opt_quiet_intervals == B_TRUE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto interval_print_end;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_header(ZSTAT_REPORT_FMT_INTERVAL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_resources(ZSTAT_REPORT_FMT_INTERVAL,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage_print);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_footer(ZSTAT_REPORT_FMT_INTERVAL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) fflush(stdout);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceinterval_print_end:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) zs_usage_set_add(set, usage_print);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Print reports if they are due */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (opt_report && arg_report != ZSTAT_REPORT_END &&
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence now >= next_report) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_end_time = now;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_reports(set);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_usage_set_free(set);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence set = zs_usage_set_alloc();
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_start_time = now;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_report_count++;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_usage_free(usage_last);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage_last = usage;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (arg_duration != ZSTAT_DURATION_INF &&
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_seconds >= arg_duration)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceinterval_loop_done:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Print last reports if due */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_end_time = g_now_time;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (opt_report && zs_usage_set_count(set) > 0 &&
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (arg_report == ZSTAT_REPORT_END || now < next_report))
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonestat_print_reports(set);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_usage_set_free(set);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (usage_last != NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_usage_free(usage_last);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (g_zsctl != NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_close(g_zsctl);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}