components/top/patches/05.stolen_time.patch
author akshay.kale@oracle.com <akshay.kale@oracle.com>
Fri, 14 Oct 2016 13:13:27 -0700
changeset 7112 dab9beb5bc49
parent 2192 31cdcfd53b4b
permissions -rw-r--r--
24843178 Method of choosing ofports need to be improved in OVS
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2192
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
     1
#
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
     2
# This patch was included to address:
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
     3
# 16988337 Stolen time should be visible in output of top(1)
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
     4
#
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
     5
# Upstream BugDB: https://sourceforge.net/p/unixtop/bugs/
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
     6
# Upstream BugURL: https://sourceforge.net/p/unixtop/bugs/55/
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
     7
#
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
     8
--- a/machine/m_sunos5.c	Fri May 24 15:39:52 2013 +0200
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
     9
+++ b/machine/m_sunos5.c	Wed Nov 05 13:48:21 2014 +0100
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    10
@@ -7,8 +7,7 @@
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    11
  * This is the machine-dependent module for SunOS 5.x (Solaris 2).
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    12
  * There is some support for MP architectures.
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    13
  * This makes top work on all revisions of SunOS 5 from 5.0
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    14
- * through 5.9 (otherwise known as Solaris 9).  It has not been
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    15
- * tested on SunOS 5.10.
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    16
+ * through 5.11 (otherwise known as Solaris 11).
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    17
  *
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    18
  * AUTHORS:      Torsten Kasch 		<[email protected]>
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    19
  *               Robert Boucher		<[email protected]>
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    20
@@ -18,6 +17,7 @@
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    21
  *               Petri Kutvonen         <[email protected]>
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    22
  *	         Casper Dik             <[email protected]>
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    23
  *               Tim Pugh               <[email protected]>
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    24
+ *               Stanislav Kozina       <[email protected]>
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    25
  */
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    26
 
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    27
 #define _KMEMUSER
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    28
@@ -112,6 +112,11 @@
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    29
 #define USE_KSTAT
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    30
 #endif
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    31
 #ifdef USE_KSTAT
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    32
+
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    33
+# if OSREV >= 510
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    34
+#  define USE_NAMED_CPU_KSTAT
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    35
+# endif
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    36
+
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    37
 #include <kstat.h>
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    38
 /*
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    39
  * Some kstats are fixed at 32 bits, these will be specified as ui32; some
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    40
@@ -235,18 +240,35 @@
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    41
  */
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    42
 struct cpustats
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    43
 {
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    44
-    unsigned int states[CPUSTATES];
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    45
-    uint_t pswitch;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    46
-    uint_t trap;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    47
-    uint_t intr;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    48
-    uint_t syscall;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    49
-    uint_t sysfork;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    50
-    uint_t sysvfork;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    51
-    uint_t pfault;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    52
-    uint_t pgin;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    53
-    uint_t pgout;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    54
+    uint64_t states[CPUSTATES];
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    55
+    uint64_t pswitch;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    56
+    uint64_t trap;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    57
+    uint64_t intr;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    58
+    uint64_t syscall;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    59
+    uint64_t sysfork;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    60
+    uint64_t sysvfork;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    61
+    uint64_t pfault;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    62
+    uint64_t pgin;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    63
+    uint64_t pgout;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    64
 };
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    65
 
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    66
+#ifdef USE_NAMED_CPU_KSTAT
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    67
+static int cpu_ticks_idle_index = -1;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    68
+static int cpu_ticks_user_index = -1;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    69
+static int cpu_ticks_kernel_index = -1;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    70
+static int cpu_ticks_stolen_index = -1;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    71
+static int pswitch_index = -1;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    72
+static int trap_index = -1;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    73
+static int intr_index = -1;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    74
+static int syscall_index = -1;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    75
+static int sysfork_index = -1;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    76
+static int sysvfork_index = -1;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    77
+static int hat_fault_index = -1;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    78
+static int as_fault_index = -1;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    79
+static int pgin_index = -1;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    80
+static int pgout_index = -1;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    81
+#endif
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    82
+
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    83
 /*
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    84
  * GCC assumes that all doubles are aligned.  Unfortunately it
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    85
  * doesn't round up the structure size to be a multiple of 8.
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    86
@@ -280,9 +302,12 @@
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    87
 
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    88
 int cpu_states[CPUSTATES];
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    89
 char *cpustatenames[] =
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    90
-{"idle", "user", "kernel", "iowait", "swap", NULL};
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    91
-#define CPUSTATE_IOWAIT 3
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    92
-#define CPUSTATE_SWAP   4
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    93
+{"idle", "user", "kernel", "stolen", "swap", NULL};
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    94
+#define CPUSTATE_IDLE     0
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    95
+#define CPUSTATE_USER     1
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    96
+#define CPUSTATE_KERNEL   2
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    97
+#define CPUSTATE_STOLEN   3
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    98
+#define CPUSTATE_SWAP     4
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
    99
 
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   100
 
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   101
 /* these are for detailing the memory statistics */
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   102
@@ -773,36 +798,33 @@
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   103
 }
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   104
 
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   105
 /*
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   106
- * int kstat_safe_namematch(int num, kstat_t *ksp, char *name, void *buf)
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   107
- *
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   108
- * Safe scan of kstat chain for names starting with "name".  Matches
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   109
- * are copied in to "ksp", and kstat_read is called on each match using
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   110
- * "buf" as a buffer of length "size".  The actual number of records
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   111
- * found is returned.  Up to "num" kstats are copied in to "ksp", but
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   112
- * no more.  If any kstat_read indicates that the chain has changed, then
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   113
- * the whole process is restarted.
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   114
+ * Safe scan of kstat chain for names starting with "module", "name" or
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   115
+ * "class". Every condition is ignored if set to empty string.
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   116
+ * kstat_read is called on each match. The actual number of records
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   117
+ * found is returned.  If any kstat_read indicates that the chain has changed,
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   118
+ * then the whole process is restarted.
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   119
  */
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   120
 
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   121
 int
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   122
-kstat_safe_namematch(int num, kstat_t **ksparg, char *name, void *buf, int size)
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   123
-
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   124
+kstat_safe_lookup(int num, kstat_t **ksparg, char *class, char *module,
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   125
+		     char *name)
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   126
 {
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   127
     kstat_t *ks;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   128
     kstat_t **ksp;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   129
     kid_t new_kcid;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   130
-    int namelen;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   131
+    int classlen, modlen, namelen;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   132
     int count;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   133
     int changed;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   134
-    char *cbuf;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   135
 
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   136
-    dprintf("kstat_safe_namematch(%d, %08x, %s, %08x, %d)\n",
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   137
-	    num, ksparg, name, buf, size);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   138
+    dprintf("kstat_safe_lookup(%d, %08x, %s, %s, %s)\n",
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   139
+	num, ksparg, class, module, name);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   140
 
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   141
+    classlen = strlen(class);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   142
+    modlen = strlen(module);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   143
     namelen = strlen(name);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   144
 
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   145
     do {
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   146
 	/* initialize before the scan */
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   147
-	cbuf = (char *)buf;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   148
 	ksp = ksparg;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   149
 	count = 0;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   150
 	changed = 0;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   151
@@ -810,18 +832,23 @@
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   152
 	/* scan the chain for matching kstats */
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   153
 	for (ks = kc->kc_chain; ks != NULL; ks = ks->ks_next)
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   154
 	{
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   155
-	    if (strncmp(ks->ks_name, name, namelen) == 0)
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   156
+	    if ((strncmp(ks->ks_class, class, classlen) == 0) &&
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   157
+	        (strncmp(ks->ks_module, module, modlen) == 0) &&
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   158
+	        (strncmp(ks->ks_name, name, namelen) == 0))
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   159
 	    {
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   160
+		dprintf("kstat_safe_lookup found instance %d (%p)\n",
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   161
+			ks->ks_instance, ks);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   162
+
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   163
 		/* this kstat matches: save it if there is room */
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   164
 		if (count++ < num)
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   165
 		{
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   166
 		    /* read the kstat */
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   167
-		    new_kcid = kstat_read(kc, ks, cbuf);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   168
+		    new_kcid = kstat_read(kc, ks, NULL);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   169
 
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   170
 		    /* if the chain changed, update it */
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   171
 		    if (new_kcid != kcid)
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   172
 		    {
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   173
-			dprintf("kstat_safe_namematch: chain changed to %d...updating\n",
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   174
+			dprintf("kstat_safe_lookup: chain changed to %d...updating\n",
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   175
 				new_kcid);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   176
 			changed = 1;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   177
 			kcid = kstat_chain_update(kc);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   178
@@ -832,18 +859,64 @@
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   179
 		    }
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   180
 
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   181
 		    /* move to the next buffers */
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   182
-		    cbuf += size;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   183
 		    *ksp++ = ks;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   184
 		}
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   185
 	    }
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   186
 	}
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   187
     } while(changed);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   188
 
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   189
-    dprintf("kstat_safe_namematch returns %d\n", count);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   190
+    dprintf("kstat_safe_lookup returns %d\n", count);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   191
 
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   192
     return count;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   193
 }
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   194
 
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   195
+#ifdef USE_NAMED_CPU_KSTAT
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   196
+/*
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   197
+ * If index_ptr integer value is > -1 then the index points to the
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   198
+ * string entry in the ks_data that we are interested in. Otherwise
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   199
+ * we will need to walk the array.
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   200
+ */
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   201
+static uint64_t
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   202
+kstat_safe_datalookup(kstat_t *kstat, char *name, int *index_ptr)
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   203
+{
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   204
+    int i;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   205
+    int size;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   206
+    int index;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   207
+    char *namep, *datap;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   208
+    kstat_named_t *data;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   209
+
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   210
+    if (kstat->ks_type != KSTAT_TYPE_NAMED)
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   211
+	    return (0);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   212
+
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   213
+    size = sizeof (kstat_named_t);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   214
+    namep = KSTAT_NAMED_PTR(kstat)->name;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   215
+
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   216
+    index = *index_ptr;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   217
+    if (index >= 0) {
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   218
+	    /* Short cut to the information. */
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   219
+	    datap = kstat->ks_data;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   220
+	    data = (kstat_named_t *)&datap[size*index];
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   221
+	    if (data->data_type != KSTAT_DATA_UINT64)
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   222
+		    return (0);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   223
+	    return (data->value.ui64);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   224
+    }
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   225
+
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   226
+    /* Need to go find the string. */
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   227
+    data = kstat->ks_data;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   228
+    for (i = 0; i < kstat->ks_ndata; i++) {
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   229
+	    if (strcmp(name, namep) == 0) {
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   230
+		    *index_ptr = i;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   231
+		    if (data->data_type != KSTAT_DATA_UINT64)
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   232
+			    return (0);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   233
+		    return (data->value.ui64);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   234
+	    }
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   235
+	    namep += size;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   236
+	    data++;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   237
+    }
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   238
+    return (0);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   239
+}
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   240
+#endif /* USE_NAMED_CPU_KSTAT */
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   241
+
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   242
 static kstat_t *ks_system_misc = NULL;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   243
 
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   244
 #endif /* USE_KSTAT */
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   245
@@ -936,36 +1009,55 @@
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   246
 
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   247
 {
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   248
 #ifdef USE_KSTAT
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   249
+#ifdef USE_NAMED_CPU_KSTAT
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   250
+    static kstat_t **cpu_sys_ks = NULL, **cpu_vm_ks = NULL;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   251
+    kstat_t *cpu_sys_stat_p, *cpu_vm_stat_p;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   252
+#else
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   253
     static kstat_t **cpu_ks = NULL;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   254
-    static cpu_stat_t *cpu_stat = NULL;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   255
+    cpu_stat_t cpu_stat;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   256
+#endif
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   257
+    static kid_t cpu_kcid = 0;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   258
     static unsigned int nelems = 0;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   259
-    cpu_stat_t *cpu_stat_p;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   260
-    int i, cpu_num;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   261
+    static int cpu_num = 0, cpu_vm_num = 0;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   262
+    int i;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   263
     struct cpustats *cpustats_p;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   264
 
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   265
     dprintf("get_cpustats(%d -> %d, %08x)\n", cnt, *cnt, cpustats);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   266
 
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   267
-    while (nelems > 0 ?
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   268
-	   (cpu_num = kstat_safe_namematch(nelems,
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   269
-					   cpu_ks,
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   270
-					   "cpu_stat",
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   271
-					   cpu_stat,
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   272
-					   sizeof(cpu_stat_t))) > nelems :
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   273
-	   (cpu_num = get_ncpus()) > 0)
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   274
+    /* Grab initial number of cpus */
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   275
+    if (nelems == 0) {
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   276
+	    cpu_vm_num = cpu_num = get_ncpus();
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   277
+	    if (cpu_num <= 0)
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   278
+		    return (cpustats);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   279
+    }
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   280
+
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   281
+reload:
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   282
+    /* Make sure we have enough space for all cpus */
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   283
+    while (cpu_kcid != kcid || cpu_num != cpu_vm_num || cpu_num > nelems)
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   284
     {
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   285
 	/* reallocate the arrays */
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   286
 	dprintf("realloc from %d to %d\n", nelems, cpu_num);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   287
 	nelems = cpu_num;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   288
-	if (cpu_ks != NULL)
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   289
-	{
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   290
-	    free(cpu_ks);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   291
+#ifdef USE_NAMED_CPU_KSTAT
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   292
+	free(cpu_sys_ks);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   293
+	free(cpu_vm_ks);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   294
+	cpu_sys_ks = (kstat_t **)calloc(nelems, sizeof(kstat_t *));
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   295
+	cpu_vm_ks = (kstat_t **)calloc(nelems, sizeof(kstat_t *));
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   296
+
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   297
+	if (cpu_sys_ks == NULL || cpu_vm_ks == NULL) {
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   298
+		puts("Allocation failed\n");
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   299
+		abort();
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   300
 	}
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   301
+
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   302
+	cpu_num = kstat_safe_lookup(nelems, cpu_sys_ks, "misc", "cpu", "sys");
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   303
+	cpu_vm_num = kstat_safe_lookup(nelems, cpu_vm_ks, "misc", "cpu", "vm");
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   304
+#else
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   305
+	free(cpu_ks);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   306
 	cpu_ks = (kstat_t **)calloc(nelems, sizeof(kstat_t *));
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   307
-	if (cpu_stat != NULL)
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   308
-	{
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   309
-	    free(cpu_stat);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   310
-	}
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   311
-	cpu_stat = (cpu_stat_t *)malloc(nelems * sizeof(cpu_stat_t));
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   312
+	cpu_num = cpu_vm_num =
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   313
+	    kstat_safe_lookup(nelems, cpu_ks, "misc", "cpu_stat", "");
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   314
+#endif
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   315
+	cpu_kcid = kcid;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   316
     }
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   317
 
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   318
     /* do we have more cpus than our caller? */
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   319
@@ -975,36 +1067,96 @@
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   320
 	dprintf("realloc array from %d to %d\n", *cnt, cpu_num);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   321
 	*cnt = cpu_num;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   322
 	cpustats = (struct cpustats *)realloc(cpustats,
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   323
-					      cpu_num * sizeof(struct cpustats));
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   324
+		cpu_num * sizeof(struct cpustats));
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   325
     }
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   326
 
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   327
-    cpu_stat_p = cpu_stat;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   328
     cpustats_p = cpustats;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   329
     for (i = 0; i < cpu_num; i++)
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   330
     {
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   331
-	dprintf("cpu %d %08x: idle %u, user %u, syscall %u\n", i, cpu_stat_p,
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   332
-		cpu_stat_p->cpu_sysinfo.cpu[0],
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   333
-		cpu_stat_p->cpu_sysinfo.cpu[1],
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   334
-		cpu_stat_p->cpu_sysinfo.syscall);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   335
+#ifdef USE_NAMED_CPU_KSTAT
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   336
+	cpu_sys_stat_p = cpu_sys_ks[i];
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   337
+	cpu_vm_stat_p = cpu_vm_ks[i];
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   338
 
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   339
-	cpustats_p->states[CPU_IDLE] = cpu_stat_p->cpu_sysinfo.cpu[CPU_IDLE];
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   340
-	cpustats_p->states[CPU_USER] = cpu_stat_p->cpu_sysinfo.cpu[CPU_USER];
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   341
-	cpustats_p->states[CPU_KERNEL] = cpu_stat_p->cpu_sysinfo.cpu[CPU_KERNEL];
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   342
-	cpustats_p->states[CPUSTATE_IOWAIT] = cpu_stat_p->cpu_sysinfo.wait[W_IO] +
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   343
-	    cpu_stat_p->cpu_sysinfo.wait[W_PIO];
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   344
-	cpustats_p->states[CPUSTATE_SWAP] = cpu_stat_p->cpu_sysinfo.wait[W_SWAP];
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   345
-	cpustats_p->pswitch = cpu_stat_p->cpu_sysinfo.pswitch;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   346
-	cpustats_p->trap = cpu_stat_p->cpu_sysinfo.trap;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   347
-	cpustats_p->intr = cpu_stat_p->cpu_sysinfo.intr;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   348
-	cpustats_p->syscall = cpu_stat_p->cpu_sysinfo.syscall;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   349
-	cpustats_p->sysfork = cpu_stat_p->cpu_sysinfo.sysfork;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   350
-	cpustats_p->sysvfork = cpu_stat_p->cpu_sysinfo.sysvfork;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   351
-	cpustats_p->pfault = cpu_stat_p->cpu_vminfo.hat_fault +
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   352
-	    cpu_stat_p->cpu_vminfo.as_fault;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   353
-	cpustats_p->pgin = cpu_stat_p->cpu_vminfo.pgin;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   354
-	cpustats_p->pgout = cpu_stat_p->cpu_vminfo.pgout;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   355
+	/*
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   356
+	 * If kstat id has changed, update the kstat headers and re-allocate
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   357
+	 * the arrays accordingly.
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   358
+	 */
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   359
+	if (((cpu_kcid = kstat_read(kc, cpu_sys_stat_p, NULL)) != kcid) ||
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   360
+		((cpu_kcid = kstat_read(kc, cpu_vm_stat_p, NULL)) != kcid))
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   361
+	    goto reload;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   362
+
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   363
+	dprintf("cpu %d %08x: idle %llu, user %llu, syscall %llu\n",
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   364
+		i, cpu_sys_stat_p,
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   365
+		kstat_safe_datalookup(cpu_sys_stat_p, "cpu_ticks_idle",
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   366
+		&cpu_ticks_idle_index),
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   367
+		kstat_safe_datalookup(cpu_sys_stat_p, "cpu_ticks_user",
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   368
+		&cpu_ticks_user_index),
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   369
+		kstat_safe_datalookup(cpu_sys_stat_p, "syscall",
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   370
+		&syscall_index));
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   371
+
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   372
+	cpustats_p->states[CPUSTATE_IDLE] =
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   373
+		kstat_safe_datalookup(cpu_sys_stat_p, "cpu_ticks_idle",
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   374
+		&cpu_ticks_idle_index);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   375
+	cpustats_p->states[CPUSTATE_USER] =
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   376
+		kstat_safe_datalookup(cpu_sys_stat_p, "cpu_ticks_user",
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   377
+		&cpu_ticks_user_index);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   378
+	cpustats_p->states[CPUSTATE_KERNEL] =
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   379
+		kstat_safe_datalookup(cpu_sys_stat_p, "cpu_ticks_kernel",
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   380
+		&cpu_ticks_kernel_index);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   381
+	cpustats_p->states[CPUSTATE_STOLEN] =
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   382
+		kstat_safe_datalookup(cpu_sys_stat_p, "cpu_ticks_stolen",
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   383
+		&cpu_ticks_stolen_index);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   384
+	cpustats_p->states[CPUSTATE_SWAP] = 0;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   385
+	cpustats_p->pswitch = kstat_safe_datalookup(cpu_sys_stat_p, "pswitch",
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   386
+		&pswitch_index);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   387
+	cpustats_p->trap = kstat_safe_datalookup(cpu_sys_stat_p, "trap",
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   388
+		&trap_index);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   389
+	cpustats_p->intr = kstat_safe_datalookup(cpu_sys_stat_p, "intr",
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   390
+		&intr_index);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   391
+	cpustats_p->syscall = kstat_safe_datalookup(cpu_sys_stat_p, "syscall",
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   392
+		&syscall_index);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   393
+	cpustats_p->sysfork = kstat_safe_datalookup(cpu_sys_stat_p, "sysfork",
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   394
+		&sysfork_index);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   395
+	cpustats_p->sysvfork = kstat_safe_datalookup(cpu_sys_stat_p, "sysvfork",
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   396
+		&sysvfork_index);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   397
+	cpustats_p->pfault = kstat_safe_datalookup(cpu_vm_stat_p, "hat_fault",
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   398
+		&hat_fault_index) +
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   399
+		kstat_safe_datalookup(cpu_vm_stat_p, "as_fault",
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   400
+		&as_fault_index);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   401
+	cpustats_p->pgin = kstat_safe_datalookup(cpu_vm_stat_p, "pgin",
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   402
+		&pgin_index);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   403
+	cpustats_p->pgout = kstat_safe_datalookup(cpu_vm_stat_p, "pgout",
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   404
+		&pgout_index);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   405
+#else
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   406
+	if ((cpu_kcid = kstat_read(kc, cpu_ks[i], &cpu_stat)) != kcid)
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   407
+	    goto reload;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   408
+
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   409
+	dprintf("cpu %d %08x: idle %u, user %u, syscall %u\n", i, cpu_stat,
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   410
+		cpu_stat.cpu_sysinfo.cpu[CPUSTATE_IDLE],
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   411
+		cpu_stat.cpu_sysinfo.cpu[CPUSTATE_USER],
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   412
+		cpu_stat.cpu_sysinfo.syscall);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   413
+
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   414
+	cpustats_p->states[CPUSTATE_IDLE] =
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   415
+		(uint64_t)cpu_stat.cpu_sysinfo.cpu[CPU_IDLE];
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   416
+	cpustats_p->states[CPUSTATE_USER] =
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   417
+		(uint64_t)cpu_stat.cpu_sysinfo.cpu[CPU_USER];
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   418
+	cpustats_p->states[CPUSTATE_KERNEL] =
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   419
+		(uint64_t)cpu_stat.cpu_sysinfo.cpu[CPU_KERNEL];
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   420
+	cpustats_p->states[CPUSTATE_STOLEN] = 0;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   421
+	cpustats_p->states[CPUSTATE_SWAP] =
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   422
+		(uint64_t)cpu_stat.cpu_sysinfo.wait[W_SWAP];
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   423
+	cpustats_p->pswitch = (uint64_t)cpu_stat.cpu_sysinfo.pswitch;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   424
+	cpustats_p->trap = (uint64_t)cpu_stat.cpu_sysinfo.trap;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   425
+	cpustats_p->intr = (uint64_t)cpu_stat.cpu_sysinfo.intr;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   426
+	cpustats_p->syscall = (uint64_t)cpu_stat.cpu_sysinfo.syscall;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   427
+	cpustats_p->sysfork = (uint64_t)cpu_stat.cpu_sysinfo.sysfork;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   428
+	cpustats_p->sysvfork = (uint64_t)cpu_stat.cpu_sysinfo.sysvfork;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   429
+	cpustats_p->pfault = (uint64_t)cpu_stat.cpu_vminfo.hat_fault +
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   430
+		(uint64_t)cpu_stat.cpu_vminfo.as_fault;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   431
+	cpustats_p->pgin = (uint64_t)cpu_stat.cpu_vminfo.pgin;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   432
+	cpustats_p->pgout = (uint64_t)cpu_stat.cpu_vminfo.pgout;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   433
+#endif
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   434
 	cpustats_p++;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   435
-	cpu_stat_p++;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   436
     }
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   437
 
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   438
     cpucount = cpu_num;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   439
@@ -1035,11 +1187,10 @@
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   440
 	    /* get struct cpu for this processor */
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   441
 	    (void) getkval (cpu_offset[i], (int *)(&cpu), sizeof (struct cpu), "cpu");
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   442
 
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   443
-	    (*cp_stats_p)[CPU_IDLE] = cpu.cpu_stat.cpu_sysinfo.cpu[CPU_IDLE];
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   444
-	    (*cp_stats_p)[CPU_USER] = cpu.cpu_stat.cpu_sysinfo.cpu[CPU_USER];
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   445
-	    (*cp_stats_p)[CPU_KERNEL] = cpu.cpu_stat.cpu_sysinfo.cpu[CPU_KERNEL];
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   446
-	    (*cp_stats_p)[CPUSTATE_IOWAIT] = cpu.cpu_stat.cpu_sysinfo.wait[W_IO] +
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   447
-		cpu.cpu_stat.cpu_sysinfo.wait[W_PIO];
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   448
+	    (*cp_stats_p)[CPUSTATE_IDLE] = cpu.cpu_stat.cpu_sysinfo.cpu[CPU_IDLE];
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   449
+	    (*cp_stats_p)[CPUSTATE_USER] = cpu.cpu_stat.cpu_sysinfo.cpu[CPU_USER];
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   450
+	    (*cp_stats_p)[CPUSTATE_KERNEL] = cpu.cpu_stat.cpu_sysinfo.cpu[CPU_KERNEL];
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   451
+	    (*cp_stats_p)[CPUSTATE_STOLEN] = 0;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   452
 	    (*cp_stats_p)[CPUSTATE_SWAP] = cpu.cpu_stat.cpu_sysinfo.wait[W_SWAP];
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   453
 	    cp_stats_p++;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   454
 	}
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   455
@@ -1394,14 +1545,55 @@
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   456
     return (0);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   457
 }
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   458
 
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   459
+static void
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   460
+percentages64(int cnt, int *out, uint64_t *new, uint64_t *old, uint64_t *diffs)
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   461
+{
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   462
+	int i;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   463
+	uint64_t change;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   464
+	uint64_t total_change;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   465
+	uint64_t *dp;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   466
+	uint64_t half_total;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   467
+
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   468
+	/* initialization */
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   469
+	total_change = 0;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   470
+	dp = diffs;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   471
+
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   472
+	/* calculate changes for each state and the overall change */
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   473
+	for (i = 0; i < cnt; i++) {
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   474
+		/*
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   475
+		 * Don't worry about wrapping - even at hz=1GHz, a
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   476
+		 * u_int64_t will last at least 544 years.
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   477
+		 */
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   478
+		change = *new - *old;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   479
+		total_change += (*dp++ = change);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   480
+		*old++ = *new++;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   481
+	}
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   482
+
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   483
+	/* avoid divide by zero potential */
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   484
+	if (total_change == 0)
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   485
+		total_change = 1;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   486
+
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   487
+	/* calculate percentages based on overall change, rounding up */
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   488
+	half_total = total_change / 2;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   489
+	for (i = 0; i < cnt; i++)
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   490
+		*out++ = (int)((*diffs++ * 1000 + half_total) / total_change);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   491
+}
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   492
+
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   493
+static uint_t
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   494
+diff_per_second64(uint64_t x, uint64_t y)
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   495
+{
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   496
+	uint64_t diff = y > x ? UINT64_MAX - y + x + 1 : x - y;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   497
+	return ((uint_t)(diff * 1000 / time_elapsed()));
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   498
+}
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   499
+
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   500
 void
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   501
 get_system_info (struct system_info *si)
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   502
 {
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   503
     int avenrun[3];
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   504
 
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   505
-    static long cp_time[CPUSTATES];
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   506
-    static long cp_old[CPUSTATES];
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   507
-    static long cp_diff[CPUSTATES];
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   508
+    static uint64_t cp_time[CPUSTATES];
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   509
+    static uint64_t cp_old[CPUSTATES];
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   510
+    static uint64_t cp_diff[CPUSTATES];
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   511
     static struct cpustats *cpustats = NULL;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   512
     static struct cpustats sum_current;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   513
     static struct cpustats sum_old;
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   514
@@ -1440,7 +1632,7 @@
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   515
     }
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   516
 
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   517
     /* convert cp_time counts to percentages */
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   518
-    (void) percentages (CPUSTATES, cpu_states, cp_time, cp_old, cp_diff);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   519
+    (void) percentages64 (CPUSTATES, cpu_states, cp_time, cp_old, cp_diff);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   520
 
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   521
     /* get mpid -- process id of last process */
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   522
     if (kd)
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   523
@@ -1467,15 +1659,15 @@
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   524
     }
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   525
 
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   526
     /* get kernel data */
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   527
-    kernel_stats[KERNEL_CSWITCH] = diff_per_second(sum_current.pswitch, sum_old.pswitch);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   528
-    kernel_stats[KERNEL_TRAP] = diff_per_second(sum_current.trap, sum_old.trap);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   529
-    kernel_stats[KERNEL_INTR] = diff_per_second(sum_current.intr, sum_old.intr);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   530
-    kernel_stats[KERNEL_SYSCALL] = diff_per_second(sum_current.syscall, sum_old.syscall);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   531
-    kernel_stats[KERNEL_FORK] = diff_per_second(sum_current.sysfork + sum_current.sysvfork,
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   532
+    kernel_stats[KERNEL_CSWITCH] = diff_per_second64(sum_current.pswitch, sum_old.pswitch);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   533
+    kernel_stats[KERNEL_TRAP] = diff_per_second64(sum_current.trap, sum_old.trap);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   534
+    kernel_stats[KERNEL_INTR] = diff_per_second64(sum_current.intr, sum_old.intr);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   535
+    kernel_stats[KERNEL_SYSCALL] = diff_per_second64(sum_current.syscall, sum_old.syscall);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   536
+    kernel_stats[KERNEL_FORK] = diff_per_second64(sum_current.sysfork + sum_current.sysvfork,
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   537
 						sum_old.sysfork + sum_old.sysvfork);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   538
-    kernel_stats[KERNEL_PFAULT] = diff_per_second(sum_current.pfault, sum_old.pfault);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   539
-    kernel_stats[KERNEL_PGIN] = pagetok(diff_per_second(sum_current.pgin, sum_old.pgin));
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   540
-    kernel_stats[KERNEL_PGOUT] = pagetok(diff_per_second(sum_current.pgout, sum_old.pgout));
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   541
+    kernel_stats[KERNEL_PFAULT] = diff_per_second64(sum_current.pfault, sum_old.pfault);
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   542
+    kernel_stats[KERNEL_PGIN] = pagetok(diff_per_second64(sum_current.pgin, sum_old.pgin));
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   543
+    kernel_stats[KERNEL_PGOUT] = pagetok(diff_per_second64(sum_current.pgout, sum_old.pgout));
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   544
 
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   545
 
31cdcfd53b4b 16988337 Stolen time should be visible in output of top(1)
Stanislav Kozina <stanislav.kozina@oracle.com>
parents:
diff changeset
   546
     /* set arrays and strings */