[PATCH 19/23] cgroup/cpuset: Improve check for calling housekeeping_update()

Waiman Long
2026-04-21T03:07:22Z

By making sure that isolated_hk_cpus matches isolated_cpus at boot time,
we can more accurately determine if calling housekeeping_update()
is needed by comparing if the two cpumasks are equal. The
update_housekeeping flag still have a use in cpuset_handle_hotplug()
to determine if a work function should be queued to invoke
cpuset_update_sd_hk_unlock() as it is not supposed to look at
isolated_hk_cpus without holding cpuset_top_mutex.

Signed-off-by: Waiman Long <longman@redhat.com>
---
kernel/cgroup/cpuset.c | 36 ++++++++++++++++++++----------------
1 file changed, 20 insertions(+), 16 deletions(-)

diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c
index a4eccb0ec0d1..1b0c50b46a49 100644
--- a/kernel/cgroup/cpuset.c
+++ b/kernel/cgroup/cpuset.c
@@ -1339,26 +1339,29 @@ static void cpuset_update_sd_hk_unlock(void)
__releases(&cpuset_mutex)
__releases(&cpuset_top_mutex)
{
+ update_housekeeping = false;
+
/* force_sd_rebuild will be cleared in rebuild_sched_domains_locked() */
if (force_sd_rebuild)
rebuild_sched_domains_locked();

- if (update_housekeeping) {
- update_housekeeping = false;
- cpumask_copy(isolated_hk_cpus, isolated_cpus);
-
- /*
- * housekeeping_update() is now called without holding
- * cpus_read_lock and cpuset_mutex. Only cpuset_top_mutex
- * is still being held for mutual exclusion.
- */
- mutex_unlock(&cpuset_mutex);
- cpus_read_unlock();
- WARN_ON_ONCE(housekeeping_update(isolated_hk_cpus, BIT(HK_TYPE_DOMAIN)));
- mutex_unlock(&cpuset_top_mutex);
- } else {
+ if (cpumask_equal(isolated_hk_cpus, isolated_cpus)) {
+ /* No housekeeping cpumask update needed */
cpuset_full_unlock();
+ return;
}
+
+ cpumask_copy(isolated_hk_cpus, isolated_cpus);
+
+ /*
+ * housekeeping_update() is now called without holding
+ * cpus_read_lock and cpuset_mutex. Only cpuset_top_mutex
+ * is still being held for mutual exclusion.
+ */
+ mutex_unlock(&cpuset_mutex);
+ cpus_read_unlock();
+ WARN_ON_ONCE(housekeeping_update(isolated_hk_cpus, BIT(HK_TYPE_DOMAIN)));
+ mutex_unlock(&cpuset_top_mutex);
}

/*
@@ -3692,10 +3695,11 @@ int __init cpuset_init(void)

BUG_ON(!alloc_cpumask_var(&cpus_attach, GFP_KERNEL));

- if (housekeeping_enabled(HK_TYPE_DOMAIN_BOOT))
+ if (housekeeping_enabled(HK_TYPE_DOMAIN_BOOT)) {
cpumask_andnot(isolated_cpus, cpu_possible_mask,
housekeeping_cpumask(HK_TYPE_DOMAIN_BOOT));
-
+ cpumask_copy(isolated_hk_cpus, isolated_cpus);
+ }
return 0;
}

--
2.53.0