[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <87il359fx5.fsf@yhuang6-desk2.ccr.corp.intel.com>
Date: Sun, 04 Feb 2024 09:28:06 +0800
From: "Huang, Ying" <ying.huang@...el.com>
To: Valentin Schneider <vschneid@...hat.com>
Cc: Pierre Gondois <pierre.gondois@....com>, linux-kernel@...r.kernel.org,
Shrikanth Hegde <sshegde@...ux.vnet.ibm.com>, Ingo Molnar
<mingo@...hat.com>, Peter Zijlstra <peterz@...radead.org>, Juri Lelli
<juri.lelli@...hat.com>, Vincent Guittot <vincent.guittot@...aro.org>,
Dietmar Eggemann <dietmar.eggemann@....com>, Steven Rostedt
<rostedt@...dmis.org>, Ben Segall <bsegall@...gle.com>, Mel Gorman
<mgorman@...e.de>, Daniel Bristot de Oliveira <bristot@...hat.com>
Subject: Re: [PATCH v2 1/3] sched/topology: Annotate RCU pointers properly
Valentin Schneider <vschneid@...hat.com> writes:
> On 16/01/24 09:23, Huang, Ying wrote:
>> Pierre Gondois <pierre.gondois@....com> 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@....com>
>>> ---
>>> 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
Powered by blists - more mailing lists