sched: Simplify wake_up_if_idle()
authorPeter Zijlstra <peterz@infradead.org>
Tue, 1 Aug 2023 20:41:25 +0000 (22:41 +0200)
committerPeter Zijlstra <peterz@infradead.org>
Mon, 14 Aug 2023 15:01:25 +0000 (17:01 +0200)
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
kernel/sched/core.c
kernel/sched/sched.h

index 66478a6..65ebf43 100644 (file)
@@ -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)
index c299a58..3a01b7a 100644 (file)
@@ -1705,6 +1705,21 @@ rq_unlock(struct rq *rq, struct rq_flags *rf)
        raw_spin_rq_unlock(rq);
 }
 
+DEFINE_LOCK_GUARD_1(rq_lock, struct rq,
+                   rq_lock(_T->lock, &_T->rf),
+                   rq_unlock(_T->lock, &_T->rf),
+                   struct rq_flags rf)
+
+DEFINE_LOCK_GUARD_1(rq_lock_irq, struct rq,
+                   rq_lock_irq(_T->lock, &_T->rf),
+                   rq_unlock_irq(_T->lock, &_T->rf),
+                   struct rq_flags rf)
+
+DEFINE_LOCK_GUARD_1(rq_lock_irqsave, struct rq,
+                   rq_lock_irqsave(_T->lock, &_T->rf),
+                   rq_unlock_irqrestore(_T->lock, &_T->rf),
+                   struct rq_flags rf)
+
 static inline struct rq *
 this_rq_lock_irq(struct rq_flags *rf)
        __acquires(rq->lock)