Re: [PATCH] cgroup/cpuset: update parent subparts cpumask while holding css refcnt
From: Miaohe Lin
Date: Sun Jul 02 2023 - 22:58:25 EST
On 2023/7/2 7:46, Waiman Long wrote:
> On 7/1/23 19:38, Waiman Long wrote:
>> On 7/1/23 02:50, Miaohe Lin wrote:
>>> update_parent_subparts_cpumask() is called outside RCU read-side critical
>>> section without holding extra css refcnt of cp. In theroy, cp could be
>>> freed at any time. Holding extra css refcnt to ensure cp is valid while
>>> updating parent subparts cpumask.
>>>
>>> Fixes: d7c8142d5a55 ("cgroup/cpuset: Make partition invalid if cpumask change violates exclusivity rule")
>>> Signed-off-by: Miaohe Lin <linmiaohe@xxxxxxxxxx>
>>> ---
>>> kernel/cgroup/cpuset.c | 3 +++
>>> 1 file changed, 3 insertions(+)
>>>
>>> diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c
>>> index 58e6f18f01c1..632a9986d5de 100644
>>> --- a/kernel/cgroup/cpuset.c
>>> +++ b/kernel/cgroup/cpuset.c
>>> @@ -1806,9 +1806,12 @@ static int update_cpumask(struct cpuset *cs, struct cpuset *trialcs,
>>> cpuset_for_each_child(cp, css, parent)
>>> if (is_partition_valid(cp) &&
>>> cpumask_intersects(trialcs->cpus_allowed, cp->cpus_allowed)) {
>>> + if (!css_tryget_online(&cp->css))
>>> + continue;
>>> rcu_read_unlock();
>>> update_parent_subparts_cpumask(cp, partcmd_invalidate, NULL, &tmp);
>>> rcu_read_lock();
>>> + css_put(&cp->css);
>>> }
>>> rcu_read_unlock();
>>> retval = 0;
>>
>> Thanks for finding that. It looks good to me.
>>
>> Reviewed-by: Waiman Long <longman@xxxxxxxxxx>
>
> Though, I will say that an offline cpuset cannot be a valid partition root. So it is not really a problem. For correctness sake and consistency with other similar code, I am in favor of getting it merged.
Yes, cpuset_mutex will prevent cpuset from being offline while update cpumask. And as you mentioned, this patch makes code more consistency at least.
Thanks for your review and comment.