Re: [PATCH v2 1/3] sched/topology: Annotate RCU pointers properly

From: Huang, Ying
Date: Sat Feb 03 2024 - 20:30:16 EST


Valentin Schneider <vschneid@xxxxxxxxxx> writes:

> On 16/01/24 09:23, Huang, Ying wrote:
>> Pierre Gondois <pierre.gondois@xxxxxxx> writes:
>>
>>> Cleanup RCU-related spare errors by annotating RCU pointers.
>>>
>>> sched_domains_numa_distance:
>>> error: incompatible types in comparison expression
>>> (different address spaces):
>>> int [noderef] __rcu *
>>> int *
>>>
>>> sched_domains_numa_masks:
>>> error: incompatible types in comparison expression
>>> (different address spaces):
>>> struct cpumask **[noderef] __rcu *
>>> struct cpumask ***
>>>
>>> The cast to (void *) adds the following sparse warning:
>>> warning: cast removes address space '__rcu' of expression
>>> but this should be normal.
>>>
>>> Fixes: 0fb3978b0aac ("sched/numa: Fix NUMA topology for systems with CPU-less nodes")
>>> Signed-off-by: Pierre Gondois <pierre.gondois@xxxxxxx>
>>> ---
>>> kernel/sched/topology.c | 12 ++++++------
>>> 1 file changed, 6 insertions(+), 6 deletions(-)
>>>
>>> diff --git a/kernel/sched/topology.c b/kernel/sched/topology.c
>>> index 10d1391e7416..2a2da9b33e31 100644
>>> --- a/kernel/sched/topology.c
>>> +++ b/kernel/sched/topology.c
>>> @@ -1542,8 +1542,8 @@ static int sched_domains_numa_levels;
>>> static int sched_domains_curr_level;
>>>
>>> int sched_max_numa_distance;
>>> -static int *sched_domains_numa_distance;
>>> -static struct cpumask ***sched_domains_numa_masks;
>>> +static int __rcu *sched_domains_numa_distance;
>>> +static struct cpumask ** __rcu *sched_domains_numa_masks;
>>> #endif
>>>
>>> /*
>>> @@ -1988,8 +1988,8 @@ void sched_init_numa(int offline_node)
>>>
>>> static void sched_reset_numa(void)
>>> {
>>> - int nr_levels, *distances;
>>> - struct cpumask ***masks;
>>> + int nr_levels, __rcu *distances;
>>> + struct cpumask ** __rcu *masks;
>>
>> No. distances and masks are not accessed via RCU in the function.
>> Instead, they should be assigned like below,
>>
>> distances = rcu_dereference_raw(sched_domains_numa_distance);
>>
>> Because sched_domains_numa_distance is protected by cpu_hotplug_lock,
>> but the lock is static. Some comments are deserved.
>>
>> Anyway, please read RCU document before making the change.
>>
>
> IIUC, something like so could also do?
>
> distances = rcu_dereference_check(sched_domains_numa_distance, lockdep_is_cpus_held());

Yes. You are right. We should do that.

--
Best Regards,
Huang, Ying