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

From: Valentin Schneider
Date: Fri Feb 02 2024 - 12:36:03 EST


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());