On Mon, Jun 12, 2023 at 11:02:28AM -0700, Boqun Feng wrote: > On Mon, Jun 12, 2023 at 11:07:21AM +0200, Peter Zijlstra wrote: > > Use guards to reduce gotos and simplify control flow. > > > > Signed-off-by: Peter Zijlstra (Intel) <peterz@xxxxxxxxxxxxx> > > --- > > kernel/sched/core.c | 20 ++++++-------------- > > kernel/sched/sched.h | 15 +++++++++++++++ > > 2 files changed, 21 insertions(+), 14 deletions(-) > > > > --- a/kernel/sched/core.c > > +++ b/kernel/sched/core.c > > @@ -3872,21 +3872,13 @@ static void __ttwu_queue_wakelist(struct > > void wake_up_if_idle(int cpu) > > { > > struct rq *rq = cpu_rq(cpu); > > - struct rq_flags rf; > > > > - rcu_read_lock(); > > - > > - if (!is_idle_task(rcu_dereference(rq->curr))) > > - goto out; > > - > > - rq_lock_irqsave(rq, &rf); > > - if (is_idle_task(rq->curr)) > > - resched_curr(rq); > > - /* Else CPU is not idle, do nothing here: */ > > - rq_unlock_irqrestore(rq, &rf); > > - > > -out: > > - rcu_read_unlock(); > > + guard(rcu)(); > > + if (is_idle_task(rcu_dereference(rq->curr))) { > > + guard(rq_lock)(rq); > > We assume that irq must be disabled when this function called? > Otherwise, I don't understand why this is not > > guard(rq_lock_irqsave)(rq); > You're quite right, I messed that up.