Whamcloud - gitweb
LU-2396 ofd: Remove unmaintained brw_stats
authorJohn L. Hammond <john.hammond@intel.com>
Thu, 28 Feb 2013 04:01:43 +0000 (22:01 -0600)
committerOleg Drokin <oleg.drokin@intel.com>
Fri, 22 Mar 2013 18:26:11 +0000 (14:26 -0400)
Remove unused nid_brw_stats member from struct nid_stat and the files
/proc/fs/lustre/obdfilter/*/{brw_stats,exports/*/brw_stats}.  If the
corresponding osd has a brw_stats proc entry then add a symlink from
the ofd proc dir.

Signed-off-by: John L. Hammond <john.hammond@intel.com>
Change-Id: I79a10816c612f67b80172d679b875ca94157b5f4
Reviewed-on: http://review.whamcloud.com/4689
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Tested-by: Hudson
Reviewed-by: Keith Mannthey <keith.mannthey@intel.com>
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Alex Zhuravlev <alexey.zhuravlev@intel.com>
lustre/include/lustre_export.h
lustre/obdclass/lprocfs_status.c
lustre/ofd/lproc_ofd.c
lustre/ofd/ofd_dev.c
lustre/ofd/ofd_internal.h
lustre/ofd/ofd_obd.c

index 29f6167..0a826ea 100644 (file)
@@ -110,7 +110,7 @@ struct mgs_export_data {
  * per-NID statistics structure.
  * It tracks access patterns to this export on a per-client-NID basis
  */
-typedef struct nid_stat {
+struct nid_stat {
         lnet_nid_t               nid;
         cfs_hlist_node_t         nid_hash;
         cfs_list_t               nid_list;
@@ -118,10 +118,9 @@ typedef struct nid_stat {
         struct proc_dir_entry   *nid_proc;
         struct lprocfs_stats    *nid_stats;
         struct lprocfs_stats    *nid_ldlm_stats;
-        struct brw_stats        *nid_brw_stats;
         cfs_atomic_t             nid_exp_ref_count; /* for obd_nid_stats_hash
                                                            exp_nid_stats */
-}nid_stat_t;
+};
 
 #define nidstat_getref(nidstat)                                                \
 do {                                                                           \
index 4eb8534..173ad85 100644 (file)
@@ -1322,9 +1322,8 @@ EXPORT_SYMBOL(lprocfs_obd_cleanup);
 
 static void lprocfs_free_client_stats(struct nid_stat *client_stat)
 {
-        CDEBUG(D_CONFIG, "stat %p - data %p/%p/%p\n", client_stat,
-               client_stat->nid_proc, client_stat->nid_stats,
-               client_stat->nid_brw_stats);
+       CDEBUG(D_CONFIG, "stat %p - data %p/%p\n", client_stat,
+              client_stat->nid_proc, client_stat->nid_stats);
 
         LASSERTF(cfs_atomic_read(&client_stat->nid_exp_ref_count) == 0,
                  "nid %s:count %d\n", libcfs_nid2str(client_stat->nid),
@@ -1336,9 +1335,6 @@ static void lprocfs_free_client_stats(struct nid_stat *client_stat)
         if (client_stat->nid_stats)
                 lprocfs_free_stats(&client_stat->nid_stats);
 
-        if (client_stat->nid_brw_stats)
-                OBD_FREE_PTR(client_stat->nid_brw_stats);
-
         if (client_stat->nid_ldlm_stats)
                 lprocfs_free_stats(&client_stat->nid_ldlm_stats);
 
@@ -2004,7 +2000,6 @@ EXPORT_SYMBOL(lprocfs_nid_stats_clear_read);
 static int lprocfs_nid_stats_clear_write_cb(void *obj, void *data)
 {
         struct nid_stat *stat = obj;
-        int i;
         ENTRY;
 
         CDEBUG(D_INFO,"refcnt %d\n", cfs_atomic_read(&stat->nid_exp_ref_count));
@@ -2019,10 +2014,6 @@ static int lprocfs_nid_stats_clear_write_cb(void *obj, void *data)
         if (stat->nid_stats)
                 lprocfs_clear_stats(stat->nid_stats);
 
-        if (stat->nid_brw_stats) {
-                for (i = 0; i < BRW_LAST; i++)
-                        lprocfs_oh_clear(&stat->nid_brw_stats->hist[i]);
-        }
         RETURN(0);
 }
 
index 272aba7..0d91844 100644 (file)
@@ -517,153 +517,12 @@ static struct lprocfs_vars lprocfs_ofd_module_vars[] = {
        { 0 }
 };
 
-#define pct(a,b) (b ? a * 100 / b : 0)
-
-static void display_brw_stats(struct seq_file *seq, char *name, char *units,
-                             struct obd_histogram *read,
-                             struct obd_histogram *write, int log2)
-{
-       unsigned long   read_tot, write_tot, r, w, read_cum = 0, write_cum = 0;
-       int             i;
-
-       seq_printf(seq, "\n%26s read      |     write\n", " ");
-       seq_printf(seq, "%-22s %-5s %% cum %% |  %-5s %% cum %%\n",
-                  name, units, units);
-
-       read_tot = lprocfs_oh_sum(read);
-       write_tot = lprocfs_oh_sum(write);
-       for (i = 0; i < OBD_HIST_MAX; i++) {
-               r = read->oh_buckets[i];
-               w = write->oh_buckets[i];
-               read_cum += r;
-               write_cum += w;
-               if (read_cum == 0 && write_cum == 0)
-                       continue;
-
-               if (!log2)
-                       seq_printf(seq, "%u", i);
-               else if (i < 10)
-                       seq_printf(seq, "%u", 1 << i);
-               else if (i < 20)
-                       seq_printf(seq, "%uK", 1 << (i - 10));
-               else
-                       seq_printf(seq, "%uM", 1 << (i - 20));
-
-               seq_printf(seq, ":\t\t%10lu %3lu %3lu   | %4lu %3lu %3lu\n",
-                          r, pct(r, read_tot), pct(read_cum, read_tot),
-                          w, pct(w, write_tot), pct(write_cum, write_tot));
-
-               if (read_cum == read_tot && write_cum == write_tot)
-                       break;
-       }
-}
-
-static void brw_stats_show(struct seq_file *seq, struct brw_stats *brw_stats)
-{
-       struct timeval  now;
-       char            title[24];
-
-       /* this sampling races with updates */
-       cfs_gettimeofday(&now);
-       seq_printf(seq, "snapshot_time:         %lu.%lu (secs.usecs)\n",
-                  now.tv_sec, now.tv_usec);
-
-       display_brw_stats(seq, "pages per bulk r/w", "rpcs",
-                         &brw_stats->hist[BRW_R_PAGES],
-                         &brw_stats->hist[BRW_W_PAGES], 1);
-
-       display_brw_stats(seq, "discontiguous pages", "rpcs",
-                         &brw_stats->hist[BRW_R_DISCONT_PAGES],
-                         &brw_stats->hist[BRW_W_DISCONT_PAGES], 0);
-
-       display_brw_stats(seq, "discontiguous blocks", "rpcs",
-                         &brw_stats->hist[BRW_R_DISCONT_BLOCKS],
-                         &brw_stats->hist[BRW_W_DISCONT_BLOCKS], 0);
-
-       display_brw_stats(seq, "disk fragmented I/Os", "ios",
-                         &brw_stats->hist[BRW_R_DIO_FRAGS],
-                         &brw_stats->hist[BRW_W_DIO_FRAGS], 0);
-
-       display_brw_stats(seq, "disk I/Os in flight", "ios",
-                         &brw_stats->hist[BRW_R_RPC_HIST],
-                         &brw_stats->hist[BRW_W_RPC_HIST], 0);
-
-       sprintf(title, "I/O time (1/%ds)", CFS_HZ);
-       display_brw_stats(seq, title, "ios",
-                         &brw_stats->hist[BRW_R_IO_TIME],
-                         &brw_stats->hist[BRW_W_IO_TIME], 1);
-
-       display_brw_stats(seq, "disk I/O size", "ios",
-                         &brw_stats->hist[BRW_R_DISK_IOSIZE],
-                         &brw_stats->hist[BRW_W_DISK_IOSIZE], 1);
-}
-
-#undef pct
-
-static int ofd_brw_stats_seq_show(struct seq_file *seq, void *v)
-{
-       struct obd_device *dev = seq->private;
-       struct filter_obd *ofd = &dev->u.filter;
-
-       brw_stats_show(seq, &ofd->fo_filter_stats);
-
-       return 0;
-}
-
-static ssize_t ofd_brw_stats_seq_write(struct file *file, const char *buf,
-                                      size_t len, loff_t *off)
-{
-       struct seq_file         *seq = file->private_data;
-       struct obd_device       *dev = seq->private;
-       struct filter_obd       *ofd = &dev->u.filter;
-       int                      i;
-
-       for (i = 0; i < BRW_LAST; i++)
-               lprocfs_oh_clear(&ofd->fo_filter_stats.hist[i]);
-
-       return len;
-}
-
-LPROC_SEQ_FOPS(ofd_brw_stats);
-
-int lproc_ofd_attach_seqstat(struct obd_device *dev)
-{
-       return lprocfs_obd_seq_create(dev, "brw_stats", 0644,
-                                     &ofd_brw_stats_fops, dev);
-}
-
 void lprocfs_ofd_init_vars(struct lprocfs_static_vars *lvars)
 {
        lvars->module_vars  = lprocfs_ofd_module_vars;
        lvars->obd_vars     = lprocfs_ofd_obd_vars;
 }
 
-static int ofd_per_nid_stats_seq_show(struct seq_file *seq, void *v)
-{
-       nid_stat_t *stat = seq->private;
-
-       if (stat->nid_brw_stats)
-               brw_stats_show(seq, stat->nid_brw_stats);
-
-       return 0;
-}
-
-static ssize_t ofd_per_nid_stats_seq_write(struct file *file, const char *buf,
-                                          size_t len, loff_t *off)
-{
-       struct seq_file *seq = file->private_data;
-        nid_stat_t     *stat = seq->private;
-        int             i;
-
-       if (stat->nid_brw_stats)
-               for (i = 0; i < BRW_LAST; i++)
-                       lprocfs_oh_clear(&stat->nid_brw_stats->hist[i]);
-
-       return len;
-}
-
-LPROC_SEQ_FOPS(ofd_per_nid_stats);
-
 void ofd_stats_counter_init(struct lprocfs_stats *stats)
 {
        LASSERT(stats && stats->ls_num == LPROC_OFD_STATS_LAST);
index f90d820..7243c12 100644 (file)
@@ -427,12 +427,6 @@ static int ofd_procfs_init(struct ofd_device *ofd)
        lprocfs_counter_init(obd->obd_stats, LPROC_OFD_WRITE_BYTES,
                             LPROCFS_CNTR_AVGMINMAX, "write_bytes", "bytes");
 
-       rc = lproc_ofd_attach_seqstat(obd);
-       if (rc) {
-               CERROR("%s: create seqstat failed: %d.\n", obd->obd_name, rc);
-               GOTO(obd_cleanup, rc);
-       }
-
        entry = lprocfs_register("exports", obd->obd_proc_entry, NULL, NULL);
        if (IS_ERR(entry)) {
                rc = PTR_ERR(entry);
@@ -466,10 +460,30 @@ obd_cleanup:
        return rc;
 }
 
+static void ofd_procfs_add_brw_stats_symlink(struct ofd_device *ofd)
+{
+       struct obd_device       *obd = ofd_obd(ofd);
+       struct obd_device       *osd_obd = ofd->ofd_osd_exp->exp_obd;
+       cfs_proc_dir_entry_t    *osd_root = osd_obd->obd_type->typ_procroot;
+       cfs_proc_dir_entry_t    *osd_dir;
+
+       osd_dir = lprocfs_srch(osd_root, obd->obd_name);
+       if (osd_dir == NULL)
+               return;
+
+       if (lprocfs_srch(osd_dir, "brw_stats") == NULL)
+               return;
+
+       lprocfs_add_symlink("brw_stats", obd->obd_proc_entry,
+                           "../../%s/%s/brw_stats",
+                           osd_root->name, osd_dir->name);
+}
+
 static void ofd_procfs_fini(struct ofd_device *ofd)
 {
        struct obd_device *obd = ofd_obd(ofd);
 
+       lprocfs_remove_proc_entry("brw_stats", obd->obd_proc_entry);
        lprocfs_remove_proc_entry("clear", obd->obd_proc_exports_entry);
        lprocfs_free_per_client_stats(obd);
        lprocfs_obd_cleanup(obd);
@@ -646,6 +660,8 @@ static int ofd_init0(const struct lu_env *env, struct ofd_device *m,
                GOTO(err_fini_proc, rc);
        }
 
+       ofd_procfs_add_brw_stats_symlink(m);
+
        /* populate cached statfs data */
        osfs = &ofd_info(env)->fti_u.osfs;
        rc = ofd_statfs_internal(env, m, osfs, 0, NULL);
index 29c9208..e963ad2 100644 (file)
@@ -385,15 +385,12 @@ int ofd_txn_stop_cb(const struct lu_env *env, struct thandle *txn,
 /* lproc_ofd.c */
 #ifdef LPROCFS
 void lprocfs_ofd_init_vars(struct lprocfs_static_vars *lvars);
-int lproc_ofd_attach_seqstat(struct obd_device *dev);
-extern struct file_operations ofd_per_nid_stats_fops;
 void ofd_stats_counter_init(struct lprocfs_stats *stats);
 #else
 static void lprocfs_ofd_init_vars(struct lprocfs_static_vars *lvars)
 {
        memset(lvars, 0, sizeof(*lvars));
 }
-static inline int lproc_ofd_attach_seqstat(struct obd_device *dev) {}
 static inline void ofd_stats_counter_init(struct lprocfs_stats *stats) {}
 #endif
 
index 99de9eb..35f73d6 100644 (file)
@@ -51,7 +51,7 @@ static int ofd_export_stats_init(struct ofd_device *ofd,
 {
        struct obd_device       *obd = ofd_obd(ofd);
        struct nid_stat         *stats;
-       int                      num_stats, i;
+       int                      num_stats;
        int                      rc, newnid = 0;
 
        ENTRY;
@@ -75,18 +75,6 @@ static int ofd_export_stats_init(struct ofd_device *ofd,
        stats = exp->exp_nid_stats;
        LASSERT(stats != NULL);
 
-       OBD_ALLOC(stats->nid_brw_stats, sizeof(struct brw_stats));
-       if (stats->nid_brw_stats == NULL)
-               GOTO(clean, rc = -ENOMEM);
-
-       for (i = 0; i < BRW_LAST; i++)
-               spin_lock_init(&stats->nid_brw_stats->hist[i].oh_lock);
-
-       rc = lprocfs_seq_create(stats->nid_proc, "brw_stats", 0644,
-                               &ofd_per_nid_stats_fops, stats);
-       if (rc)
-               CWARN("Error adding the brw_stats file\n");
-
        num_stats = (sizeof(*obd->obd_type->typ_dt_ops) / sizeof(void *)) +
                     LPROC_OFD_LAST - 1;