])
+# 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],
LIBCFS_U64_LONG_LONG
LIBCFS_SSIZE_T_LONG
LIBCFS_SIZE_T_LONG
+LIBCFS_TASK_RCU
# 2.6.18
LIBCFS_TASKLIST_LOCK
# 2.6.19
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) {
} 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)
{