]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
rcu-tasks: Restore use of timers for non-RT kernels
authorPaul E. McKenney <paulmck@kernel.org>
Fri, 18 Mar 2022 15:08:14 +0000 (08:08 -0700)
committerPaul E. McKenney <paulmck@kernel.org>
Tue, 12 Apr 2022 00:06:43 +0000 (17:06 -0700)
The use of hrtimers for RCU-tasks grace-period delays works well in
general, but can result in excessive grace-period delays for some
corner-case workloads.  This commit therefore reverts to the use of
timers for non-RT kernels to mitigate those grace-period delays.

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

index 71fe340ab82a2c6496af7dc5d24a28fd24eb8dad..405614039515a250782e5f7f02999f1fa06a9344 100644 (file)
@@ -654,9 +654,13 @@ static void rcu_tasks_wait_gp(struct rcu_tasks *rtp)
 
                // Slowly back off waiting for holdouts
                set_tasks_gp_state(rtp, RTGS_WAIT_SCAN_HOLDOUTS);
-               exp = jiffies_to_nsecs(fract);
-               __set_current_state(TASK_IDLE);
-               schedule_hrtimeout_range(&exp, jiffies_to_nsecs(HZ / 2), HRTIMER_MODE_REL_HARD);
+               if (!IS_ENABLED(CONFIG_PREEMPT_RT)) {
+                       schedule_timeout_idle(fract);
+               } else {
+                       exp = jiffies_to_nsecs(fract);
+                       __set_current_state(TASK_IDLE);
+                       schedule_hrtimeout_range(&exp, jiffies_to_nsecs(HZ / 2), HRTIMER_MODE_REL_HARD);
+               }
 
                if (fract < HZ)
                        fract++;