]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
sched/fair: Add sched_smt_active check for fastpaths
authorShrikanth Hegde <sshegde@linux.ibm.com>
Fri, 15 May 2026 17:24:55 +0000 (22:54 +0530)
committerPeter Zijlstra <peterz@infradead.org>
Tue, 19 May 2026 10:17:37 +0000 (12:17 +0200)
For fastpaths such as wakeup and load balance even minimal code additions
can add up. is_core_idle is accessed during load balance.

Other callsites of is_core_idle make sched_smt_active() check first.
Make the same check in should_we_balance.

Rest of access to cpu_smt_mask isn't in fastpath.

Note: Remove the stale comment above is_core_idle. Enqueue methods
of fair aren't close to it anymore.

Suggested-by: K Prateek Nayak <kprateek.nayak@amd.com>
Signed-off-by: Shrikanth Hegde <sshegde@linux.ibm.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Valentin Schneider <vschneid@redhat.com>
Link: https://patch.msgid.link/20260515172456.542799-4-sshegde@linux.ibm.com
kernel/sched/fair.c

index 233bd2ebbb738d1e301e7eb98b089e6e2b38bb2a..14bd31b17c716769e3df082ee7500898491f04c3 100644 (file)
@@ -1549,10 +1549,7 @@ update_stats_curr_start(struct cfs_rq *cfs_rq, struct sched_entity *se)
        se->exec_start = rq_clock_task(rq_of(cfs_rq));
 }
 
-/**************************************************
- * Scheduling class queueing methods:
- */
-
+/* Check sched_smt_active before calling this to avoid overheads in fastpaths */
 static inline bool is_core_idle(int cpu)
 {
        int sibling;
@@ -11961,7 +11958,9 @@ static int should_we_balance(struct lb_env *env)
                 * balancing cores, but remember the first idle SMT CPU for
                 * later consideration.  Find CPU on an idle core first.
                 */
-               if (!(env->sd->flags & SD_SHARE_CPUCAPACITY) && !is_core_idle(cpu)) {
+               if (sched_smt_active() &&
+                   !(env->sd->flags & SD_SHARE_CPUCAPACITY) &&
+                   !is_core_idle(cpu)) {
                        if (idle_smt == -1)
                                idle_smt = cpu;
                        /*