Print this page
codereview and testing fixes.
6558 kstat: desire type for timestamps


   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
  23  * Copyright 2013 David Hoeppner.  All rights reserved.
  24  * Copyright 2013 Nexenta Systems, Inc.  All rights reserved.

  25  */
  26 
  27 #ifndef _STAT_KSTAT_H
  28 #define _STAT_KSTAT_H
  29 
  30 /*
  31  * Structures needed by the kstat reader functions.
  32  */
  33 #include <sys/var.h>
  34 #include <sys/utsname.h>
  35 #include <sys/sysinfo.h>
  36 #include <sys/flock.h>
  37 #include <sys/dnlc.h>
  38 #include <regex.h>
  39 #include <nfs/nfs.h>
  40 #include <nfs/nfs_clnt.h>
  41 
  42 #ifdef __sparc
  43 #include <vm/hat_sfmmu.h>
  44 #include <sys/simmstat.h>
  45 #include <sys/sysctrl.h>
  46 #include <sys/fhc.h>
  47 #endif
  48 
  49 #define KSTAT_DATA_HRTIME       (KSTAT_DATA_STRING + 1)
  50 
  51 typedef union ks_value {
  52         char            c[16];
  53         int32_t         i32;
  54         uint32_t        ui32;
  55         struct {
  56                 union {
  57                         char    *ptr;
  58                         char    __pad[8];
  59                 } addr;
  60                 uint32_t        len;
  61         } str;
  62 
  63         int64_t         i64;
  64         uint64_t        ui64;

  65 } ks_value_t;
  66 
  67 #define SAVE_HRTIME(I, S, N)                            \
  68 {                                                       \
  69         ks_value_t v;                                   \
  70         v.ui64 = S->N;                                       \

  71         nvpair_insert(I, #N, &v, KSTAT_DATA_UINT64);        \



  72 }
  73 
  74 #define SAVE_INT32(I, S, N)                             \
  75 {                                                       \
  76         ks_value_t v;                                   \
  77         v.i32 = S->N;                                        \
  78         nvpair_insert(I, #N, &v, KSTAT_DATA_INT32); \
  79 }
  80 
  81 #define SAVE_UINT32(I, S, N)                            \
  82 {                                                       \
  83         ks_value_t v;                                   \
  84         v.ui32 = S->N;                                       \
  85         nvpair_insert(I, #N, &v, KSTAT_DATA_UINT32);        \
  86 }
  87 
  88 #define SAVE_INT64(I, S, N)                             \
  89 {                                                       \
  90         ks_value_t v;                                   \
  91         v.i64 = S->N;                                        \


  98         v.ui64 = S->N;                                       \
  99         nvpair_insert(I, #N, &v, KSTAT_DATA_UINT64);        \
 100 }
 101 
 102 /*
 103  * We dont want const "strings" because we free
 104  * the instances later.
 105  */
 106 #define SAVE_STRING(I, S, N)                            \
 107 {                                                       \
 108         ks_value_t v;                                   \
 109         v.str.addr.ptr = safe_strdup(S->N);          \
 110         v.str.len = strlen(S->N);                    \
 111         nvpair_insert(I, #N, &v, KSTAT_DATA_STRING);        \
 112 }
 113 
 114 #define SAVE_HRTIME_X(I, N, V)                          \
 115 {                                                       \
 116         ks_value_t v;                                   \
 117         v.ui64 = V;                                     \
 118         nvpair_insert(I, N, &v, KSTAT_DATA_HRTIME); \
 119 }
 120 
 121 #define SAVE_INT32_X(I, N, V)                           \
 122 {                                                       \
 123         ks_value_t v;                                   \
 124         v.i32 = V;                                      \
 125         nvpair_insert(I, N, &v, KSTAT_DATA_INT32);  \
 126 }
 127 
 128 #define SAVE_UINT32_X(I, N, V)                          \
 129 {                                                       \
 130         ks_value_t v;                                   \
 131         v.ui32 = V;                                     \
 132         nvpair_insert(I, N, &v, KSTAT_DATA_UINT32); \
 133 }
 134 
 135 #define SAVE_UINT64_X(I, N, V)                          \
 136 {                                                       \
 137         ks_value_t v;                                   \
 138         v.ui64 = V;                                     \


 153         (void) asprintf(&v.str.addr.ptr, "%c", V);  \
 154         v.str.len = 1;                                  \
 155         nvpair_insert(I, N, &v, KSTAT_DATA_STRING); \
 156 }
 157 
 158 #define DFLT_FMT                                        \
 159         "module: %-30.30s  instance: %-6d\n"            \
 160         "name:   %-30.30s  class:    %-.30s\n"
 161 
 162 #define JSON_FMT                                        \
 163         "{\n\t\"module\": \"%s\",\n"                    \
 164         "\t\"instance\": %d,\n"                         \
 165         "\t\"name\": \"%s\",\n"                         \
 166         "\t\"class\": \"%s\",\n"                        \
 167         "\t\"type\": %d,\n"
 168 
 169 #define KS_DFMT "\t%-30s  "
 170 #define KS_JFMT "\t\t\"%s\": "
 171 #define KS_PFMT "%s:%d:%s:%s"
 172 








 173 typedef struct ks_instance {
 174         list_node_t     ks_next;
 175         char            ks_name[KSTAT_STRLEN];
 176         char            ks_module[KSTAT_STRLEN];
 177         char            ks_class[KSTAT_STRLEN];
 178         int             ks_instance;
 179         uchar_t         ks_type;
 180         hrtime_t        ks_snaptime;
 181         list_t          ks_nvlist;
 182 } ks_instance_t;
 183 
 184 typedef struct ks_nvpair {
 185         list_node_t     nv_next;
 186         char            name[KSTAT_STRLEN];
 187         uchar_t         data_type;
 188         ks_value_t      value;
 189 } ks_nvpair_t;
 190 
 191 typedef struct ks_pattern {
 192         char            *pstr;




   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
  23  * Copyright 2013 David Hoeppner.  All rights reserved.
  24  * Copyright 2013 Nexenta Systems, Inc.  All rights reserved.
  25  * Copyright 2016 Garrett D'Amore
  26  */
  27 
  28 #ifndef _STAT_KSTAT_H
  29 #define _STAT_KSTAT_H
  30 
  31 /*
  32  * Structures needed by the kstat reader functions.
  33  */
  34 #include <sys/var.h>
  35 #include <sys/utsname.h>
  36 #include <sys/sysinfo.h>
  37 #include <sys/flock.h>
  38 #include <sys/dnlc.h>
  39 #include <regex.h>
  40 #include <nfs/nfs.h>
  41 #include <nfs/nfs_clnt.h>
  42 
  43 #ifdef __sparc
  44 #include <vm/hat_sfmmu.h>
  45 #include <sys/simmstat.h>
  46 #include <sys/sysctrl.h>
  47 #include <sys/fhc.h>
  48 #endif
  49 


  50 typedef union ks_value {
  51         char            c[16];
  52         int32_t         i32;
  53         uint32_t        ui32;
  54         struct {
  55                 union {
  56                         char    *ptr;
  57                         char    __pad[8];
  58                 } addr;
  59                 uint32_t        len;
  60         } str;
  61 
  62         int64_t         i64;
  63         uint64_t        ui64;
  64         hrtime_t        t;
  65 } ks_value_t;
  66 
  67 #define SAVE_HRTIME(I, S, N)                                    \
  68 {                                                               \
  69         ks_value_t v;                                           \
  70         v.ui64 = S->N;                                               \
  71         if (g_hrtime_fmt == KS_HRFMT_DEFAULT) {                 \
  72                 nvpair_insert(I, #N, &v, KSTAT_DATA_UINT64);        \
  73         } else {                                                \
  74                 nvpair_insert(I, #N, &v, KSTAT_DATA_TIME);  \
  75         }                                                       \
  76 }
  77 
  78 #define SAVE_INT32(I, S, N)                             \
  79 {                                                       \
  80         ks_value_t v;                                   \
  81         v.i32 = S->N;                                        \
  82         nvpair_insert(I, #N, &v, KSTAT_DATA_INT32); \
  83 }
  84 
  85 #define SAVE_UINT32(I, S, N)                            \
  86 {                                                       \
  87         ks_value_t v;                                   \
  88         v.ui32 = S->N;                                       \
  89         nvpair_insert(I, #N, &v, KSTAT_DATA_UINT32);        \
  90 }
  91 
  92 #define SAVE_INT64(I, S, N)                             \
  93 {                                                       \
  94         ks_value_t v;                                   \
  95         v.i64 = S->N;                                        \


 102         v.ui64 = S->N;                                       \
 103         nvpair_insert(I, #N, &v, KSTAT_DATA_UINT64);        \
 104 }
 105 
 106 /*
 107  * We dont want const "strings" because we free
 108  * the instances later.
 109  */
 110 #define SAVE_STRING(I, S, N)                            \
 111 {                                                       \
 112         ks_value_t v;                                   \
 113         v.str.addr.ptr = safe_strdup(S->N);          \
 114         v.str.len = strlen(S->N);                    \
 115         nvpair_insert(I, #N, &v, KSTAT_DATA_STRING);        \
 116 }
 117 
 118 #define SAVE_HRTIME_X(I, N, V)                          \
 119 {                                                       \
 120         ks_value_t v;                                   \
 121         v.ui64 = V;                                     \
 122         nvpair_insert(I, N, &v, KSTAT_DATA_TIME);   \
 123 }
 124 
 125 #define SAVE_INT32_X(I, N, V)                           \
 126 {                                                       \
 127         ks_value_t v;                                   \
 128         v.i32 = V;                                      \
 129         nvpair_insert(I, N, &v, KSTAT_DATA_INT32);  \
 130 }
 131 
 132 #define SAVE_UINT32_X(I, N, V)                          \
 133 {                                                       \
 134         ks_value_t v;                                   \
 135         v.ui32 = V;                                     \
 136         nvpair_insert(I, N, &v, KSTAT_DATA_UINT32); \
 137 }
 138 
 139 #define SAVE_UINT64_X(I, N, V)                          \
 140 {                                                       \
 141         ks_value_t v;                                   \
 142         v.ui64 = V;                                     \


 157         (void) asprintf(&v.str.addr.ptr, "%c", V);  \
 158         v.str.len = 1;                                  \
 159         nvpair_insert(I, N, &v, KSTAT_DATA_STRING); \
 160 }
 161 
 162 #define DFLT_FMT                                        \
 163         "module: %-30.30s  instance: %-6d\n"            \
 164         "name:   %-30.30s  class:    %-.30s\n"
 165 
 166 #define JSON_FMT                                        \
 167         "{\n\t\"module\": \"%s\",\n"                    \
 168         "\t\"instance\": %d,\n"                         \
 169         "\t\"name\": \"%s\",\n"                         \
 170         "\t\"class\": \"%s\",\n"                        \
 171         "\t\"type\": %d,\n"
 172 
 173 #define KS_DFMT "\t%-30s  "
 174 #define KS_JFMT "\t\t\"%s\": "
 175 #define KS_PFMT "%s:%d:%s:%s"
 176 
 177 #define KS_HRFMT_DEFAULT        'o'
 178 #define KS_HRFMT_BOOT           'b'
 179 #define KS_HRFMT_UNIX           'u'
 180 #define KS_HRFMT_DATE           'd'
 181 #define KS_HRFMT_NANO           'n'
 182 #define KS_HRFMT_ISO            'I'
 183 #define KS_HRFMT_ZISO           'Z'
 184 
 185 typedef struct ks_instance {
 186         list_node_t     ks_next;
 187         char            ks_name[KSTAT_STRLEN];
 188         char            ks_module[KSTAT_STRLEN];
 189         char            ks_class[KSTAT_STRLEN];
 190         int             ks_instance;
 191         uchar_t         ks_type;
 192         hrtime_t        ks_snaptime;
 193         list_t          ks_nvlist;
 194 } ks_instance_t;
 195 
 196 typedef struct ks_nvpair {
 197         list_node_t     nv_next;
 198         char            name[KSTAT_STRLEN];
 199         uchar_t         data_type;
 200         ks_value_t      value;
 201 } ks_nvpair_t;
 202 
 203 typedef struct ks_pattern {
 204         char            *pstr;