/* * Create the "mac" kstat. The "mac" kstat is comprised of three kinds of * statistics: statistics maintained by the mac module itself, generic mac * statistics maintained by the driver, and MAC-type specific statistics * also maintained by the driver. */ void mac_driver_stat_create(mac_impl_t *mip) { kstat_t *ksp; kstat_named_t *knp; uint_t count; major_t major = getmajor(mip->mi_phy_dev); count = MAC_MOD_NKSTAT + MAC_NKSTAT + mip->mi_type->mt_statcount; ksp = kstat_create_zone((const char *)ddi_major_to_name(major), getminor(mip->mi_phy_dev) - 1, MAC_KSTAT_NAME, MAC_KSTAT_CLASS, KSTAT_TYPE_NAMED, count, 0, getzoneid()); if (ksp == NULL) return; ksp->ks_update = i_mac_driver_stat_update; ksp->ks_private = mip; mip->mi_ksp = ksp; mip->mi_kstat_count = count; knp = (kstat_named_t *)ksp->ks_data; i_mac_kstat_init(knp, i_mac_mod_si, MAC_MOD_NKSTAT); knp += MAC_MOD_NKSTAT; i_mac_kstat_init(knp, i_mac_si, MAC_NKSTAT); if (mip->mi_type->mt_statcount > 0) { knp += MAC_NKSTAT; i_mac_kstat_init(knp, mip->mi_type->mt_stats, mip->mi_type->mt_statcount); } kstat_install(ksp); }
/* * To support kstat_create_netstack() using kstat_zone_add we need * to track both * - all zoneids that use the global/shared stack * - all kstats that have been added for the shared stack */ kstat_t * kstat_create_netstack(char *ks_module, int ks_instance, char *ks_name, char *ks_class, uchar_t ks_type, uint_t ks_ndata, uchar_t ks_flags, netstackid_t ks_netstackid) { kstat_t *ks; if (ks_netstackid == GLOBAL_NETSTACKID) { ks = kstat_create_zone(ks_module, ks_instance, ks_name, ks_class, ks_type, ks_ndata, ks_flags, GLOBAL_ZONEID); if (ks != NULL) netstack_shared_kstat_add(ks); return (ks); } else { zoneid_t zoneid = ks_netstackid; return (kstat_create_zone(ks_module, ks_instance, ks_name, ks_class, ks_type, ks_ndata, ks_flags, zoneid)); } }
static void cpupart_kstat_create(cpupart_t *cp) { kstat_t *ksp; zoneid_t zoneid; ASSERT(MUTEX_HELD(&cpu_lock)); /* * We have a bit of a chicken-egg problem since this code will * get called to create the kstats for CP_DEFAULT before the * pools framework gets initialized. We circumvent the problem * by special-casing cp_default. */ if (cp != &cp_default && pool_pset_enabled()) zoneid = GLOBAL_ZONEID; else zoneid = ALL_ZONES; ksp = kstat_create_zone("unix", cp->cp_id, "pset", "misc", KSTAT_TYPE_NAMED, sizeof (cpupart_kstat_t) / sizeof (kstat_named_t), 0, zoneid); if (ksp != NULL) { cpupart_kstat_t *cpksp = ksp->ks_data; kstat_named_init(&cpksp->cpk_updates, "updates", KSTAT_DATA_UINT64); kstat_named_init(&cpksp->cpk_runnable, "runnable", KSTAT_DATA_UINT64); kstat_named_init(&cpksp->cpk_waiting, "waiting", KSTAT_DATA_UINT64); kstat_named_init(&cpksp->cpk_ncpus, "ncpus", KSTAT_DATA_UINT32); kstat_named_init(&cpksp->cpk_avenrun_1min, "avenrun_1min", KSTAT_DATA_UINT32); kstat_named_init(&cpksp->cpk_avenrun_5min, "avenrun_5min", KSTAT_DATA_UINT32); kstat_named_init(&cpksp->cpk_avenrun_15min, "avenrun_15min", KSTAT_DATA_UINT32); ksp->ks_update = cpupart_kstat_update; ksp->ks_private = cp; kstat_install(ksp); } cp->cp_kstat = ksp; }
void svc_clts_stats_init(zoneid_t zoneid, struct rpc_clts_server **statsp) { kstat_t *ksp; kstat_named_t *knp; knp = rpcstat_zone_init_common(zoneid, "unix", "rpc_clts_server", (const kstat_named_t *)&clts_rsstat_tmpl, sizeof (clts_rsstat_tmpl)); /* * Backwards compatibility for old kstat clients */ ksp = kstat_create_zone("unix", 0, "rpc_server", "rpc", KSTAT_TYPE_NAMED, clts_rsstat_ndata, KSTAT_FLAG_VIRTUAL | KSTAT_FLAG_WRITABLE, zoneid); if (ksp) { ksp->ks_data = knp; kstat_install(ksp); } *statsp = (struct rpc_clts_server *)knp; }
/* * Create interrupt kstats for this CPU. */ void cpu_create_intrstat(cpu_t *cp) { int i; kstat_t *intr_ksp; kstat_named_t *knp; char name[KSTAT_STRLEN]; zoneid_t zoneid; ASSERT(MUTEX_HELD(&cpu_lock)); if (pool_pset_enabled()) zoneid = GLOBAL_ZONEID; else zoneid = ALL_ZONES; intr_ksp = kstat_create_zone("cpu", cp->cpu_id, "intrstat", "misc", KSTAT_TYPE_NAMED, PIL_MAX * 2, NULL, zoneid); /* * Initialize each PIL's named kstat */ if (intr_ksp != NULL) { intr_ksp->ks_update = cpu_kstat_intrstat_update; knp = (kstat_named_t *)intr_ksp->ks_data; intr_ksp->ks_private = cp; for (i = 0; i < PIL_MAX; i++) { (void) snprintf(name, KSTAT_STRLEN, "level-%d-time", i + 1); kstat_named_init(&knp[i * 2], name, KSTAT_DATA_UINT64); (void) snprintf(name, KSTAT_STRLEN, "level-%d-count", i + 1); kstat_named_init(&knp[(i * 2) + 1], name, KSTAT_DATA_UINT64); } kstat_install(intr_ksp); } }
/* * Create kstat with given name - statname, update function - fn * and initialize it with given names - init_stat_info */ static kstat_t * i_mac_stat_create(void *handle, const char *modname, const char *statname, int (*fn) (kstat_t *, int), mac_stat_info_t *init_stat_info, uint_t count) { kstat_t *ksp; kstat_named_t *knp; ksp = kstat_create_zone(modname, 0, statname, "net", KSTAT_TYPE_NAMED, count, 0, getzoneid()); if (ksp == NULL) return (NULL); ksp->ks_update = fn; ksp->ks_private = handle; knp = (kstat_named_t *)ksp->ks_data; i_mac_kstat_init(knp, init_stat_info, count); kstat_install(ksp); return (ksp); }