The Linux Kernel Mailing List
 help / color / mirror / Atom feed
* [PATCH v2 0/3] sched: Simplify ifdeffery around CONFIG_SCHED_SMT
@ 2026-05-12 15:21 Shrikanth Hegde
  2026-05-12 15:21 ` [PATCH v2 1/3] topology: Introduce cpu_smt_mask for CONFIG_SCHED_SMT=n Shrikanth Hegde
                   ` (4 more replies)
  0 siblings, 5 replies; 15+ messages in thread
From: Shrikanth Hegde @ 2026-05-12 15:21 UTC (permalink / raw)
  To: mingo, peterz, vincent.guittot, linux-kernel
  Cc: sshegde, kprateek.nayak, juri.lelli, vschneid, dietmar.eggemann,
	tj, rostedt, mgorman, bsegall, arighi

Semantics
=========
- For CONFIG_SCHED_SMT=y:
    No functional change.
- For CONFIG_SCHED_SMT=n:
    - cpu_smt_mask(cpu) becomes cpumask_of(cpu), effectively making it
      per CPU with no siblings.
    - sched_smt_present remains defined, but never becomes active:
    	 Since cpumask_weight(cpumask_of(cpu)) == 1

Performance impact
==================
- CONFIG_SCHED_SMT=y:
    No change in generated code.
- CONFIG_SCHED_SMT=n:
    - Small increase in text size (~0.01%) due to removal of compile-time
      stubs. Most paths remain effectively dead due to static keys.
    - Fast paths are protected using IS_ENABLED(CONFIG_SCHED_SMT).

With that, cpu_smt_mask() to be used unconditionally and reduces
CONFIG_SCHED_SMT-specific code paths, improving readability and
maintainability.

This leaves the remaining use of CONFIG_SCHED_SMT mainly for topology
handling bits.

Since v1[1]:
- Dropped changes for stop_core_cpuslocked. intel_ifs is the only
  user and it gets compiled with SCHED_SMT always. Added comments
  around it why ifdefs are still being kept.
- Decided not to add sched_smt_active checks for sched_core_cpu_deactivate
  and sched_core_cpu_starting, they bail out if weight(smt_mask) == 1.
  Hence core_lock won't be held for long. It is not fastpath either.
- Thanks to Valentin Schneider and Tejun Heo for checking out the series
  and the feedback.

Shrikanth Hegde (3):
  topology: Introduce cpu_smt_mask for CONFIG_SCHED_SMT=n
  sched: Simplify ifdeffery around cpu_smt_mask
  sched/fair: Add compile time check in fastpaths for CONFIG_SCHED_SMT=n

 include/linux/sched/smt.h |  4 ----
 include/linux/topology.h  | 15 +++++++++++++-
 kernel/sched/core.c       |  6 ------
 kernel/sched/ext_idle.c   |  6 ------
 kernel/sched/fair.c       | 41 +++++----------------------------------
 kernel/sched/sched.h      |  6 ------
 kernel/sched/topology.c   |  2 --
 kernel/stop_machine.c     |  5 +++++
 kernel/workqueue.c        |  4 ----
 9 files changed, 24 insertions(+), 65 deletions(-)

-- 
2.47.3


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH v2 1/3] topology: Introduce cpu_smt_mask for CONFIG_SCHED_SMT=n
  2026-05-12 15:21 [PATCH v2 0/3] sched: Simplify ifdeffery around CONFIG_SCHED_SMT Shrikanth Hegde
@ 2026-05-12 15:21 ` Shrikanth Hegde
  2026-05-12 16:56   ` Phil Auld
  2026-05-12 15:21 ` [PATCH v2 2/3] sched: Simplify ifdeffery around cpu_smt_mask Shrikanth Hegde
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 15+ messages in thread
From: Shrikanth Hegde @ 2026-05-12 15:21 UTC (permalink / raw)
  To: mingo, peterz, vincent.guittot, linux-kernel
  Cc: sshegde, kprateek.nayak, juri.lelli, vschneid, dietmar.eggemann,
	tj, rostedt, mgorman, bsegall, arighi

Define cpu_smt_mask in case of CONFIG_SCHED_SMT=n as cpumask_of that
CPU. With that config, it is expected that kernel treats each CPU
as individual core. Using cpumask_of(cpu) reflects that.

This would help to get rid of the ifdeffery that is spread across
the codebase since cpu_smt_mask is defined only in case of
CONFIG_SCHED_SMT=y.

Note: There is no arch today which defines cpu_smt_mask unconditionally.
So likely defining the cpu_smt_mask shouldn't lead redefintion errors.

Signed-off-by: Shrikanth Hegde <sshegde@linux.ibm.com>
---
 include/linux/topology.h | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/include/linux/topology.h b/include/linux/topology.h
index 6575af39fd10..709a2dcf4c73 100644
--- a/include/linux/topology.h
+++ b/include/linux/topology.h
@@ -230,11 +230,24 @@ static inline int cpu_to_mem(int cpu)
 #define topology_drawer_cpumask(cpu)		cpumask_of(cpu)
 #endif
 
-#if defined(CONFIG_SCHED_SMT) && !defined(cpu_smt_mask)
+/*
+ * Defining cpu_smt_mask as cpumask_of that CPU helps to get
+ * rid of lot of ifdeffery all around the codebase in case of
+ * CONFIG_SCHED_SMT=n. It just means there are no other siblings, which
+ * is what is expected.
+ */
+#if defined(CONFIG_SCHED_SMT)
+# if !defined(cpu_smt_mask)
 static inline const struct cpumask *cpu_smt_mask(int cpu)
 {
 	return topology_sibling_cpumask(cpu);
 }
+# endif
+#else	/* !CONFIG_SCHED_SMT */
+static inline const struct cpumask *cpu_smt_mask(int cpu)
+{
+	return cpumask_of(cpu);
+}
 #endif
 
 #ifndef topology_is_primary_thread
-- 
2.47.3


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v2 2/3] sched: Simplify ifdeffery around cpu_smt_mask
  2026-05-12 15:21 [PATCH v2 0/3] sched: Simplify ifdeffery around CONFIG_SCHED_SMT Shrikanth Hegde
  2026-05-12 15:21 ` [PATCH v2 1/3] topology: Introduce cpu_smt_mask for CONFIG_SCHED_SMT=n Shrikanth Hegde
@ 2026-05-12 15:21 ` Shrikanth Hegde
  2026-05-12 16:57   ` Phil Auld
  2026-05-12 15:21 ` [PATCH v2 3/3] sched/fair: Add compile time check in fastpaths for CONFIG_SCHED_SMT=n Shrikanth Hegde
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 15+ messages in thread
From: Shrikanth Hegde @ 2026-05-12 15:21 UTC (permalink / raw)
  To: mingo, peterz, vincent.guittot, linux-kernel
  Cc: sshegde, kprateek.nayak, juri.lelli, vschneid, dietmar.eggemann,
	tj, rostedt, mgorman, bsegall, arighi

Now, that cpu_smt_mask is defined as cpumask_of(cpu) for
CONFIG_SCHED_SMT=n, it is possible to get rid of the ifdeffery.

Effectively,
- This makes sched_smt_present is defined always

- cpumask_weight(cpumask_of(cpu)) == 1. So sched_smt_present_inc/dec
  will never enable the sched_smt_present. Which is expected.

- Paths that were compile-time eliminated become runtime guarded
  using static keys.

- Defines set_idle_cores, test_idle_cores etc which could likely benefit
  the CONFIG_SCHED_SMT=n systems to use the same optimizations within the
  LLC at wakeups.

- This will expose sched_smt_present symbol for CONFIG_SCHED_SMT=n.
  Likely not a concern.

- There a bloat of code CONFIG_SCHED_SMT=n. (NR_CPUS=2048)
  add/remove: 24/18 grow/shrink: 26/28 up/down: 6396/-3188 (3208)
  Total: Before=30629880, After=30633088, chg +0.01%

- No code bloat for CONFIG_SCHED_SMT=y, which is expected.

- Add comments around stop_core_cpuslocked on why ifdefs are not
  removed.

- This leaves the remaining uses of CONFIG_SCHED_SMT mainly for
  topology building bits which have a policy based decision.

Acked-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Shrikanth Hegde <sshegde@linux.ibm.com>
---
 include/linux/sched/smt.h |  4 ----
 kernel/sched/core.c       |  6 ------
 kernel/sched/ext_idle.c   |  6 ------
 kernel/sched/fair.c       | 35 -----------------------------------
 kernel/sched/sched.h      |  6 ------
 kernel/sched/topology.c   |  2 --
 kernel/stop_machine.c     |  5 +++++
 kernel/workqueue.c        |  4 ----
 8 files changed, 5 insertions(+), 63 deletions(-)

diff --git a/include/linux/sched/smt.h b/include/linux/sched/smt.h
index 166b19af956f..cde6679c0278 100644
--- a/include/linux/sched/smt.h
+++ b/include/linux/sched/smt.h
@@ -4,16 +4,12 @@
 
 #include <linux/static_key.h>
 
-#ifdef CONFIG_SCHED_SMT
 extern struct static_key_false sched_smt_present;
 
 static __always_inline bool sched_smt_active(void)
 {
 	return static_branch_likely(&sched_smt_present);
 }
-#else
-static __always_inline bool sched_smt_active(void) { return false; }
-#endif
 
 void arch_smt_update(void);
 
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index b905805bbcbe..3ae5f19c1b7e 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -8612,18 +8612,14 @@ static void cpuset_cpu_inactive(unsigned int cpu)
 
 static inline void sched_smt_present_inc(int cpu)
 {
-#ifdef CONFIG_SCHED_SMT
 	if (cpumask_weight(cpu_smt_mask(cpu)) == 2)
 		static_branch_inc_cpuslocked(&sched_smt_present);
-#endif
 }
 
 static inline void sched_smt_present_dec(int cpu)
 {
-#ifdef CONFIG_SCHED_SMT
 	if (cpumask_weight(cpu_smt_mask(cpu)) == 2)
 		static_branch_dec_cpuslocked(&sched_smt_present);
-#endif
 }
 
 int sched_cpu_activate(unsigned int cpu)
@@ -8711,9 +8707,7 @@ int sched_cpu_deactivate(unsigned int cpu)
 	 */
 	sched_smt_present_dec(cpu);
 
-#ifdef CONFIG_SCHED_SMT
 	sched_core_cpu_deactivate(cpu);
-#endif
 
 	if (!sched_smp_initialized)
 		return 0;
diff --git a/kernel/sched/ext_idle.c b/kernel/sched/ext_idle.c
index 6e1980763270..9f5ad6b071f9 100644
--- a/kernel/sched/ext_idle.c
+++ b/kernel/sched/ext_idle.c
@@ -79,7 +79,6 @@ static bool scx_idle_test_and_clear_cpu(int cpu)
 	int node = scx_cpu_node_if_enabled(cpu);
 	struct cpumask *idle_cpus = idle_cpumask(node)->cpu;
 
-#ifdef CONFIG_SCHED_SMT
 	/*
 	 * SMT mask should be cleared whether we can claim @cpu or not. The SMT
 	 * cluster is not wholly idle either way. This also prevents
@@ -104,7 +103,6 @@ static bool scx_idle_test_and_clear_cpu(int cpu)
 		else if (cpumask_test_cpu(cpu, idle_smts))
 			__cpumask_clear_cpu(cpu, idle_smts);
 	}
-#endif
 
 	return cpumask_test_and_clear_cpu(cpu, idle_cpus);
 }
@@ -622,7 +620,6 @@ s32 scx_select_cpu_dfl(struct task_struct *p, s32 prev_cpu, u64 wake_flags,
 		goto out_unlock;
 	}
 
-#ifdef CONFIG_SCHED_SMT
 	/*
 	 * Use @prev_cpu's sibling if it's idle.
 	 */
@@ -634,7 +631,6 @@ s32 scx_select_cpu_dfl(struct task_struct *p, s32 prev_cpu, u64 wake_flags,
 				goto out_unlock;
 		}
 	}
-#endif
 
 	/*
 	 * Search for any idle CPU in the same LLC domain.
@@ -714,7 +710,6 @@ static void update_builtin_idle(int cpu, bool idle)
 
 	assign_cpu(cpu, idle_cpus, idle);
 
-#ifdef CONFIG_SCHED_SMT
 	if (sched_smt_active()) {
 		const struct cpumask *smt = cpu_smt_mask(cpu);
 		struct cpumask *idle_smts = idle_cpumask(node)->smt;
@@ -731,7 +726,6 @@ static void update_builtin_idle(int cpu, bool idle)
 			cpumask_andnot(idle_smts, idle_smts, smt);
 		}
 	}
-#endif
 }
 
 /*
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index 3ebec186f982..353e31ecaadc 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -1584,7 +1584,6 @@ update_stats_curr_start(struct cfs_rq *cfs_rq, struct sched_entity *se)
 
 static inline bool is_core_idle(int cpu)
 {
-#ifdef CONFIG_SCHED_SMT
 	int sibling;
 
 	for_each_cpu(sibling, cpu_smt_mask(cpu)) {
@@ -1594,7 +1593,6 @@ static inline bool is_core_idle(int cpu)
 		if (!idle_cpu(sibling))
 			return false;
 	}
-#endif
 
 	return true;
 }
@@ -2277,7 +2275,6 @@ numa_type numa_classify(unsigned int imbalance_pct,
 	return node_fully_busy;
 }
 
-#ifdef CONFIG_SCHED_SMT
 /* Forward declarations of select_idle_sibling helpers */
 static inline bool test_idle_cores(int cpu);
 static inline int numa_idle_core(int idle_core, int cpu)
@@ -2295,12 +2292,6 @@ static inline int numa_idle_core(int idle_core, int cpu)
 
 	return idle_core;
 }
-#else /* !CONFIG_SCHED_SMT: */
-static inline int numa_idle_core(int idle_core, int cpu)
-{
-	return idle_core;
-}
-#endif /* !CONFIG_SCHED_SMT */
 
 /*
  * Gather all necessary information to make NUMA balancing placement
@@ -7811,7 +7802,6 @@ static inline int __select_idle_cpu(int cpu, struct task_struct *p)
 	return -1;
 }
 
-#ifdef CONFIG_SCHED_SMT
 DEFINE_STATIC_KEY_FALSE(sched_smt_present);
 EXPORT_SYMBOL_GPL(sched_smt_present);
 
@@ -7921,29 +7911,6 @@ static int select_idle_smt(struct task_struct *p, struct sched_domain *sd, int t
 	return -1;
 }
 
-#else /* !CONFIG_SCHED_SMT: */
-
-static inline void set_idle_cores(int cpu, int val)
-{
-}
-
-static inline bool test_idle_cores(int cpu)
-{
-	return false;
-}
-
-static inline int select_idle_core(struct task_struct *p, int core, struct cpumask *cpus, int *idle_cpu)
-{
-	return __select_idle_cpu(core, p);
-}
-
-static inline int select_idle_smt(struct task_struct *p, struct sched_domain *sd, int target)
-{
-	return -1;
-}
-
-#endif /* !CONFIG_SCHED_SMT */
-
 /*
  * Scan the LLC domain for idle CPUs; this is dynamically regulated by
  * comparing the average scan cost (tracked in sd->avg_scan_cost) against the
@@ -12036,9 +12003,7 @@ static int should_we_balance(struct lb_env *env)
 			 * idle has been found, then its not needed to check other
 			 * SMT siblings for idleness:
 			 */
-#ifdef CONFIG_SCHED_SMT
 			cpumask_andnot(swb_cpus, swb_cpus, cpu_smt_mask(cpu));
-#endif
 			continue;
 		}
 
diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
index 9f63b15d309d..e476623a0c2a 100644
--- a/kernel/sched/sched.h
+++ b/kernel/sched/sched.h
@@ -1667,7 +1667,6 @@ do {						\
 	flags = _raw_spin_rq_lock_irqsave(rq);	\
 } while (0)
 
-#ifdef CONFIG_SCHED_SMT
 extern void __update_idle_core(struct rq *rq);
 
 static inline void update_idle_core(struct rq *rq)
@@ -1676,12 +1675,7 @@ static inline void update_idle_core(struct rq *rq)
 		__update_idle_core(rq);
 }
 
-#else /* !CONFIG_SCHED_SMT: */
-static inline void update_idle_core(struct rq *rq) { }
-#endif /* !CONFIG_SCHED_SMT */
-
 #ifdef CONFIG_FAIR_GROUP_SCHED
-
 static inline struct task_struct *task_of(struct sched_entity *se)
 {
 	WARN_ON_ONCE(!entity_is_task(se));
diff --git a/kernel/sched/topology.c b/kernel/sched/topology.c
index 5847b83d9d55..a1f46e3f4ede 100644
--- a/kernel/sched/topology.c
+++ b/kernel/sched/topology.c
@@ -1310,9 +1310,7 @@ static void init_sched_groups_capacity(int cpu, struct sched_domain *sd)
 		cpumask_copy(mask, sched_group_span(sg));
 		for_each_cpu(cpu, mask) {
 			cores++;
-#ifdef CONFIG_SCHED_SMT
 			cpumask_andnot(mask, mask, cpu_smt_mask(cpu));
-#endif
 		}
 		sg->cores = cores;
 
diff --git a/kernel/stop_machine.c b/kernel/stop_machine.c
index 3fe6b0c99f3d..773d8e9ae30c 100644
--- a/kernel/stop_machine.c
+++ b/kernel/stop_machine.c
@@ -633,6 +633,11 @@ int stop_machine(cpu_stop_fn_t fn, void *data, const struct cpumask *cpus)
 EXPORT_SYMBOL_GPL(stop_machine);
 
 #ifdef CONFIG_SCHED_SMT
+/*
+ * INTEL_IFS is the only user of this API. That selftest can
+ * only be compiled if SMP=y. On x86 it selects SCHED_SMT.
+ * Keep the ifdefs for now.
+ */
 int stop_core_cpuslocked(unsigned int cpu, cpu_stop_fn_t fn, void *data)
 {
 	const struct cpumask *smt_mask = cpu_smt_mask(cpu);
diff --git a/kernel/workqueue.c b/kernel/workqueue.c
index 3d2e3b2ec528..c911fdcb4428 100644
--- a/kernel/workqueue.c
+++ b/kernel/workqueue.c
@@ -8198,11 +8198,7 @@ static bool __init cpus_dont_share(int cpu0, int cpu1)
 
 static bool __init cpus_share_smt(int cpu0, int cpu1)
 {
-#ifdef CONFIG_SCHED_SMT
 	return cpumask_test_cpu(cpu0, cpu_smt_mask(cpu1));
-#else
-	return false;
-#endif
 }
 
 static bool __init cpus_share_numa(int cpu0, int cpu1)
-- 
2.47.3


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v2 3/3] sched/fair: Add compile time check in fastpaths for CONFIG_SCHED_SMT=n
  2026-05-12 15:21 [PATCH v2 0/3] sched: Simplify ifdeffery around CONFIG_SCHED_SMT Shrikanth Hegde
  2026-05-12 15:21 ` [PATCH v2 1/3] topology: Introduce cpu_smt_mask for CONFIG_SCHED_SMT=n Shrikanth Hegde
  2026-05-12 15:21 ` [PATCH v2 2/3] sched: Simplify ifdeffery around cpu_smt_mask Shrikanth Hegde
@ 2026-05-12 15:21 ` Shrikanth Hegde
  2026-05-12 16:59   ` Phil Auld
  2026-05-13  6:07   ` K Prateek Nayak
  2026-05-12 17:48 ` [PATCH v2 0/3] sched: Simplify ifdeffery around CONFIG_SCHED_SMT Valentin Schneider
  2026-05-13  6:20 ` K Prateek Nayak
  4 siblings, 2 replies; 15+ messages in thread
From: Shrikanth Hegde @ 2026-05-12 15:21 UTC (permalink / raw)
  To: mingo, peterz, vincent.guittot, linux-kernel
  Cc: sshegde, kprateek.nayak, juri.lelli, vschneid, dietmar.eggemann,
	tj, rostedt, mgorman, bsegall, arighi

For fastpaths such as wakeup, load balance even a minimal code additons
can pop up. Add IS_ENABLED checks there to ensure there is no overhead.

Other places are either have sched_smt_active() check or they are not in
fast paths.

Signed-off-by: Shrikanth Hegde <sshegde@linux.ibm.com>
---
 kernel/sched/fair.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index 353e31ecaadc..b6f9592b31fd 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -1586,6 +1586,9 @@ static inline bool is_core_idle(int cpu)
 {
 	int sibling;
 
+	if (!IS_ENABLED(CONFIG_SCHED_SMT))
+		return true;
+
 	for_each_cpu(sibling, cpu_smt_mask(cpu)) {
 		if (cpu == sibling)
 			continue;
@@ -12003,7 +12006,8 @@ static int should_we_balance(struct lb_env *env)
 			 * idle has been found, then its not needed to check other
 			 * SMT siblings for idleness:
 			 */
-			cpumask_andnot(swb_cpus, swb_cpus, cpu_smt_mask(cpu));
+			if (IS_ENABLED(CONFIG_SCHED_SMT))
+				cpumask_andnot(swb_cpus, swb_cpus, cpu_smt_mask(cpu));
 			continue;
 		}
 
-- 
2.47.3


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 1/3] topology: Introduce cpu_smt_mask for CONFIG_SCHED_SMT=n
  2026-05-12 15:21 ` [PATCH v2 1/3] topology: Introduce cpu_smt_mask for CONFIG_SCHED_SMT=n Shrikanth Hegde
@ 2026-05-12 16:56   ` Phil Auld
  0 siblings, 0 replies; 15+ messages in thread
From: Phil Auld @ 2026-05-12 16:56 UTC (permalink / raw)
  To: Shrikanth Hegde
  Cc: mingo, peterz, vincent.guittot, linux-kernel, kprateek.nayak,
	juri.lelli, vschneid, dietmar.eggemann, tj, rostedt, mgorman,
	bsegall, arighi

On Tue, May 12, 2026 at 08:51:23PM +0530 Shrikanth Hegde wrote:
> Define cpu_smt_mask in case of CONFIG_SCHED_SMT=n as cpumask_of that
> CPU. With that config, it is expected that kernel treats each CPU
> as individual core. Using cpumask_of(cpu) reflects that.
> 
> This would help to get rid of the ifdeffery that is spread across
> the codebase since cpu_smt_mask is defined only in case of
> CONFIG_SCHED_SMT=y.
> 
> Note: There is no arch today which defines cpu_smt_mask unconditionally.
> So likely defining the cpu_smt_mask shouldn't lead redefintion errors.
> 
> Signed-off-by: Shrikanth Hegde <sshegde@linux.ibm.com>


I like this whole cleanup, fwiw.

Reviewed-by: Phil Auld <pauld@redhat.com>


Cheers,
Phil

> ---
>  include/linux/topology.h | 15 ++++++++++++++-
>  1 file changed, 14 insertions(+), 1 deletion(-)
> 
> diff --git a/include/linux/topology.h b/include/linux/topology.h
> index 6575af39fd10..709a2dcf4c73 100644
> --- a/include/linux/topology.h
> +++ b/include/linux/topology.h
> @@ -230,11 +230,24 @@ static inline int cpu_to_mem(int cpu)
>  #define topology_drawer_cpumask(cpu)		cpumask_of(cpu)
>  #endif
>  
> -#if defined(CONFIG_SCHED_SMT) && !defined(cpu_smt_mask)
> +/*
> + * Defining cpu_smt_mask as cpumask_of that CPU helps to get
> + * rid of lot of ifdeffery all around the codebase in case of
> + * CONFIG_SCHED_SMT=n. It just means there are no other siblings, which
> + * is what is expected.
> + */
> +#if defined(CONFIG_SCHED_SMT)
> +# if !defined(cpu_smt_mask)
>  static inline const struct cpumask *cpu_smt_mask(int cpu)
>  {
>  	return topology_sibling_cpumask(cpu);
>  }
> +# endif
> +#else	/* !CONFIG_SCHED_SMT */
> +static inline const struct cpumask *cpu_smt_mask(int cpu)
> +{
> +	return cpumask_of(cpu);
> +}
>  #endif
>  
>  #ifndef topology_is_primary_thread
> -- 
> 2.47.3
> 
> 

-- 


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 2/3] sched: Simplify ifdeffery around cpu_smt_mask
  2026-05-12 15:21 ` [PATCH v2 2/3] sched: Simplify ifdeffery around cpu_smt_mask Shrikanth Hegde
@ 2026-05-12 16:57   ` Phil Auld
  0 siblings, 0 replies; 15+ messages in thread
From: Phil Auld @ 2026-05-12 16:57 UTC (permalink / raw)
  To: Shrikanth Hegde
  Cc: mingo, peterz, vincent.guittot, linux-kernel, kprateek.nayak,
	juri.lelli, vschneid, dietmar.eggemann, tj, rostedt, mgorman,
	bsegall, arighi

On Tue, May 12, 2026 at 08:51:24PM +0530 Shrikanth Hegde wrote:
> Now, that cpu_smt_mask is defined as cpumask_of(cpu) for
> CONFIG_SCHED_SMT=n, it is possible to get rid of the ifdeffery.
> 
> Effectively,
> - This makes sched_smt_present is defined always
> 
> - cpumask_weight(cpumask_of(cpu)) == 1. So sched_smt_present_inc/dec
>   will never enable the sched_smt_present. Which is expected.
> 
> - Paths that were compile-time eliminated become runtime guarded
>   using static keys.
> 
> - Defines set_idle_cores, test_idle_cores etc which could likely benefit
>   the CONFIG_SCHED_SMT=n systems to use the same optimizations within the
>   LLC at wakeups.
> 
> - This will expose sched_smt_present symbol for CONFIG_SCHED_SMT=n.
>   Likely not a concern.
> 
> - There a bloat of code CONFIG_SCHED_SMT=n. (NR_CPUS=2048)
>   add/remove: 24/18 grow/shrink: 26/28 up/down: 6396/-3188 (3208)
>   Total: Before=30629880, After=30633088, chg +0.01%
> 
> - No code bloat for CONFIG_SCHED_SMT=y, which is expected.
> 
> - Add comments around stop_core_cpuslocked on why ifdefs are not
>   removed.
> 
> - This leaves the remaining uses of CONFIG_SCHED_SMT mainly for
>   topology building bits which have a policy based decision.
> 
> Acked-by: Tejun Heo <tj@kernel.org>
> Signed-off-by: Shrikanth Hegde <sshegde@linux.ibm.com>

LGTM.

Reviewed-by: Phil Auld <pauld@redhat.com>

Cheers,
Phil


> ---
>  include/linux/sched/smt.h |  4 ----
>  kernel/sched/core.c       |  6 ------
>  kernel/sched/ext_idle.c   |  6 ------
>  kernel/sched/fair.c       | 35 -----------------------------------
>  kernel/sched/sched.h      |  6 ------
>  kernel/sched/topology.c   |  2 --
>  kernel/stop_machine.c     |  5 +++++
>  kernel/workqueue.c        |  4 ----
>  8 files changed, 5 insertions(+), 63 deletions(-)
> 
> diff --git a/include/linux/sched/smt.h b/include/linux/sched/smt.h
> index 166b19af956f..cde6679c0278 100644
> --- a/include/linux/sched/smt.h
> +++ b/include/linux/sched/smt.h
> @@ -4,16 +4,12 @@
>  
>  #include <linux/static_key.h>
>  
> -#ifdef CONFIG_SCHED_SMT
>  extern struct static_key_false sched_smt_present;
>  
>  static __always_inline bool sched_smt_active(void)
>  {
>  	return static_branch_likely(&sched_smt_present);
>  }
> -#else
> -static __always_inline bool sched_smt_active(void) { return false; }
> -#endif
>  
>  void arch_smt_update(void);
>  
> diff --git a/kernel/sched/core.c b/kernel/sched/core.c
> index b905805bbcbe..3ae5f19c1b7e 100644
> --- a/kernel/sched/core.c
> +++ b/kernel/sched/core.c
> @@ -8612,18 +8612,14 @@ static void cpuset_cpu_inactive(unsigned int cpu)
>  
>  static inline void sched_smt_present_inc(int cpu)
>  {
> -#ifdef CONFIG_SCHED_SMT
>  	if (cpumask_weight(cpu_smt_mask(cpu)) == 2)
>  		static_branch_inc_cpuslocked(&sched_smt_present);
> -#endif
>  }
>  
>  static inline void sched_smt_present_dec(int cpu)
>  {
> -#ifdef CONFIG_SCHED_SMT
>  	if (cpumask_weight(cpu_smt_mask(cpu)) == 2)
>  		static_branch_dec_cpuslocked(&sched_smt_present);
> -#endif
>  }
>  
>  int sched_cpu_activate(unsigned int cpu)
> @@ -8711,9 +8707,7 @@ int sched_cpu_deactivate(unsigned int cpu)
>  	 */
>  	sched_smt_present_dec(cpu);
>  
> -#ifdef CONFIG_SCHED_SMT
>  	sched_core_cpu_deactivate(cpu);
> -#endif
>  
>  	if (!sched_smp_initialized)
>  		return 0;
> diff --git a/kernel/sched/ext_idle.c b/kernel/sched/ext_idle.c
> index 6e1980763270..9f5ad6b071f9 100644
> --- a/kernel/sched/ext_idle.c
> +++ b/kernel/sched/ext_idle.c
> @@ -79,7 +79,6 @@ static bool scx_idle_test_and_clear_cpu(int cpu)
>  	int node = scx_cpu_node_if_enabled(cpu);
>  	struct cpumask *idle_cpus = idle_cpumask(node)->cpu;
>  
> -#ifdef CONFIG_SCHED_SMT
>  	/*
>  	 * SMT mask should be cleared whether we can claim @cpu or not. The SMT
>  	 * cluster is not wholly idle either way. This also prevents
> @@ -104,7 +103,6 @@ static bool scx_idle_test_and_clear_cpu(int cpu)
>  		else if (cpumask_test_cpu(cpu, idle_smts))
>  			__cpumask_clear_cpu(cpu, idle_smts);
>  	}
> -#endif
>  
>  	return cpumask_test_and_clear_cpu(cpu, idle_cpus);
>  }
> @@ -622,7 +620,6 @@ s32 scx_select_cpu_dfl(struct task_struct *p, s32 prev_cpu, u64 wake_flags,
>  		goto out_unlock;
>  	}
>  
> -#ifdef CONFIG_SCHED_SMT
>  	/*
>  	 * Use @prev_cpu's sibling if it's idle.
>  	 */
> @@ -634,7 +631,6 @@ s32 scx_select_cpu_dfl(struct task_struct *p, s32 prev_cpu, u64 wake_flags,
>  				goto out_unlock;
>  		}
>  	}
> -#endif
>  
>  	/*
>  	 * Search for any idle CPU in the same LLC domain.
> @@ -714,7 +710,6 @@ static void update_builtin_idle(int cpu, bool idle)
>  
>  	assign_cpu(cpu, idle_cpus, idle);
>  
> -#ifdef CONFIG_SCHED_SMT
>  	if (sched_smt_active()) {
>  		const struct cpumask *smt = cpu_smt_mask(cpu);
>  		struct cpumask *idle_smts = idle_cpumask(node)->smt;
> @@ -731,7 +726,6 @@ static void update_builtin_idle(int cpu, bool idle)
>  			cpumask_andnot(idle_smts, idle_smts, smt);
>  		}
>  	}
> -#endif
>  }
>  
>  /*
> diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
> index 3ebec186f982..353e31ecaadc 100644
> --- a/kernel/sched/fair.c
> +++ b/kernel/sched/fair.c
> @@ -1584,7 +1584,6 @@ update_stats_curr_start(struct cfs_rq *cfs_rq, struct sched_entity *se)
>  
>  static inline bool is_core_idle(int cpu)
>  {
> -#ifdef CONFIG_SCHED_SMT
>  	int sibling;
>  
>  	for_each_cpu(sibling, cpu_smt_mask(cpu)) {
> @@ -1594,7 +1593,6 @@ static inline bool is_core_idle(int cpu)
>  		if (!idle_cpu(sibling))
>  			return false;
>  	}
> -#endif
>  
>  	return true;
>  }
> @@ -2277,7 +2275,6 @@ numa_type numa_classify(unsigned int imbalance_pct,
>  	return node_fully_busy;
>  }
>  
> -#ifdef CONFIG_SCHED_SMT
>  /* Forward declarations of select_idle_sibling helpers */
>  static inline bool test_idle_cores(int cpu);
>  static inline int numa_idle_core(int idle_core, int cpu)
> @@ -2295,12 +2292,6 @@ static inline int numa_idle_core(int idle_core, int cpu)
>  
>  	return idle_core;
>  }
> -#else /* !CONFIG_SCHED_SMT: */
> -static inline int numa_idle_core(int idle_core, int cpu)
> -{
> -	return idle_core;
> -}
> -#endif /* !CONFIG_SCHED_SMT */
>  
>  /*
>   * Gather all necessary information to make NUMA balancing placement
> @@ -7811,7 +7802,6 @@ static inline int __select_idle_cpu(int cpu, struct task_struct *p)
>  	return -1;
>  }
>  
> -#ifdef CONFIG_SCHED_SMT
>  DEFINE_STATIC_KEY_FALSE(sched_smt_present);
>  EXPORT_SYMBOL_GPL(sched_smt_present);
>  
> @@ -7921,29 +7911,6 @@ static int select_idle_smt(struct task_struct *p, struct sched_domain *sd, int t
>  	return -1;
>  }
>  
> -#else /* !CONFIG_SCHED_SMT: */
> -
> -static inline void set_idle_cores(int cpu, int val)
> -{
> -}
> -
> -static inline bool test_idle_cores(int cpu)
> -{
> -	return false;
> -}
> -
> -static inline int select_idle_core(struct task_struct *p, int core, struct cpumask *cpus, int *idle_cpu)
> -{
> -	return __select_idle_cpu(core, p);
> -}
> -
> -static inline int select_idle_smt(struct task_struct *p, struct sched_domain *sd, int target)
> -{
> -	return -1;
> -}
> -
> -#endif /* !CONFIG_SCHED_SMT */
> -
>  /*
>   * Scan the LLC domain for idle CPUs; this is dynamically regulated by
>   * comparing the average scan cost (tracked in sd->avg_scan_cost) against the
> @@ -12036,9 +12003,7 @@ static int should_we_balance(struct lb_env *env)
>  			 * idle has been found, then its not needed to check other
>  			 * SMT siblings for idleness:
>  			 */
> -#ifdef CONFIG_SCHED_SMT
>  			cpumask_andnot(swb_cpus, swb_cpus, cpu_smt_mask(cpu));
> -#endif
>  			continue;
>  		}
>  
> diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
> index 9f63b15d309d..e476623a0c2a 100644
> --- a/kernel/sched/sched.h
> +++ b/kernel/sched/sched.h
> @@ -1667,7 +1667,6 @@ do {						\
>  	flags = _raw_spin_rq_lock_irqsave(rq);	\
>  } while (0)
>  
> -#ifdef CONFIG_SCHED_SMT
>  extern void __update_idle_core(struct rq *rq);
>  
>  static inline void update_idle_core(struct rq *rq)
> @@ -1676,12 +1675,7 @@ static inline void update_idle_core(struct rq *rq)
>  		__update_idle_core(rq);
>  }
>  
> -#else /* !CONFIG_SCHED_SMT: */
> -static inline void update_idle_core(struct rq *rq) { }
> -#endif /* !CONFIG_SCHED_SMT */
> -
>  #ifdef CONFIG_FAIR_GROUP_SCHED
> -
>  static inline struct task_struct *task_of(struct sched_entity *se)
>  {
>  	WARN_ON_ONCE(!entity_is_task(se));
> diff --git a/kernel/sched/topology.c b/kernel/sched/topology.c
> index 5847b83d9d55..a1f46e3f4ede 100644
> --- a/kernel/sched/topology.c
> +++ b/kernel/sched/topology.c
> @@ -1310,9 +1310,7 @@ static void init_sched_groups_capacity(int cpu, struct sched_domain *sd)
>  		cpumask_copy(mask, sched_group_span(sg));
>  		for_each_cpu(cpu, mask) {
>  			cores++;
> -#ifdef CONFIG_SCHED_SMT
>  			cpumask_andnot(mask, mask, cpu_smt_mask(cpu));
> -#endif
>  		}
>  		sg->cores = cores;
>  
> diff --git a/kernel/stop_machine.c b/kernel/stop_machine.c
> index 3fe6b0c99f3d..773d8e9ae30c 100644
> --- a/kernel/stop_machine.c
> +++ b/kernel/stop_machine.c
> @@ -633,6 +633,11 @@ int stop_machine(cpu_stop_fn_t fn, void *data, const struct cpumask *cpus)
>  EXPORT_SYMBOL_GPL(stop_machine);
>  
>  #ifdef CONFIG_SCHED_SMT
> +/*
> + * INTEL_IFS is the only user of this API. That selftest can
> + * only be compiled if SMP=y. On x86 it selects SCHED_SMT.
> + * Keep the ifdefs for now.
> + */
>  int stop_core_cpuslocked(unsigned int cpu, cpu_stop_fn_t fn, void *data)
>  {
>  	const struct cpumask *smt_mask = cpu_smt_mask(cpu);
> diff --git a/kernel/workqueue.c b/kernel/workqueue.c
> index 3d2e3b2ec528..c911fdcb4428 100644
> --- a/kernel/workqueue.c
> +++ b/kernel/workqueue.c
> @@ -8198,11 +8198,7 @@ static bool __init cpus_dont_share(int cpu0, int cpu1)
>  
>  static bool __init cpus_share_smt(int cpu0, int cpu1)
>  {
> -#ifdef CONFIG_SCHED_SMT
>  	return cpumask_test_cpu(cpu0, cpu_smt_mask(cpu1));
> -#else
> -	return false;
> -#endif
>  }
>  
>  static bool __init cpus_share_numa(int cpu0, int cpu1)
> -- 
> 2.47.3
> 
> 

-- 


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 3/3] sched/fair: Add compile time check in fastpaths for CONFIG_SCHED_SMT=n
  2026-05-12 15:21 ` [PATCH v2 3/3] sched/fair: Add compile time check in fastpaths for CONFIG_SCHED_SMT=n Shrikanth Hegde
@ 2026-05-12 16:59   ` Phil Auld
  2026-05-13  4:15     ` Shrikanth Hegde
  2026-05-13  6:07   ` K Prateek Nayak
  1 sibling, 1 reply; 15+ messages in thread
From: Phil Auld @ 2026-05-12 16:59 UTC (permalink / raw)
  To: Shrikanth Hegde
  Cc: mingo, peterz, vincent.guittot, linux-kernel, kprateek.nayak,
	juri.lelli, vschneid, dietmar.eggemann, tj, rostedt, mgorman,
	bsegall, arighi

Hi Shrikanth,

On Tue, May 12, 2026 at 08:51:25PM +0530 Shrikanth Hegde wrote:
> For fastpaths such as wakeup, load balance even a minimal code additons
> can pop up. Add IS_ENABLED checks there to ensure there is no overhead.

"For fastpaths such as wakeup and load balance, even minimal code additions
can add up. Add IS_ENABLED() checks..."  ?

> 
> Other places are either have sched_smt_active() check or they are not in

s/are//

"have a sched_smt_active_check()" or drop "check" ? 


Otherwise lgtm.

Reviewed-by: Phil Auld <pauld@redhat.com>


Cheers,
Phil



> fast paths.
> 
> Signed-off-by: Shrikanth Hegde <sshegde@linux.ibm.com>
> ---
>  kernel/sched/fair.c | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
> 
> diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
> index 353e31ecaadc..b6f9592b31fd 100644
> --- a/kernel/sched/fair.c
> +++ b/kernel/sched/fair.c
> @@ -1586,6 +1586,9 @@ static inline bool is_core_idle(int cpu)
>  {
>  	int sibling;
>  
> +	if (!IS_ENABLED(CONFIG_SCHED_SMT))
> +		return true;
> +
>  	for_each_cpu(sibling, cpu_smt_mask(cpu)) {
>  		if (cpu == sibling)
>  			continue;
> @@ -12003,7 +12006,8 @@ static int should_we_balance(struct lb_env *env)
>  			 * idle has been found, then its not needed to check other
>  			 * SMT siblings for idleness:
>  			 */
> -			cpumask_andnot(swb_cpus, swb_cpus, cpu_smt_mask(cpu));
> +			if (IS_ENABLED(CONFIG_SCHED_SMT))
> +				cpumask_andnot(swb_cpus, swb_cpus, cpu_smt_mask(cpu));
>  			continue;
>  		}
>  
> -- 
> 2.47.3
> 
> 

-- 


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 0/3] sched: Simplify ifdeffery around CONFIG_SCHED_SMT
  2026-05-12 15:21 [PATCH v2 0/3] sched: Simplify ifdeffery around CONFIG_SCHED_SMT Shrikanth Hegde
                   ` (2 preceding siblings ...)
  2026-05-12 15:21 ` [PATCH v2 3/3] sched/fair: Add compile time check in fastpaths for CONFIG_SCHED_SMT=n Shrikanth Hegde
@ 2026-05-12 17:48 ` Valentin Schneider
  2026-05-13  6:20 ` K Prateek Nayak
  4 siblings, 0 replies; 15+ messages in thread
From: Valentin Schneider @ 2026-05-12 17:48 UTC (permalink / raw)
  To: Shrikanth Hegde, mingo, peterz, vincent.guittot, linux-kernel
  Cc: sshegde, kprateek.nayak, juri.lelli, dietmar.eggemann, tj,
	rostedt, mgorman, bsegall, arighi

On 12/05/26 20:51, Shrikanth Hegde wrote:
> Semantics
> =========
> - For CONFIG_SCHED_SMT=y:
>     No functional change.
> - For CONFIG_SCHED_SMT=n:
>     - cpu_smt_mask(cpu) becomes cpumask_of(cpu), effectively making it
>       per CPU with no siblings.
>     - sched_smt_present remains defined, but never becomes active:
>        Since cpumask_weight(cpumask_of(cpu)) == 1
>
> Performance impact
> ==================
> - CONFIG_SCHED_SMT=y:
>     No change in generated code.
> - CONFIG_SCHED_SMT=n:
>     - Small increase in text size (~0.01%) due to removal of compile-time
>       stubs. Most paths remain effectively dead due to static keys.
>     - Fast paths are protected using IS_ENABLED(CONFIG_SCHED_SMT).
>
> With that, cpu_smt_mask() to be used unconditionally and reduces
> CONFIG_SCHED_SMT-specific code paths, improving readability and
> maintainability.
>
> This leaves the remaining use of CONFIG_SCHED_SMT mainly for topology
> handling bits.
>

Reviewed-by: Valentin Schneider <vschneid@redhat.com>


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 3/3] sched/fair: Add compile time check in fastpaths for CONFIG_SCHED_SMT=n
  2026-05-12 16:59   ` Phil Auld
@ 2026-05-13  4:15     ` Shrikanth Hegde
  2026-05-13 11:53       ` Phil Auld
  0 siblings, 1 reply; 15+ messages in thread
From: Shrikanth Hegde @ 2026-05-13  4:15 UTC (permalink / raw)
  To: Phil Auld
  Cc: mingo, peterz, vincent.guittot, linux-kernel, kprateek.nayak,
	juri.lelli, vschneid, dietmar.eggemann, tj, rostedt, mgorman,
	bsegall, arighi

Hi Phil.

On 5/12/26 10:29 PM, Phil Auld wrote:
> Hi Shrikanth,
> 
> On Tue, May 12, 2026 at 08:51:25PM +0530 Shrikanth Hegde wrote:
>> For fastpaths such as wakeup, load balance even a minimal code additons
>> can pop up. Add IS_ENABLED checks there to ensure there is no overhead.
> 
> "For fastpaths such as wakeup and load balance, even minimal code additions
> can add up. Add IS_ENABLED() checks..."  ?
> 

Ok.

>>
>> Other places are either have sched_smt_active() check or they are not in
> 
> s/are//

ok.

> 
> "have a sched_smt_active_check()" or drop "check" ?
> 
> 

I was saying sched_smt_active() runtime gating is there for many fast paths where
cpu_smt_mask is being referred or those code paths are not fast paths.

Let me re-word a bit.

> Otherwise lgtm.
> 
> Reviewed-by: Phil Auld <pauld@redhat.com>
> 
> 
> Cheers,
> Phil
> 
Thanks for the review.

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 3/3] sched/fair: Add compile time check in fastpaths for CONFIG_SCHED_SMT=n
  2026-05-12 15:21 ` [PATCH v2 3/3] sched/fair: Add compile time check in fastpaths for CONFIG_SCHED_SMT=n Shrikanth Hegde
  2026-05-12 16:59   ` Phil Auld
@ 2026-05-13  6:07   ` K Prateek Nayak
  2026-05-13  6:16     ` Shrikanth Hegde
  2026-05-13  6:39     ` Shrikanth Hegde
  1 sibling, 2 replies; 15+ messages in thread
From: K Prateek Nayak @ 2026-05-13  6:07 UTC (permalink / raw)
  To: Shrikanth Hegde, mingo, peterz, vincent.guittot, linux-kernel
  Cc: juri.lelli, vschneid, dietmar.eggemann, tj, rostedt, mgorman,
	bsegall, arighi

Hello Shrikanth,

Thank you for cleaning these bits up! Couple comments below:

On 5/12/2026 8:51 PM, Shrikanth Hegde wrote:
> diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
> index 353e31ecaadc..b6f9592b31fd 100644
> --- a/kernel/sched/fair.c
> +++ b/kernel/sched/fair.c
> @@ -1586,6 +1586,9 @@ static inline bool is_core_idle(int cpu)
>  {
>  	int sibling;
>  
> +	if (!IS_ENABLED(CONFIG_SCHED_SMT))
> +		return true;

I think !sched_smt_active() can also return early here. That said ...

> +
>  	for_each_cpu(sibling, cpu_smt_mask(cpu)) {
>  		if (cpu == sibling)
>  			continue;
> @@ -12003,7 +12006,8 @@ static int should_we_balance(struct lb_env *env)

... I think the if() above can simply check for sched_smt_active()
before calling is_core_idle() like:

    if (sched_smt_active() &&
        !(env->sd->flags & SD_SHARE_CPUCAPACITY) &&
        !is_core_idle(cpu)) {
        ...
    }

That way, we ensure we don't call is_core_idle() and the cpumask_and()
unnecessarily on topologies that don't have SMT domain similar to how
sched_use_asym_prio() guards the call to is_core_idle().

Thoughts?

>  			 * idle has been found, then its not needed to check other
>  			 * SMT siblings for idleness:
>  			 */
> -			cpumask_andnot(swb_cpus, swb_cpus, cpu_smt_mask(cpu));
> +			if (IS_ENABLED(CONFIG_SCHED_SMT))
> +				cpumask_andnot(swb_cpus, swb_cpus, cpu_smt_mask(cpu));
>  			continue;
>  		}
>  

-- 
Thanks and Regards,
Prateek


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 3/3] sched/fair: Add compile time check in fastpaths for CONFIG_SCHED_SMT=n
  2026-05-13  6:07   ` K Prateek Nayak
@ 2026-05-13  6:16     ` Shrikanth Hegde
  2026-05-13  6:39     ` Shrikanth Hegde
  1 sibling, 0 replies; 15+ messages in thread
From: Shrikanth Hegde @ 2026-05-13  6:16 UTC (permalink / raw)
  To: K Prateek Nayak, mingo, peterz, vincent.guittot, linux-kernel
  Cc: juri.lelli, vschneid, dietmar.eggemann, tj, rostedt, mgorman,
	bsegall, arighi



On 5/13/26 11:37 AM, K Prateek Nayak wrote:
> Hello Shrikanth,
> 
> Thank you for cleaning these bits up! Couple comments below:
> 
> On 5/12/2026 8:51 PM, Shrikanth Hegde wrote:
>> diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
>> index 353e31ecaadc..b6f9592b31fd 100644
>> --- a/kernel/sched/fair.c
>> +++ b/kernel/sched/fair.c
>> @@ -1586,6 +1586,9 @@ static inline bool is_core_idle(int cpu)
>>   {
>>   	int sibling;
>>   
>> +	if (!IS_ENABLED(CONFIG_SCHED_SMT))
>> +		return true;
> 
> I think !sched_smt_active() can also return early here. That said ...
> 

If we do below, the rest users already have the checks.
So we should be good.
I will add a comment saying this expects to be called under sched_smt_active.

>> +
>>   	for_each_cpu(sibling, cpu_smt_mask(cpu)) {
>>   		if (cpu == sibling)
>>   			continue;
>> @@ -12003,7 +12006,8 @@ static int should_we_balance(struct lb_env *env)
> 
> ... I think the if() above can simply check for sched_smt_active()
> before calling is_core_idle() like:
> 
>      if (sched_smt_active() &&
>          !(env->sd->flags & SD_SHARE_CPUCAPACITY) &&
>          !is_core_idle(cpu)) {
>          ...
>      }
> 
> That way, we ensure we don't call is_core_idle() and the cpumask_and()
> unnecessarily on topologies that don't have SMT domain similar to how
> sched_use_asym_prio() guards the call to is_core_idle().
> 
> Thoughts?

Ack. Let me edit the v3. I was about to send.

> 
>>   			 * idle has been found, then its not needed to check other
>>   			 * SMT siblings for idleness:
>>   			 */
>> -			cpumask_andnot(swb_cpus, swb_cpus, cpu_smt_mask(cpu));
>> +			if (IS_ENABLED(CONFIG_SCHED_SMT))
>> +				cpumask_andnot(swb_cpus, swb_cpus, cpu_smt_mask(cpu));
>>   			continue;
>>   		}
>>   
> 


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 0/3] sched: Simplify ifdeffery around CONFIG_SCHED_SMT
  2026-05-12 15:21 [PATCH v2 0/3] sched: Simplify ifdeffery around CONFIG_SCHED_SMT Shrikanth Hegde
                   ` (3 preceding siblings ...)
  2026-05-12 17:48 ` [PATCH v2 0/3] sched: Simplify ifdeffery around CONFIG_SCHED_SMT Valentin Schneider
@ 2026-05-13  6:20 ` K Prateek Nayak
  4 siblings, 0 replies; 15+ messages in thread
From: K Prateek Nayak @ 2026-05-13  6:20 UTC (permalink / raw)
  To: Shrikanth Hegde, mingo, peterz, vincent.guittot, linux-kernel
  Cc: juri.lelli, vschneid, dietmar.eggemann, tj, rostedt, mgorman,
	bsegall, arighi

Hello Shrikanth,

On 5/12/2026 8:51 PM, Shrikanth Hegde wrote:
> Semantics
> =========
> - For CONFIG_SCHED_SMT=y:
>     No functional change.
> - For CONFIG_SCHED_SMT=n:
>     - cpu_smt_mask(cpu) becomes cpumask_of(cpu), effectively making it
>       per CPU with no siblings.
>     - sched_smt_present remains defined, but never becomes active:
>     	 Since cpumask_weight(cpumask_of(cpu)) == 1
> 
> Performance impact
> ==================
> - CONFIG_SCHED_SMT=y:
>     No change in generated code.
> - CONFIG_SCHED_SMT=n:
>     - Small increase in text size (~0.01%) due to removal of compile-time
>       stubs. Most paths remain effectively dead due to static keys.
>     - Fast paths are protected using IS_ENABLED(CONFIG_SCHED_SMT).
> 
> With that, cpu_smt_mask() to be used unconditionally and reduces
> CONFIG_SCHED_SMT-specific code paths, improving readability and
> maintainability.
> 
> This leaves the remaining use of CONFIG_SCHED_SMT mainly for topology
> handling bits.

Thank you again cleaning this up! Feel free to include:

Tested-by: K Prateek Nayak <kprateek.nayak@amd.com>

I also tested removing the "select SCHED_SMT" dependency for x86 after
guarding SDTL_INIT(..., SMT) behind CONFIG_SCHED_SMT and the system is
up fine; performance is terrible as expected :-)

-- 
Thanks and Regards,
Prateek


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 3/3] sched/fair: Add compile time check in fastpaths for CONFIG_SCHED_SMT=n
  2026-05-13  6:07   ` K Prateek Nayak
  2026-05-13  6:16     ` Shrikanth Hegde
@ 2026-05-13  6:39     ` Shrikanth Hegde
  2026-05-13  6:57       ` K Prateek Nayak
  1 sibling, 1 reply; 15+ messages in thread
From: Shrikanth Hegde @ 2026-05-13  6:39 UTC (permalink / raw)
  To: K Prateek Nayak, mingo, peterz, vincent.guittot, linux-kernel
  Cc: juri.lelli, vschneid, dietmar.eggemann, tj, rostedt, mgorman,
	bsegall, arighi


Hi Prateek.

> ... I think the if() above can simply check for sched_smt_active()
> before calling is_core_idle() like:
> 
>      if (sched_smt_active() &&
>          !(env->sd->flags & SD_SHARE_CPUCAPACITY) &&
>          !is_core_idle(cpu)) {
>          ...
>      }
> 
> That way, we ensure we don't call is_core_idle() and the cpumask_and()
> unnecessarily on topologies that don't have SMT domain similar to how
> sched_use_asym_prio() guards the call to is_core_idle().
> 
> Thoughts?
> 
In addition, Do you think it makes sense to consolidate use of
sched_smt_present always using sched_smt_active() ?


static __always_inline bool sched_smt_active(void)
{
         return static_branch_likely(&sched_smt_present);
}

kernel/sched/core_sched.c:      if (!static_branch_likely(&sched_smt_present))
kernel/sched/fair.c:    if (!static_branch_likely(&sched_smt_present) ||
kernel/sched/sched.h:   if (static_branch_unlikely(&sched_smt_present))


The last being differing with unlikely in update_idle_core.
Does it make sense to call sched_smt_active there as well?

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 3/3] sched/fair: Add compile time check in fastpaths for CONFIG_SCHED_SMT=n
  2026-05-13  6:39     ` Shrikanth Hegde
@ 2026-05-13  6:57       ` K Prateek Nayak
  0 siblings, 0 replies; 15+ messages in thread
From: K Prateek Nayak @ 2026-05-13  6:57 UTC (permalink / raw)
  To: Shrikanth Hegde, mingo, peterz, vincent.guittot, linux-kernel
  Cc: juri.lelli, vschneid, dietmar.eggemann, tj, rostedt, mgorman,
	bsegall, arighi

Hello Shrikanth,

On 5/13/2026 12:09 PM, Shrikanth Hegde wrote:
> 
> Hi Prateek.
> 
>> ... I think the if() above can simply check for sched_smt_active()
>> before calling is_core_idle() like:
>>
>>      if (sched_smt_active() &&
>>          !(env->sd->flags & SD_SHARE_CPUCAPACITY) &&
>>          !is_core_idle(cpu)) {
>>          ...
>>      }
>>
>> That way, we ensure we don't call is_core_idle() and the cpumask_and()
>> unnecessarily on topologies that don't have SMT domain similar to how
>> sched_use_asym_prio() guards the call to is_core_idle().
>>
>> Thoughts?
>>
> In addition, Do you think it makes sense to consolidate use of
> sched_smt_present always using sched_smt_active() ?
> 
> 
> static __always_inline bool sched_smt_active(void)
> {
>         return static_branch_likely(&sched_smt_present);
> }
> 
> kernel/sched/core_sched.c:      if (!static_branch_likely(&sched_smt_present))
> kernel/sched/fair.c:    if (!static_branch_likely(&sched_smt_present) ||
> kernel/sched/sched.h:   if (static_branch_unlikely(&sched_smt_present))
> 
> 
> The last being differing with unlikely in update_idle_core.
> Does it make sense to call sched_smt_active there as well?

I think using sched_smt_active() everywhere should be fine.

I'm not sure what made update_idle_core() special; Perhaps there was
a greater chance of running it on systems with CONFIG_SCHED_SMT
enabled but doesn't physically have SMT.

This came from commit 1b568f0aabf2 ("sched/core: Optimize SCHED_SMT")
in 2016 when SMT was perhaps not so common and sched_smt_active()
came later in 2018 with the spectre mitigation optimizations on x86
where SMT was more prevalent so it defaulted to likely.

I'll let Peter comment if he prefers keeping this branch unlikely
but from my side, unifying eveything under sched_smt_active() looks
better.

-- 
Thanks and Regards,
Prateek


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 3/3] sched/fair: Add compile time check in fastpaths for CONFIG_SCHED_SMT=n
  2026-05-13  4:15     ` Shrikanth Hegde
@ 2026-05-13 11:53       ` Phil Auld
  0 siblings, 0 replies; 15+ messages in thread
From: Phil Auld @ 2026-05-13 11:53 UTC (permalink / raw)
  To: Shrikanth Hegde
  Cc: mingo, peterz, vincent.guittot, linux-kernel, kprateek.nayak,
	juri.lelli, vschneid, dietmar.eggemann, tj, rostedt, mgorman,
	bsegall, arighi

On Wed, May 13, 2026 at 09:45:53AM +0530 Shrikanth Hegde wrote:
> Hi Phil.
> 
> On 5/12/26 10:29 PM, Phil Auld wrote:
> > Hi Shrikanth,
> > 
> > On Tue, May 12, 2026 at 08:51:25PM +0530 Shrikanth Hegde wrote:
> > > For fastpaths such as wakeup, load balance even a minimal code additons
> > > can pop up. Add IS_ENABLED checks there to ensure there is no overhead.
> > 
> > "For fastpaths such as wakeup and load balance, even minimal code additions
> > can add up. Add IS_ENABLED() checks..."  ?
> > 
> 
> Ok.
> 
> > > 
> > > Other places are either have sched_smt_active() check or they are not in
> > 
> > s/are//
> 
> ok.
> 
> > 
> > "have a sched_smt_active_check()" or drop "check" ?
> > 
> > 
> 
> I was saying sched_smt_active() runtime gating is there for many fast paths where
> cpu_smt_mask is being referred or those code paths are not fast paths.
> 
> Let me re-word a bit.
>

I know what you were saying. I just wanted an article when I read it :)


Cheers,
Phil

> > Otherwise lgtm.
> > 
> > Reviewed-by: Phil Auld <pauld@redhat.com>
> > 
> > 
> > Cheers,
> > Phil
> > 
> Thanks for the review.
> 

-- 


^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2026-05-13 11:53 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-12 15:21 [PATCH v2 0/3] sched: Simplify ifdeffery around CONFIG_SCHED_SMT Shrikanth Hegde
2026-05-12 15:21 ` [PATCH v2 1/3] topology: Introduce cpu_smt_mask for CONFIG_SCHED_SMT=n Shrikanth Hegde
2026-05-12 16:56   ` Phil Auld
2026-05-12 15:21 ` [PATCH v2 2/3] sched: Simplify ifdeffery around cpu_smt_mask Shrikanth Hegde
2026-05-12 16:57   ` Phil Auld
2026-05-12 15:21 ` [PATCH v2 3/3] sched/fair: Add compile time check in fastpaths for CONFIG_SCHED_SMT=n Shrikanth Hegde
2026-05-12 16:59   ` Phil Auld
2026-05-13  4:15     ` Shrikanth Hegde
2026-05-13 11:53       ` Phil Auld
2026-05-13  6:07   ` K Prateek Nayak
2026-05-13  6:16     ` Shrikanth Hegde
2026-05-13  6:39     ` Shrikanth Hegde
2026-05-13  6:57       ` K Prateek Nayak
2026-05-12 17:48 ` [PATCH v2 0/3] sched: Simplify ifdeffery around CONFIG_SCHED_SMT Valentin Schneider
2026-05-13  6:20 ` K Prateek Nayak

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox