aboutsummaryrefslogtreecommitdiff
path: root/kernel/sched/core.c
diff options
context:
space:
mode:
authorGravatar Peter Zijlstra <peterz@infradead.org> 2023-08-01 22:41:25 +0200
committerGravatar Peter Zijlstra <peterz@infradead.org> 2023-08-14 17:01:25 +0200
commit4eb054f92b066ec0a0cba6896ee8eff4c91dfc9e (patch)
treea5cb363039abb48b5847a8916f78f1a97510c7df /kernel/sched/core.c
parentsched: Simplify: migrate_swap_stop() (diff)
downloadlinux-4eb054f92b066ec0a0cba6896ee8eff4c91dfc9e.tar.gz
linux-4eb054f92b066ec0a0cba6896ee8eff4c91dfc9e.tar.bz2
linux-4eb054f92b066ec0a0cba6896ee8eff4c91dfc9e.zip
sched: Simplify wake_up_if_idle()
Use guards to reduce gotos and simplify control flow. Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Reviewed-by: Valentin Schneider <vschneid@redhat.com> Link: https://lore.kernel.org/r/20230801211812.032678917@infradead.org
Diffstat (limited to 'kernel/sched/core.c')
-rw-r--r--kernel/sched/core.c20
1 files changed, 6 insertions, 14 deletions
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 66478a62f217..65ebf43206b6 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -3939,21 +3939,13 @@ static void __ttwu_queue_wakelist(struct task_struct *p, int cpu, int wake_flags
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_irqsave)(rq);
+ if (is_idle_task(rq->curr))
+ resched_curr(rq);
+ }
}
bool cpus_share_cache(int this_cpu, int that_cpu)