Messages in this thread | | | Date | Mon, 11 Jun 2018 05:56:58 -0700 | From | "Paul E. McKenney" <> | Subject | Re: [PATCH 1/2] rcutorture: Disable RT throttling for boost tests |
| |
On Sun, Jun 10, 2018 at 04:45:43PM -0700, Joel Fernandes wrote: > From: "Joel Fernandes (Google)" <joel@joelfernandes.org> > > Currently rcutorture is not able to torture RCU boosting properly. This > is because the rcutorture's boost threads which are doing the torturing > may be throttled due to RT throttling. > > This patch makes rcutorture use the right torture technique (unthrottled > rcutorture boost tasks) for torturing RCU so that the test fails > correctly when no boost is available. > > Currently this requires accessing sysctl_sched_rt_runtime directly, but > that should be Ok since rcutorture is test code. Such direct access is > also only possible if rcutorture is used as a built-in so make it > conditional on that. > > Signed-off-by: Joel Fernandes (Google) <joel@joelfernandes.org>
Thank you, Joel! I have queued these for testing and review. Peter Zijlstra might have some feedback on variable access, but will test first.
Thanx, Paul
> --- > kernel/rcu/rcutorture.c | 29 +++++++++++++++++++++++++++++ > 1 file changed, 29 insertions(+) > > diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c > index 5219e7ccd8a4..00e06349d7bb 100644 > --- a/kernel/rcu/rcutorture.c > +++ b/kernel/rcu/rcutorture.c > @@ -55,6 +55,7 @@ > #include <linux/torture.h> > #include <linux/vmalloc.h> > #include <linux/sched/debug.h> > +#include <linux/sched/sysctl.h> > > #include "rcu.h" > > @@ -772,6 +773,32 @@ static void rcu_torture_boost_cb(struct rcu_head *head) > smp_store_release(&rbip->inflight, 0); > } > > +static int old_rt_runtime = -1; > + > +static void rcu_torture_disable_rt_throttle(void) > +{ > + /* > + * Disable RT throttling so that rcutorture's boost threads don't get > + * throttled. Only possible if rcutorture is built-in otherwise the > + * user should manually do this by setting the sched_rt_period_us and > + * sched_rt_runtime sysctls. > + */ > + if (!IS_BUILTIN(CONFIG_RCU_TORTURE_TEST) || old_rt_runtime != -1) > + return; > + > + old_rt_runtime = sysctl_sched_rt_runtime; > + sysctl_sched_rt_runtime = -1; > +} > + > +static void rcu_torture_enable_rt_throttle(void) > +{ > + if (!IS_BUILTIN(CONFIG_RCU_TORTURE_TEST) || old_rt_runtime == -1) > + return; > + > + sysctl_sched_rt_runtime = old_rt_runtime; > + old_rt_runtime = -1; > +} > + > static int rcu_torture_boost(void *arg) > { > unsigned long call_rcu_time; > @@ -1510,6 +1537,7 @@ static int rcutorture_booster_cleanup(unsigned int cpu) > mutex_lock(&boost_mutex); > t = boost_tasks[cpu]; > boost_tasks[cpu] = NULL; > + rcu_torture_enable_rt_throttle(); > mutex_unlock(&boost_mutex); > > /* This must be outside of the mutex, otherwise deadlock! */ > @@ -1526,6 +1554,7 @@ static int rcutorture_booster_init(unsigned int cpu) > > /* Don't allow time recalculation while creating a new task. */ > mutex_lock(&boost_mutex); > + rcu_torture_disable_rt_throttle(); > VERBOSE_TOROUT_STRING("Creating rcu_torture_boost task"); > boost_tasks[cpu] = kthread_create_on_node(rcu_torture_boost, NULL, > cpu_to_node(cpu), > -- > 2.18.0.rc1.242.g61856ae69a-goog >
| |