OSDN Git Service

rcu: Fixes to rcutorture error handling and cleanup
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Sat, 18 Feb 2012 06:12:18 +0000 (22:12 -0800)
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Wed, 25 Apr 2012 03:55:39 +0000 (20:55 -0700)
The rcutorture initialization code ignored the error returns from
rcu_torture_onoff_init() and rcu_torture_stall_init().  The rcutorture
cleanup code failed to NULL out a number of pointers.  These bugs will
normally have no effect, but this commit fixes them nevertheless.

Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
kernel/rcutorture.c

index a89b381..1463a06 100644 (file)
@@ -1337,6 +1337,7 @@ static void rcutorture_booster_cleanup(int cpu)
 
        /* This must be outside of the mutex, otherwise deadlock! */
        kthread_stop(t);
+       boost_tasks[cpu] = NULL;
 }
 
 static int rcutorture_booster_init(int cpu)
@@ -1484,13 +1485,15 @@ static void rcu_torture_onoff_cleanup(void)
                return;
        VERBOSE_PRINTK_STRING("Stopping rcu_torture_onoff task");
        kthread_stop(onoff_task);
+       onoff_task = NULL;
 }
 
 #else /* #ifdef CONFIG_HOTPLUG_CPU */
 
-static void
+static int
 rcu_torture_onoff_init(void)
 {
+       return 0;
 }
 
 static void rcu_torture_onoff_cleanup(void)
@@ -1554,6 +1557,7 @@ static void rcu_torture_stall_cleanup(void)
                return;
        VERBOSE_PRINTK_STRING("Stopping rcu_torture_stall_task.");
        kthread_stop(stall_task);
+       stall_task = NULL;
 }
 
 static int rcutorture_cpu_notify(struct notifier_block *self,
@@ -1665,6 +1669,7 @@ rcu_torture_cleanup(void)
                VERBOSE_PRINTK_STRING("Stopping rcu_torture_shutdown task");
                kthread_stop(shutdown_task);
        }
+       shutdown_task = NULL;
        rcu_torture_onoff_cleanup();
 
        /* Wait for all RCU callbacks to fire.  */
@@ -1897,9 +1902,17 @@ rcu_torture_init(void)
                        goto unwind;
                }
        }
-       rcu_torture_onoff_init();
+       i = rcu_torture_onoff_init();
+       if (i != 0) {
+               firsterr = i;
+               goto unwind;
+       }
        register_reboot_notifier(&rcutorture_shutdown_nb);
-       rcu_torture_stall_init();
+       i = rcu_torture_stall_init();
+       if (i != 0) {
+               firsterr = i;
+               goto unwind;
+       }
        rcutorture_record_test_transition();
        mutex_unlock(&fullstop_mutex);
        return 0;