Re: [PATCH 2/5] sched/topology: Wrappers for sched_domains_mutex

From: Waiman Long
Date: Fri Mar 07 2025 - 09:49:40 EST


On 3/7/25 4:32 AM, Juri Lelli wrote:
On 05/03/25 10:52, Juri Lelli wrote:
On 04/03/25 11:01, Waiman Long wrote:
On 3/4/25 10:05 AM, Waiman Long wrote:
--- a/kernel/sched/topology.c
+++ b/kernel/sched/topology.c
@@ -6,6 +6,19 @@
  #include <linux/bsearch.h>
    DEFINE_MUTEX(sched_domains_mutex);
+#ifdef CONFIG_SMP
+void sched_domains_mutex_lock(void)
+{
+    mutex_lock(&sched_domains_mutex);
+}
+void sched_domains_mutex_unlock(void)
+{
+    mutex_unlock(&sched_domains_mutex);
+}
+#else
+void sched_domains_mutex_lock(void) { }
+void sched_domains_mutex_unlock(void) { }
+#endif
    /* Protected by sched_domains_mutex: */
  static cpumask_var_t sched_domains_tmpmask;
@@ -2791,7 +2804,7 @@ void partition_sched_domains_locked(int
ndoms_new, cpumask_var_t doms_new[],
  void partition_sched_domains(int ndoms_new, cpumask_var_t doms_new[],
                   struct sched_domain_attr *dattr_new)
  {
-    mutex_lock(&sched_domains_mutex);
+    sched_domains_mutex_lock();
      partition_sched_domains_locked(ndoms_new, doms_new, dattr_new);
-    mutex_unlock(&sched_domains_mutex);
+    sched_domains_mutex_unlock();
  }
There are two "lockdep_assert_held(&sched_domains_mutex);" statements in
topology.c file and one in cpuset.c. That can be problematic in the
non-SMP case. Maybe another wrapper to do the assert?
Ignore that as both topology.c and cpuset.c will only be compiled if
CONFIG_SMP is defined. IOW, you don't need the the "#ifdef CONFIG_SMP"
above.
Indeed!
Ah, actually I believe next patch (3/5) introduce usage for the !SMP
case in sched_rt_handler()

diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c
index 4b8e33c615b1..8cebe71d2bb1 100644
--- a/kernel/sched/rt.c
+++ b/kernel/sched/rt.c
@@ -2910,6 +2910,7 @@ static int sched_rt_handler(const struct ctl_table *table, int write, void *buff
int ret;

mutex_lock(&mutex);
+ sched_domains_mutex_lock();
old_period = sysctl_sched_rt_period;
old_runtime = sysctl_sched_rt_runtime;

@@ -2936,6 +2937,7 @@ static int sched_rt_handler(const struct ctl_table *table, int write, void *buff
sysctl_sched_rt_period = old_period;
sysctl_sched_rt_runtime = old_runtime;
}
+ sched_domains_mutex_unlock();
mutex_unlock(&mutex);

return ret;

So, I will need to add the ifdef back I guess (I removed it on v2). Do
you agree?

You are right. That change does introduce the need to define the !CONFIG_SMP case. I was looking the existing uses o domains_mutex when making that suggestions.

It is a good catch.

Cheers,
Longman