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#include <alloca.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <assert.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <dirent.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <dlfcn.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <door.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <errno.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <exacct.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <ctype.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <fcntl.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <kstat.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <libcontract.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <libintl.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <libscf.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <zonestat.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <zonestat_impl.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <limits.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <pool.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <procfs.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <rctl.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <thread.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <signal.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <stdarg.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <stddef.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <stdio.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <stdlib.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <strings.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <synch.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <sys/acctctl.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <sys/contract/process.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <sys/ctfs.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <sys/fork.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <sys/param.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <sys/priocntl.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <sys/fxpriocntl.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <sys/processor.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <sys/pset.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <sys/socket.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <sys/stat.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <sys/statvfs.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <sys/swap.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <sys/systeminfo.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <thread.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <sys/list.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <sys/time.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <sys/types.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <sys/vm_usage.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <sys/wait.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <sys/zone.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <time.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <ucred.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <unistd.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <vm/anon.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <zone.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#include <zonestat.h>
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define MAX_PSET_NAME 1024 /* Taken from PV_NAME_MAX_LEN */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSD_PSET_UNLIMITED UINT16_MAX
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZONESTAT_EXACCT_FILE "/var/adm/exacct/zonestat-process"
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * zonestatd implements gathering cpu and memory utilization data for
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * running zones. It has these components:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * zsd_server:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Door server to respond to client connections. Each client
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * will connect using libzonestat.so, which will open and
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * call /var/tmp/.zonestat_door. Each connecting client is given
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * a file descriptor to the stat server.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * The zsd_server also responds to zoneadmd, which reports when a
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * new zone is booted. This is used to fattach the zsd_server door
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * into the new zone.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * zsd_stat_server:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Receives client requests for the current utilization data. Each
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * client request will cause zonestatd to update the current utilization
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * data by kicking the stat_thread.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * If the client is in a non-global zone, the utilization data will
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * be filtered to only show the given zone. The usage by all other zones
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * will be added to the system utilization.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * stat_thread:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * The stat thread implements querying the system to determine the
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * current utilization data for each running zone. This includes
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * inspecting the system's processor set configuration, as well as details
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * of each zone, such as their configured limits, and which processor
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * sets they are running in.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * The stat_thread will only update memory utilization data as often as
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * the configured config/sample_interval on the zones-monitoring service.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * The private vmusage structure unfortunately uses size_t types, and assumes
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * the caller's bitness matches the kernel's bitness. Since the getvmusage()
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * system call is contracted, and zonestatd is 32 bit, the following structures
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * are used to interact with a 32bit or 64 bit kernel.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencetypedef struct zsd_vmusage32 {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence id_t vmu_zoneid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t vmu_type;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence id_t vmu_id;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint32_t vmu_rss_all;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint32_t vmu_rss_private;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint32_t vmu_rss_shared;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint32_t vmu_swap_all;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint32_t vmu_swap_private;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint32_t vmu_swap_shared;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence} zsd_vmusage32_t;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencetypedef struct zsd_vmusage64 {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence id_t vmu_zoneid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t vmu_type;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence id_t vmu_id;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * An amd64 kernel will align the following uint64_t members, but a
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * 32bit i386 process will not without help.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int vmu_align_next_members_on_8_bytes;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t vmu_rss_all;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t vmu_rss_private;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t vmu_rss_shared;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t vmu_swap_all;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t vmu_swap_private;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t vmu_swap_shared;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence} zsd_vmusage64_t;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestruct zsd_zone;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/* Used to store a zone's usage of a pset */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencetypedef struct zsd_pset_usage {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence struct zsd_zone *zsu_zone;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence struct zsd_pset *zsu_pset;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_node_t zsu_next;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zoneid_t zsu_zoneid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence boolean_t zsu_found; /* zone bound at end of interval */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence boolean_t zsu_active; /* zone was bound during interval */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence boolean_t zsu_new; /* zone newly bound in this interval */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence boolean_t zsu_deleted; /* zone was unbound in this interval */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence boolean_t zsu_empty; /* no procs in pset in this interval */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence time_t zsu_start; /* time when zone was found in pset */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence hrtime_t zsu_hrstart; /* time when zone was found in pset */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsu_cpu_shares;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t zsu_scheds; /* schedulers found in this pass */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence timestruc_t zsu_cpu_usage; /* cpu time used */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence} zsd_pset_usage_t;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/* Used to store a pset's utilization */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencetypedef struct zsd_pset {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence psetid_t zsp_id;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_node_t zsp_next;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char zsp_name[ZS_PSETNAME_MAX];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t zsp_cputype; /* default, dedicated or shared */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence boolean_t zsp_found; /* pset found at end of interval */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence boolean_t zsp_new; /* pset new in this interval */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence boolean_t zsp_deleted; /* pset deleted in this interval */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence boolean_t zsp_active; /* pset existed during interval */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence boolean_t zsp_empty; /* no processes in pset */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence time_t zsp_start;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence hrtime_t zsp_hrstart;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsp_online; /* online cpus in interval */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsp_size; /* size in this interval */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsp_min; /* configured min in this interval */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsp_max; /* configured max in this interval */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int64_t zsp_importance; /* configured max in this interval */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t zsp_scheds; /* scheds of processes found in pset */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsp_cpu_shares; /* total shares in this interval */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence timestruc_t zsp_total_time;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence timestruc_t zsp_usage_kern;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence timestruc_t zsp_usage_zones;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Individual zone usages of pset */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_t zsp_usage_list;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int zsp_nusage;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Summed kstat values from individual cpus in pset */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence timestruc_t zsp_idle;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence timestruc_t zsp_intr;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence timestruc_t zsp_kern;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence timestruc_t zsp_user;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence} zsd_pset_t;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/* Used to track an individual cpu's utilization as reported by kstats */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencetypedef struct zsd_cpu {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence processorid_t zsc_id;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_node_t zsc_next;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence psetid_t zsc_psetid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence psetid_t zsc_psetid_prev;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_pset_t *zsc_pset;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence boolean_t zsc_found; /* cpu online in this interval */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence boolean_t zsc_onlined; /* cpu onlined during this interval */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence boolean_t zsc_offlined; /* cpu offlined during this interval */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence boolean_t zsc_active; /* cpu online during this interval */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence boolean_t zsc_allocated; /* True if cpu has ever been found */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* kstats this interval */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsc_nsec_idle;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsc_nsec_intr;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsc_nsec_kern;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsc_nsec_user;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* kstats in most recent interval */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsc_nsec_idle_prev;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsc_nsec_intr_prev;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsc_nsec_kern_prev;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsc_nsec_user_prev;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Total kstat increases since zonestatd started reading kstats */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence timestruc_t zsc_idle;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence timestruc_t zsc_intr;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence timestruc_t zsc_kern;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence timestruc_t zsc_user;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence} zsd_cpu_t;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/* Used to describe an individual zone and its utilization */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencetypedef struct zsd_zone {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zoneid_t zsz_id;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_node_t zsz_next;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char zsz_name[ZS_ZONENAME_MAX];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t zsz_cputype;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t zsz_iptype;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence time_t zsz_start;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence hrtime_t zsz_hrstart;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char zsz_pool[ZS_POOLNAME_MAX];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char zsz_pset[ZS_PSETNAME_MAX];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int zsz_default_sched;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* These are deduced by inspecting processes */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence psetid_t zsz_psetid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t zsz_scheds;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence boolean_t zsz_new; /* zone booted during this interval */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence boolean_t zsz_deleted; /* halted during this interval */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence boolean_t zsz_active; /* running in this interval */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence boolean_t zsz_empty; /* no processes in this interval */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence boolean_t zsz_gone; /* not installed in this interval */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence boolean_t zsz_found; /* Running at end of this interval */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsz_cpu_shares;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsz_cpu_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsz_ram_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsz_locked_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsz_vm_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsz_cpus_online;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence timestruc_t zsz_cpu_usage; /* cpu time of cpu cap */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence timestruc_t zsz_cap_time; /* cpu time of cpu cap */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence timestruc_t zsz_share_time; /* cpu time of share of cpu */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence timestruc_t zsz_pset_time; /* time of all psets zone is bound to */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsz_usage_ram;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsz_usage_locked;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsz_usage_vm;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsz_processes_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsz_lwps_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsz_shm_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsz_shmids_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsz_semids_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsz_msgids_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsz_lofi_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsz_processes;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsz_lwps;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsz_shm;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsz_shmids;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsz_semids;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsz_msgids;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsz_lofi;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence} zsd_zone_t;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Used to track the cpu usage of an individual processes.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * zonestatd sweeps /proc each interval and charges the cpu usage of processes.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * to their zone. As processes exit, their extended accounting records are
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * read and the difference of their total and known usage is charged to their
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * zone.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * If a process is never seen in /proc, the total usage on its extended
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * accounting record will be charged to its zone.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencetypedef struct zsd_proc {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_node_t zspr_next;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pid_t zspr_ppid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence psetid_t zspr_psetid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zoneid_t zspr_zoneid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int zspr_sched;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence timestruc_t zspr_usage;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence} zsd_proc_t;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/* Used to track the overall resource usage of the system */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencetypedef struct zsd_system {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zss_ram_total;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zss_ram_kern;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zss_ram_zones;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zss_locked_kern;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zss_locked_zones;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zss_vm_total;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zss_vm_kern;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zss_vm_zones;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zss_swap_total;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zss_swap_used;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence timestruc_t zss_idle;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence timestruc_t zss_intr;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence timestruc_t zss_kern;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence timestruc_t zss_user;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence timestruc_t zss_cpu_total_time;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence timestruc_t zss_cpu_usage_kern;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence timestruc_t zss_cpu_usage_zones;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zss_maxpid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zss_processes_max;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zss_lwps_max;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zss_shm_max;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zss_shmids_max;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zss_semids_max;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zss_msgids_max;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zss_lofi_max;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zss_processes;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zss_lwps;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zss_shm;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zss_shmids;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zss_semids;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zss_msgids;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zss_lofi;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zss_ncpus;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zss_ncpus_online;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence} zsd_system_t;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * A dumping ground for various information and structures used to compute
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * utilization.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * This structure is used to track the system while clients are connected.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * When The first client connects, a zsd_ctl is allocated and configured by
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * zsd_open(). When all clients disconnect, the zsd_ctl is closed.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencetypedef struct zsd_ctl {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence kstat_ctl_t *zsctl_kstat_ctl;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* To track extended accounting */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int zsctl_proc_fd; /* Log currently being used */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ea_file_t zsctl_proc_eaf;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence struct stat64 zsctl_proc_stat;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int zsctl_proc_open;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int zsctl_proc_fd_next; /* Log file to use next */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ea_file_t zsctl_proc_eaf_next;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence struct stat64 zsctl_proc_stat_next;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int zsctl_proc_open_next;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* pool configuration handle */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pool_conf_t *zsctl_pool_conf;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int zsctl_pool_status;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int zsctl_pool_changed;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* The above usage tacking structures */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_system_t *zsctl_system;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_t zsctl_zones;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_t zsctl_psets;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_t zsctl_cpus;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_cpu_t *zsctl_cpu_array;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_proc_t *zsctl_proc_array;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Various system info */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsctl_maxcpuid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsctl_maxproc;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsctl_kern_bits;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsctl_pagesize;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Used to track time available under a cpu cap. */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsctl_hrtime;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsctl_hrtime_prev;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence timestruc_t zsctl_hrtime_total;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence struct timeval zsctl_timeofday;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Caches for arrays allocated for use by various system calls */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence psetid_t *zsctl_pset_cache;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t zsctl_pset_ncache;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence processorid_t *zsctl_cpu_cache;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t zsctl_cpu_ncache;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zoneid_t *zsctl_zone_cache;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t zsctl_zone_ncache;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence struct swaptable *zsctl_swap_cache;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsctl_swap_cache_size;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsctl_swap_cache_num;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_vmusage64_t *zsctl_vmusage_cache;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t zsctl_vmusage_cache_num;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Info about procfs for scanning /proc */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence struct dirent *zsctl_procfs_dent;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence long zsctl_procfs_dent_size;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pool_value_t *zsctl_pool_vals[3];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Counts on tracked entities */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t zsctl_nzones;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t zsctl_npsets;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t zsctl_npset_usages;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence} zsd_ctl_t;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_ctl_t *g_ctl;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceboolean_t g_open; /* True if g_ctl is open */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceint g_hasclient; /* True if any clients are connected */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * The usage cache is updated by the stat_thread, and copied to clients by
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * the zsd_stat_server. Mutex and cond are to synchronize between the
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * stat_thread and the stat_server.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezs_usage_cache_t *g_usage_cache;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencemutex_t g_usage_cache_lock;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencecond_t g_usage_cache_kick;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceuint_t g_usage_cache_kickers;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencecond_t g_usage_cache_wait;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencechar *g_usage_cache_buf;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceuint_t g_usage_cache_bufsz;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceuint64_t g_gen_next;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/* fds of door servers */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceint g_server_door;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceint g_stat_door;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Starting and current time. Used to throttle memory calculation, and to
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * mark new zones and psets with their boot and creation time.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencetime_t g_now;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencetime_t g_start;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencehrtime_t g_hrnow;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencehrtime_t g_hrstart;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceuint64_t g_interval;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * main() thread.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencethread_t g_main;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/* PRINTFLIKE1 */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_warn(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, gettext("zonestat: Warning: "));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) vfprintf(stderr, fmt, alist);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) fprintf(stderr, "\n");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence va_end(alist);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/* PRINTFLIKE1 */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_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, gettext("zonestat: Error: "));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) vfprintf(stderr, fmt, alist);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) fprintf(stderr, "\n");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence va_end(alist);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence exit(1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/* Turns on extended accounting if not configured externally */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceint
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_enable_cpu_stats()
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char *path = ZONESTAT_EXACCT_FILE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char oldfile[MAXPATHLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int ret, state = AC_ON;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ac_res_t res[6];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Start a new accounting file if accounting not configured
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * externally.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence res[0].ar_id = AC_PROC_PID;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence res[0].ar_state = AC_ON;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence res[1].ar_id = AC_PROC_ANCPID;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence res[1].ar_state = AC_ON;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence res[2].ar_id = AC_PROC_CPU;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence res[2].ar_state = AC_ON;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence res[3].ar_id = AC_PROC_TIME;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence res[3].ar_state = AC_ON;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence res[4].ar_id = AC_PROC_ZONENAME;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence res[4].ar_state = AC_ON;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence res[5].ar_id = AC_NONE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence res[5].ar_state = AC_ON;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (acctctl(AC_PROC | AC_RES_SET, res, sizeof (res)) != 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext("Unable to set accounting resources"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (-1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Only set accounting file if none is configured */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ret = acctctl(AC_PROC | AC_FILE_GET, oldfile, sizeof (oldfile));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ret < 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) unlink(path);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (acctctl(AC_PROC | AC_FILE_SET, path, strlen(path) + 1)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence == -1) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext("Unable to set accounting file"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (-1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (acctctl(AC_PROC | AC_STATE_SET, &state, sizeof (state)) == -1) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext("Unable to enable accounting"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (-1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/* Turns off extended accounting if not configured externally */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceint
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_disable_cpu_stats()
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char *path = ZONESTAT_EXACCT_FILE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int ret, state = AC_OFF;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ac_res_t res[6];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char oldfile[MAXPATHLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* If accounting file is externally configured, leave it alone */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ret = acctctl(AC_PROC | AC_FILE_GET, oldfile, sizeof (oldfile));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ret == 0 && strcmp(oldfile, path) != 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence res[0].ar_id = AC_PROC_PID;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence res[0].ar_state = AC_OFF;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence res[1].ar_id = AC_PROC_ANCPID;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence res[1].ar_state = AC_OFF;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence res[2].ar_id = AC_PROC_CPU;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence res[2].ar_state = AC_OFF;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence res[3].ar_id = AC_PROC_TIME;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence res[3].ar_state = AC_OFF;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence res[4].ar_id = AC_PROC_ZONENAME;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence res[4].ar_state = AC_OFF;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence res[5].ar_id = AC_NONE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence res[5].ar_state = AC_OFF;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (acctctl(AC_PROC | AC_RES_SET, res, sizeof (res)) != 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext("Unable to clear accounting resources"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (-1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (acctctl(AC_PROC | AC_FILE_SET, NULL, 0) == -1) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext("Unable to clear accounting file"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (-1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (acctctl(AC_PROC | AC_STATE_SET, &state, sizeof (state)) == -1) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext("Unable to diable accounting"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (-1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) unlink(path);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * If not configured externally, deletes the current extended accounting file
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * and starts a new one.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Since the stat_thread holds an open handle to the accounting file, it will
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * read all remaining entries from the old file before switching to
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * read the new one.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceint
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_roll_exacct(void)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int ret;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char *path = ZONESTAT_EXACCT_FILE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char oldfile[MAXPATHLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* If accounting file is externally configured, leave it alone */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ret = acctctl(AC_PROC | AC_FILE_GET, oldfile, sizeof (oldfile));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ret == 0 && strcmp(oldfile, path) != 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (unlink(path) != 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Roll it next time */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (acctctl(AC_PROC | AC_FILE_SET, path, strlen(path) + 1) == -1) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext("Unable to set accounting file"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (-1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/* Contract stuff for zone_enter() */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceint
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceinit_template(void)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int fd;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int err = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence fd = open64(CTFS_ROOT "/process/template", O_RDWR);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (fd == -1)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (-1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * For now, zoneadmd doesn't do anything with the contract.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Deliver no events, don't inherit, and allow it to be orphaned.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence err |= ct_tmpl_set_critical(fd, 0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence err |= ct_tmpl_set_informative(fd, 0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence err |= ct_pr_tmpl_set_fatal(fd, CT_PR_EV_HWERR);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence err |= ct_pr_tmpl_set_param(fd, CT_PR_PGRPONLY | CT_PR_REGENT);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (err || ct_tmpl_activate(fd)) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) close(fd);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (-1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (fd);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Contract stuff for zone_enter()
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceint
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencecontract_latest(ctid_t *id)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int cfd, r;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ct_stathdl_t st;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctid_t result;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if ((cfd = open64(CTFS_ROOT "/process/latest", O_RDONLY)) == -1)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (errno);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if ((r = ct_status_read(cfd, CTD_COMMON, &st)) != 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) close(cfd);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (r);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence result = ct_status_get_id(st);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ct_status_free(st);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) close(cfd);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *id = result;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic int
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceclose_on_exec(int fd)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int flags = fcntl(fd, F_GETFD, 0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if ((flags != -1) && (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) != -1))
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (-1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceint
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencecontract_open(ctid_t ctid, const char *type, const char *file, int oflag)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char path[PATH_MAX];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int n, fd;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (type == NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence type = "all";
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence n = snprintf(path, PATH_MAX, CTFS_ROOT "/%s/%ld/%s", type, ctid, file);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (n >= sizeof (path)) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence errno = ENAMETOOLONG;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (-1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence fd = open64(path, oflag);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (fd != -1) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (close_on_exec(fd) == -1) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int err = errno;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) close(fd);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence errno = err;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (-1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (fd);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceint
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencecontract_abandon_id(ctid_t ctid)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int fd, err;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence fd = contract_open(ctid, "all", "ctl", O_WRONLY);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (fd == -1)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (errno);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence err = ct_ctl_abandon(fd);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) close(fd);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (err);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Attach the zsd_server to a zone. Called for each zone when zonestatd
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * starts, and for each newly booted zone when zoneadmd contacts the zsd_server
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Zone_enter is used to avoid reaching into zone to fattach door.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_fattach_zone(zoneid_t zid, int door, boolean_t detach_only)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char *path = ZS_DOOR_PATH;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int fd, pid, stat, tmpl_fd;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctid_t ct;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if ((tmpl_fd = init_template()) == -1) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn("Unable to init template");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pid = forkx(0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pid < 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) ct_tmpl_clear(tmpl_fd);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext(
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "Unable to fork to add zonestat to zoneid %d\n"), zid);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pid == 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) ct_tmpl_clear(tmpl_fd);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) close(tmpl_fd);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (zid != 0 && zone_enter(zid) != 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (errno == EINVAL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence _exit(0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence _exit(1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) fdetach(path);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) unlink(path);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (detach_only)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence _exit(0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence fd = open(path, O_CREAT|O_RDWR, 0644);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (fd < 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence _exit(2);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (fattach(door, path) != 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence _exit(3);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence _exit(0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (contract_latest(&ct) == -1)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ct = -1;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) ct_tmpl_clear(tmpl_fd);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) close(tmpl_fd);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) contract_abandon_id(ct);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence while (waitpid(pid, &stat, 0) != pid)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (WIFEXITED(stat) && WEXITSTATUS(stat) == 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext("Unable to attach door to zoneid: %d"), zid);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (WEXITSTATUS(stat) == 1)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext("Cannot entering zone"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else if (WEXITSTATUS(stat) == 2)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext("Unable to create door file: %s"), path);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else if (WEXITSTATUS(stat) == 3)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext("Unable to fattach file: %s"), path);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext("Internal error entering zone: %d"), zid);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Zone lookup and allocation functions to manage list of currently running
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * zones.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic zsd_zone_t *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_lookup_zone(zsd_ctl_t *ctl, char *zonename, zoneid_t zoneid)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_zone_t *zone;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (zone = list_head(&ctl->zsctl_zones); zone != NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone = list_next(&ctl->zsctl_zones, zone)) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (strcmp(zone->zsz_name, zonename) == 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (zoneid != -1)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_id = zoneid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (zone);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic zsd_zone_t *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_lookup_zone_byid(zsd_ctl_t *ctl, zoneid_t zoneid)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_zone_t *zone;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (zone = list_head(&ctl->zsctl_zones); zone != NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone = list_next(&ctl->zsctl_zones, zone)) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (zone->zsz_id == zoneid)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (zone);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic zsd_zone_t *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_allocate_zone(zsd_ctl_t *ctl, char *zonename, zoneid_t zoneid)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_zone_t *zone;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if ((zone = (zsd_zone_t *)calloc(1, sizeof (zsd_zone_t))) == NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) strlcpy(zone->zsz_name, zonename, sizeof (zone->zsz_name));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_id = zoneid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_found = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Allocate as deleted so if not found in first pass, zone is deleted
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * from list. This can happen if zone is returned by zone_list, but
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * exits before first attempt to fetch zone details.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_start = g_now;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_hrstart = g_hrnow;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_deleted = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_cpu_shares = ZS_LIMIT_NONE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_cpu_cap = ZS_LIMIT_NONE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_ram_cap = ZS_LIMIT_NONE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_locked_cap = ZS_LIMIT_NONE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_vm_cap = ZS_LIMIT_NONE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_processes_cap = ZS_LIMIT_NONE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_lwps_cap = ZS_LIMIT_NONE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_shm_cap = ZS_LIMIT_NONE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_shmids_cap = ZS_LIMIT_NONE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_semids_cap = ZS_LIMIT_NONE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_msgids_cap = ZS_LIMIT_NONE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_lofi_cap = ZS_LIMIT_NONE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_nzones++;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (zone);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic zsd_zone_t *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_lookup_insert_zone(zsd_ctl_t *ctl, char *zonename, zoneid_t zoneid)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_zone_t *zone, *tmp;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if ((zone = zsd_lookup_zone(ctl, zonename, zoneid)) != NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (zone);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if ((zone = zsd_allocate_zone(ctl, zonename, zoneid)) == NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Insert sorted by zonename */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence tmp = list_head(&ctl->zsctl_zones);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence while (tmp != NULL && strcmp(zonename, tmp->zsz_name) > 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence tmp = list_next(&ctl->zsctl_zones, tmp);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_insert_before(&ctl->zsctl_zones, tmp, zone);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (zone);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Mark all zones as not existing. As zones are found, they will
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * be marked as existing. If a zone is not found, then it must have
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * halted.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_mark_zones_start(zsd_ctl_t *ctl)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_zone_t *zone;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (zone = list_head(&ctl->zsctl_zones); zone != NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone = list_next(&ctl->zsctl_zones, zone)) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_found = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Mark each zone as not using pset. If processes are found using the
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * pset, the zone will remain bound to the pset. If none of a zones
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * processes are bound to the pset, the zone's usage of the pset will
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * be deleted.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_mark_pset_usage_start(zsd_pset_t *pset)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_pset_usage_t *usage;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (usage = list_head(&pset->zsp_usage_list);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage != NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage = list_next(&pset->zsp_usage_list, usage)) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_found = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_empty = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Mark each pset as not existing. If a pset is found, it will be marked
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * as existing. If a pset is not found, it wil be deleted.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_mark_psets_start(zsd_ctl_t *ctl)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_pset_t *pset;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (pset = list_head(&ctl->zsctl_psets); pset != NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset = list_next(&ctl->zsctl_psets, pset)) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_found = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_mark_pset_usage_start(pset);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * A pset was found. Update its information
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_mark_pset_found(zsd_pset_t *pset, uint_t type, uint64_t online,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t size, uint64_t min, uint64_t max, int64_t importance)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_empty = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_deleted = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence assert(pset->zsp_found == B_FALSE);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* update pset flags */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pset->zsp_active == B_FALSE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* pset not seen on previous interval. It is new. */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_new = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_new = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_found = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_cputype = type;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_online = online;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_size = size;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_min = min;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_max = max;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_importance = importance;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_cpu_shares = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_scheds = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_active = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * A zone's process was found using a pset. Charge the process to the pset and
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * the per-zone data for the pset.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_mark_pset_usage_found(zsd_pset_usage_t *usage, uint_t sched)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_zone_t *zone = usage->zsu_zone;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_pset_t *pset = usage->zsu_pset;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Nothing to do if already found */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (usage->zsu_found == B_TRUE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto add_stats;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_found = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_empty = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_deleted = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* update usage flags */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (usage->zsu_active == B_FALSE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_new = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_new = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_scheds = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_cpu_shares = ZS_LIMIT_NONE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_active = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_empty = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_empty = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceadd_stats:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Detect zone's pset id, and if it is bound to multiple psets */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (zone->zsz_psetid == ZS_PSET_ERROR)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_psetid = pset->zsp_id;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else if (zone->zsz_psetid != pset->zsp_id)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_psetid = ZS_PSET_MULTI;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_scheds |= sched;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_scheds |= sched;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_scheds |= sched;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Record if FSS is co-habitating with conflicting scheduler */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if ((pset->zsp_scheds & ZS_SCHED_FSS) &&
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_scheds & (
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZS_SCHED_TS | ZS_SCHED_IA | ZS_SCHED_FX)) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_scheds |= ZS_SCHED_CONFLICT;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_scheds |= ZS_SCHED_CONFLICT;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/* Add cpu time for a process to a pset, zone, and system totals */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_add_usage(zsd_ctl_t *ctl, zsd_pset_usage_t *usage, timestruc_t *delta)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_system_t *system = ctl->zsctl_system;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_zone_t *zone = usage->zsu_zone;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_pset_t *pset = usage->zsu_pset;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_ADD_TIMESTRUC(usage->zsu_cpu_usage, *delta);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_ADD_TIMESTRUC(pset->zsp_usage_zones, *delta);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_ADD_TIMESTRUC(zone->zsz_cpu_usage, *delta);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_ADD_TIMESTRUC(system->zss_cpu_usage_zones, *delta);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/* Determine which processor sets have been deleted */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_mark_psets_end(zsd_ctl_t *ctl)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_pset_t *pset, *tmp;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Mark pset as not exists, and deleted if it existed
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * previous interval.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset = list_head(&ctl->zsctl_psets);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence while (pset != NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pset->zsp_found == B_FALSE) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_empty = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pset->zsp_deleted == B_TRUE) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence tmp = pset;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset = list_next(&ctl->zsctl_psets, pset);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_remove(&ctl->zsctl_psets, tmp);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence free(tmp);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_npsets--;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence continue;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Pset vanished during this interval */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_new = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_deleted = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_active = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset = list_next(&ctl->zsctl_psets, pset);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/* Determine which zones are no longer bound to processor sets */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_mark_pset_usages_end(zsd_ctl_t *ctl)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_pset_t *pset;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_zone_t *zone;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_pset_usage_t *usage, *tmp;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Mark pset as not exists, and deleted if it existed previous
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * interval.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (pset = list_head(&ctl->zsctl_psets); pset != NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset = list_next(&ctl->zsctl_psets, pset)) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage = list_head(&pset->zsp_usage_list);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence while (usage != NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Mark pset as not exists, and deleted if it existed
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * previous interval.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (usage->zsu_found == B_FALSE ||
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_zone->zsz_deleted == B_TRUE ||
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_pset->zsp_deleted == B_TRUE) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence tmp = usage;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage = list_next(&pset->zsp_usage_list,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_remove(&pset->zsp_usage_list, tmp);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence free(tmp);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_nusage--;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_npset_usages--;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence continue;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_new = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_deleted = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_active = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Add cpu shares for usages that are in FSS */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone = usage->zsu_zone;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (usage->zsu_scheds & ZS_SCHED_FSS &&
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_cpu_shares != ZS_SHARES_UNLIMITED &&
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_cpu_shares != 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone = usage->zsu_zone;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_cpu_shares = zone->zsz_cpu_shares;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_cpu_shares += zone->zsz_cpu_shares;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage = list_next(&pset->zsp_usage_list,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/* A zone has been found. Update its information */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_mark_zone_found(zsd_ctl_t *ctl, zsd_zone_t *zone, uint64_t cpu_shares,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t cpu_cap, uint64_t ram_cap, uint64_t locked_cap,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t vm_cap, uint64_t processes_cap, uint64_t processes,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t lwps_cap, uint64_t lwps, uint64_t shm_cap, uint64_t shm,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t shmids_cap, uint64_t shmids, uint64_t semids_cap,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t semids, uint64_t msgids_cap, uint64_t msgids, uint64_t lofi_cap,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t lofi, char *poolname, char *psetname, uint_t sched, uint_t cputype,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t iptype)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_system_t *sys = ctl->zsctl_system;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence assert(zone->zsz_found == B_FALSE);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Mark zone as exists, and new if it did not exist in previous
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * interval.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_found = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_empty = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_deleted = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Zone is new. Assume zone's properties are the same over entire
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * interval.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (zone->zsz_active == B_FALSE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_new = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_new = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) strlcpy(zone->zsz_pool, poolname, sizeof (zone->zsz_pool));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) strlcpy(zone->zsz_pset, psetname, sizeof (zone->zsz_pset));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_default_sched = sched;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Schedulers updated later as processes are found */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_scheds = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Cpus updated later as psets bound are identified */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_cpus_online = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_cputype = cputype;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_iptype = iptype;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_psetid = ZS_PSET_ERROR;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_cpu_cap = cpu_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_cpu_shares = cpu_shares;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_ram_cap = ram_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_locked_cap = locked_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_vm_cap = vm_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_processes_cap = processes_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_processes = processes;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_lwps_cap = lwps_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_lwps = lwps;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_shm_cap = shm_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_shm = shm;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_shmids_cap = shmids_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_shmids = shmids;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_semids_cap = semids_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_semids = semids;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_msgids_cap = msgids_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_msgids = msgids;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_lofi_cap = lofi_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_lofi = lofi;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_processes += processes;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_lwps += lwps;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_shm += shm;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_shmids += shmids;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_semids += semids;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_msgids += msgids;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_lofi += lofi;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_active = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/* Determine which zones have halted */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_mark_zones_end(zsd_ctl_t *ctl)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_zone_t *zone, *tmp;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Mark zone as not existing, or delete if it did not exist in
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * previous interval.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone = list_head(&ctl->zsctl_zones);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence while (zone != NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (zone->zsz_found == B_FALSE) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_empty = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (zone->zsz_deleted == B_TRUE) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Zone deleted in prior interval,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * so it no longer exists.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence tmp = zone;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone = list_next(&ctl->zsctl_zones, zone);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_remove(&ctl->zsctl_zones, tmp);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence free(tmp);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_nzones--;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence continue;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_new = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_deleted = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_active = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone = list_next(&ctl->zsctl_zones, zone);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Mark cpus as not existing. If a cpu is found, it will be updated. If
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * a cpu is not found, then it must have gone offline, so it will be
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * deleted.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * The kstat tracking data is rolled so that the usage since the previous
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * interval can be determined.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_mark_cpus_start(zsd_ctl_t *ctl, boolean_t roll)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_cpu_t *cpu;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Mark all cpus as not existing. As cpus are found, they will
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * be marked as existing.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (cpu = list_head(&ctl->zsctl_cpus); cpu != NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu = list_next(&ctl->zsctl_cpus, cpu)) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu->zsc_found = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (cpu->zsc_active == B_TRUE && roll) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu->zsc_psetid_prev = cpu->zsc_psetid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu->zsc_nsec_idle_prev = cpu->zsc_nsec_idle;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu->zsc_nsec_intr_prev = cpu->zsc_nsec_intr;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu->zsc_nsec_kern_prev = cpu->zsc_nsec_kern;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu->zsc_nsec_user_prev = cpu->zsc_nsec_user;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * An array the size of the maximum number of cpus is kept. Within this array
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * a list of the online cpus is maintained.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_cpu_t *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_lookup_insert_cpu(zsd_ctl_t *ctl, processorid_t cpuid)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_cpu_t *cpu;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence assert(cpuid < ctl->zsctl_maxcpuid);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu = &(ctl->zsctl_cpu_array[cpuid]);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence assert(cpuid == cpu->zsc_id);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (cpu->zsc_allocated == B_FALSE) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu->zsc_allocated = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_insert_tail(&ctl->zsctl_cpus, cpu);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (cpu);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/* A cpu has been found. Update its information */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_mark_cpu_found(zsd_cpu_t *cpu, zsd_pset_t *pset, psetid_t psetid)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * legacy processor sets, the cpu may move while zonestatd is
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * inspecting, causing it to be found twice. In this case, just
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * leave cpu in the first processor set in which it was found.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (cpu->zsc_found == B_TRUE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Mark cpu as online */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu->zsc_found = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu->zsc_offlined = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu->zsc_pset = pset;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * cpu is newly online.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (cpu->zsc_active == B_FALSE) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Cpu is newly online.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu->zsc_onlined = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu->zsc_psetid = psetid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu->zsc_psetid_prev = psetid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * cpu online during previous interval. Save properties at
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * start of interval
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu->zsc_onlined = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu->zsc_psetid = psetid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu->zsc_active = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/* Remove all offlined cpus from the list of tracked cpus */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_mark_cpus_end(zsd_ctl_t *ctl)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_cpu_t *cpu, *tmp;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int id;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Mark cpu as online or offline */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu = list_head(&ctl->zsctl_cpus);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence while (cpu != NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (cpu->zsc_found == B_FALSE) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (cpu->zsc_offlined == B_TRUE) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * cpu offlined in prior interval. It is gone.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence tmp = cpu;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu = list_next(&ctl->zsctl_cpus, cpu);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_remove(&ctl->zsctl_cpus, tmp);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Clear structure for future use */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence id = tmp->zsc_id;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence bzero(tmp, sizeof (zsd_cpu_t));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence tmp->zsc_id = id;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence tmp->zsc_allocated = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence tmp->zsc_psetid = ZS_PSET_ERROR;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence tmp->zsc_psetid_prev = ZS_PSET_ERROR;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * cpu online at start of interval. Treat
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * as still online, since it was online for
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * some portion of the interval.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu->zsc_offlined = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu->zsc_onlined = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu->zsc_active = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu->zsc_psetid = cpu->zsc_psetid_prev;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu->zsc_pset = NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu = list_next(&ctl->zsctl_cpus, cpu);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/* Some utility functions for managing the list of processor sets */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic zsd_pset_t *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_lookup_pset_byid(zsd_ctl_t *ctl, psetid_t psetid)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_pset_t *pset;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (pset = list_head(&ctl->zsctl_psets); pset != NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset = list_next(&ctl->zsctl_psets, pset)) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pset->zsp_id == psetid)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (pset);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic zsd_pset_t *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_lookup_pset(zsd_ctl_t *ctl, char *psetname, psetid_t psetid)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_pset_t *pset;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (pset = list_head(&ctl->zsctl_psets); pset != NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset = list_next(&ctl->zsctl_psets, pset)) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (strcmp(pset->zsp_name, psetname) == 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (psetid != -1)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_id = psetid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (pset);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic zsd_pset_t *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_allocate_pset(zsd_ctl_t *ctl, char *psetname, psetid_t psetid)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_pset_t *pset;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if ((pset = (zsd_pset_t *)calloc(1, sizeof (zsd_pset_t))) == NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) strlcpy(pset->zsp_name, psetname, sizeof (pset->zsp_name));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_id = psetid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_found = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Allocate as deleted so if not found in first pass, pset is deleted
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * from list. This can happen if pset is returned by pset_list, but
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * is destroyed before first attempt to fetch pset details.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_create(&pset->zsp_usage_list, sizeof (zsd_pset_usage_t),
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence offsetof(zsd_pset_usage_t, zsu_next));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_hrstart = g_hrnow;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_deleted = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_empty = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_npsets++;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (pset);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic zsd_pset_t *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_lookup_insert_pset(zsd_ctl_t *ctl, char *psetname, psetid_t psetid)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_pset_t *pset, *tmp;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if ((pset = zsd_lookup_pset(ctl, psetname, psetid)) != NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (pset);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if ((pset = zsd_allocate_pset(ctl, psetname, psetid)) == NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Insert sorted by psetname */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence tmp = list_head(&ctl->zsctl_psets);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence while (tmp != NULL && strcmp(psetname, tmp->zsp_name) > 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence tmp = list_next(&ctl->zsctl_psets, tmp);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_insert_before(&ctl->zsctl_psets, tmp, pset);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (pset);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/* Some utility functions for managing the list of zones using each pset */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic zsd_pset_usage_t *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_lookup_usage(zsd_pset_t *pset, zsd_zone_t *zone)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_pset_usage_t *usage;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (usage = list_head(&pset->zsp_usage_list); usage != NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage = list_next(&pset->zsp_usage_list, usage))
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (usage->zsu_zone == zone)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (usage);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic zsd_pset_usage_t *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_allocate_pset_usage(zsd_ctl_t *ctl, zsd_pset_t *pset, zsd_zone_t *zone)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_pset_usage_t *usage;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if ((usage = (zsd_pset_usage_t *)calloc(1, sizeof (zsd_pset_usage_t)))
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence == NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_link_init(&usage->zsu_next);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_zone = zone;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_zoneid = zone->zsz_id;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_pset = pset;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_found = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_active = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_new = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Allocate as not deleted. If a process is found in a pset for
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * a zone, the usage will not be deleted until at least the next
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * interval.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_start = g_now;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_hrstart = g_hrnow;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_deleted = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_empty = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_scheds = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_cpu_shares = ZS_LIMIT_NONE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_npset_usages++;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_nusage++;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (usage);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic zsd_pset_usage_t *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_lookup_insert_usage(zsd_ctl_t *ctl, zsd_pset_t *pset, zsd_zone_t *zone)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_pset_usage_t *usage, *tmp;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if ((usage = zsd_lookup_usage(pset, zone))
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence != NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (usage);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if ((usage = zsd_allocate_pset_usage(ctl, pset, zone)) == NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence tmp = list_head(&pset->zsp_usage_list);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence while (tmp != NULL && strcmp(zone->zsz_name, tmp->zsu_zone->zsz_name)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence > 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence tmp = list_next(&pset->zsp_usage_list, tmp);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_insert_before(&pset->zsp_usage_list, tmp, usage);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (usage);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_refresh_system(zsd_ctl_t *ctl)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_system_t *system = ctl->zsctl_system;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Re-count these values each interval */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence system->zss_processes = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence system->zss_lwps = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence system->zss_shm = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence system->zss_shmids = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence system->zss_semids = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence system->zss_msgids = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence system->zss_lofi = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/* Reads each cpu's kstats, and adds the usage to the cpu's pset */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_update_cpu_stats(zsd_ctl_t *ctl, zsd_cpu_t *cpu)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_system_t *sys;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence processorid_t cpuid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_pset_t *pset_prev;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_pset_t *pset;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence kstat_t *kstat;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence kstat_named_t *knp;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence kid_t kid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t idle, intr, kern, user;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys = ctl->zsctl_system;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset = cpu->zsc_pset;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence knp = NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence kid = -1;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpuid = cpu->zsc_id;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Get the cpu time totals for this cpu */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence kstat = kstat_lookup(ctl->zsctl_kstat_ctl, "cpu", cpuid, "sys");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (kstat == NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence kid = kstat_read(ctl->zsctl_kstat_ctl, kstat, NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (kid == -1)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence knp = kstat_data_lookup(kstat, "cpu_nsec_idle");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (knp == NULL || knp->data_type != KSTAT_DATA_UINT64)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence idle = knp->value.ui64;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence knp = kstat_data_lookup(kstat, "cpu_nsec_kernel");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (knp == NULL || knp->data_type != KSTAT_DATA_UINT64)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence kern = knp->value.ui64;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence knp = kstat_data_lookup(kstat, "cpu_nsec_user");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (knp == NULL || knp->data_type != KSTAT_DATA_UINT64)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence user = knp->value.ui64;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Tracking intr time per cpu just exists for future enhancements.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * The value is presently always zero.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence intr = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu->zsc_nsec_idle = idle;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu->zsc_nsec_intr = intr;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu->zsc_nsec_kern = kern;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu->zsc_nsec_user = user;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (cpu->zsc_onlined == B_TRUE) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * cpu is newly online. There is no reference value,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * so just record its current stats for comparison
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * on next stat read.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu->zsc_nsec_idle_prev = cpu->zsc_nsec_idle;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu->zsc_nsec_intr_prev = cpu->zsc_nsec_intr;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu->zsc_nsec_kern_prev = cpu->zsc_nsec_kern;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu->zsc_nsec_user_prev = cpu->zsc_nsec_user;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Calculate relative time since previous refresh.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Paranoia. Don't let time go backwards.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence idle = intr = kern = user = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (cpu->zsc_nsec_idle > cpu->zsc_nsec_idle_prev)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence idle = cpu->zsc_nsec_idle - cpu->zsc_nsec_idle_prev;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (cpu->zsc_nsec_intr > cpu->zsc_nsec_intr_prev)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence intr = cpu->zsc_nsec_intr - cpu->zsc_nsec_intr_prev;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (cpu->zsc_nsec_kern > cpu->zsc_nsec_kern_prev)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence kern = cpu->zsc_nsec_kern - cpu->zsc_nsec_kern_prev;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (cpu->zsc_nsec_user > cpu->zsc_nsec_user_prev)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence user = cpu->zsc_nsec_user - cpu->zsc_nsec_user_prev;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Update totals for cpu usage */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_ADD_NANOSEC(cpu->zsc_idle, idle);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_ADD_NANOSEC(cpu->zsc_intr, intr);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_ADD_NANOSEC(cpu->zsc_kern, kern);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_ADD_NANOSEC(cpu->zsc_user, user);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Add cpu's stats to its pset if it is known to be in
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * the pset since previous read.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (cpu->zsc_psetid == cpu->zsc_psetid_prev ||
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu->zsc_psetid_prev == ZS_PSET_ERROR ||
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (pset_prev = zsd_lookup_pset_byid(ctl,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu->zsc_psetid_prev)) == NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_ADD_NANOSEC(pset->zsp_idle, idle);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_ADD_NANOSEC(pset->zsp_intr, intr);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_ADD_NANOSEC(pset->zsp_kern, kern);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_ADD_NANOSEC(pset->zsp_user, user);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Last pset was different than current pset.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Best guess is to split usage between the two.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_ADD_NANOSEC(pset_prev->zsp_idle, idle / 2);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_ADD_NANOSEC(pset_prev->zsp_intr, intr / 2);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_ADD_NANOSEC(pset_prev->zsp_kern, kern / 2);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_ADD_NANOSEC(pset_prev->zsp_user, user / 2);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_ADD_NANOSEC(pset->zsp_idle,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (idle / 2) + (idle % 2));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_ADD_NANOSEC(pset->zsp_intr,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (intr / 2) + (intr % 2));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_ADD_NANOSEC(pset->zsp_kern,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (kern / 2) + (kern % 2));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_ADD_NANOSEC(pset->zsp_user,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (user / 2) + (user % 2));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_ADD_NANOSEC(sys->zss_idle, idle);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_ADD_NANOSEC(sys->zss_intr, intr);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_ADD_NANOSEC(sys->zss_kern, kern);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_ADD_NANOSEC(sys->zss_user, user);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/* Determine the details of a processor set by pset_id */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic int
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_get_pool_pset(zsd_ctl_t *ctl, psetid_t psetid, char *psetname,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence size_t namelen, uint_t *cputype, uint64_t *online, uint64_t *size,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t *min, uint64_t *max, int64_t *importance)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t old, num;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pool_conf_t *conf = ctl->zsctl_pool_conf;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pool_value_t **vals = ctl->zsctl_pool_vals;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pool_resource_t **res_list = NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pool_resource_t *pset;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pool_component_t **cpus = NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence processorid_t *cache;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence const char *string;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t uint64;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int64_t int64;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int i, ret, type;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ctl->zsctl_pool_status == POOL_DISABLED) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Inspect legacy psets
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (;;) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence old = num = ctl->zsctl_cpu_ncache;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ret = pset_info(psetid, &type, &num,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_cpu_cache);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ret < 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* pset is gone. Tell caller to retry */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence errno = EINTR;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (-1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (num <= old) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Success */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if ((cache = (processorid_t *)realloc(
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_cpu_cache, num *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sizeof (processorid_t))) != NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_cpu_ncache = num;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_cpu_cache = cache;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Could not allocate to get new cpu list.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext(
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "Could not allocate for cpu list"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence errno = ENOMEM;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (-1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Old school pset. Just make min and max equal
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * to its size
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (psetid == ZS_PSET_DEFAULT) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *cputype = ZS_CPUTYPE_DEFAULT_PSET;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) strlcpy(psetname, "pset_default", namelen);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *cputype = ZS_CPUTYPE_PSRSET_PSET;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(psetname, namelen,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "SUNWlegacy_pset_%d", psetid);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Just treat legacy pset as a simple pool pset
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *online = num;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *size = num;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *min = num;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *max = num;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *importance = 1;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Look up the pool pset using the pset id */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence res_list = NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pool_value_set_int64(vals[1], psetid);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pool_value_set_name(vals[1], "pset.sys_id")
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence != PO_SUCCESS)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto err;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pool_value_set_name(vals[0], "type") != PO_SUCCESS)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto err;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pool_value_set_string(vals[0], "pset") != PO_SUCCESS)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto err;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if ((res_list = pool_query_resources(conf, &num, vals)) == NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto err;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (num != 1)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto err;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset = res_list[0];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence free(res_list);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence res_list = NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pool_get_property(conf, pool_resource_to_elem(conf, pset),
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "pset.name", vals[0]) != POC_STRING ||
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pool_value_get_string(vals[0], &string) != PO_SUCCESS)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto err;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) strlcpy(psetname, string, namelen);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (strncmp(psetname, "SUNWtmp", strlen("SUNWtmp")) == 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *cputype = ZS_CPUTYPE_DEDICATED;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else if (psetid == ZS_PSET_DEFAULT)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *cputype = ZS_CPUTYPE_DEFAULT_PSET;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *cputype = ZS_CPUTYPE_POOL_PSET;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Get size, min, max, and importance */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pool_get_property(conf, pool_resource_to_elem(conf,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset), "pset.size", vals[0]) == POC_UINT &&
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pool_value_get_uint64(vals[0], &uint64) == PO_SUCCESS)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *size = uint64;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *size = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Get size, min, max, and importance */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pool_get_property(conf, pool_resource_to_elem(conf,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset), "pset.min", vals[0]) == POC_UINT &&
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pool_value_get_uint64(vals[0], &uint64) == PO_SUCCESS)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *min = uint64;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *min = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (*min >= ZSD_PSET_UNLIMITED)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *min = ZS_LIMIT_NONE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pool_get_property(conf, pool_resource_to_elem(conf,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset), "pset.max", vals[0]) == POC_UINT &&
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pool_value_get_uint64(vals[0], &uint64) == PO_SUCCESS)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *max = uint64;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *max = ZS_LIMIT_NONE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (*max >= ZSD_PSET_UNLIMITED)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *max = ZS_LIMIT_NONE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pool_get_property(conf, pool_resource_to_elem(conf,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset), "pset.importance", vals[0]) == POC_INT &&
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pool_value_get_int64(vals[0], &int64) == PO_SUCCESS)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *importance = int64;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *importance = (uint64_t)1;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *online = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (*size == 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* get cpus */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpus = pool_query_resource_components(conf, pset, &num, NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (cpus == NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto err;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Make sure there is space for cpu id list */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (num > ctl->zsctl_cpu_ncache) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if ((cache = (processorid_t *)realloc(
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_cpu_cache, num *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sizeof (processorid_t))) != NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_cpu_ncache = num;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_cpu_cache = cache;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Could not allocate to get new cpu list.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext(
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "Could not allocate for cpu list"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto err;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* count the online cpus */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (i = 0; i < num; i++) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pool_get_property(conf, pool_component_to_elem(
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence conf, cpus[i]), "cpu.status", vals[0]) != POC_STRING ||
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pool_value_get_string(vals[0], &string) != PO_SUCCESS)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto err;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (strcmp(string, "on-line") != 0 &&
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence strcmp(string, "no-intr") != 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence continue;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pool_get_property(conf, pool_component_to_elem(
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence conf, cpus[i]), "cpu.sys_id", vals[0]) != POC_INT ||
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pool_value_get_int64(vals[0], &int64) != PO_SUCCESS)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto err;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (*online)++;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_cpu_cache[i] = (psetid_t)int64;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence free(cpus);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceerr:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (res_list != NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence free(res_list);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (cpus != NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence free(cpus);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * The pools operations should succeed since the conf is a consistent
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * snapshot. Tell caller there is no need to retry.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence errno = EINVAL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (-1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Update the current list of processor sets.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * This also updates the list of online cpus, and each cpu's pset membership.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_refresh_psets(zsd_ctl_t *ctl)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int i, j, ret, state;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t old, num;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t cputype;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int64_t sys_id, importance;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t online, size, min, max;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_system_t *system;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_pset_t *pset;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_cpu_t *cpu;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence psetid_t *cache;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char psetname[ZS_PSETNAME_MAX];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence processorid_t cpuid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pool_value_t *pv_save = NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pool_resource_t **res_list = NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pool_resource_t *res;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pool_value_t **vals;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pool_conf_t *conf;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence boolean_t roll_cpus = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Zero cpu counters to recount them */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence system = ctl->zsctl_system;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence system->zss_ncpus = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence system->zss_ncpus_online = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceretry:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ret = pool_get_status(&state);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ret == 0 && state == POOL_ENABLED) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence conf = ctl->zsctl_pool_conf;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vals = ctl->zsctl_pool_vals;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pv_save = vals[1];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vals[1] = NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ctl->zsctl_pool_status == POOL_DISABLED) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pool_conf_open(ctl->zsctl_pool_conf,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pool_dynamic_location(), PO_RDONLY) == 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_pool_status = POOL_ENABLED;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_pool_changed = POU_PSET;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_pool_changed = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ret = pool_conf_update(ctl->zsctl_pool_conf,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence &(ctl->zsctl_pool_changed));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ret < 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Pools must have become disabled */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) pool_conf_close(ctl->zsctl_pool_conf);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_pool_status = POOL_DISABLED;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pool_error() == POE_SYSTEM && errno ==
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ENOTACTIVE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto retry;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext(
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "Unable to update pool configuration"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Not able to get pool info. Don't update. */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto err;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Get the list of psets using libpool */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pool_value_set_name(vals[0], "type") != PO_SUCCESS)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto err;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pool_value_set_string(vals[0], "pset") != PO_SUCCESS)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto err;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if ((res_list = pool_query_resources(conf, &num, vals))
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence == NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto err;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (num > ctl->zsctl_pset_ncache) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if ((cache = (psetid_t *)realloc(ctl->zsctl_pset_cache,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (num) * sizeof (psetid_t))) == NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto err;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_pset_ncache = num;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_pset_cache = cache;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Save the pset id of each pset */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (i = 0; i < num; i++) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence res = res_list[i];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pool_get_property(conf, pool_resource_to_elem(conf,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence res), "pset.sys_id", vals[0]) != POC_INT ||
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pool_value_get_int64(vals[0], &sys_id)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence != PO_SUCCESS)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto err;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_pset_cache[i] = (int)sys_id;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vals[1] = pv_save;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pv_save = NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ctl->zsctl_pool_status == POOL_ENABLED) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) pool_conf_close(ctl->zsctl_pool_conf);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_pool_status = POOL_DISABLED;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Get the pset list using legacy psets */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (;;) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence old = num = ctl->zsctl_pset_ncache;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) pset_list(ctl->zsctl_pset_cache, &num);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if ((num + 1) <= old) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if ((cache = (psetid_t *)realloc(ctl->zsctl_pset_cache,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (num + 1) * sizeof (psetid_t))) != NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_pset_ncache = num + 1;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_pset_cache = cache;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Could not allocate to get new pset list.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Give up
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Add the default pset to list */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_pset_cache[num] = ctl->zsctl_pset_cache[0];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_pset_cache[0] = ZS_PSET_DEFAULT;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence num++;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencepsets_changed:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_mark_cpus_start(ctl, roll_cpus);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_mark_psets_start(ctl);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence roll_cpus = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Refresh cpu membership of all psets */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (i = 0; i < num; i++) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Get pool pset information */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys_id = ctl->zsctl_pset_cache[i];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (zsd_get_pool_pset(ctl, sys_id, psetname, sizeof (psetname),
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence &cputype, &online, &size, &min, &max, &importance)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence != 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (errno == EINTR)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto psets_changed;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext("Failed to get info for pset %d"),
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys_id);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence continue;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence system->zss_ncpus += size;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence system->zss_ncpus_online += online;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset = zsd_lookup_insert_pset(ctl, psetname,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_pset_cache[i]);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* update pset info */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_mark_pset_found(pset, cputype, online, size, min,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence max, importance);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* update each cpu in pset */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (j = 0; j < pset->zsp_online; j++) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpuid = ctl->zsctl_cpu_cache[j];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu = zsd_lookup_insert_cpu(ctl, cpuid);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_mark_cpu_found(cpu, pset, sys_id);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceerr:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (res_list != NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence free(res_list);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pv_save != NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vals[1] = pv_save;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Fetch the current pool and pset name for the given zone.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_get_zone_pool_pset(zsd_ctl_t *ctl, zsd_zone_t *zone,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char *pool, int poollen, char *pset, int psetlen, uint_t *cputype)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence poolid_t poolid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pool_t **pools = NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pool_resource_t **res_list = NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char poolname[ZS_POOLNAME_MAX];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char psetname[ZS_PSETNAME_MAX];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pool_conf_t *conf = ctl->zsctl_pool_conf;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pool_value_t *pv_save = NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pool_value_t **vals = ctl->zsctl_pool_vals;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence const char *string;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int ret;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int64_t int64;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t num;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ret = zone_getattr(zone->zsz_id, ZONE_ATTR_POOLID,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence &poolid, sizeof (poolid));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ret < 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto lookup_done;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pv_save = vals[1];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vals[1] = NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pools = NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence res_list = NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Default values if lookup fails */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) strlcpy(poolname, "pool_default", sizeof (poolname));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) strlcpy(psetname, "pset_default", sizeof (poolname));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *cputype = ZS_CPUTYPE_DEFAULT_PSET;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* no dedicated cpu if pools are disabled */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ctl->zsctl_pool_status == POOL_DISABLED)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto lookup_done;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Get the pool name using the id */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pool_value_set_int64(vals[0], poolid);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pool_value_set_name(vals[0], "pool.sys_id") != PO_SUCCESS)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto lookup_done;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if ((pools = pool_query_pools(conf, &num, vals)) == NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto lookup_done;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (num != 1)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto lookup_done;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pool_get_property(conf, pool_to_elem(conf, pools[0]),
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "pool.name", vals[0]) != POC_STRING ||
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pool_value_get_string(vals[0], &string) != PO_SUCCESS)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto lookup_done;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) strlcpy(poolname, (char *)string, sizeof (poolname));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Get the name of the pset for the pool */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pool_value_set_name(vals[0], "type") != PO_SUCCESS)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto lookup_done;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pool_value_set_string(vals[0], "pset") != PO_SUCCESS)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto lookup_done;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if ((res_list = pool_query_pool_resources(conf, pools[0], &num, vals))
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence == NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto lookup_done;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (num != 1)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto lookup_done;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pool_get_property(conf, pool_resource_to_elem(conf,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence res_list[0]), "pset.sys_id", vals[0]) != POC_INT ||
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pool_value_get_int64(vals[0], &int64) != PO_SUCCESS)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto lookup_done;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (int64 == ZS_PSET_DEFAULT)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *cputype = ZS_CPUTYPE_DEFAULT_PSET;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pool_get_property(conf, pool_resource_to_elem(conf,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence res_list[0]), "pset.name", vals[0]) != POC_STRING ||
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pool_value_get_string(vals[0], &string) != PO_SUCCESS)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto lookup_done;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) strlcpy(psetname, (char *)string, sizeof (psetname));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (strncmp(psetname, "SUNWtmp_", strlen("SUNWtmp_")) == 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *cputype = ZS_CPUTYPE_DEDICATED;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (strncmp(psetname, "SUNW_legacy_", strlen("SUNW_legacy_")) == 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *cputype = ZS_CPUTYPE_PSRSET_PSET;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *cputype = ZS_CPUTYPE_POOL_PSET;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencelookup_done:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pv_save != NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vals[1] = pv_save;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (res_list)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence free(res_list);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pools)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence free(pools);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) strlcpy(pool, poolname, poollen);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) strlcpy(pset, psetname, psetlen);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/* Convert scheduler names to ZS_* scheduler flags */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic uint_t
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_schedname2int(char *clname, int pri)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t sched = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (strcmp(clname, "TS") == 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sched = ZS_SCHED_TS;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else if (strcmp(clname, "IA") == 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sched = ZS_SCHED_IA;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else if (strcmp(clname, "FX") == 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pri > 59) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sched = ZS_SCHED_FX_60;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sched = ZS_SCHED_FX;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else if (strcmp(clname, "RT") == 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sched = ZS_SCHED_RT;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else if (strcmp(clname, "FSS") == 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sched = ZS_SCHED_FSS;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (sched);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic uint64_t
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_get_zone_rctl_limit(char *name)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence rctlblk_t *rblk;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence rblk = (rctlblk_t *)alloca(rctlblk_size());
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (getrctl(name, NULL, rblk, RCTL_FIRST)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence != 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (ZS_LIMIT_NONE);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (rctlblk_get_value(rblk));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic uint64_t
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_get_zone_rctl_usage(char *name)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence rctlblk_t *rblk;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence rblk = (rctlblk_t *)alloca(rctlblk_size());
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (getrctl(name, NULL, rblk, RCTL_USAGE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence != 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (rctlblk_get_value(rblk));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence#define ZSD_NUM_RCTL_VALS 19
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Fetch the limit information for a zone. This uses zone_enter() as the
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * getrctl(2) system call only returns rctl information for the zone of
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * the caller.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic int
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_get_zone_caps(zsd_ctl_t *ctl, zsd_zone_t *zone, uint64_t *cpu_shares,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t *cpu_cap, uint64_t *ram_cap, uint64_t *locked_cap,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t *vm_cap, uint64_t *processes_cap, uint64_t *processes,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t *lwps_cap, uint64_t *lwps, uint64_t *shm_cap, uint64_t *shm,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t *shmids_cap, uint64_t *shmids, uint64_t *semids_cap,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t *semids, uint64_t *msgids_cap, uint64_t *msgids,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t *lofi_cap, uint64_t *lofi, uint_t *sched)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int p[2], pid, tmpl_fd, ret;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctid_t ct;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char class[PC_CLNMSZ];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t vals[ZSD_NUM_RCTL_VALS];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_system_t *sys = ctl->zsctl_system;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int i = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int res = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Treat all caps as no cap on error */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *cpu_shares = ZS_LIMIT_NONE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *cpu_cap = ZS_LIMIT_NONE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *ram_cap = ZS_LIMIT_NONE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *locked_cap = ZS_LIMIT_NONE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *vm_cap = ZS_LIMIT_NONE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *processes_cap = ZS_LIMIT_NONE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *lwps_cap = ZS_LIMIT_NONE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *shm_cap = ZS_LIMIT_NONE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *shmids_cap = ZS_LIMIT_NONE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *semids_cap = ZS_LIMIT_NONE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *msgids_cap = ZS_LIMIT_NONE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *lofi_cap = ZS_LIMIT_NONE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *processes = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *lwps = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *shm = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *shmids = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *semids = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *msgids = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *lofi = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Get the ram cap first since it is a zone attr */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ret = zone_getattr(zone->zsz_id, ZONE_ATTR_PHYS_MCAP,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ram_cap, sizeof (*ram_cap));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ret < 0 || *ram_cap == 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *ram_cap = ZS_LIMIT_NONE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Get the zone's default scheduling class */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ret = zone_getattr(zone->zsz_id, ZONE_ATTR_SCHED_CLASS,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence class, sizeof (class));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ret < 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (-1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *sched = zsd_schedname2int(class, 0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* rctl caps must be fetched from within the zone */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pipe(p) != 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (-1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if ((tmpl_fd = init_template()) == -1) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) close(p[0]);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) close(p[1]);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (-1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pid = forkx(0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pid < 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) ct_tmpl_clear(tmpl_fd);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) close(p[0]);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) close(p[1]);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (-1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pid == 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) ct_tmpl_clear(tmpl_fd);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) close(tmpl_fd);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) close(p[0]);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (zone->zsz_id != getzoneid()) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (zone_enter(zone->zsz_id) < 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) close(p[1]);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence _exit(0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Get caps for zone, and write them to zonestatd parent. */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vals[i++] = zsd_get_zone_rctl_limit("zone.cpu-shares");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vals[i++] = zsd_get_zone_rctl_limit("zone.cpu-cap");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vals[i++] = zsd_get_zone_rctl_limit("zone.max-locked-memory");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vals[i++] = zsd_get_zone_rctl_limit("zone.max-swap");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vals[i++] = zsd_get_zone_rctl_limit("zone.max-processes");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vals[i++] = zsd_get_zone_rctl_usage("zone.max-processes");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vals[i++] = zsd_get_zone_rctl_limit("zone.max-lwps");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vals[i++] = zsd_get_zone_rctl_usage("zone.max-lwps");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vals[i++] = zsd_get_zone_rctl_limit("zone.max-shm-memory");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vals[i++] = zsd_get_zone_rctl_usage("zone.max-shm-memory");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vals[i++] = zsd_get_zone_rctl_limit("zone.max-shm-ids");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vals[i++] = zsd_get_zone_rctl_usage("zone.max-shm-ids");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vals[i++] = zsd_get_zone_rctl_limit("zone.max-sem-ids");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vals[i++] = zsd_get_zone_rctl_usage("zone.max-sem-ids");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vals[i++] = zsd_get_zone_rctl_limit("zone.max-msg-ids");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vals[i++] = zsd_get_zone_rctl_usage("zone.max-msg-ids");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vals[i++] = zsd_get_zone_rctl_limit("zone.max-lofi");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vals[i++] = zsd_get_zone_rctl_usage("zone.max-lofi");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (write(p[1], vals, ZSD_NUM_RCTL_VALS * sizeof (uint64_t)) !=
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZSD_NUM_RCTL_VALS * sizeof (uint64_t)) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) close(p[1]);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence _exit(1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) close(p[1]);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence _exit(0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (contract_latest(&ct) == -1)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ct = -1;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) ct_tmpl_clear(tmpl_fd);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) close(tmpl_fd);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) close(p[1]);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence while (waitpid(pid, NULL, 0) != pid)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Read cap from child in zone */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (read(p[0], vals, ZSD_NUM_RCTL_VALS * sizeof (uint64_t)) !=
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ZSD_NUM_RCTL_VALS * sizeof (uint64_t)) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence res = -1;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto cleanup;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence i = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *cpu_shares = vals[i++];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *cpu_cap = vals[i++];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *locked_cap = vals[i++];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *vm_cap = vals[i++];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *processes_cap = vals[i++];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *processes = vals[i++];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *lwps_cap = vals[i++];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *lwps = vals[i++];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *shm_cap = vals[i++];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *shm = vals[i++];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *shmids_cap = vals[i++];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *shmids = vals[i++];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *semids_cap = vals[i++];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *semids = vals[i++];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *msgids_cap = vals[i++];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *msgids = vals[i++];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *lofi_cap = vals[i++];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *lofi = vals[i++];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Interpret maximum values as no cap */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (*cpu_cap == UINT32_MAX || *cpu_cap == 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *cpu_cap = ZS_LIMIT_NONE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (*processes_cap == sys->zss_processes_max)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *processes_cap = ZS_LIMIT_NONE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (*lwps_cap == sys->zss_lwps_max)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *lwps_cap = ZS_LIMIT_NONE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (*shm_cap == sys->zss_shm_max)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *shm_cap = ZS_LIMIT_NONE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (*shmids_cap == sys->zss_shmids_max)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *shmids_cap = ZS_LIMIT_NONE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (*semids_cap == sys->zss_semids_max)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *semids_cap = ZS_LIMIT_NONE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (*msgids_cap == sys->zss_msgids_max)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *msgids_cap = ZS_LIMIT_NONE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (*lofi_cap == sys->zss_lofi_max)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *lofi_cap = ZS_LIMIT_NONE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencecleanup:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) close(p[0]);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) ct_tmpl_clear(tmpl_fd);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) close(tmpl_fd);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) contract_abandon_id(ct);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (res);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/* Update the current list of running zones */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_refresh_zones(zsd_ctl_t *ctl)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_zone_t *zone;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t old, num;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ushort_t flags;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int i, ret;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zoneid_t *cache;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t cpu_shares;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t cpu_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t ram_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t locked_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t vm_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t processes_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t processes;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t lwps_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t lwps;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t shm_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t shm;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t shmids_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t shmids;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t semids_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t semids;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t msgids_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t msgids;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t lofi_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t lofi;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char zonename[ZS_ZONENAME_MAX];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char poolname[ZS_POOLNAME_MAX];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char psetname[ZS_PSETNAME_MAX];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t sched;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t cputype;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t iptype;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Get the current list of running zones */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (;;) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence old = num = ctl->zsctl_zone_ncache;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) zone_list(ctl->zsctl_zone_cache, &num);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (num <= old)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if ((cache = (zoneid_t *)realloc(ctl->zsctl_zone_cache,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (num) * sizeof (zoneid_t))) != NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_zone_ncache = num;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_zone_cache = cache;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Could not allocate to get new zone list. Give up */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_mark_zones_start(ctl);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (i = 0; i < num; i++) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ret = getzonenamebyid(ctl->zsctl_zone_cache[i],
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zonename, sizeof (zonename));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ret < 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence continue;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone = zsd_lookup_insert_zone(ctl, zonename,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_zone_cache[i]);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ret = zone_getattr(ctl->zsctl_zone_cache[i], ZONE_ATTR_FLAGS,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence &flags, sizeof (flags));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ret < 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence continue;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (flags & ZF_NET_EXCL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence iptype = ZS_IPTYPE_EXCLUSIVE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence iptype = ZS_IPTYPE_SHARED;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_get_zone_pool_pset(ctl, zone, poolname, sizeof (poolname),
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence psetname, sizeof (psetname), &cputype);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (zsd_get_zone_caps(ctl, zone, &cpu_shares, &cpu_cap,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence &ram_cap, &locked_cap, &vm_cap, &processes_cap, &processes,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence &lwps_cap, &lwps, &shm_cap, &shm, &shmids_cap, &shmids,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence &semids_cap, &semids, &msgids_cap, &msgids, &lofi_cap,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence &lofi, &sched) != 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence continue;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_mark_zone_found(ctl, zone, cpu_shares, cpu_cap, ram_cap,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence locked_cap, vm_cap, processes_cap, processes, lwps_cap,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence lwps, shm_cap, shm, shmids_cap, shmids, semids_cap,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence semids, msgids_cap, msgids, lofi_cap, lofi, poolname,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence psetname, sched, cputype, iptype);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/* Fetch the details of a process from its psinfo_t */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_get_proc_info(zsd_ctl_t *ctl, psinfo_t *psinfo, psetid_t *psetid,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence psetid_t *prev_psetid, zoneid_t *zoneid, zoneid_t *prev_zoneid,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence timestruc_t *delta, uint_t *sched)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence timestruc_t d;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_proc_t *proc;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Get cached data for proc */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence proc = &(ctl->zsctl_proc_array[psinfo->pr_pid]);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *psetid = psinfo->pr_lwp.pr_bindpset;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (proc->zspr_psetid == ZS_PSET_ERROR)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *prev_psetid = *psetid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *prev_psetid = proc->zspr_psetid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *zoneid = psinfo->pr_zoneid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (proc->zspr_zoneid == -1)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *prev_zoneid = *zoneid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *prev_zoneid = proc->zspr_zoneid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_DELTA(d, psinfo->pr_time, proc->zspr_usage);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *delta = d;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *sched = zsd_schedname2int(psinfo->pr_lwp.pr_clname,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence psinfo->pr_lwp.pr_pri);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Update cached data for proc */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence proc->zspr_psetid = psinfo->pr_lwp.pr_bindpset;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence proc->zspr_zoneid = psinfo->pr_zoneid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence proc->zspr_sched = *sched;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence proc->zspr_usage.tv_sec = psinfo->pr_time.tv_sec;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence proc->zspr_usage.tv_nsec = psinfo->pr_time.tv_nsec;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence proc->zspr_ppid = psinfo->pr_ppid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Reset the known cpu usage of a process. This is done after a process
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * exits so that if the pid is recycled, data from its previous life is
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * not reused
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_flush_proc_info(zsd_proc_t *proc)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence proc->zspr_usage.tv_sec = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence proc->zspr_usage.tv_nsec = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Open the current extended accounting file. On initialization, open the
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * file as the current file to be used. Otherwise, open the file as the
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * next file to use of the current file reaches EOF.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic int
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_open_exacct(zsd_ctl_t *ctl, boolean_t init)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int ret, oret, state, trys = 0, flags;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int *fd, *open;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ea_file_t *eaf;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence struct stat64 *stat;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char path[MAXPATHLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * The accounting file is first opened at the tail. Following
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * opens to new accounting files are opened at the head.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (init == B_TRUE) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence flags = EO_NO_VALID_HDR | EO_TAIL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence fd = &ctl->zsctl_proc_fd;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence eaf = &ctl->zsctl_proc_eaf;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence stat = &ctl->zsctl_proc_stat;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence open = &ctl->zsctl_proc_open;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence flags = EO_NO_VALID_HDR | EO_HEAD;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence fd = &ctl->zsctl_proc_fd_next;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence eaf = &ctl->zsctl_proc_eaf_next;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence stat = &ctl->zsctl_proc_stat_next;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence open = &ctl->zsctl_proc_open_next;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *fd = -1;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *open = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceretry:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* open accounting files for cpu consumption */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ret = acctctl(AC_STATE_GET | AC_PROC, &state, sizeof (state));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ret != 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext("Unable to get process accounting state"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto err;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (state != AC_ON) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (trys > 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext(
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "Unable to enable process accounting"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto err;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) zsd_enable_cpu_stats();
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence trys++;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto retry;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ret = acctctl(AC_FILE_GET | AC_PROC, path, sizeof (path));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ret != 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext("Unable to get process accounting file"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto err;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if ((*fd = open64(path, O_RDONLY, 0)) >= 0 &&
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (oret = ea_fdopen(eaf, *fd, NULL, flags, O_RDONLY)) == 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ret = fstat64(*fd, stat);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (*fd < 0 || oret < 0 || ret < 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence struct timespec ts;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * It is possible the accounting file is momentarily unavailable
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * because it is being rolled. Try for up to half a second.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * If failure to open accounting file persists, give up.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (oret == 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) ea_close(eaf);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else if (*fd >= 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) close(*fd);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (trys > 500) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext(
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "Unable to open process accounting file"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto err;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* wait one millisecond */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ts.tv_sec = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ts.tv_nsec = NANOSEC / 1000;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) nanosleep(&ts, NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto retry;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *open = 1;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceerr:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (*fd >= 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) close(*fd);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *open = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *fd = -1;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (-1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Walk /proc and charge each process to its zone and processor set.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Then read exacct data for exited processes, and charge them as well.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_refresh_procs(zsd_ctl_t *ctl, boolean_t init)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence DIR *dir;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence struct dirent *dent;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence psinfo_t psinfo;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int fd, ret;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_proc_t *proc, *pproc, *tmp, *next;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_t pplist, plist;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_zone_t *zone, *prev_zone;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_pset_t *pset, *prev_pset;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence psetid_t psetid, prev_psetid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zoneid_t zoneid, prev_zoneid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_pset_usage_t *usage, *prev_usage;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char path[MAXPATHLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ea_object_t object;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ea_object_t pobject;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence boolean_t hrtime_expired = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence struct timeval interval_end;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence timestruc_t delta, d1, d2;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t sched = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Get the current accounting file. The current accounting file
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * may be different than the file in use, as the accounting file
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * may have been rolled, or manually changed by an admin.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ret = zsd_open_exacct(ctl, init);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ret != 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext("Unable to track process accounting"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Mark the current time as the interval end time. Don't track
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * processes that exit after this time.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) gettimeofday(&interval_end, NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence dir = opendir("/proc");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (dir == NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext("Unable to open /proc"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence dent = ctl->zsctl_procfs_dent;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) memset(dent, 0, ctl->zsctl_procfs_dent_size);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Walk all processes and compute each zone's usage on each pset. */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence while (readdir_r(dir, dent) != 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (strcmp(dent->d_name, ".") == 0 ||
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence strcmp(dent->d_name, "..") == 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence continue;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(path, sizeof (path), "/proc/%s/psinfo",
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence dent->d_name);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence fd = open(path, O_RDONLY);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (fd < 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence continue;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (read(fd, &psinfo, sizeof (psinfo)) != sizeof (psinfo)) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) close(fd);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence continue;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) close(fd);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_get_proc_info(ctl, &psinfo, &psetid, &prev_psetid,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence &zoneid, &prev_zoneid, &delta, &sched);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence d1.tv_sec = delta.tv_sec / 2;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence d1.tv_nsec = delta.tv_nsec / 2;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence d2.tv_sec = (delta.tv_sec / 2) + (delta.tv_sec % 2);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence d2.tv_nsec = (delta.tv_nsec / 2) + (delta.tv_nsec % 2);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Get the zone and pset this process is running in */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone = zsd_lookup_zone_byid(ctl, zoneid);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (zone == NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence continue;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset = zsd_lookup_pset_byid(ctl, psetid);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pset == NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence continue;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage = zsd_lookup_insert_usage(ctl, pset, zone);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (usage == NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence continue;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Get the usage of the previous zone and pset if they were
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * different.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (zoneid != prev_zoneid)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence prev_zone = zsd_lookup_zone_byid(ctl, prev_zoneid);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence prev_zone = NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (psetid != prev_psetid)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence prev_pset = zsd_lookup_pset_byid(ctl, prev_psetid);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence prev_pset = NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence prev_usage = NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (prev_zone != NULL || prev_pset != NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (prev_zone == NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence prev_zone = zone;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (prev_pset == NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence prev_pset = pset;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence prev_usage = zsd_lookup_insert_usage(ctl, prev_pset,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence prev_zone);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Update the usage with the processes info */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (prev_usage == NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_mark_pset_usage_found(usage, sched);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_mark_pset_usage_found(usage, sched);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_mark_pset_usage_found(prev_usage, sched);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * First time around is just to get a starting point. All
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * usages will be zero.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (init == B_TRUE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence continue;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (prev_usage == NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_add_usage(ctl, usage, &delta);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_add_usage(ctl, usage, &d1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_add_usage(ctl, prev_usage, &d2);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) closedir(dir);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * No need to collect exited proc data on initialization. Just
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * caching the usage of the known processes to get a zero starting
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * point.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (init == B_TRUE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Add accounting records to account for processes which have
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * exited.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_create(&plist, sizeof (zsd_proc_t),
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence offsetof(zsd_proc_t, zspr_next));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_create(&pplist, sizeof (zsd_proc_t),
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence offsetof(zsd_proc_t, zspr_next));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (;;) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pid_t pid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pid_t ppid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence timestruc_t user, sys, proc_usage;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence timestruc_t finish;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int numfound = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence bzero(&object, sizeof (object));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence proc = NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone = NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset = NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage = NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ret = ea_get_object(&ctl->zsctl_proc_eaf, &object);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ret == EO_ERROR) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ea_error() == EXR_EOF) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence struct stat64 *stat;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence struct stat64 *stat_next;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * See if the next accounting file is the
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * same as the current accounting file.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence stat = &(ctl->zsctl_proc_stat);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence stat_next = &(ctl->zsctl_proc_stat_next);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (stat->st_ino == stat_next->st_ino &&
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence stat->st_dev == stat_next->st_dev) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * End of current accounting file is
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * reached, so finished. Clear EOF
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * bit for next time around.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ea_clear(&ctl->zsctl_proc_eaf);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Accounting file has changed. Move
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * to current accounting file.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) ea_close(&ctl->zsctl_proc_eaf);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_proc_fd =
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_proc_fd_next;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_proc_eaf =
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_proc_eaf_next;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_proc_stat =
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_proc_stat_next;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_proc_fd_next = -1;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_proc_open_next = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence continue;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Other accounting error. Give up on
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * accounting.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto ea_err;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Skip if not a process group */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if ((object.eo_catalog & EXT_TYPE_MASK) != EXT_GROUP ||
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (object.eo_catalog & EXD_DATA_MASK) != EXD_GROUP_PROC) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) ea_free_item(&object, EUP_ALLOC);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence continue;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* The process group entry should be complete */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence while (numfound < 9) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence bzero(&pobject, sizeof (pobject));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ret = ea_get_object(&ctl->zsctl_proc_eaf,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence &pobject);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ret < 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) ea_free_item(&object, EUP_ALLOC);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "unable to get process accounting data");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto ea_err;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Next entries should be process data */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if ((pobject.eo_catalog & EXT_TYPE_MASK) ==
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence EXT_GROUP) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) ea_free_item(&object, EUP_ALLOC);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) ea_free_item(&pobject, EUP_ALLOC);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "process data of wrong type");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto ea_err;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence switch (pobject.eo_catalog & EXD_DATA_MASK) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence case EXD_PROC_PID:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pid = pobject.eo_item.ei_uint32;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence proc = &(ctl->zsctl_proc_array[pid]);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * This process should not be currently in
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * the list of processes to process.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence assert(!list_link_active(&proc->zspr_next));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence numfound++;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence case EXD_PROC_ANCPID:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ppid = pobject.eo_item.ei_uint32;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pproc = &(ctl->zsctl_proc_array[ppid]);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence numfound++;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence case EXD_PROC_ZONENAME:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone = zsd_lookup_zone(ctl,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pobject.eo_item.ei_string, -1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence numfound++;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence case EXD_PROC_CPU_USER_SEC:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence user.tv_sec =
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pobject.eo_item.ei_uint64;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence numfound++;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence case EXD_PROC_CPU_USER_NSEC:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence user.tv_nsec =
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pobject.eo_item.ei_uint64;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence numfound++;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence case EXD_PROC_CPU_SYS_SEC:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys.tv_sec =
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pobject.eo_item.ei_uint64;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence numfound++;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence case EXD_PROC_CPU_SYS_NSEC:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys.tv_nsec =
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pobject.eo_item.ei_uint64;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence numfound++;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence case EXD_PROC_FINISH_SEC:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence finish.tv_sec =
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pobject.eo_item.ei_uint64;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence numfound++;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence case EXD_PROC_FINISH_NSEC:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence finish.tv_nsec =
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pobject.eo_item.ei_uint64;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence numfound++;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) ea_free_item(&pobject, EUP_ALLOC);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) ea_free_item(&object, EUP_ALLOC);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (numfound != 9) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext(
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "Malformed process accounting entry found"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto proc_done;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (finish.tv_sec > interval_end.tv_sec ||
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (finish.tv_sec == interval_end.tv_sec &&
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence finish.tv_nsec > (interval_end.tv_usec * 1000)))
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence hrtime_expired = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Try to identify the zone and pset to which this
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * exited process belongs.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (zone == NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto proc_done;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Save proc info */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence proc->zspr_ppid = ppid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence proc->zspr_zoneid = zone->zsz_id;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence prev_psetid = ZS_PSET_ERROR;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sched = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * The following tries to deduce the processes pset.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * First choose pset and sched using cached value from the
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * most recent time the process has been seen.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * pset and sched can change across zone_enter, so make sure
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * most recent sighting of this process was in the same
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * zone before using most recent known value.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * If there is no known value, use value of processes
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * parent. If parent is unknown, walk parents until a known
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * parent is found.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * If no parent in the zone is found, use the zone's default
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * pset and scheduling class.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (proc->zspr_psetid != ZS_PSET_ERROR) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence prev_psetid = proc->zspr_psetid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset = zsd_lookup_pset_byid(ctl, prev_psetid);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sched = proc->zspr_sched;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else if (pproc->zspr_zoneid == zone->zsz_id &&
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pproc->zspr_psetid != ZS_PSET_ERROR) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence prev_psetid = pproc->zspr_psetid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset = zsd_lookup_pset_byid(ctl, prev_psetid);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sched = pproc->zspr_sched;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pset == NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Process or processes parent has never been seen.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Save to deduce a known parent later.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence proc_usage = sys;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_ADD_TIMESTRUC(proc_usage, user);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_DELTA(delta, proc_usage,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence proc->zspr_usage);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence proc->zspr_usage = delta;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_insert_tail(&plist, proc);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence continue;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Add the zone's usage to the pset */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage = zsd_lookup_insert_usage(ctl, pset, zone);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (usage == NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto proc_done;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_mark_pset_usage_found(usage, sched);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* compute the usage to add for the exited proc */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence proc_usage = sys;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_ADD_TIMESTRUC(proc_usage, user);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_DELTA(delta, proc_usage,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence proc->zspr_usage);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_add_usage(ctl, usage, &delta);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceproc_done:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_flush_proc_info(proc);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (hrtime_expired == B_TRUE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * close next accounting file.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ctl->zsctl_proc_open_next) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) ea_close(
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence &ctl->zsctl_proc_eaf_next);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_proc_open_next = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_proc_fd_next = -1;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* For the remaining processes, use pset and sched of a known parent */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence proc = list_head(&plist);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence while (proc != NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence next = proc;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (;;) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (next->zspr_ppid == 0 || next->zspr_ppid == -1) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Kernel process, or parent is unknown, skip
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * process, remove from process list.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence tmp = proc;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence proc = list_next(&plist, proc);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_link_init(&tmp->zspr_next);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pproc = &(ctl->zsctl_proc_array[next->zspr_ppid]);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pproc->zspr_zoneid != proc->zspr_zoneid) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Parent in different zone. Save process and
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * use zone's default pset and sched below
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence tmp = proc;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence proc = list_next(&plist, proc);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_remove(&plist, tmp);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_insert_tail(&pplist, tmp);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Parent has unknown pset, Search parent's parent */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pproc->zspr_psetid == ZS_PSET_ERROR) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence next = pproc;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence continue;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Found parent with known pset. Use its info */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence proc->zspr_psetid = pproc->zspr_psetid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence proc->zspr_sched = pproc->zspr_sched;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence next->zspr_psetid = pproc->zspr_psetid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence next->zspr_sched = pproc->zspr_sched;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone = zsd_lookup_zone_byid(ctl,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence proc->zspr_zoneid);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (zone == NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence tmp = proc;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence proc = list_next(&plist, proc);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_remove(&plist, tmp);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_link_init(&tmp->zspr_next);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset = zsd_lookup_pset_byid(ctl,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence proc->zspr_psetid);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pset == NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence tmp = proc;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence proc = list_next(&plist, proc);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_remove(&plist, tmp);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_link_init(&tmp->zspr_next);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Add the zone's usage to the pset */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage = zsd_lookup_insert_usage(ctl, pset, zone);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (usage == NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence tmp = proc;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence proc = list_next(&plist, proc);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_remove(&plist, tmp);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_link_init(&tmp->zspr_next);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_mark_pset_usage_found(usage, proc->zspr_sched);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_add_usage(ctl, usage, &proc->zspr_usage);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_flush_proc_info(proc);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence tmp = proc;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence proc = list_next(&plist, proc);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_remove(&plist, tmp);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_link_init(&tmp->zspr_next);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Process has never been seen. Using zone info to
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * determine pset and scheduling class.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence proc = list_head(&pplist);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence while (proc != NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone = zsd_lookup_zone_byid(ctl, proc->zspr_zoneid);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (zone == NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto next;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (zone->zsz_psetid != ZS_PSET_ERROR &&
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_psetid != ZS_PSET_MULTI) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence prev_psetid = zone->zsz_psetid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset = zsd_lookup_pset_byid(ctl, prev_psetid);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset = zsd_lookup_pset(ctl, zone->zsz_pset, -1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pset != NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence prev_psetid = pset->zsp_id;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pset == NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto next;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sched = zone->zsz_scheds;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Ignore FX high scheduling class if it is not the
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * only scheduling class in the zone.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (sched != ZS_SCHED_FX_60)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sched &= (~ZS_SCHED_FX_60);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * If more than one scheduling class has been found
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * in the zone, use zone's default scheduling class for
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * this process.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if ((sched & (sched - 1)) != 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sched = zone->zsz_default_sched;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Add the zone's usage to the pset */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage = zsd_lookup_insert_usage(ctl, pset, zone);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (usage == NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto next;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_mark_pset_usage_found(usage, sched);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_add_usage(ctl, usage, &proc->zspr_usage);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencenext:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence tmp = proc;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence proc = list_next(&pplist, proc);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_flush_proc_info(tmp);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_link_init(&tmp->zspr_next);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceea_err:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Close the next accounting file if we have not transitioned to it
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * yet.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ctl->zsctl_proc_open_next) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) ea_close(&ctl->zsctl_proc_eaf_next);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_proc_open_next = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_proc_fd_next = -1;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * getvmusage(2) uses size_t's in the passwd data structure, which differ
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * in size for 32bit and 64 bit kernels. Since this is a contracted interface,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * and zonestatd does not necessarily match the kernel's bitness, marshal
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * results appropriately.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic int
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_getvmusage(zsd_ctl_t *ctl, uint_t flags, time_t age, zsd_vmusage64_t *buf,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t *nres)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_vmusage32_t *vmu32;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_vmusage64_t *vmu64;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint32_t nres32;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int i;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int ret;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ctl->zsctl_kern_bits == 32) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence nres32 = *nres;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ret = syscall(SYS_rusagesys, _RUSAGESYS_GETVMUSAGE,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence flags, age, (uintptr_t)buf, (uintptr_t)&nres32);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *nres = nres32;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ret == 0 && buf != NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * An array of vmusage32_t's has been returned.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Convert it to an array of vmusage64_t's.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vmu32 = (zsd_vmusage32_t *)buf;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vmu64 = (zsd_vmusage64_t *)buf;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (i = nres32 - 1; i >= 0; i--) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vmu64[i].vmu_zoneid = vmu32[i].vmu_zoneid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vmu64[i].vmu_type = vmu32[i].vmu_type;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vmu64[i].vmu_type = vmu32[i].vmu_type;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vmu64[i].vmu_rss_all = vmu32[i].vmu_rss_all;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vmu64[i].vmu_rss_private =
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vmu32[i].vmu_rss_private;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vmu64[i].vmu_rss_shared =
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vmu32[i].vmu_rss_shared;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vmu64[i].vmu_swap_all = vmu32[i].vmu_swap_all;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vmu64[i].vmu_swap_private =
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vmu32[i].vmu_swap_private;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vmu64[i].vmu_swap_shared =
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vmu32[i].vmu_swap_shared;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (ret);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * kernel is 64 bit, so use 64 bit structures as zonestat
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * expects.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (syscall(SYS_rusagesys, _RUSAGESYS_GETVMUSAGE,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence flags, age, (uintptr_t)buf, (uintptr_t)nres));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Update the current physical, virtual, and locked memory usage of the
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * running zones.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_refresh_memory(zsd_ctl_t *ctl, boolean_t init)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t phys_total;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t phys_used;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t phys_zones;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t phys_zones_overcount;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t phys_zones_extra;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t phys_zones_credit;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t vm_free;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t vm_used;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t disk_swap_total;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t disk_swap_used; /* disk swap with contents */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t physmem;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t pp_kernel;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t arc_size = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence struct anoninfo ani;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int num_swap_devices;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence struct swaptable *swt;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence struct swapent *swent;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence size_t swt_size;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char *path;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_vmusage64_t *vmusage;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t num_vmusage;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int i, ret;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_system_t *sys;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_zone_t *zone;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int vmu_nzones;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence kstat_t *kstat;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char kstat_name[KSTAT_STRLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence kstat_named_t *knp;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence kid_t kid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (init)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys = ctl->zsctl_system;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* interrogate swap devices to find the amount of disk swap */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencedisk_swap_again:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence num_swap_devices = swapctl(SC_GETNSWP, NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (num_swap_devices == 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_swap_total = disk_swap_total = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_swap_used = disk_swap_used = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* No disk swap */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto disk_swap_done;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* see if swap table needs to be larger */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (num_swap_devices > ctl->zsctl_swap_cache_num) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence swt_size = sizeof (int) +
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (num_swap_devices * sizeof (struct swapent)) +
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (num_swap_devices * MAXPATHLEN);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ctl->zsctl_swap_cache != NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence free(ctl->zsctl_swap_cache);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence swt = (struct swaptable *)malloc(swt_size);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (swt == NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Could not allocate to get list of swap devices.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Just use data from the most recent read, which will
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * be zero if this is the first read.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext("Unable to allocate to determine "
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "virtual memory"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence disk_swap_total = sys->zss_swap_total;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence disk_swap_used = sys->zss_swap_used;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto disk_swap_done;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence swent = swt->swt_ent;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence path = (char *)swt + (sizeof (int) +
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence num_swap_devices * sizeof (swapent_t));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (i = 0; i < num_swap_devices; i++, swent++) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence swent->ste_path = path;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence path += MAXPATHLEN;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence swt->swt_n = num_swap_devices;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_swap_cache = swt;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_swap_cache_size = swt_size;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_swap_cache_num = num_swap_devices;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence num_swap_devices = swapctl(SC_LIST, ctl->zsctl_swap_cache);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (num_swap_devices < 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* More swap devices have arrived */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (errno == ENOMEM)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto disk_swap_again;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext("Unable to determine disk swap devices"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Unexpected error. Use existing data */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence disk_swap_total = sys->zss_swap_total;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence disk_swap_used = sys->zss_swap_used;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto disk_swap_done;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* add up the disk swap */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence disk_swap_total = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence disk_swap_used = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence swent = ctl->zsctl_swap_cache->swt_ent;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (i = 0; i < num_swap_devices; i++, swent++) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence disk_swap_total += swent->ste_pages;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence disk_swap_used += (swent->ste_pages - swent->ste_free);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence disk_swap_total *= ctl->zsctl_pagesize;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence disk_swap_used *= ctl->zsctl_pagesize;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_swap_total = disk_swap_total;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_swap_used = disk_swap_used;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencedisk_swap_done:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* get system pages kstat */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence kid = -1;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence kstat = kstat_lookup(ctl->zsctl_kstat_ctl, "unix", 0, "system_pages");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (kstat == NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext("Unable to lookup system pages kstat"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence kid = kstat_read(ctl->zsctl_kstat_ctl, kstat, NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (kid == -1) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext("Unable to read system pages kstat"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence knp = kstat_data_lookup(kstat, "physmem");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (knp == NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext("Unable to read physmem"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (knp->data_type == KSTAT_DATA_UINT64)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence physmem = knp->value.ui64;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else if (knp->data_type == KSTAT_DATA_UINT32)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence physmem = knp->value.ui32;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence knp = kstat_data_lookup(kstat, "pp_kernel");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (knp == NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext("Unable to read pp_kernel"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (knp->data_type == KSTAT_DATA_UINT64)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pp_kernel = knp->value.ui64;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else if (knp->data_type == KSTAT_DATA_UINT32)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pp_kernel = knp->value.ui32;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence physmem *= ctl->zsctl_pagesize;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pp_kernel *= ctl->zsctl_pagesize;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* get the zfs arc size if available */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence arc_size = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence kid = -1;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence kstat = kstat_lookup(ctl->zsctl_kstat_ctl, "zfs", 0, "arcstats");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (kstat != NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence kid = kstat_read(ctl->zsctl_kstat_ctl, kstat, NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (kid != -1) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence knp = kstat_data_lookup(kstat, "size");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (knp != NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (knp->data_type == KSTAT_DATA_UINT64)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence arc_size = knp->value.ui64;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Try to get swap information */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (swapctl(SC_AINFO, &ani) < 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext("Unable to get swap info"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencevmusage_again:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* getvmusage to get physical memory usage */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vmusage = ctl->zsctl_vmusage_cache;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence num_vmusage = ctl->zsctl_vmusage_cache_num;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ret = zsd_getvmusage(ctl, VMUSAGE_SYSTEM | VMUSAGE_ALL_ZONES, 0,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vmusage, &num_vmusage);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ret != 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Unexpected error. Use existing data */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (errno != EOVERFLOW) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext(
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "Unable to read physical memory usage"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence phys_zones = sys->zss_ram_zones;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto vmusage_done;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* vmusage results cache too small */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (num_vmusage > ctl->zsctl_vmusage_cache_num) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence size_t size = sizeof (zsd_vmusage64_t) * num_vmusage;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ctl->zsctl_vmusage_cache != NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence free(ctl->zsctl_vmusage_cache);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vmusage = (zsd_vmusage64_t *)malloc(size);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (vmusage == NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext("Unable to alloc to determine "
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "physical memory usage"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence phys_zones = sys->zss_ram_zones;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto vmusage_done;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_vmusage_cache = vmusage;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_vmusage_cache_num = num_vmusage;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto vmusage_again;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence phys_zones_overcount = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vmu_nzones = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (i = 0; i < num_vmusage; i++) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence switch (vmusage[i].vmu_type) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence case VMUSAGE_SYSTEM:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* total pages backing user process mappings */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence phys_zones = sys->zss_ram_zones =
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vmusage[i].vmu_rss_all;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence case VMUSAGE_ZONE:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vmu_nzones++;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence phys_zones_overcount += vmusage[i].vmu_rss_all;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone = zsd_lookup_zone_byid(ctl, vmusage[i].vmu_id);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (zone != NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_usage_ram = vmusage[i].vmu_rss_all;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence default:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Figure how much memory was double counted due to text sharing
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * between zones. Credit this back so that the sum of the zones
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * equals the total zone ram usage;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence phys_zones_extra = phys_zones_overcount - phys_zones;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence phys_zones_credit = phys_zones_extra / vmu_nzones;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencevmusage_done:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* walk the zones to get swap and locked kstats. Fetch ram cap. */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_locked_zones = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_vm_zones = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (zone = list_head(&ctl->zsctl_zones); zone != NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone = list_next(&ctl->zsctl_zones, zone)) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* If zone halted during interval, show memory usage as none */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (zone->zsz_active == B_FALSE ||
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_deleted == B_TRUE) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_usage_ram = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_usage_vm = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_usage_locked = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence continue;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (phys_zones_credit > 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (zone->zsz_usage_ram > phys_zones_credit) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_usage_ram -= phys_zones_credit;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Get zone's swap usage. Since zone could have halted,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * treats as zero if cannot read
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_usage_vm = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(kstat_name, sizeof (kstat_name),
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "swapresv_zone_%d", zone->zsz_id);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence kid = -1;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence kstat = kstat_lookup(ctl->zsctl_kstat_ctl, "caps",
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_id, kstat_name);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (kstat != NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence kid = kstat_read(ctl->zsctl_kstat_ctl, kstat, NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (kid != -1) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence knp = kstat_data_lookup(kstat, "usage");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (knp != NULL &&
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence knp->data_type == KSTAT_DATA_UINT64) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_usage_vm = knp->value.ui64;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_vm_zones += knp->value.ui64;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Get zone's locked usage. Since zone could have halted,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * treats as zero if cannot read
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_usage_locked = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) snprintf(kstat_name, sizeof (kstat_name),
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "lockedmem_zone_%d", zone->zsz_id);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence kid = -1;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence kstat = kstat_lookup(ctl->zsctl_kstat_ctl, "caps",
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_id, kstat_name);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (kstat != NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence kid = kstat_read(ctl->zsctl_kstat_ctl, kstat, NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (kid != -1) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence knp = kstat_data_lookup(kstat, "usage");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (knp != NULL &&
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence knp->data_type == KSTAT_DATA_UINT64) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_usage_locked = knp->value.ui64;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Since locked memory accounting for zones
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * can double count ddi locked memory, cap each
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * zone's locked usage at its ram usage.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (zone->zsz_usage_locked >
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_usage_ram)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_usage_locked =
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_usage_ram;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_locked_zones +=
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_usage_locked;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence phys_total =
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sysconf(_SC_PHYS_PAGES) * ctl->zsctl_pagesize;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence phys_used = (sysconf(_SC_PHYS_PAGES) - sysconf(_SC_AVPHYS_PAGES))
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * ctl->zsctl_pagesize;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Compute remaining statistics */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_ram_total = phys_total;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_ram_zones = phys_zones;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_ram_kern = phys_used - phys_zones - arc_size;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * The total for kernel locked memory should include
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * segkp locked pages, but oh well. The arc size is subtracted,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * as that physical memory is reclaimable.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_locked_kern = pp_kernel - arc_size;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Add memory used by kernel startup and obp to kernel locked */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if ((phys_total - physmem) > 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_locked_kern += phys_total - physmem;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Add in the portion of (RAM+DISK) that is not available as swap,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * and consider it swap used by the kernel.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_vm_total = phys_total + disk_swap_total;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vm_free = (ani.ani_max - ani.ani_resv) * ctl->zsctl_pagesize;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence vm_used = sys->zss_vm_total - vm_free;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_vm_kern = vm_used - sys->zss_vm_zones - arc_size;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Charge each cpu's usage to its processor sets. Also add the cpu's total
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * time to each zone using the processor set. This tracks the maximum
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * amount of cpu time that a zone could have used.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_refresh_cpu_stats(zsd_ctl_t *ctl, boolean_t init)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_system_t *sys;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_zone_t *zone;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_pset_usage_t *usage;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_cpu_t *cpu;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_cpu_t *cpu_next;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_pset_t *pset;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence timestruc_t ts;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t hrtime;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence timestruc_t delta;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Update the per-cpu kstat data */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu_next = list_head(&ctl->zsctl_cpus);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence while (cpu_next != NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu = cpu_next;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu_next = list_next(&ctl->zsctl_cpus, cpu);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_update_cpu_stats(ctl, cpu);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Update the elapsed real time */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence hrtime = gethrtime();
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (init) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* first time around, store hrtime for future comparision */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_hrtime = hrtime;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_hrtime_prev = hrtime;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Compute increase in hrtime since the most recent read */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_hrtime_prev = ctl->zsctl_hrtime;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_hrtime = hrtime;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if ((hrtime = hrtime - ctl->zsctl_hrtime_prev) > 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_ADD_NANOSEC(ctl->zsctl_hrtime_total, hrtime);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* On initialization, all psets have zero time */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (init)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (pset = list_head(&ctl->zsctl_psets); pset != NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset = list_next(&ctl->zsctl_psets, pset)) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pset->zsp_active == B_FALSE) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext("Internal error,inactive pset found"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence continue;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* sum total used time for pset */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ts.tv_sec = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ts.tv_nsec = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_ADD_TIMESTRUC(ts, pset->zsp_intr);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_ADD_TIMESTRUC(ts, pset->zsp_kern);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_ADD_TIMESTRUC(ts, pset->zsp_user);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* kernel time in pset is total time minus zone time */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_DELTA(pset->zsp_usage_kern, ts,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_usage_zones);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pset->zsp_usage_kern.tv_sec < 0 ||
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_usage_kern.tv_nsec < 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_usage_kern.tv_sec = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_usage_kern.tv_nsec = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Total pset elapsed time is used time plus idle time */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_ADD_TIMESTRUC(ts, pset->zsp_idle);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_DELTA(delta, ts, pset->zsp_total_time);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (usage = list_head(&pset->zsp_usage_list); usage != NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage = list_next(&pset->zsp_usage_list, usage)) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone = usage->zsu_zone;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (usage->zsu_cpu_shares != ZS_LIMIT_NONE &&
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_cpu_shares != ZS_SHARES_UNLIMITED &&
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_cpu_shares != 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Figure out how many nanoseconds of share time
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * to give to the zone
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence hrtime = delta.tv_sec;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence hrtime *= NANOSEC;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence hrtime += delta.tv_nsec;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence hrtime *= usage->zsu_cpu_shares;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence hrtime /= pset->zsp_cpu_shares;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_ADD_NANOSEC(zone->zsz_share_time,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence hrtime);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Add pset time to each zone using pset */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_ADD_TIMESTRUC(zone->zsz_pset_time, delta);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_cpus_online += pset->zsp_online;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_total_time = ts;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (zone = list_head(&ctl->zsctl_zones); zone != NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone = list_next(&ctl->zsctl_zones, zone)) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* update cpu cap tracking if the zone has a cpu cap */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (zone->zsz_cpu_cap != ZS_LIMIT_NONE) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t elapsed;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence elapsed = ctl->zsctl_hrtime - ctl->zsctl_hrtime_prev;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence elapsed *= zone->zsz_cpu_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence elapsed = elapsed / 100;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_ADD_NANOSEC(zone->zsz_cap_time, elapsed);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys = ctl->zsctl_system;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ts.tv_sec = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ts.tv_nsec = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_ADD_TIMESTRUC(ts, sys->zss_intr);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_ADD_TIMESTRUC(ts, sys->zss_kern);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_ADD_TIMESTRUC(ts, sys->zss_user);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* kernel time in pset is total time minus zone time */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_DELTA(sys->zss_cpu_usage_kern, ts,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_cpu_usage_zones);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (sys->zss_cpu_usage_kern.tv_sec < 0 ||
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_cpu_usage_kern.tv_nsec < 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_cpu_usage_kern.tv_sec = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_cpu_usage_kern.tv_nsec = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Total pset elapsed time is used time plus idle time */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_ADD_TIMESTRUC(ts, sys->zss_idle);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_cpu_total_time = ts;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Saves current usage data to a cache that is read by libzonestat when
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * calling zs_usage_read().
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * All pointers in the cached data structure are set to NULL. When
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * libzonestat reads the cached data, it will set the pointers relative to
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * its address space.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_usage_cache_update(zsd_ctl_t *ctl)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_usage_cache_t *cache;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_usage_cache_t *old;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_usage_t *usage;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_system_t *sys;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_system_t *dsys;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_zone_t *zone = NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_zone_t *dzone;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_pset_t *pset = NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_pset_t *dpset;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_pset_zone_t *pusage;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_pset_usage_t *dpusage;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char *next;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t size, i, j;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence size =
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sizeof (zs_usage_cache_t) +
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sizeof (zs_usage_t) +
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sizeof (zs_system_t) +
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sizeof (zs_zone_t) * ctl->zsctl_nzones +
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sizeof (zs_pset_t) * ctl->zsctl_npsets +
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sizeof (zs_pset_zone_t) * ctl->zsctl_npset_usages;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cache = (zs_usage_cache_t *)malloc(size);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (cache == NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext("Unable to allocate usage cache\n"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence next = (char *)cache;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cache->zsuc_size = size - sizeof (zs_usage_cache_t);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence next += sizeof (zs_usage_cache_t);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* LINTED */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage = cache->zsuc_usage = (zs_usage_t *)next;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence next += sizeof (zs_usage_t);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_start = g_start;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_hrstart = g_hrstart;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_time = g_now;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_hrtime = g_hrnow;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_nzones = ctl->zsctl_nzones;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_npsets = ctl->zsctl_npsets;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_system = NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* LINTED */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys = (zs_system_t *)next;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence next += sizeof (zs_system_t);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence dsys = ctl->zsctl_system;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_ram_total = dsys->zss_ram_total;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_ram_kern = dsys->zss_ram_kern;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_ram_zones = dsys->zss_ram_zones;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_locked_kern = dsys->zss_locked_kern;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_locked_zones = dsys->zss_locked_zones;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_vm_total = dsys->zss_vm_total;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_vm_kern = dsys->zss_vm_kern;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_vm_zones = dsys->zss_vm_zones;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_swap_total = dsys->zss_swap_total;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_swap_used = dsys->zss_swap_used;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_ncpus = dsys->zss_ncpus;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_ncpus_online = dsys->zss_ncpus_online;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_processes_max = dsys->zss_maxpid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_lwps_max = dsys->zss_lwps_max;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_shm_max = dsys->zss_shm_max;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_shmids_max = dsys->zss_shmids_max;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_semids_max = dsys->zss_semids_max;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_msgids_max = dsys->zss_msgids_max;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_lofi_max = dsys->zss_lofi_max;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_processes = dsys->zss_processes;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_lwps = dsys->zss_lwps;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_shm = dsys->zss_shm;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_shmids = dsys->zss_shmids;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_semids = dsys->zss_semids;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_msgids = dsys->zss_msgids;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_lofi = dsys->zss_lofi;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_cpu_total_time = dsys->zss_cpu_total_time;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_cpu_usage_zones = dsys->zss_cpu_usage_zones;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_cpu_usage_kern = dsys->zss_cpu_usage_kern;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (i = 0, dzone = list_head(&ctl->zsctl_zones);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence i < ctl->zsctl_nzones;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence i++, dzone = list_next(&ctl->zsctl_zones, dzone)) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* LINTED */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone = (zs_zone_t *)next;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence next += sizeof (zs_zone_t);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_link_init(&zone->zsz_next);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_system = NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) strlcpy(zone->zsz_name, dzone->zsz_name,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sizeof (zone->zsz_name));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) strlcpy(zone->zsz_pool, dzone->zsz_pool,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sizeof (zone->zsz_pool));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) strlcpy(zone->zsz_pset, dzone->zsz_pset,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sizeof (zone->zsz_pset));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_id = dzone->zsz_id;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_cputype = dzone->zsz_cputype;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_iptype = dzone->zsz_iptype;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_start = dzone->zsz_start;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_hrstart = dzone->zsz_hrstart;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_scheds = dzone->zsz_scheds;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_cpu_shares = dzone->zsz_cpu_shares;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_cpu_cap = dzone->zsz_cpu_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_ram_cap = dzone->zsz_ram_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_vm_cap = dzone->zsz_vm_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_locked_cap = dzone->zsz_locked_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_cpu_usage = dzone->zsz_cpu_usage;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_cpus_online = dzone->zsz_cpus_online;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_pset_time = dzone->zsz_pset_time;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_cap_time = dzone->zsz_cap_time;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_share_time = dzone->zsz_share_time;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_usage_ram = dzone->zsz_usage_ram;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_usage_locked = dzone->zsz_usage_locked;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_usage_vm = dzone->zsz_usage_vm;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_processes_cap = dzone->zsz_processes_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_lwps_cap = dzone->zsz_lwps_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_shm_cap = dzone->zsz_shm_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_shmids_cap = dzone->zsz_shmids_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_semids_cap = dzone->zsz_semids_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_msgids_cap = dzone->zsz_msgids_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_lofi_cap = dzone->zsz_lofi_cap;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_processes = dzone->zsz_processes;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_lwps = dzone->zsz_lwps;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_shm = dzone->zsz_shm;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_shmids = dzone->zsz_shmids;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_semids = dzone->zsz_semids;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_msgids = dzone->zsz_msgids;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_lofi = dzone->zsz_lofi;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (i = 0, dpset = list_head(&ctl->zsctl_psets);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence i < ctl->zsctl_npsets;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence i++, dpset = list_next(&ctl->zsctl_psets, dpset)) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* LINTED */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset = (zs_pset_t *)next;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence next += sizeof (zs_pset_t);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_link_init(&pset->zsp_next);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) strlcpy(pset->zsp_name, dpset->zsp_name,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sizeof (pset->zsp_name));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_id = dpset->zsp_id;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_cputype = dpset->zsp_cputype;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_start = dpset->zsp_start;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_hrstart = dpset->zsp_hrstart;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_online = dpset->zsp_online;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_size = dpset->zsp_size;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_min = dpset->zsp_min;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_max = dpset->zsp_max;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_importance = dpset->zsp_importance;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_scheds = dpset->zsp_scheds;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_cpu_shares = dpset->zsp_cpu_shares;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_total_time = dpset->zsp_total_time;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_usage_kern = dpset->zsp_usage_kern;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_usage_zones = dpset->zsp_usage_zones;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_nusage = dpset->zsp_nusage;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Add pset usages for pset */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (j = 0, dpusage = list_head(&dpset->zsp_usage_list);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence j < dpset->zsp_nusage;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence j++, dpusage = list_next(&dpset->zsp_usage_list, dpusage)) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* LINTED */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pusage = (zs_pset_zone_t *)next;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence next += sizeof (zs_pset_zone_t);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* pointers are computed by client */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pusage->zspz_pset = NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pusage->zspz_zone = NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_link_init(&pusage->zspz_next);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pusage->zspz_zoneid = dpusage->zsu_zone->zsz_id;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pusage->zspz_start = dpusage->zsu_start;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pusage->zspz_hrstart = dpusage->zsu_hrstart;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pusage->zspz_hrstart = dpusage->zsu_hrstart;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pusage->zspz_cpu_shares = dpusage->zsu_cpu_shares;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pusage->zspz_scheds = dpusage->zsu_scheds;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pusage->zspz_cpu_usage = dpusage->zsu_cpu_usage;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Update the current cache pointer */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) mutex_lock(&g_usage_cache_lock);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence old = g_usage_cache;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cache->zsuc_ref = 1;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cache->zsuc_gen = g_gen_next;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_gen = g_gen_next;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_size = size;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_usage_cache = cache;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (old != NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence old->zsuc_ref--;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (old->zsuc_ref == 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence free(old);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_gen_next++;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Wake up any clients that are waiting for this calculation */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (g_usage_cache_kickers > 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) cond_broadcast(&g_usage_cache_wait);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) mutex_unlock(&g_usage_cache_lock);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic zs_usage_cache_t *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_usage_cache_hold_locked()
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_usage_cache_t *ret;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ret = g_usage_cache;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ret->zsuc_ref++;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (ret);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencevoid
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_usage_cache_rele(zs_usage_cache_t *cache)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) mutex_lock(&g_usage_cache_lock);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cache->zsuc_ref--;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (cache->zsuc_ref == 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence free(cache);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) mutex_unlock(&g_usage_cache_lock);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/* Close the handles held by zsd_open() */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencevoid
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_close(zsd_ctl_t *ctl)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_zone_t *zone;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_pset_t *pset;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_pset_usage_t *usage;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_cpu_t *cpu;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int id;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ctl->zsctl_kstat_ctl) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) kstat_close(ctl->zsctl_kstat_ctl);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_kstat_ctl = NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ctl->zsctl_proc_open) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) ea_close(&ctl->zsctl_proc_eaf);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_proc_open = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_proc_fd = -1;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ctl->zsctl_pool_conf) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ctl->zsctl_pool_status == POOL_ENABLED)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) pool_conf_close(ctl->zsctl_pool_conf);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_pool_status = POOL_DISABLED;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence while ((zone = list_head(&ctl->zsctl_zones)) != NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_remove(&ctl->zsctl_zones, zone);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence free(zone);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_nzones--;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence while ((pset = list_head(&ctl->zsctl_psets)) != NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence while ((usage = list_head(&pset->zsp_usage_list))
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence != NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_remove(&pset->zsp_usage_list, usage);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_npset_usages--;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence free(usage);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_remove(&ctl->zsctl_psets, pset);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence free(pset);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_npsets--;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Release all cpus being tracked */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence while (cpu = list_head(&ctl->zsctl_cpus)) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_remove(&ctl->zsctl_cpus, cpu);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence id = cpu->zsc_id;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence bzero(cpu, sizeof (zsd_cpu_t));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu->zsc_id = id;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu->zsc_allocated = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu->zsc_psetid = ZS_PSET_ERROR;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpu->zsc_psetid_prev = ZS_PSET_ERROR;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence assert(ctl->zsctl_npset_usages == 0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence assert(ctl->zsctl_npsets == 0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence assert(ctl->zsctl_nzones == 0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) zsd_disable_cpu_stats();
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Update the utilization data for all zones and processor sets.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic int
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_read(zsd_ctl_t *ctl, boolean_t init, boolean_t do_memory)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) kstat_chain_update(ctl->zsctl_kstat_ctl);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) gettimeofday(&(ctl->zsctl_timeofday), NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_refresh_system(ctl);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Memory calculation is expensive. Only update it on sample
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * intervals.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (do_memory == B_TRUE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_refresh_memory(ctl, init);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_refresh_zones(ctl);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_refresh_psets(ctl);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_refresh_procs(ctl, init);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_refresh_cpu_stats(ctl, init);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Delete objects that no longer exist.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Pset usages must be deleted first as they point to zone and
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * pset objects.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_mark_pset_usages_end(ctl);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_mark_psets_end(ctl);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_mark_cpus_end(ctl);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_mark_zones_end(ctl);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Save results for clients.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_usage_cache_update(ctl);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Roll process accounting file.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) zsd_roll_exacct();
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Get the system rctl, which is the upper most limit
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic uint64_t
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_get_system_rctl(char *name)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence rctlblk_t *rblk, *rblk_last;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence rblk = (rctlblk_t *)alloca(rctlblk_size());
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence rblk_last = (rctlblk_t *)alloca(rctlblk_size());
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (getrctl(name, NULL, rblk_last, RCTL_FIRST) != 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (ZS_LIMIT_NONE);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence while (getrctl(name, rblk_last, rblk, RCTL_NEXT) == 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) bcopy(rblk, rblk_last, rctlblk_size());
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (rctlblk_get_value(rblk_last));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Open any necessary subsystems for collecting utilization data,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * allocate and initialize data structures, and get initial utilization.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Errors:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * ENOMEM out of memory
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * EINVAL other error
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic zsd_ctl_t *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_open(zsd_ctl_t *ctl)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_system_t *system;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char path[MAXPATHLEN];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence long pathmax;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence struct statvfs svfs;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int ret;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int i;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence size_t size;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int err;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ctl == NULL && (ctl = (zsd_ctl_t *)calloc(1,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sizeof (zsd_ctl_t))) == NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext("Out of Memory"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence errno = ENOMEM;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto err;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_proc_fd = -1;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* open kstats */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ctl->zsctl_kstat_ctl == NULL &&
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (ctl->zsctl_kstat_ctl = kstat_open()) == NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence err = errno;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext("Unable to open kstats"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence errno = err;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (errno != ENOMEM)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence errno = EAGAIN;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto err;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * These are set when the accounting file is opened by
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * zsd_update_procs()
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_proc_fd = -1;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_proc_fd_next = -1;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_proc_open = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_proc_open_next = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencecheck_exacct:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) zsd_enable_cpu_stats();
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Create structures to track usage */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ctl->zsctl_system == NULL && (ctl->zsctl_system = (zsd_system_t *)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence calloc(1, sizeof (zsd_system_t))) == NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ret = -1;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext("Out of Memory"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence errno = ENOMEM;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto err;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence system = ctl->zsctl_system;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* get the kernel bitness to know structure layout for getvmusage */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ret = sysinfo(SI_ARCHITECTURE_64, path, sizeof (path));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ret < 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_kern_bits = 32;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_kern_bits = 64;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_pagesize = sysconf(_SC_PAGESIZE);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence size = sysconf(_SC_CPUID_MAX);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_maxcpuid = size;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ctl->zsctl_cpu_array == NULL && (ctl->zsctl_cpu_array =
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (zsd_cpu_t *)calloc(size + 1, sizeof (zsd_cpu_t))) == NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext("Out of Memory"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence errno = ENOMEM;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto err;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (i = 0; i <= ctl->zsctl_maxcpuid; i++) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_cpu_array[i].zsc_id = i;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_cpu_array[i].zsc_allocated = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_cpu_array[i].zsc_psetid = ZS_PSET_ERROR;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_cpu_array[i].zsc_psetid_prev = ZS_PSET_ERROR;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (statvfs("/proc", &svfs) != 0 ||
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence strcmp("/proc", svfs.f_fstr) != 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext("/proc not a procfs filesystem"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence errno = EINVAL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto err;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence size = sysconf(_SC_MAXPID) + 1;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_maxproc = size;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ctl->zsctl_proc_array == NULL &&
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (ctl->zsctl_proc_array = (zsd_proc_t *)calloc(size,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sizeof (zsd_proc_t))) == NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext("Out of Memory"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence errno = ENOMEM;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto err;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (i = 0; i <= ctl->zsctl_maxproc; i++) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_link_init(&(ctl->zsctl_proc_array[i].zspr_next));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_proc_array[i].zspr_psetid = ZS_PSET_ERROR;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_proc_array[i].zspr_zoneid = -1;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_proc_array[i].zspr_usage.tv_sec = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_proc_array[i].zspr_usage.tv_nsec = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_proc_array[i].zspr_ppid = -1;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_create(&ctl->zsctl_zones, sizeof (zsd_zone_t),
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence offsetof(zsd_zone_t, zsz_next));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_create(&ctl->zsctl_psets, sizeof (zsd_pset_t),
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence offsetof(zsd_pset_t, zsp_next));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence list_create(&ctl->zsctl_cpus, sizeof (zsd_cpu_t),
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence offsetof(zsd_cpu_t, zsc_next));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pathmax = pathconf("/proc", _PC_NAME_MAX);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pathmax < 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext("Unable to determine max path of /proc"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence errno = EINVAL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto err;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence size = sizeof (struct dirent) + pathmax + 1;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_procfs_dent_size = size;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ctl->zsctl_procfs_dent == NULL &&
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (ctl->zsctl_procfs_dent = (struct dirent *)calloc(1, size))
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence == NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext("Out of Memory"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence errno = ENOMEM;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto err;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ctl->zsctl_pool_conf == NULL &&
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (ctl->zsctl_pool_conf = pool_conf_alloc()) == NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext("Out of Memory"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence errno = ENOMEM;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto err;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_pool_status = POOL_DISABLED;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_pool_changed = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ctl->zsctl_pool_vals[0] == NULL &&
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (ctl->zsctl_pool_vals[0] = pool_value_alloc()) == NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext("Out of Memory"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence errno = ENOMEM;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto err;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ctl->zsctl_pool_vals[1] == NULL &&
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (ctl->zsctl_pool_vals[1] = pool_value_alloc()) == NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext("Out of Memory"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence errno = ENOMEM;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto err;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ctl->zsctl_pool_vals[2] = NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * get system limits
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence system->zss_maxpid = size = sysconf(_SC_MAXPID);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence system->zss_processes_max = zsd_get_system_rctl("zone.max-processes");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence system->zss_lwps_max = zsd_get_system_rctl("zone.max-lwps");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence system->zss_shm_max = zsd_get_system_rctl("zone.max-shm-memory");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence system->zss_shmids_max = zsd_get_system_rctl("zone.max-shm-ids");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence system->zss_semids_max = zsd_get_system_rctl("zone.max-sem-ids");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence system->zss_msgids_max = zsd_get_system_rctl("zone.max-msg-ids");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence system->zss_lofi_max = zsd_get_system_rctl("zone.max-lofi");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_gen_next = 1;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (zsd_read(ctl, B_TRUE, B_FALSE) != 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext("Reading zone statistics failed"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (ctl);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceerr:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ctl)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_close(ctl);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/* Copy utilization data to buffer, filtering data if non-global zone. */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_usage_filter(zoneid_t zid, zs_usage_cache_t *cache, zs_usage_t *usage,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence boolean_t is_gz)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_usage_t *cusage;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_system_t *sys, *csys;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_zone_t *zone, *czone;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_pset_t *pset, *cpset;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_pset_zone_t *pz, *cpz, *foundpz;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence size_t size = 0, csize = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char *start, *cstart;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int i, j;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence timestruc_t delta;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Privileged users in the global zone get everything */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (is_gz) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cusage = cache->zsuc_usage;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) bcopy(cusage, usage, cusage->zsu_size);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Zones just get their own usage */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cusage = cache->zsuc_usage;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence start = (char *)usage;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cstart = (char *)cusage;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence size += sizeof (zs_usage_t);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence csize += sizeof (zs_usage_t);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_start = cusage->zsu_start;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_hrstart = cusage->zsu_hrstart;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_time = cusage->zsu_time;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_hrtime = cusage->zsu_hrtime;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_gen = cusage->zsu_gen;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_nzones = 1;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_npsets = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* LINTED */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys = (zs_system_t *)(start + size);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* LINTED */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence csys = (zs_system_t *)(cstart + csize);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence size += sizeof (zs_system_t);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence csize += sizeof (zs_system_t);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Save system limits but not usage */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *sys = *csys;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_ncpus = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_ncpus_online = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* LINTED */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone = (zs_zone_t *)(start + size);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* LINTED */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence czone = (zs_zone_t *)(cstart + csize);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Find the matching zone */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (i = 0; i < cusage->zsu_nzones; i++) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (czone->zsz_id == zid) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *zone = *czone;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence size += sizeof (zs_zone_t);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence csize += sizeof (zs_zone_t);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* LINTED */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence czone = (zs_zone_t *)(cstart + csize);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_ram_kern += (sys->zss_ram_zones - zone->zsz_usage_ram);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_ram_zones = zone->zsz_usage_ram;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_vm_kern += (sys->zss_vm_zones - zone->zsz_usage_vm);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_vm_zones = zone->zsz_usage_vm;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_locked_kern += (sys->zss_locked_zones -
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zone->zsz_usage_locked);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_locked_zones = zone->zsz_usage_locked;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_DELTA(delta, sys->zss_cpu_usage_zones, zone->zsz_cpu_usage);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_ADD_TIMESTRUC(sys->zss_cpu_usage_kern, delta);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_cpu_usage_zones = zone->zsz_cpu_usage;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* LINTED */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset = (zs_pset_t *)(start + size);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* LINTED */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpset = (zs_pset_t *)(cstart + csize);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (i = 0; i < cusage->zsu_npsets; i++) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence csize += sizeof (zs_pset_t);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* LINTED */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpz = (zs_pset_zone_t *)(csize + cstart);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence foundpz = NULL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (j = 0; j < cpset->zsp_nusage; j++) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (cpz->zspz_zoneid == zid)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence foundpz = cpz;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence csize += sizeof (zs_pset_zone_t);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* LINTED */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpz = (zs_pset_zone_t *)(csize + cstart);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (foundpz != NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence size += sizeof (zs_pset_t);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* LINTED */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pz = (zs_pset_zone_t *)(start + size);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence size += sizeof (zs_pset_zone_t);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *pset = *cpset;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence *pz = *foundpz;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_DELTA(delta, pset->zsp_usage_zones,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pz->zspz_cpu_usage);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence TIMESTRUC_ADD_TIMESTRUC(pset->zsp_usage_kern, delta);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_usage_zones = pz->zspz_cpu_usage;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pset->zsp_nusage = 1;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_npsets++;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_ncpus += pset->zsp_size;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence sys->zss_ncpus_online += pset->zsp_online;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* LINTED */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cpset = (zs_pset_t *)(cstart + csize);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage->zsu_size = size;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Respond to new connections from libzonestat.so. Also respond to zoneadmd,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * which reports new zones.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/* ARGSUSED */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_server(void *cookie, char *argp, size_t arg_size,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence door_desc_t *dp, uint_t n_desc)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int *args, cmd;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence door_desc_t door;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ucred_t *ucred;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence const priv_set_t *eset;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (argp == DOOR_UNREF_DATA) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) door_return(NULL, 0, NULL, 0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence thr_exit(NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (arg_size != sizeof (cmd) * 2) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) door_return(NULL, 0, NULL, 0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence thr_exit(NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* LINTED */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence args = (int *)argp;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cmd = args[0];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* If connection, return door to stat server */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (cmd == ZSD_CMD_CONNECT) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Verify client compilation version */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (args[1] != ZS_VERSION) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence args[1] = ZSD_STATUS_VERSION_MISMATCH;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) door_return(argp, sizeof (cmd) * 2, NULL, 0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence thr_exit(NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ucred = alloca(ucred_size());
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Verify client permission */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (door_ucred(&ucred) != 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence args[1] = ZSD_STATUS_INTERNAL_ERROR;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) door_return(argp, sizeof (cmd) * 2, NULL, 0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence thr_exit(NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence eset = ucred_getprivset(ucred, PRIV_EFFECTIVE);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (eset == NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence args[1] = ZSD_STATUS_INTERNAL_ERROR;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) door_return(argp, sizeof (cmd) * 2, NULL, 0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence thr_exit(NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (!priv_ismember(eset, PRIV_PROC_INFO)) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence args[1] = ZSD_STATUS_PERMISSION;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) door_return(argp, sizeof (cmd) * 2, NULL, 0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence thr_exit(NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Return stat server door */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence args[1] = ZSD_STATUS_OK;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence door.d_attributes = DOOR_DESCRIPTOR;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence door.d_data.d_desc.d_descriptor = g_stat_door;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) door_return(argp, sizeof (cmd) * 2, &door, 1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence thr_exit(NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Respond to zoneadmd informing zonestatd of a new zone */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (cmd == ZSD_CMD_NEW_ZONE) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_fattach_zone(args[1], g_server_door, B_FALSE);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) door_return(NULL, 0, NULL, 0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence thr_exit(NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence args[1] = ZSD_STATUS_INTERNAL_ERROR;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) door_return(argp, sizeof (cmd) * 2, NULL, 0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence thr_exit(NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Respond to libzonestat.so clients with the current utlilzation data.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/* ARGSUSED */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_stat_server(void *cookie, char *argp, size_t arg_size,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence door_desc_t *dp, uint_t n_desc)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t *args, cmd;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_usage_cache_t *cache;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int ret;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char *rvalp;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence size_t rvals;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zs_usage_t *usage;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ucred_t *ucred;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zoneid_t zoneid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence const priv_set_t *eset;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence boolean_t is_gz = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Tell stat thread there are no more clients */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (argp == DOOR_UNREF_DATA) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) mutex_lock(&g_usage_cache_lock);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_hasclient = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) cond_signal(&g_usage_cache_kick);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) mutex_unlock(&g_usage_cache_lock);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) door_return(NULL, 0, NULL, 0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence thr_exit(NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (arg_size != sizeof (cmd) * 2) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) door_return(NULL, 0, NULL, 0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence thr_exit(NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* LINTED */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence args = (uint64_t *)argp;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cmd = args[0];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (cmd != ZSD_CMD_READ) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) door_return(NULL, 0, NULL, 0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence thr_exit(NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ucred = alloca(ucred_size());
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (door_ucred(&ucred) != 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) door_return(NULL, 0, NULL, 0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence thr_exit(NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zoneid = ucred_getzoneid(ucred);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (zoneid == GLOBAL_ZONEID)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence is_gz = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence eset = ucred_getprivset(ucred, PRIV_EFFECTIVE);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (eset == NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) door_return(NULL, 0, NULL, 0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence thr_exit(NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (!priv_ismember(eset, PRIV_PROC_INFO)) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) door_return(NULL, 0, NULL, 0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence thr_exit(NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) mutex_lock(&g_usage_cache_lock);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_hasclient = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Force a new cpu calculation for client. This will force a
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * new memory calculation if the memory data is older than the
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * sample period.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_usage_cache_kickers++;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) cond_signal(&g_usage_cache_kick);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence ret = cond_wait(&g_usage_cache_wait, &g_usage_cache_lock);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_usage_cache_kickers--;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (ret != 0 && errno == EINTR) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) mutex_unlock(&g_usage_cache_lock);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext(
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "Interrupted before writing usage size to client\n"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) door_return(NULL, 0, NULL, 0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence thr_exit(NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence cache = zsd_usage_cache_hold_locked();
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (cache == NULL) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext("Usage cache empty.\n"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) door_return(NULL, 0, NULL, 0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence thr_exit(NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) mutex_unlock(&g_usage_cache_lock);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Copy current usage data to stack to send to client */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence usage = (zs_usage_t *)alloca(cache->zsuc_size);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Filter out results if caller is non-global zone */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_usage_filter(zoneid, cache, usage, is_gz);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence rvalp = (void *)usage;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence rvals = usage->zsu_size;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_usage_cache_rele(cache);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) door_return(rvalp, rvals, 0, NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence thr_exit(NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic volatile boolean_t g_quit;
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 Lawrence/*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * The stat thread generates new utilization data when clients request
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * it. It also manages opening and closing the subsystems used to gather
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * data depending on if clients exist.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/* ARGSUSED */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencevoid *
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestat_thread(void *arg)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence time_t start;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence time_t now;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence time_t next_memory;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence boolean_t do_memory;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence boolean_t do_read;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence boolean_t do_close;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence start = time(NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (start < 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (g_quit == B_TRUE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto quit;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext("Unable to fetch current time"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_quit = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto quit;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence next_memory = start;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence while (g_quit == B_FALSE) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (;;) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * These are used to decide if the most recent memory
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * calculation was within a sample interval,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * and weather or not the usage collection needs to
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * be opened or closed.
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence do_memory = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence do_read = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence do_close = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * If all clients have gone, close usage collecting
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) mutex_lock(&g_usage_cache_lock);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (!g_hasclient && g_open == B_TRUE) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence do_close = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) mutex_unlock(&g_usage_cache_lock);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (g_quit == B_TRUE) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) mutex_unlock(
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence &g_usage_cache_lock);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * Wait for a usage data request
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (g_usage_cache_kickers == 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) cond_wait(&g_usage_cache_kick,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence &g_usage_cache_lock);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence now = time(NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (now < 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (g_quit == B_TRUE) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) mutex_unlock(
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence &g_usage_cache_lock);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto quit;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_quit = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) mutex_unlock(&g_usage_cache_lock);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext(
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "Unable to fetch current time"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto quit;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (g_hasclient) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence do_read = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (now >= next_memory) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence do_memory = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence next_memory = now + g_interval;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence do_close = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) mutex_unlock(&g_usage_cache_lock);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (do_read || do_close)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_now = now;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_hrnow = gethrtime();
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (g_hasclient && g_open == B_FALSE) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_start = g_now;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_hrstart = g_hrnow;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_ctl = zsd_open(g_ctl);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (g_ctl == NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext(
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "Unable to open zone statistics"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_open = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (do_read && g_ctl) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (zsd_read(g_ctl, B_FALSE, do_memory) != 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext(
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "Unable to read zone statistics"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_quit = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) mutex_lock(&g_usage_cache_lock);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (!g_hasclient && g_open == B_TRUE && g_ctl) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) mutex_unlock(&g_usage_cache_lock);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_close(g_ctl);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_open = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) mutex_unlock(&g_usage_cache_lock);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencequit:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (g_open)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_close(g_ctl);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) thr_kill(g_main, SIGINT);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence thr_exit(NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencevoid
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencezsd_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 zsd_warn(gettext("cannot get FX class parameters"));
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 if (priocntl(P_PID, getpid(), PC_SETPARMS, (caddr_t)&pcparms) == -1)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext("cannot enter the FX class"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic int pipe_fd;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencedaemonize_ready(char status)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * wake the parent with a clue
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) write(pipe_fd, &status, 1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) close(pipe_fd);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic int
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencedaemonize_start(void)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence char data;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int status;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int filedes[2];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pid_t pid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) close(0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) dup2(2, 1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pipe(filedes) < 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (-1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) fflush(NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if ((pid = fork1()) < 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (-1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (pid != 0) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * parent
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence struct sigaction act;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence act.sa_sigaction = SIG_DFL;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) sigemptyset(&act.sa_mask);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence act.sa_flags = 0;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) sigaction(SIGPIPE, &act, NULL); /* ignore SIGPIPE */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) close(filedes[1]);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (read(filedes[0], &data, 1) == 1) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* forward ready code via exit status */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence exit(data);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence status = -1;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) wait4(pid, &status, 0, NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* daemon process exited before becoming ready */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (WIFEXITED(status)) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* assume daemon process printed useful message */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence exit(WEXITSTATUS(status));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence } else {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_warn(gettext("daemon process killed or died"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence exit(1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * child
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence pipe_fd = filedes[1];
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) close(filedes[0]);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /*
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence * generic Unix setup
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) setsid();
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) umask(0000);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencestatic void
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencefattach_all_zones(boolean_t detach_only)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zoneid_t *zids;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint_t nzids, nzids_last;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int i;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceagain:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) zone_list(NULL, &nzids);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence nzids_last = nzids;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zids = (zoneid_t *)malloc(sizeof (zoneid_t) * nzids_last);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (zids == NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_error(gettext("Out of memory"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) zone_list(zids, &nzids);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (nzids > nzids_last) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence free(zids);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence goto again;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence for (i = 0; i < nzids; i++)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_fattach_zone(zids[i], g_server_door, detach_only);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence free(zids);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceint
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrencemain(int argc, char *argv[])
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence{
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence int arg;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence thread_t tid;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence scf_simple_prop_t *prop;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence uint64_t *intervalp;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence boolean_t opt_cleanup = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_main = thr_self();
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_quit = B_FALSE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) signal(SIGINT, zonestat_quithandler);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) signal(SIGTERM, zonestat_quithandler);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) signal(SIGHUP, zonestat_quithandler);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence/* (void) sigignore(SIGCHLD); */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) sigignore(SIGPIPE);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (getzoneid() != GLOBAL_ZONEID)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_error(gettext("Must be run from global zone only"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence while ((arg = getopt(argc, argv, "c"))
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence != EOF) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence switch (arg) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence case 'c':
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence opt_cleanup = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence break;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence default:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_error(gettext("Invalid option"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (opt_cleanup) {
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (zsd_disable_cpu_stats() != 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence exit(1);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence else
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence exit(0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence }
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Get the configured sample interval */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence prop = scf_simple_prop_get(NULL, "svc:/system/zones-monitoring:default",
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "config", "sample_interval");
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (prop == NULL)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_error(gettext("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 zsd_error(gettext("Malformed SMF property "
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "\"config/sample_interval\". Must be of type \"count\""));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence intervalp = scf_simple_prop_next_count(prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_interval = *intervalp;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (g_interval == 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_error(gettext("Malformed SMF property "
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence "\"config/sample_interval\". Must be greater than zero"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence scf_simple_prop_free(prop);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (daemonize_start() < 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_error(gettext("Unable to start daemon\n"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Run at high priority */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_set_fx();
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) mutex_init(&g_usage_cache_lock, USYNC_THREAD, NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) cond_init(&g_usage_cache_kick, USYNC_THREAD, NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) cond_init(&g_usage_cache_wait, USYNC_THREAD, NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_server_door = door_create(zsd_server, NULL,
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence DOOR_REFUSE_DESC | DOOR_NO_CANCEL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (g_server_door < 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_error(gettext("Unable to create server door\n"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_stat_door = door_create(zsd_stat_server, NULL, DOOR_UNREF_MULTI |
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence DOOR_REFUSE_DESC | DOOR_NO_CANCEL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (g_stat_door < 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_error(gettext("Unable to create statistics door\n"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence fattach_all_zones(B_FALSE);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence if (thr_create(NULL, 0, stat_thread, NULL, 0, &tid) != 0)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence zsd_error(gettext("Unable to create statistics thread\n"));
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence daemonize_ready(0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* Wait for signal to quit */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence while (g_quit == B_FALSE)
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) pause();
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* detach doors */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence fattach_all_zones(B_TRUE);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) door_revoke(g_server_door);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) door_revoke(g_stat_door);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence /* kick stat thread and wait for it to close the statistics */
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) mutex_lock(&g_usage_cache_lock);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence g_quit = B_TRUE;
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) cond_signal(&g_usage_cache_kick);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) mutex_unlock(&g_usage_cache_lock);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrenceend:
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence (void) thr_join(tid, NULL, NULL);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence return (0);
efd4c9b63ad77503c101fc6c2ed8ba96c9d52964Steve Lawrence}