rcutorture: Hoist OOM registry up one level
authorPaul E. McKenney <paulmck@kernel.org>
Wed, 22 Jul 2020 17:45:12 +0000 (10:45 -0700)
committerPaul E. McKenney <paulmck@kernel.org>
Tue, 25 Aug 2020 01:45:35 +0000 (18:45 -0700)
Currently, registering and unregistering the OOM notifier is done
right before and after the test, respectively.  This will not work
well for multi-threaded tests, so this commit hoists this registering
and unregistering up into the rcu_torture_fwd_prog_init() and
rcu_torture_fwd_prog_cleanup() functions.

Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
kernel/rcu/rcutorture.c

index 2b3f04e..983f82f 100644 (file)
@@ -2110,13 +2110,11 @@ static int rcu_torture_fwd_prog(void *args)
        do {
                schedule_timeout_interruptible(fwd_progress_holdoff * HZ);
                WRITE_ONCE(rcu_fwd_emergency_stop, false);
-               register_oom_notifier(&rcutorture_oom_nb);
                if (!IS_ENABLED(CONFIG_TINY_RCU) ||
                    rcu_inkernel_boot_has_ended())
                        rcu_torture_fwd_prog_nr(rfp, &tested, &tested_tries);
                if (rcu_inkernel_boot_has_ended())
                        rcu_torture_fwd_prog_cr(rfp);
-               unregister_oom_notifier(&rcutorture_oom_nb);
 
                /* Avoid slow periods, better to test when busy. */
                stutter_wait("rcu_torture_fwd_prog");
@@ -2159,6 +2157,7 @@ static int __init rcu_torture_fwd_prog_init(void)
        mutex_lock(&rcu_fwd_mutex);
        rcu_fwds = rfp;
        mutex_unlock(&rcu_fwd_mutex);
+       register_oom_notifier(&rcutorture_oom_nb);
        return torture_create_kthread(rcu_torture_fwd_prog, rfp, fwd_prog_task);
 }
 
@@ -2171,6 +2170,7 @@ static void rcu_torture_fwd_prog_cleanup(void)
        mutex_lock(&rcu_fwd_mutex);
        rcu_fwds = NULL;
        mutex_unlock(&rcu_fwd_mutex);
+       unregister_oom_notifier(&rcutorture_oom_nb);
        kfree(rfp);
 }