tasklist-lock-redux-20060922
authorJeffrey Hutzelman <jhutz@cmu.edu>
Fri, 22 Sep 2006 12:16:24 +0000 (12:16 +0000)
committerDerrick Brashear <shadow@dementia.org>
Fri, 22 Sep 2006 12:16:24 +0000 (12:16 +0000)
try tasklist_lock weak binding in osi_probe

if no tasklist_lock, fall back to rcu locking

src/afs/LINUX/osi_probe.c
src/afs/afs_osi_gcpags.c
src/rx/LINUX/rx_knet.c

index 3b30fdd..20acb39 100644 (file)
@@ -245,6 +245,7 @@ extern asmlinkage long sys_exit (int) __attribute__((weak));
 extern asmlinkage long sys_open (const char *, int, int) __attribute__((weak));
 #endif
 extern asmlinkage long sys_ioctl(unsigned int, unsigned int, unsigned long) __attribute__((weak));
+extern rwlock_t tasklist_lock __attribute__((weak));
 
 
 /* Structures used to control probing.  We put all the details of which
index 3c8cfbb..c5df931 100644 (file)
@@ -233,6 +233,11 @@ afs_osi_TraverseProcTable()
     struct task_struct *p;
     if (&tasklist_lock)
        read_lock(&tasklist_lock);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
+    else
+       rcu_read_lock();
+#endif
+
 #ifdef DEFINED_FOR_EACH_PROCESS
     for_each_process(p) if (p->pid) {
 #ifdef STRUCT_TASK_STRUCT_HAS_EXIT_STATE
@@ -258,6 +263,10 @@ afs_osi_TraverseProcTable()
 #endif
     if (&tasklist_lock)
        read_unlock(&tasklist_lock);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
+    else
+       rcu_read_unlock();
+#endif
 }
 #endif
 
index b0b7d9c..4e176f6 100644 (file)
@@ -209,9 +209,17 @@ osi_StopListener(void)
 
     if (&tasklist_lock)
       read_lock(&tasklist_lock);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
+    else
+      rcu_read_lock();
+#endif
     listener = find_task_by_pid(rxk_ListenerPid);
     if (&tasklist_lock)
        read_unlock(&tasklist_lock);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
+    else
+      rcu_read_unlock();
+#endif
     while (rxk_ListenerPid) {
        flush_signals(listener);
        force_sig(SIGKILL, listener);