Print this page
Add boot_hrtime to global and zone kstats.

@@ -20,10 +20,11 @@
  */
 /*
  * Copyright (c) 1992, 2010, Oracle and/or its affiliates. All rights reserved.
  * Copyright 2014, Joyent, Inc. All rights reserved.
  * Copyright 2015 Nexenta Systems, Inc. All rights reserved.
+ * Copyright 2016 Garrett D'Amore
  */
 
 /*
  * Kernel statistics framework
  */

@@ -146,10 +147,11 @@
 extern  uint_t          pollstats_ndata;
 
 extern  int     vac;
 extern  uint_t  nproc;
 extern  time_t  boot_time;
+extern  hrtime_t        boot_hrtime;
 extern  sysinfo_t       sysinfo;
 extern  vminfo_t        vminfo;
 
 struct {
         kstat_named_t ncpus;

@@ -160,10 +162,11 @@
         kstat_named_t nproc;
         kstat_named_t avenrun_1min;
         kstat_named_t avenrun_5min;
         kstat_named_t avenrun_15min;
         kstat_named_t boot_time;
+        kstat_named_t boot_hrtime;
         kstat_named_t nsec_per_tick;
 } system_misc_kstat = {
         { "ncpus",              KSTAT_DATA_UINT32 },
         { "lbolt",              KSTAT_DATA_UINT32 },
         { "deficit",            KSTAT_DATA_UINT32 },

@@ -172,10 +175,11 @@
         { "nproc",              KSTAT_DATA_UINT32 },
         { "avenrun_1min",       KSTAT_DATA_UINT32 },
         { "avenrun_5min",       KSTAT_DATA_UINT32 },
         { "avenrun_15min",      KSTAT_DATA_UINT32 },
         { "boot_time",          KSTAT_DATA_UINT32 },
+        { "boot_hrtime",        KSTAT_DATA_TIME },
         { "nsec_per_tick",      KSTAT_DATA_UINT32 },
 };
 
 struct {
         kstat_named_t physmem;

@@ -808,10 +812,11 @@
 system_misc_kstat_update(kstat_t *ksp, int rw)
 {
         int myncpus = ncpus;
         int *loadavgp = &avenrun[0];
         time_t zone_boot_time;
+        hrtime_t zone_boot_hrtime;
         clock_t zone_lbolt;
         hrtime_t zone_hrtime;
         size_t zone_nproc;
 
         if (rw == KSTAT_WRITE)

@@ -834,12 +839,14 @@
 
         if (INGLOBALZONE(curproc)) {
                 zone_boot_time = boot_time;
                 zone_lbolt = ddi_get_lbolt();
                 zone_nproc = nproc;
+                zone_boot_hrtime = boot_hrtime;
         } else {
                 zone_boot_time = curproc->p_zone->zone_boot_time;
+                zone_boot_hrtime = curproc->p_zone->zone_boot_hrtime;
 
                 zone_hrtime = gethrtime();
                 zone_lbolt = (clock_t)(NSEC_TO_TICK(zone_hrtime) -
                     NSEC_TO_TICK(curproc->p_zone->zone_zsched->p_mstart));
                 mutex_enter(&curproc->p_zone->zone_nlwps_lock);

@@ -856,10 +863,11 @@
         system_misc_kstat.avenrun_1min.value.ui32       = (uint32_t)loadavgp[0];
         system_misc_kstat.avenrun_5min.value.ui32       = (uint32_t)loadavgp[1];
         system_misc_kstat.avenrun_15min.value.ui32      = (uint32_t)loadavgp[2];
         system_misc_kstat.boot_time.value.ui32          = (uint32_t)
             zone_boot_time;
+        system_misc_kstat.boot_hrtime.value.t           = zone_boot_hrtime;
         system_misc_kstat.nsec_per_tick.value.ui32      = (uint32_t)
             nsec_per_tick;
         return (0);
 }