]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
sched: Provide idle_rq() helper
authorPeter Zijlstra <peterz@infradead.org>
Tue, 13 Jan 2026 09:50:41 +0000 (10:50 +0100)
committerPeter Zijlstra <peterz@infradead.org>
Tue, 13 Jan 2026 10:37:52 +0000 (11:37 +0100)
A fix for the dl_server 'requires' idle_cpu() usage, which made me
note that it and available_idle_cpu() are extern function calls.

And while idle_cpu() is used outside of kernel/sched/,
available_idle_cpu() is not.

This makes it hard to make idle_cpu() an inline helper, so provide
idle_rq() and implement idle_cpu() and available_idle_cpu() using
that.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
include/linux/sched.h
kernel/sched/sched.h
kernel/sched/syscalls.c

index d395f2810facbe5dc450d010eceba0746eeb1826..da0133524d08c2e98d90cd870e3eb0fc9550aee5 100644 (file)
@@ -1874,7 +1874,6 @@ static inline int task_nice(const struct task_struct *p)
 extern int can_nice(const struct task_struct *p, const int nice);
 extern int task_curr(const struct task_struct *p);
 extern int idle_cpu(int cpu);
-extern int available_idle_cpu(int cpu);
 extern int sched_setscheduler(struct task_struct *, int, const struct sched_param *);
 extern int sched_setscheduler_nocheck(struct task_struct *, int, const struct sched_param *);
 extern void sched_set_fifo(struct task_struct *p);
index d30cca6870f5f9fbc38d668c0bc824aebcbd7f54..e885a935b716258687323d735d71efa099bcab25 100644 (file)
@@ -1364,6 +1364,28 @@ static inline u32 sched_rng(void)
 #define cpu_curr(cpu)          (cpu_rq(cpu)->curr)
 #define raw_rq()               raw_cpu_ptr(&runqueues)
 
+static inline bool idle_rq(struct rq *rq)
+{
+       return rq->curr == rq->idle && !rq->nr_running && !rq->ttwu_pending;
+}
+
+/**
+ * available_idle_cpu - is a given CPU idle for enqueuing work.
+ * @cpu: the CPU in question.
+ *
+ * Return: 1 if the CPU is currently idle. 0 otherwise.
+ */
+static inline bool available_idle_cpu(int cpu)
+{
+       if (!idle_rq(cpu_rq(cpu)))
+               return 0;
+
+       if (vcpu_is_preempted(cpu))
+               return 0;
+
+       return 1;
+}
+
 #ifdef CONFIG_SCHED_PROXY_EXEC
 static inline void rq_set_donor(struct rq *rq, struct task_struct *t)
 {
index 0496dc29ed0f95525611b90feec022f9b1a380b9..cb337de679b860b5c368e086f4abcab1693d7499 100644 (file)
@@ -180,35 +180,7 @@ int task_prio(const struct task_struct *p)
  */
 int idle_cpu(int cpu)
 {
-       struct rq *rq = cpu_rq(cpu);
-
-       if (rq->curr != rq->idle)
-               return 0;
-
-       if (rq->nr_running)
-               return 0;
-
-       if (rq->ttwu_pending)
-               return 0;
-
-       return 1;
-}
-
-/**
- * available_idle_cpu - is a given CPU idle for enqueuing work.
- * @cpu: the CPU in question.
- *
- * Return: 1 if the CPU is currently idle. 0 otherwise.
- */
-int available_idle_cpu(int cpu)
-{
-       if (!idle_cpu(cpu))
-               return 0;
-
-       if (vcpu_is_preempted(cpu))
-               return 0;
-
-       return 1;
+       return idle_rq(cpu_rq(cpu));
 }
 
 /**