rcutorture: Use the barrier operation specified by cur_ops
authorZqiang <qiang1.zhang@intel.com>
Sun, 31 Jul 2022 10:53:56 +0000 (18:53 +0800)
committerPaul E. McKenney <paulmck@kernel.org>
Thu, 1 Sep 2022 17:50:04 +0000 (10:50 -0700)
The rcutorture_oom_notify() function unconditionally invokes
rcu_barrier(), which is OK when the rcutorture.torture_type value is
"rcu", but unhelpful otherwise.  The purpose of these barrier calls is to
wait for all outstanding callback-flooding callbacks to be invoked before
cleaning up their data.  Using the wrong barrier function therefore
risks arbitrary memory corruption.  Thus, this commit changes these
rcu_barrier() calls into cur_ops->cb_barrier() to make things work when
torturing non-vanilla flavors of RCU.

Signed-off-by: Zqiang <qiang1.zhang@intel.com>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
kernel/rcu/rcutorture.c

index d8e1b27..08b7b59 100644 (file)
@@ -2600,12 +2600,12 @@ static int rcutorture_oom_notify(struct notifier_block *self,
        for (i = 0; i < fwd_progress; i++)
                ncbs += rcu_torture_fwd_prog_cbfree(&rfp[i]);
        pr_info("%s: Freed %lu RCU callbacks.\n", __func__, ncbs);
-       rcu_barrier();
+       cur_ops->cb_barrier();
        ncbs = 0;
        for (i = 0; i < fwd_progress; i++)
                ncbs += rcu_torture_fwd_prog_cbfree(&rfp[i]);
        pr_info("%s: Freed %lu RCU callbacks.\n", __func__, ncbs);
-       rcu_barrier();
+       cur_ops->cb_barrier();
        ncbs = 0;
        for (i = 0; i < fwd_progress; i++)
                ncbs += rcu_torture_fwd_prog_cbfree(&rfp[i]);