Print this page
9936 atomic ops in syscall_mstate() induce significant overhead
9942 zone secflags are not initialized correctly
@@ -1910,25 +1910,31 @@
static int
zone_misc_kstat_update(kstat_t *ksp, int rw)
{
zone_t *zone = ksp->ks_private;
zone_misc_kstat_t *zmp = ksp->ks_data;
- hrtime_t tmp;
+ hrtime_t hrtime;
+ uint64_t tmp;
if (rw == KSTAT_WRITE)
return (EACCES);
- tmp = zone->zone_utime;
- scalehrtime(&tmp);
- zmp->zm_utime.value.ui64 = tmp;
- tmp = zone->zone_stime;
- scalehrtime(&tmp);
- zmp->zm_stime.value.ui64 = tmp;
- tmp = zone->zone_wtime;
- scalehrtime(&tmp);
- zmp->zm_wtime.value.ui64 = tmp;
+ tmp = cpu_uarray_sum(zone->zone_ustate, ZONE_USTATE_STIME);
+ hrtime = UINT64_OVERFLOW_TO_INT64(tmp);
+ scalehrtime(&hrtime);
+ zmp->zm_stime.value.ui64 = hrtime;
+ tmp = cpu_uarray_sum(zone->zone_ustate, ZONE_USTATE_UTIME);
+ hrtime = UINT64_OVERFLOW_TO_INT64(tmp);
+ scalehrtime(&hrtime);
+ zmp->zm_utime.value.ui64 = hrtime;
+
+ tmp = cpu_uarray_sum(zone->zone_ustate, ZONE_USTATE_WTIME);
+ hrtime = UINT64_OVERFLOW_TO_INT64(tmp);
+ scalehrtime(&hrtime);
+ zmp->zm_wtime.value.ui64 = hrtime;
+
zmp->zm_avenrun1.value.ui32 = zone->zone_avenrun[0];
zmp->zm_avenrun5.value.ui32 = zone->zone_avenrun[1];
zmp->zm_avenrun15.value.ui32 = zone->zone_avenrun[2];
zmp->zm_ffcap.value.ui32 = zone->zone_ffcap;
@@ -2095,14 +2101,10 @@
zone0.zone_initname = initname;
zone0.zone_lockedmem_kstat = NULL;
zone0.zone_swapresv_kstat = NULL;
zone0.zone_nprocs_kstat = NULL;
- zone0.zone_stime = 0;
- zone0.zone_utime = 0;
- zone0.zone_wtime = 0;
-
list_create(&zone0.zone_ref_list, sizeof (zone_ref_t),
offsetof(zone_ref_t, zref_linkage));
list_create(&zone0.zone_zsd, sizeof (struct zsd_entry),
offsetof(struct zsd_entry, zsd_linkage));
list_insert_head(&zone_active, &zone0);
@@ -2302,10 +2304,12 @@
/*
* Initialise the lock for the database structure used by mntfs.
*/
rw_init(&zone0.zone_mntfs_db_lock, NULL, RW_DEFAULT, NULL);
+ zone0.zone_ustate = cpu_uarray_zalloc(ZONE_USTATE_MAX, KM_SLEEP);
+
mutex_enter(&zonehash_lock);
zone_uniqid(&zone0);
ASSERT(zone0.zone_uniqid == GLOBAL_ZONEUNIQID);
zonehashbyid = mod_hash_create_idhash("zone_by_id", zone_hash_size,
@@ -2386,10 +2390,12 @@
list_destroy(&zone->zone_ref_list);
zone_free_zsd(zone);
zone_free_datasets(zone);
list_destroy(&zone->zone_dl_list);
+ cpu_uarray_free(zone->zone_ustate);
+
if (zone->zone_rootvp != NULL)
VN_RELE(zone->zone_rootvp);
if (zone->zone_rootpath)
kmem_free(zone->zone_rootpath, zone->zone_rootpathlen);
if (zone->zone_name != NULL)
@@ -3201,16 +3207,17 @@
* second.
*
* Based on loadavg_update(), genloadavg() and calcloadavg() from clock.c.
*/
void
-zone_loadavg_update()
+zone_loadavg_update(void)
{
zone_t *zp;
zone_status_t status;
struct loadavg_s *lavg;
hrtime_t zone_total;
+ uint64_t tmp;
int i;
hrtime_t hr_avg;
int nrun;
static int64_t f[3] = { 135, 27, 9 };
int64_t q, r;
@@ -3231,11 +3238,13 @@
/*
* Update the 10 second moving average data in zone_loadavg.
*/
lavg = &zp->zone_loadavg;
- zone_total = zp->zone_utime + zp->zone_stime + zp->zone_wtime;
+ tmp = cpu_uarray_sum_all(zp->zone_ustate);
+ zone_total = UINT64_OVERFLOW_TO_INT64(tmp);
+
scalehrtime(&zone_total);
/* The zone_total should always be increasing. */
lavg->lg_loads[lavg->lg_cur] = (zone_total > lavg->lg_total) ?
zone_total - lavg->lg_total : 0;
@@ -4521,14 +4530,11 @@
zone->zone_ipc.ipcq_semmni = 0;
zone->zone_ipc.ipcq_msgmni = 0;
zone->zone_bootargs = NULL;
zone->zone_fs_allowed = NULL;
- secflags_zero(&zone0.zone_secflags.psf_lower);
- secflags_zero(&zone0.zone_secflags.psf_effective);
- secflags_zero(&zone0.zone_secflags.psf_inherit);
- secflags_fullset(&zone0.zone_secflags.psf_upper);
+ psecflags_default(&zone->zone_secflags);
zone->zone_initname =
kmem_alloc(strlen(zone_default_initname) + 1, KM_SLEEP);
(void) strcpy(zone->zone_initname, zone_default_initname);
zone->zone_nlwps = 0;
@@ -4542,10 +4548,12 @@
zone->zone_max_lofi = 0;
zone->zone_max_lofi_ctl = UINT64_MAX;
zone0.zone_lockedmem_kstat = NULL;
zone0.zone_swapresv_kstat = NULL;
+ zone->zone_ustate = cpu_uarray_zalloc(ZONE_USTATE_MAX, KM_SLEEP);
+
/*
* Zsched initializes the rctls.
*/
zone->zone_rctls = NULL;