diff options
author | 2022-03-08 09:54:13 -0800 | |
---|---|---|
committer | 2022-04-11 17:06:42 -0700 | |
commit | 777570d9ef820e470736fa9e02b8e3e48891c050 (patch) | |
tree | 74a947bd5224c7299d7fc8e0754997a3ef20941b /kernel/smp.c | |
parent | rcu-tasks: Make Tasks RCU account for userspace execution (diff) | |
download | wireguard-linux-777570d9ef820e470736fa9e02b8e3e48891c050.tar.xz wireguard-linux-777570d9ef820e470736fa9e02b8e3e48891c050.zip |
rcu-tasks: Use schedule_hrtimeout_range() to wait for grace periods
The synchronous RCU-tasks grace-period-wait primitives invoke
schedule_timeout_idle() to give readers a chance to exit their
read-side critical sections. Unfortunately, this fails during early
boot on PREEMPT_RT because PREEMPT_RT relies solely on ksoftirqd to run
timer handlers. Because ksoftirqd cannot operate until its kthreads
are spawned, there is a brief period of time following scheduler
initialization where PREEMPT_RT cannot run the timer handlers that
schedule_timeout_idle() relies on, resulting in a hang.
To avoid this boot-time hang, this commit replaces schedule_timeout_idle()
with schedule_hrtimeout(), so that the timer expires in hardirq context.
This is ensures that the timer fires even on PREEMPT_RT throughout the
irqs-enabled portions of boot as well as during runtime.
The timer is set to expire between fract and fract + HZ / 2 jiffies in
order to align with any other timers that might expire during that time,
thus reducing the number of wakeups.
Note that RCU-tasks grace periods are infrequent, so the use of hrtimer
should be fine. In contrast, in common-case code, user of hrtimer
could result in performance issues.
Cc: Martin KaFai Lau <kafai@fb.com>
Cc: Andrii Nakryiko <andrii@kernel.org>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
Diffstat (limited to 'kernel/smp.c')
0 files changed, 0 insertions, 0 deletions