Whamcloud - gitweb
Branch HEAD
authoryangsheng <yangsheng>
Fri, 13 Feb 2009 16:14:59 +0000 (16:14 +0000)
committeryangsheng <yangsheng>
Fri, 13 Feb 2009 16:14:59 +0000 (16:14 +0000)
b=16759

i=shadow, zhen.liang

Use RCU lock to enable stack dump when tasklist_lock unexport.

libcfs/autoconf/lustre-libcfs.m4
libcfs/libcfs/watchdog.c

index e536a79..492b0e7 100644 (file)
@@ -241,6 +241,24 @@ CFLAGS="$tmp_flags"
 ])
 
 
+# check if task_struct with rcu memeber
+AC_DEFUN([LIBCFS_TASK_RCU],
+[AC_MSG_CHECKING([if task_struct has a rcu field])
+LB_LINUX_TRY_COMPILE([
+       #include <linux/sched.h>
+],[
+        struct task_struct tsk;
+
+        tsk.rcu.next = NULL;
+],[
+        AC_MSG_RESULT([yes])
+        AC_DEFINE(HAVE_TASK_RCU, 1,
+                  [task_struct has rcu field])
+],[
+        AC_MSG_RESULT([no])
+])
+])
+
 # LIBCFS_TASKLIST_LOCK
 # 2.6.18 remove tasklist_lock export
 AC_DEFUN([LIBCFS_TASKLIST_LOCK],
@@ -434,6 +452,7 @@ LIBCFS_FUNC_SHOW_TASK
 LIBCFS_U64_LONG_LONG
 LIBCFS_SSIZE_T_LONG
 LIBCFS_SIZE_T_LONG
+LIBCFS_TASK_RCU
 # 2.6.18
 LIBCFS_TASKLIST_LOCK
 # 2.6.19
index 4709831..4e5cc42 100644 (file)
@@ -101,14 +101,20 @@ static cfs_time_t lcw_last_watchdog_time;
 static int lcw_recent_watchdog_count;
 static spinlock_t lcw_last_watchdog_lock = SPIN_LOCK_UNLOCKED;
 
-#ifdef HAVE_TASKLIST_LOCK
 static void
 lcw_dump(struct lc_watchdog *lcw)
 {
         cfs_task_t *tsk;
+#if defined(HAVE_TASKLIST_LOCK)
+        read_lock(&tasklist_lock);
+#elif defined(HAVE_TASK_RCU)
+        rcu_read_lock();
+#else
+        CERROR("unable to dump stack because of missing export\n"); 
+        return;
+#endif
         ENTRY;
 
-        read_lock(&tasklist_lock);
         tsk = find_task_by_pid(lcw->lcw_pid);
 
         if (tsk == NULL) {
@@ -120,17 +126,14 @@ lcw_dump(struct lc_watchdog *lcw)
         } else {
                 libcfs_debug_dumpstack(tsk);
         }
-        
+
+#if defined(HAVE_TASKLIST_LOCK)
         read_unlock(&tasklist_lock);
+#elif defined(HAVE_TASK_RCU)
+        rcu_read_unlock();
+#endif
         EXIT;
 }
-#else
-static void
-lcw_dump(struct lc_watchdog *lcw)
-{
-        CERROR("unable to dump stack because of missing export\n");
-}
-#endif
 
 static void lcw_cb(ulong_ptr_t data)
 {