Current File : //usr/include/zonestat.h
/*
 * Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved.
 */

#ifndef _ZONESTAT_H
#define	_ZONESTAT_H


#include <limits.h>
#include <sys/nvpair.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/param.h>
#include <sys/pset.h>
#include <sys/sysmacros.h>
#include <sys/zone.h>

#ifdef __cplusplus
extern "C" {
#endif

#define	ZS_IPTYPE_SHARED	1
#define	ZS_IPTYPE_EXCLUSIVE	2

#define	ZS_CPUTYPE_DEFAULT_PSET	1
#define	ZS_CPUTYPE_POOL_PSET	2
#define	ZS_CPUTYPE_PSRSET_PSET	3
#define	ZS_CPUTYPE_DEDICATED	4

/*
 * Scheds are defined as flags so a list of them can be returned in a single
 * uint_t.
 */
#define	ZS_SCHED_TS			0x1
#define	ZS_SCHED_IA			0x2
#define	ZS_SCHED_RT			0x4
#define	ZS_SCHED_FX			0x8
#define	ZS_SCHED_FX_60			0x10
#define	ZS_SCHED_FSS			0x20
#define	ZS_SCHED_SDC			0x40
#define	ZS_SCHED_SYS			0x80
#define	ZS_SCHED_CONFLICT		0x100

#define	ZS_LIMIT_NONE			(UINT64_MAX)
#define	ZS_PCT_NONE			(UINT_MAX)
#define	ZS_SHARES_UNLIMITED		(UINT16_MAX)

#define	ZS_ZONENAME_MAX			ZONENAME_MAX
#define	ZS_PSETNAME_MAX			(1024 + 1)
#define	ZS_POOLNAME_MAX			(1024 + 1)

typedef enum zs_resource_type_enum {
    ZS_RESOURCE_TYPE_TIME = 1,
    ZS_RESOURCE_TYPE_COUNT,
    ZS_RESOURCE_TYPE_BYTES
} zs_resource_type_t;

typedef enum zs_limit_type_enum {
    ZS_LIMIT_TYPE_TIME = 1,
    ZS_LIMIT_TYPE_COUNT,
    ZS_LIMIT_TYPE_BYTES
} zs_limit_type_t;

typedef enum zs_resource_property_enum {
    ZS_RESOURCE_PROP_CPU_TOTAL = 1,
    ZS_RESOURCE_PROP_CPU_ONLINE,
    ZS_RESOURCE_PROP_CPU_LOAD_1MIN,
    ZS_RESOURCE_PROP_CPU_LOAD_5MIN,
    ZS_RESOURCE_PROP_CPU_LOAD_15MIN
} zs_resource_property_t;

typedef enum zs_resource_enum {
/* Beginning of public enum constants */
    ZS_RESOURCE_CPU = 1,
    ZS_RESOURCE_RAM_RSS,
    ZS_RESOURCE_RAM_LOCKED,
    ZS_RESOURCE_VM,
    ZS_RESOURCE_DISK_SWAP, /* Only supports ZS_USER_ALL and ZS_USER_FREE */
    ZS_RESOURCE_LWPS,
    ZS_RESOURCE_PROCESSES,
    ZS_RESOURCE_SHM_MEMORY,
    ZS_RESOURCE_SHM_IDS,
    ZS_RESOURCE_SEM_IDS,
    ZS_RESOURCE_MSG_IDS,
    ZS_RESOURCE_CPU_STOLEN, /* Only supports ZS_USER_ALL and ZS_USER_SYSTEM */
/* End of public enum constants */

/* Beginning of private enum constants */
    ZS_RESOURCE_LOFI,
    ZS_RESOURCE_NET_SPEED,
    ZS_RESOURCE_NET_ALL,
    ZS_RESOURCE_NET_IN,
    ZS_RESOURCE_NET_OUT,
    ZS_RESOURCE_NET_PHYS_ALL,
    ZS_RESOURCE_NET_PHYS_IN,
    ZS_RESOURCE_NET_PHYS_OUT
/* End of private enum constants */
} zs_resource_t;

typedef enum zs_user_enum {
    ZS_USER_ALL = 1,
    ZS_USER_SYSTEM,
    ZS_USER_ZONES,
    ZS_USER_FREE
} zs_user_t;

typedef enum zs_limit_enum {
    ZS_LIMIT_CPU = 1,
    ZS_LIMIT_CPU_SHARES,
    ZS_LIMIT_RAM_RSS,
    ZS_LIMIT_RAM_LOCKED,
    ZS_LIMIT_VM,
    ZS_LIMIT_LWPS,
    ZS_LIMIT_PROCESSES,
    ZS_LIMIT_SHM_MEMORY,
    ZS_LIMIT_SHM_IDS,
    ZS_LIMIT_MSG_IDS,
    ZS_LIMIT_SEM_IDS,
    ZS_LIMIT_LOFI
} zs_limit_t;

typedef enum zs_zone_property_enum {
    ZS_ZONE_PROP_NAME = 1,
    ZS_ZONE_PROP_ID,
    ZS_ZONE_PROP_IPTYPE,
    ZS_ZONE_PROP_CPUTYPE,
    ZS_ZONE_PROP_DEFAULT_SCHED,
    ZS_ZONE_PROP_SCHEDULERS,
    ZS_ZONE_PROP_CPU_SHARES,
    ZS_ZONE_PROP_POOLNAME,
    ZS_ZONE_PROP_PSETNAME
} zs_zone_property_t;

typedef enum zs_pset_property_enum {
    ZS_PSET_PROP_NAME = 1,
    ZS_PSET_PROP_ID,
    ZS_PSET_PROP_CPUTYPE,
    ZS_PSET_PROP_SIZE,
    ZS_PSET_PROP_ONLINE,
    ZS_PSET_PROP_MIN,
    ZS_PSET_PROP_MAX,
    ZS_PSET_PROP_CPU_SHARES,
    ZS_PSET_PROP_SCHEDULERS,
    ZS_PSET_PROP_LOAD_1MIN,
    ZS_PSET_PROP_LOAD_5MIN,
    ZS_PSET_PROP_LOAD_15MIN
} zs_pset_property_t;

typedef enum zs_pz_property_enum {
    ZS_PZ_PROP_SCHEDULERS = 1,
    ZS_PZ_PROP_CPU_SHARES,
    ZS_PZ_PROP_CPU_CAP
} zs_pz_property_t;

typedef enum zs_pz_pct_enum {
    ZS_PZ_PCT_PSET = 1,
    ZS_PZ_PCT_CPU_CAP,
    ZS_PZ_PCT_PSET_SHARES,
    ZS_PZ_PCT_CPU_SHARES
} zs_pz_pct_t;

typedef enum zs_datalink_enum {
	ZS_LINK_PROP_NAME = 1,
	ZS_LINK_PROP_DEVNAME,
	ZS_LINK_PROP_ZONENAME,
	ZS_LINK_PROP_SPEED,
	ZS_LINK_PROP_STATE,
	ZS_LINK_PROP_CLASS,
	ZS_LINK_PROP_RBYTE,
	ZS_LINK_PROP_OBYTE,
	ZS_LINK_PROP_PRBYTES,
	ZS_LINK_PROP_POBYTES,
	ZS_LINK_PROP_TOT_BYTES,
	ZS_LINK_PROP_TOT_RBYTES,
	ZS_LINK_PROP_TOT_OBYTES,
	ZS_LINK_PROP_TOT_PRBYTES,
	ZS_LINK_PROP_TOT_POBYTES,
	ZS_LINK_PROP_MAXBW
} zs_datalink_property_t;

typedef enum zs_link_zone_enum {
	ZS_LINK_ZONE_PROP_NAME = 1,
	ZS_LINK_ZONE_PROP_BYTES,
	ZS_LINK_ZONE_PROP_RBYTES,
	ZS_LINK_ZONE_PROP_OBYTES,
	ZS_LINK_ZONE_PROP_PRBYTES,
	ZS_LINK_ZONE_PROP_POBYTES,
	ZS_LINK_ZONE_PROP_MAXBW,
	ZS_LINK_ZONE_PROP_PARTBW
} zs_lz_property_t;

/* Per-client handle to libzonestat */
typedef struct __zs_ctl *zs_ctl_t;

/*
 * These usage structure contains the system's utilization (overall, zones,
 * psets, memory) at a given point in time.
 */
typedef struct __zs_usage *zs_usage_t;

/*
 * The following structures desribe each zone, pset, and each zone's usage
 * of each pset.  Each usage structure (above) contains lists of these that
 * can be traversed.
 */
typedef struct __zs_zone *zs_zone_t;
typedef struct __zs_pset *zs_pset_t;
typedef struct __zs_pset_zone *zs_pset_zone_t;

/*
 * Opaque structure for properties.
 */
typedef struct __zs_property *zs_property_t;

/* functions for opening/closing a handle for reading current usage */
zs_ctl_t zs_open();
void zs_close(zs_ctl_t);

/* function for reading current resource usage */
zs_usage_t zs_usage_read(zs_ctl_t);

/* functions for manimulating usage data: zs_usage */
zs_usage_t zs_usage_diff(zs_usage_t, zs_usage_t);
void zs_usage_free(zs_usage_t);

/* functions for overall system resources: zs_resource */

boolean_t zs_resource_supported(zs_resource_t);
boolean_t zs_resource_user_supported(zs_resource_t, zs_user_t);
zs_resource_type_t zs_resource_type(zs_resource_t);

boolean_t zs_resource_property_supported(zs_resource_property_t);
zs_property_t zs_resource_property(zs_usage_t, zs_resource_property_t);

uint64_t zs_resource_total_uint64(zs_usage_t, zs_resource_t);
uint64_t zs_resource_used_uint64(zs_usage_t, zs_resource_t, zs_user_t);
uint64_t zs_resource_used_zone_uint64(zs_zone_t, zs_resource_t);
void zs_resource_total_time(zs_usage_t, zs_resource_t, timestruc_t *);
void zs_resource_used_time(zs_usage_t, zs_resource_t, zs_user_t,
    timestruc_t *);
void zs_resource_used_zone_time(zs_zone_t, zs_resource_t, timestruc_t *);
uint_t zs_resource_used_pct(zs_usage_t, zs_resource_t, zs_user_t);
uint_t zs_resource_used_zone_pct(zs_zone_t, zs_resource_t);

/* functions for individual zone usage: zs_zone */
int zs_zone_list(zs_usage_t, zs_zone_t *, int);
zs_zone_t zs_zone_walk(zs_usage_t, zs_zone_t);

boolean_t zs_zone_property_supported(zs_zone_property_t);
zs_property_t zs_zone_property(zs_zone_t, zs_zone_property_t);

boolean_t zs_zone_limit_supported(zs_limit_t);
zs_limit_type_t zs_zone_limit_type(zs_limit_t);
uint64_t zs_zone_limit_uint64(zs_zone_t, zs_limit_t);
uint64_t zs_zone_limit_used_uint64(zs_zone_t, zs_limit_t);
void zs_zone_limit_time(zs_zone_t, zs_limit_t, timestruc_t *);
void zs_zone_limit_used_time(zs_zone_t, zs_limit_t, timestruc_t *);
uint_t zs_zone_limit_used_pct(zs_zone_t, zs_limit_t);

/* functions for individual psets: zs_pset */
int zs_pset_list(zs_usage_t, zs_pset_t *, int);
zs_pset_t zs_pset_walk(zs_usage_t, zs_pset_t);
boolean_t zs_pset_property_supported(zs_pset_property_t);
boolean_t zs_pset_user_supported(zs_user_t);
zs_property_t zs_pset_property(zs_pset_t, zs_pset_property_t);
void zs_pset_total_time(zs_pset_t, timestruc_t *);
uint64_t zs_pset_total_cpus(zs_pset_t);
void zs_pset_used_time(zs_pset_t, zs_user_t, timestruc_t *);
uint64_t zs_pset_used_cpus(zs_pset_t, zs_user_t);
uint_t zs_pset_used_pct(zs_pset_t, zs_user_t);
void zs_pset_stolen_all_time(zs_pset_t, timestruc_t *);
uint64_t zs_pset_stolen_all_cpus(zs_pset_t);
uint_t zs_pset_stolen_all_pct(zs_pset_t);
void zs_pset_stolen_time(zs_pset_t, timestruc_t *);
uint64_t zs_pset_stolen_cpus(zs_pset_t);
uint_t zs_pset_stolen_pct(zs_pset_t);
void zs_pset_stolen_zones_time(zs_pset_t, timestruc_t *);
uint64_t zs_pset_stolen_zones_cpus(zs_pset_t);
uint_t zs_pset_stolen_zones_pct(zs_pset_t);

/* functions for a pset's per-zone usage: zs_pset_zone */
int zs_pset_zone_list(zs_pset_t, zs_pset_zone_t *, int);
zs_pset_zone_t zs_pset_zone_walk(zs_pset_t, zs_pset_zone_t);
zs_zone_t zs_pset_zone_get_zone(zs_pset_zone_t);
zs_pset_t zs_pset_zone_get_pset(zs_pset_zone_t);
boolean_t zs_pset_zone_property_supported(zs_pz_property_t);
zs_property_t zs_pset_zone_property(zs_pset_zone_t, zs_pz_property_t);
void zs_pset_zone_used_time(zs_pset_zone_t, timestruc_t *);
uint64_t zs_pset_zone_used_cpus(zs_pset_zone_t);
boolean_t zs_pset_zone_pct_supported(zs_pz_pct_t);
uint_t zs_pset_zone_used_pct(zs_pset_zone_t, zs_pz_pct_t);

/* functions for accessing properties */
zs_property_t zs_property_alloc();
size_t zs_property_size();
void zs_property_free(zs_property_t);
data_type_t zs_property_type(zs_property_t);
char *zs_property_string(zs_property_t);
double zs_property_double(zs_property_t);
uint64_t zs_property_uint64(zs_property_t);
int64_t zs_property_int64(zs_property_t);
uint_t zs_property_uint(zs_property_t);
int zs_property_int(zs_property_t);

#ifdef __cplusplus
}
#endif

#endif	/* _ZONESTAT_H */