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

Waiman Long
2026-04-24T18:33:06Z

On 4/22/26 9:10 PM, Chen Ridong wrote:
>
> On 2026/4/21 11:03, Waiman Long wrote:
>> 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.
>>
> Currently, isolated_hk_cpus is updated within the cpuset_mutex critical section
> (before mutex_unlock(&cpuset_mutex)) in cpuset_update_sd_hk_unlock. Therefore, I
> think update_housekeeping can now be removed.

That is true. I will remove in the next version.

Thanks,
Longman

>
>> 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;
>> }
>>