]> git.proxmox.com Git - mirror_spl-debian.git/commitdiff
Add basic dynamic kstat support
authorBrian Behlendorf <behlendorf1@llnl.gov>
Mon, 30 Jan 2012 20:15:31 +0000 (12:15 -0800)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Thu, 2 Feb 2012 19:28:00 +0000 (11:28 -0800)
Add the bare minimum functionality to support dynamic kstats.  A
complete kstat implementation should be done as part of issue #84.

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Issue #84

include/sys/kstat.h
module/spl/spl-kstat.c

index 3c2ad4c5ba068aace8fc4d05ff6e4f83f834d13e..e4c88c82b7ccb71562c14addc549920d90f87d5d 100644 (file)
 
 #define KS_MAGIC                0x9d9d9d9d
 
-typedef int kid_t;              /* unique kstat id */
+/* Dynamic updates */
+#define KSTAT_READ              0
+#define KSTAT_WRITE             1
+
+struct kstat_s;
+
+typedef int kid_t;                                  /* unique kstat id */
+typedef int kstat_update_t(struct kstat_s *, int);  /* dynamic update cb */
 
 typedef struct kstat_s {
        int              ks_magic;                  /* magic value */
@@ -89,6 +96,8 @@ typedef struct kstat_s {
         uint_t           ks_ndata;                  /* # of type-specific data records */
         size_t           ks_data_size;              /* size of kstat data section */
         struct proc_dir_entry *ks_proc;             /* proc linkage */
+        kstat_update_t   *ks_update;                /* dynamic updates */
+        void             *ks_private;               /* private data */
         spinlock_t       ks_lock;                   /* kstat data lock */
         struct list_head ks_list;                   /* kstat linkage */
 } kstat_t;
index ee9dfdf0324522c15a1d2d94312035d111802935..48fab972b8c8859fc1a08232e131cef1c5ed7b8f 100644 (file)
@@ -223,6 +223,13 @@ kstat_seq_show(struct seq_file *f, void *p)
         return rc;
 }
 
+int
+kstat_default_update(kstat_t *ksp, int rw)
+{
+       ASSERT(ksp != NULL);
+       return 0;
+}
+
 static void *
 kstat_seq_data_addr(kstat_t *ksp, loff_t n)
 {
@@ -260,6 +267,9 @@ kstat_seq_start(struct seq_file *f, loff_t *pos)
         ASSERT(ksp->ks_magic == KS_MAGIC);
         SENTRY;
 
+        /* Dynamically update kstat, on error existing kstats are used */
+        (void) ksp->ks_update(ksp, KSTAT_READ);
+
         spin_lock(&ksp->ks_lock);
        ksp->ks_snaptime = gethrtime();
 
@@ -361,6 +371,8 @@ __kstat_create(const char *ks_module, int ks_instance, const char *ks_name,
        strncpy(ksp->ks_class, ks_class, KSTAT_STRLEN);
        ksp->ks_type = ks_type;
        ksp->ks_flags = ks_flags;
+       ksp->ks_update = kstat_default_update;
+       ksp->ks_private = NULL;
 
        switch (ksp->ks_type) {
                 case KSTAT_TYPE_RAW: