Skip to content

RFC rcu/sched: Fix ignored rescheduling after rcu_eqs_enter() v3

Frederic Weisbecker lkml oe-lkp stable 1 version In review

Get series with b4
b4 am [email protected]

Versions newest first

  1. v1 RFC Latest8 patches 12 repliesIn review

Patches in v1 No applies recorded yet

#Subject and filesSizeRepliesApplied
1/8rcu: Remove superfluous rdp fetchkernel/rcu/tree.c+0 -12 replies
2/8rcu: Pull deferred rcuog wake up to rcu_eqs_enter() callerskernel/rcu/tree.c+6 -10 replies
3/8rcu/nocb: Perform deferred wake up before last idle's need_resched() checkinclude/linux/rcupdate.h kernel/rcu/tree.c kernel/rcu/tree_plugin.h +1 more+10 -30 replies
4/8rcu/nocb: Trigger self-IPI on late deferred wake up before user resumekernel/rcu/tree.c kernel/rcu/tree.h kernel/rcu/tree_plugin.h+38 -112 replies
5/8entry: Explicitly flush pending rcuog wakeup before last rescheduling pointskernel/entry/common.c kernel/rcu/tree.c+13 -55 replies
6/8sched: Report local wake up on resched blind zone within idle loopinclude/linux/sched.h kernel/sched/core.c kernel/sched/idle.c +1 more+59 -03 replies
7/8entry: Report local wake up on resched blind zone while resuming to userkernel/entry/common.c+4 -00 replies
8/8timer: Report ignored local enqueue in nohz modekernel/sched/core.c+23 -10 replies

Reviews trailers per patch

No Reviewed-by, Acked-by or Tested-by trailers for v1 yet.

Read the v1 thread

Cover letter [RFC PATCH 0/8] rcu/sched: Fix ignored rescheduling after rcu_eqs_enter() v3

(This was [PATCH 0/4] sched/idle: Fix missing need_resched() checks after rcu_idle_enter() v2)

I initially followed Peterz review but eventually I tried a different approach. Instead of handling the late wake up from rcu_idle_enter(), I've split the delayed rcuog wake up and moved it right before the last generic need_resched() check, it makes more sense and we don't need to fiddle with cpuidle core and drivers anymore. It's also less error prone.

I also fixed the nohz_full case and (hopefully) the guest case.

And this comes with debugging to prevent from that pattern to happen again.

Only lightly tested so far.

git://git.kernel.org/pub/scm/linux/kernel/git/frederic/linux-dynticks.git
sched/idle-v3

HEAD: d95fc510e804a5c4658a823ff12d9caba1d906c7

Thanks,
Frederic
---

Frederic Weisbecker (8):
rcu: Remove superfluous rdp fetch
rcu: Pull deferred rcuog wake up to rcu_eqs_enter() callers rcu/nocb: Perform deferred wake up before last idle's need_resched() check rcu/nocb: Trigger self-IPI on late deferred wake up before user resume
entry: Explicitly flush pending rcuog wakeup before last rescheduling points
sched: Report local wake up on resched blind zone within idle loop
entry: Report local wake up on resched blind zone while resuming to user
timer: Report ignored local enqueue in nohz mode

 include/linux/rcupdate.h |  2 ++
 include/linux/sched.h    | 11 ++++++++
 kernel/entry/common.c    | 10 ++++++++
 kernel/rcu/tree.c        | 27 ++++++++++++++++++--
 kernel/rcu/tree.h        |  2 +-
 kernel/rcu/tree_plugin.h | 30 +++++++++++++++-------
 kernel/sched/core.c      | 66 +++++++++++++++++++++++++++++++++++++++++++++++-
 kernel/sched/idle.c      |  6 +++++
 kernel/sched/sched.h     |  3 +++
 9 files changed, 144 insertions(+), 13 deletions(-)