Re: [PATCH v3] sched/core: Skip user_cpus_ptr masking if no online CPU left

From: Chen Ridong
Date: Wed Aug 13 2025 - 21:15:01 EST




On 2025/7/31 20:03, Chen Ridong wrote:
>
>
> On 2025/7/23 9:58, Chen Ridong wrote:
>>
>>
>> On 2025/7/19 0:48, Waiman Long wrote:
>>> Chen Ridong reported that cpuset could report a kernel warning for a task
>>> due to set_cpus_allowed_ptr() returning failure in the corner case that:
>>>
>>> 1) the task used sched_setaffinity(2) to set its CPU affinity mask to
>>> be the same as the cpuset.cpus of its cpuset,
>>> 2) all the CPUs assigned to that cpuset were taken offline, and
>>> 3) cpuset v1 is in use and the task had to be migrated to the top cpuset.
>>>
>>> Due to the fact that CPU affinity of the tasks in the top cpuset are
>>> not updated when a CPU hotplug online/offline event happens, offline
>>> CPUs are included in CPU affinity of those tasks. It is possible
>>> that further masking with user_cpus_ptr set by sched_setaffinity(2)
>>> in __set_cpus_allowed_ptr() will leave only offline CPUs in the new
>>> mask causing the subsequent call to __set_cpus_allowed_ptr_locked()
>>> to return failure with an empty CPU affinity.
>>>
>>> Fix this failure by skipping user_cpus_ptr masking if there is no online
>>> CPU left.
>>>
>>> Reported-by: Chen Ridong <chenridong@xxxxxxxxxxxxxxx>
>>> Closes: https://lore.kernel.org/lkml/20250714032311.3570157-1-chenridong@xxxxxxxxxxxxxxx/
>>> Fixes: da019032819a ("sched: Enforce user requested affinity")
>>> Signed-off-by: Waiman Long <longman@xxxxxxxxxx>
>>> ---
>>> kernel/sched/core.c | 7 ++++---
>>> 1 file changed, 4 insertions(+), 3 deletions(-)
>>>
>>> diff --git a/kernel/sched/core.c b/kernel/sched/core.c
>>> index 81c6df746df1..208f8af73134 100644
>>> --- a/kernel/sched/core.c
>>> +++ b/kernel/sched/core.c
>>> @@ -3170,12 +3170,13 @@ int __set_cpus_allowed_ptr(struct task_struct *p, struct affinity_context *ctx)
>>>
>>> rq = task_rq_lock(p, &rf);
>>> /*
>>> - * Masking should be skipped if SCA_USER or any of the SCA_MIGRATE_*
>>> - * flags are set.
>>> + * Masking should be skipped if SCA_USER, any of the SCA_MIGRATE_*
>>> + * flags are set or no online CPU left.
>>> */
>>> if (p->user_cpus_ptr &&
>>> !(ctx->flags & (SCA_USER | SCA_MIGRATE_ENABLE | SCA_MIGRATE_DISABLE)) &&
>>> - cpumask_and(rq->scratch_mask, ctx->new_mask, p->user_cpus_ptr))
>>> + cpumask_and(rq->scratch_mask, ctx->new_mask, p->user_cpus_ptr) &&
>>> + cpumask_intersects(rq->scratch_mask, cpu_active_mask))
>>> ctx->new_mask = rq->scratch_mask;
>>>
>>> return __set_cpus_allowed_ptr_locked(p, ctx, rq, &rf);
>>
>> Tested-by: Chen Ridong <chenridong@xxxxxxxxxx>
>>
>
> Friendly ping.
>
> Best regards,
> Ridong
>

Could someone please review this patch?

--
Best regards,
Ridong