From a074acbae7c4ed248fcd4131449877d29f2ddc32 Mon Sep 17 00:00:00 2001 From: ericm Date: Thu, 8 Oct 2009 21:06:14 +0000 Subject: [PATCH] branch: HEAD use separate lprocfs counter for softirq context. b=20650 r=eeb r=rread --- lustre/include/lprocfs_status.h | 1 + lustre/lvfs/lvfs_lib.c | 19 +++++++++++++++++-- lustre/lvfs/lvfs_linux.c | 2 +- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/lustre/include/lprocfs_status.h b/lustre/include/lprocfs_status.h index 11bc074..46b7059 100644 --- a/lustre/include/lprocfs_status.h +++ b/lustre/include/lprocfs_status.h @@ -150,6 +150,7 @@ struct lprocfs_counter { unsigned int lc_config; __s64 lc_count; __s64 lc_sum; + __s64 lc_sum_irq; __s64 lc_min; __s64 lc_max; __s64 lc_sumsquare; diff --git a/lustre/lvfs/lvfs_lib.c b/lustre/lvfs/lvfs_lib.c index 4542720..95b59d4 100644 --- a/lustre/lvfs/lvfs_lib.c +++ b/lustre/lvfs/lvfs_lib.c @@ -177,6 +177,9 @@ void lprocfs_counter_add(struct lprocfs_stats *stats, int idx, percpu_cntr->lc_count++; if (percpu_cntr->lc_config & LPROCFS_CNTR_AVGMINMAX) { + /* see comment in lprocfs_counter_sub */ + LASSERT(!cfs_in_interrupt()); + percpu_cntr->lc_sum += amount; if (percpu_cntr->lc_config & LPROCFS_CNTR_STDDEV) percpu_cntr->lc_sumsquare += (__s64)amount * amount; @@ -205,8 +208,20 @@ void lprocfs_counter_sub(struct lprocfs_stats *stats, int idx, percpu_cntr = &(stats->ls_percpu[smp_id]->lp_cntr[idx]); atomic_inc(&percpu_cntr->lc_cntl.la_entry); - if (percpu_cntr->lc_config & LPROCFS_CNTR_AVGMINMAX) - percpu_cntr->lc_sum -= amount; + if (percpu_cntr->lc_config & LPROCFS_CNTR_AVGMINMAX) { + /* + * currently lprocfs_count_add() can only be called in thread + * context; sometimes we use RCU callbacks to free memory + * which calls lprocfs_counter_sub(), and RCU callbacks may + * execute in softirq context - right now that's the only case + * we're in softirq context here, use separate counter for that. + * bz20650. + */ + if (cfs_in_interrupt()) + percpu_cntr->lc_sum_irq -= amount; + else + percpu_cntr->lc_sum -= amount; + } atomic_inc(&percpu_cntr->lc_cntl.la_exit); lprocfs_stats_unlock(stats); } diff --git a/lustre/lvfs/lvfs_linux.c b/lustre/lvfs/lvfs_linux.c index 7c713d7..1b4ab82 100644 --- a/lustre/lvfs/lvfs_linux.c +++ b/lustre/lvfs/lvfs_linux.c @@ -581,7 +581,7 @@ __s64 lprocfs_read_helper(struct lprocfs_counter *lc, ret = lc->lc_config; break; case LPROCFS_FIELDS_FLAGS_SUM: - ret = lc->lc_sum; + ret = lc->lc_sum + lc->lc_sum_irq; break; case LPROCFS_FIELDS_FLAGS_MIN: ret = lc->lc_min; -- 1.8.3.1