From 5f7e4e3dbee600b2da376a50ec73907c0b57d301 Mon Sep 17 00:00:00 2001 From: "John L. Hammond" Date: Wed, 27 Feb 2013 22:01:43 -0600 Subject: [PATCH] LU-2396 ofd: Remove unmaintained brw_stats 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 Change-Id: I79a10816c612f67b80172d679b875ca94157b5f4 Reviewed-on: http://review.whamcloud.com/4689 Reviewed-by: Andreas Dilger Tested-by: Hudson Reviewed-by: Keith Mannthey Tested-by: Maloo Reviewed-by: Alex Zhuravlev --- lustre/include/lustre_export.h | 5 +- lustre/obdclass/lprocfs_status.c | 13 +--- lustre/ofd/lproc_ofd.c | 141 --------------------------------------- lustre/ofd/ofd_dev.c | 28 ++++++-- lustre/ofd/ofd_internal.h | 3 - lustre/ofd/ofd_obd.c | 14 +--- 6 files changed, 27 insertions(+), 177 deletions(-) diff --git a/lustre/include/lustre_export.h b/lustre/include/lustre_export.h index 29f6167..0a826ea 100644 --- a/lustre/include/lustre_export.h +++ b/lustre/include/lustre_export.h @@ -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 { \ diff --git a/lustre/obdclass/lprocfs_status.c b/lustre/obdclass/lprocfs_status.c index 4eb8534..173ad85 100644 --- a/lustre/obdclass/lprocfs_status.c +++ b/lustre/obdclass/lprocfs_status.c @@ -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); } diff --git a/lustre/ofd/lproc_ofd.c b/lustre/ofd/lproc_ofd.c index 272aba7..0d91844 100644 --- a/lustre/ofd/lproc_ofd.c +++ b/lustre/ofd/lproc_ofd.c @@ -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); diff --git a/lustre/ofd/ofd_dev.c b/lustre/ofd/ofd_dev.c index f90d820..7243c12 100644 --- a/lustre/ofd/ofd_dev.c +++ b/lustre/ofd/ofd_dev.c @@ -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); diff --git a/lustre/ofd/ofd_internal.h b/lustre/ofd/ofd_internal.h index 29c9208..e963ad2 100644 --- a/lustre/ofd/ofd_internal.h +++ b/lustre/ofd/ofd_internal.h @@ -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 diff --git a/lustre/ofd/ofd_obd.c b/lustre/ofd/ofd_obd.c index 99de9eb..35f73d6 100644 --- a/lustre/ofd/ofd_obd.c +++ b/lustre/ofd/ofd_obd.c @@ -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; -- 1.8.3.1