Whamcloud - gitweb
branch: HEAD
authorericm <ericm>
Thu, 8 Oct 2009 21:06:14 +0000 (21:06 +0000)
committerericm <ericm>
Thu, 8 Oct 2009 21:06:14 +0000 (21:06 +0000)
use separate lprocfs counter for softirq context.
b=20650
r=eeb
r=rread

lustre/include/lprocfs_status.h
lustre/lvfs/lvfs_lib.c
lustre/lvfs/lvfs_linux.c

index 11bc074..46b7059 100644 (file)
@@ -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;
index 4542720..95b59d4 100644 (file)
@@ -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);
 }
index 7c713d7..1b4ab82 100644 (file)
@@ -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;