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 <[email protected]> --- 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

