kstat2_create(9f) 맨 페이지 - 윈디하나의 솔라나라

개요

섹션
맨 페이지 이름
검색(S)

kstat2_create(9f)

kstat2_create(9F)              Kernel Functions              kstat2_create(9F)



NAME
       kstat2_create - create and initialize a new kstat

SYNOPSIS
       #include <sys/types.h>
       #include <sys/kstat2.h>

       kstat2_t *kstat2_create(const char *pseg[], uint32_t npseg,
                 const zoneid_t ks_zone, kstat2_named_t *ks_data,
                 uint_t ks_ndata, uint32_t ks_flags,
                 const kstat2_md_t *ks_metadata,
                 const char *ks_desc, kstat2_metaflag_t ks_mflags);

INTERFACE LEVEL
       Solaris DDI specific (Solaris DDI)

PARAMETERS
       ks_pseg

           The  segments  used  to  construct a path which uniquely identifies
           this kstat. For example, "unix", "cpu", "cpu_info", "1".


       ks_npseg

           The number of path segments in the array kstat_pseg.


       ks_zone

           The ID of the zone in which kstat will initially  be  visible.  The
           constant  ALL_ZONES is used to make the kstat visible in all zones,
           and GLOBAL_ZONEID to make it visible only in the  global  zone.  To
           make  the kstat visible in other zones, see kstat2_zone_add(9F) and
           description of KSTAT2_FLAG_GZ_VIS later in the man page.


       ks_data

           This argument must be NULL for kstats whose storage is  managed  by
           the framework, and a pointer to an array of kstat2 name-value pairs
           for kstats whose data storage is managed by the kstat provider.


       ks_ndata

           The number of name-value pairs in the ks_data section of the kstat.


       ks_flags

           A bit-field of various flags for this kstat. The only flag which is
           available for use by kstat providers is:


           KSTAT2_FLAG_PERSISTENT

               Indicates  that this kstat is persistent over time. For persis‐
               tent kstats, kstat2_delete(9F) function marks the kstat as dor‐
               mant;  a  subsequent  kstat2_create()  function reactivates the
               kstat. This feature is provided so that statistics are not lost
               across  driver  close  or  open (such as raw disk I/O on a disk
               with no mounted partitions). Note that persistent kstats cannot
               have  their  storage managed by the driver since ks_data points
               to garbage as soon as the driver goes away.


           KSTAT2_FLAG_GZ_VIS

               Indicates that this kstat is created and made visible  in  both
               the  global  zone  and  ks_zone, if kz_zone is the ID of a non-
               global zone.




       ks_metadata

           The metadata for the values held in the kstat's ks_data  structure.
           This  metadata  is  an  array of kstat2_md_t structures of the same
           length and in the same order  as  the  kstat  name-value  pairs  in
           ks_data.


       ks_desc

           A  brief  string  describing the purpose of this kstat. This string
           must be statically allocated as a pointer to it, which is  held  in
           the kstat.


       ks_mflags

           Meta-flags for the kstat as a whole.


           KSTAT2_MF_NONE

               Indicates that this kstat has no meta-flags set.


           KSTAT2_MF_STABLE

               Indicates  that this kstat is considered stable and will not be
               removed from Oracle Solaris without prior notification.


           KSTAT2_MF_PRIV

               Indicates that this kstat contains sensitive content which  can
               only be read by users having the appropriate RBAC privilege.





DESCRIPTION
       kstat2_create() function is used in conjunction with kstat2_install(9F)
       to allocate and initialize a kstat2(9S) structure. The method is gener‐
       ally as follows:


       kstat2_create()  function  allocates and performs necessary system ini‐
       tialization of a kstat2(9S) structure. kstat2_create()  function  allo‐
       cates  memory  for the entire kstat (including data if necessary), ini‐
       tializes all header fields and the data section, assigns a unique kstat
       ID  (KID),  and  then puts the kstat onto the system's kstat chain. The
       returned kstat is marked invalid because the provider (caller) may  not
       have initialized the data section.


       After  a  successful call to kstat2_create() function, the provider can
       set the ks2_update, ks2_private and ks2_lock fields if  necessary,  and
       must initialize the name-value pairs in ks2_data.


       Once  the  kstat is completely initialized, kstat2_install(9F) function
       is used to make the kstat accessible to the outside world.


       Kstats containing data which may be regarded as sensitive  should  have
       the  KSTAT_MF_PRIV  flag set in metadata. Kstats with this flag set are
       only visible to and  readable  by  users  having  the  RBAC  privilege:
       kstat_rd_sensitive.

RETURN VALUES
       If  successful,  the  kstat2_create() function returns a pointer to the
       allocated kstat. NULL is returned upon failure.

CONTEXT
       The kstat2_create() function can be called from user or kernel context.

EXAMPLES
       Example 1 Create a kstat with framework allocated storage



         #include <sys/types.h>
         #include <sys/kstat2.h>

         static const kstat2_md_t[2] md = {
             { KSTAT2_NVMT_CNT, KSTAT2_NVMF_NONE, 1UL,
                 "Caller count", KSTAT1_DATA_NONE },
             { KSTAT2_NVMT_UNK, KSTAT2_NVMF_NONE, 0UL,
                 "Last caller name", KSTAT1_DATA_NONE }
         };
         static const uint_t ndata = sizeof (md) / sizeof (kstat2_md_t);
         static kmutex_t my_lock;

         static kstat2_t
         my_drv_create_kstat()
         {
             kstat2_t *ksp;
             const char *pseg[] = { "misc", "my_drv", "data_in", "0" };

             ksp = kstat2_create(pseg, sizeof (pseg) / sizeof (char *),
                 ALL_ZONES, NULL, ndata, 0, md,
                 "data read by my_drv", KSTAT2_MF_NONE);

             if (ksp != NULL) {
                 /*
                  * Kstat name-value pairs must be initialized
                  * before calling kstat2_install()
                  */
                 kstat2_named_t *knp = KSTAT2_NV_PTR(ksp);
                 kstat2_nv_init(knp, "int_data", KSTAT2_NVVT_INT, KSTAT2_NVF_NONE);
                 kstat2_nv_init(knp+1, "str_data", KSTAT2_NVVT_STR, KSTAT2_NVF_NONE);

                 /*
                  * Set kstat's lock because there is variable
                  * data in the kstat (KSTAT2_NVVT_STR).
                  */
                 ksp->ks2_lock = &my_lock;
                 kstat2_install(ksp);
             }
             return (ksp);
         }



       Example 2 Create a kstat with driver allocated storage



         #include <sys/types.h>
         #include <sys/kstat2.h>

         static const kstat2_md_t[2] md = {
             { KSTAT2_NVMT_BYTES, KSTAT2_NVMF_NONE, 1UL,
                 "int1 byte count", KSTAT1_DATA_NONE },
             { KSTAT2_NVMT_BYTES, KSTAT2_NVMF_NONE, 1UL,
                 "int2 byte count", KSTAT1_DATA_NONE }
         };
         static const uint_t ndata = sizeof (md) / sizeof (kstat2_md_t);
         static kstat2_named_t my_drv_kvals[2];
         static kmutex_t my_lock;

         static kstat2_t
         my_drv_create_kstat()
         {
             kstat2_t *ksp;
             const char *pseg[] = { "misc", "my_drv", "data_in", "0" };

             ksp = kstat2_create(pseg, sizeof (pseg) / sizeof (char *),
                 ALL_ZONES, my_drv_kvals, ndata, 0, md,
                 "data read by my_drv", KSTAT2_MF_NONE);

             if (ksp != NULL) {
                 /*
                  * Kstat name-value pairs must be initialized
                  * before calling kstat2_install(). This could also be done
                  * in a static initializer of my_drv_kvals.
                  */
                 kstat2_nv_init(my_drv_kvals[0], "int1",
                     KSTAT2_NVVT_INT, KSTAT2_NVF_NONE);
                 kstat2_nv_init(my_drv_kvals[1], "int2",
                     KSTAT2_NVVT_INT, KSTAT2_NVF_NONE);

                 kstat2_install(ksp);
             }
             return (ksp);
         }



       Example 3 Create a persistent kstat



         #include <sys/types.h>
         #include <sys/kstat2.h>

         static const kstat2_md_t[2] md = {
             { KSTAT2_NVMT_CNT, KSTAT2_NVMF_NONE, 1UL,
                "data errors", KSTAT1_DATA_NONE },
             { KSTAT2_NVMT_CNT, KSTAT2_NVMF_NONE, 1UL,
               "transport errors", KSTAT1_DATA_NONE }
         };
         static const uint_t ndata = sizeof (md) / sizeof (kstat2_md_t);

         static kstat2_t
         create_dsk_error_kstat(const char *ddi_inst_str)
         {
             kstat2_t *ksp;
             const char *pseg[] = { "disk", "mydrv", ddi_inst_str, "err" };

                   /*
                    * Create a persistent kstat for the disk error data.
                    * Note that the kstat's framework must allocate and manage
                    * the storage the data in a persistent kstat.
                    */
             ksp = kstat2_create(pseg, sizeof (pseg) / sizeof (char *),
                   ALL_ZONES, NULL, ndata, KSTAT2_FLAG_PERSISTENT, md,
                          "mydrv disk error kstat", KSTAT2_MF_NONE);

                      if (ksp != NULL) {
                          /*
                           * Kstat name-value pairs must be initialized before
                           * calling the kstat2_install() function. However, a persistent kstat
                           * which is being reactivated has data which is already
                           * initialized, so there is no need to do it again. It would
                           * be an error to do so. So the kvals are
                           * only initialized if the kstat is not in a dormant state.
                           */
                      if (! (ksp->ks2_flags & KSTAT_FLAG_DORMANT)) {
                              kstat2_named_t *err_kval = ksp->ks2_data;

                              kstat2_nv_init(err_kval, "data_errors",
                                  KSTAT2_NVVT_INT, KSTAT2_NVF_NONE);
                              kstat2_nv_init(err_kval+1, "transport_errors",
                                  KSTAT2_NVVT_INT, KSTAT2_NVF_NONE);
                          }

                          kstat2_install(ksp);
             }
             return (ksp);
         }



SEE ALSO
       user_attr(5),        privileges(7),        kstat2_create_histogram(9F),
       kstat2_delete(9F),        kstat2_install(9F),       kstat2_nv_init(9F),
       kstat2_zone_add(9F), kstat2_zone_remove(9F), kstat2(9S), kstat2_md(9S),
       kstat2_named(9S)

NOTES
       When  creating  persistent  kstats,  it  is  important to note that the
       kstats framework makes an internal copy of the metadata and the strings
       supplied  for  the  kval (kstat value) names. This is to ensure that if
       the driver or module is unloaded, there are no stale references held to
       static  data  in  the driver's address space. This copying only happens
       when the kstat is first installed by a  call  to  the  kstat2_install()
       function. Therefore, if a kval is reinitialized after a kstat is active
       from a dormant state, the kval name pointer points to an address in the
       driver's  address  space. This space becomes invalid if the driver were
       subsequently unloaded. For more information, see the kstat2_install(9F)
       man page.



Oracle Solaris 11.4               12 Aug 2016                kstat2_create(9F)
맨 페이지 내용의 저작권은 맨 페이지 작성자에게 있습니다.
RSS ATOM XHTML 5 CSS3