Whamcloud - gitweb
branch: HEAD
[fs/lustre-release.git] / lustre / lvfs / lvfs_lib.c
index b0de820..95b59d4 100644 (file)
@@ -16,8 +16,8 @@
  * in the LICENSE file that accompanied this code).
  *
  * You should have received a copy of the GNU General Public License
- * version 2 along with this program; If not, see [sun.com URL with a
- * copy of GPLv2].
+ * version 2 along with this program; If not, see
+ * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
  *
  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
  * CA 95054 USA or visit www.sun.com if you need additional information or
@@ -149,10 +149,9 @@ int __obd_fail_timeout_set(__u32 id, __u32 value, int ms, int set)
         if (ret) {
                 CERROR("obd_fail_timeout id %x sleeping for %dms\n",
                        id, ms);
-                set_current_state(TASK_UNINTERRUPTIBLE);
                 cfs_schedule_timeout(CFS_TASK_UNINT,
                                      cfs_time_seconds(ms) / 1000);
-                set_current_state(TASK_RUNNING);
+                set_current_state(CFS_TASK_RUNNING);
                 CERROR("obd_fail_timeout id %x awake\n", id);
         }
         return ret;
@@ -178,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;
@@ -206,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);
 }