From 7e2c00ef6c9e8734bc87a71f5047cab6e6477e83 Mon Sep 17 00:00:00 2001 From: Bobi Jam Date: Fri, 10 Aug 2012 14:22:45 +0800 Subject: [PATCH] LU-1727 lprocfs: fix an old assertion lprocfs_counter_add() can be called in interrupt context, as a memory allocation can trigger memory shrinker call ldlm_pool_shrink(), which calls lprocfs_counter_add(). Signed-off-by: Bobi Jam Change-Id: I0f5d3e07c234f7d615ca87761a7bd6367e72beac Reviewed-on: http://review.whamcloud.com/3729 Tested-by: Hudson Tested-by: Maloo Reviewed-by: Andreas Dilger Reviewed-by: Oleg Drokin --- lustre/lvfs/lvfs_lib.c | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/lustre/lvfs/lvfs_lib.c b/lustre/lvfs/lvfs_lib.c index 625ab15..99334a2 100644 --- a/lustre/lvfs/lvfs_lib.c +++ b/lustre/lvfs/lvfs_lib.c @@ -95,10 +95,16 @@ 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; + /* + * lprocfs_counter_add() can be called in interrupt context, + * as memory allocation could trigger memory shrinker call + * ldlm_pool_shrink(), which calls lprocfs_counter_add(). + * LU-1727. + */ + if (cfs_in_interrupt()) + percpu_cntr->lc_sum_irq += amount; + else + percpu_cntr->lc_sum += amount; if (percpu_cntr->lc_config & LPROCFS_CNTR_STDDEV) percpu_cntr->lc_sumsquare += (__s64)amount * amount; if (amount < percpu_cntr->lc_min) @@ -131,14 +137,13 @@ void lprocfs_counter_sub(struct lprocfs_stats *stats, int idx, long amount) if (!(stats->ls_flags & LPROCFS_STATS_FLAG_NOPERCPU)) cfs_atomic_inc(&percpu_cntr->lc_cntl.la_entry); 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. - */ + /* + * 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 -- 1.8.3.1