* [PATCH v2 0/3] Small cleanup around sparse report
@ 2024-01-15 14:34 Pierre Gondois
2024-01-15 14:34 ` [PATCH v2 1/3] sched/topology: Annotate RCU pointers properly Pierre Gondois
` (2 more replies)
0 siblings, 3 replies; 8+ messages in thread
From: Pierre Gondois @ 2024-01-15 14:34 UTC (permalink / raw)
To: linux-kernel
Cc: Shrikanth Hegde, Pierre Gondois, Ingo Molnar, Peter Zijlstra,
Juri Lelli, Vincent Guittot, Dietmar Eggemann, Steven Rostedt,
Ben Segall, Mel Gorman, Daniel Bristot de Oliveira,
Valentin Schneider, Huang Ying
v2:
- Added __rcu annotations to variabbles in sched_reset_numa(),
and casts for calls to kfree().
- Renamed idle_cpu_without() to idle_rq_without()
- Added sched/fair: Use rq in update_blocked_averages()
While checking spare's tool report, some RCU pointers appeared
to be not annotated. In the same effort, idle_cpu_without() and
update_blocked_averages() seemed to be subject to a small
optimizations.
Pierre Gondois (3):
sched/topology: Annotate RCU pointers properly
sched/fair: Use rq in idle_cpu_without()
sched/fair: Use rq in update_blocked_averages()
kernel/sched/fair.c | 25 +++++++++++--------------
kernel/sched/topology.c | 12 ++++++------
2 files changed, 17 insertions(+), 20 deletions(-)
--
2.25.1
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v2 1/3] sched/topology: Annotate RCU pointers properly
2024-01-15 14:34 [PATCH v2 0/3] Small cleanup around sparse report Pierre Gondois
@ 2024-01-15 14:34 ` Pierre Gondois
2024-01-16 1:23 ` Huang, Ying
2024-01-16 3:56 ` kernel test robot
2024-01-15 14:34 ` [PATCH v2 2/3] sched/fair: Use rq in idle_cpu_without() Pierre Gondois
2024-01-15 14:34 ` [PATCH v2 3/3] sched/fair: Use rq in update_blocked_averages() Pierre Gondois
2 siblings, 2 replies; 8+ messages in thread
From: Pierre Gondois @ 2024-01-15 14:34 UTC (permalink / raw)
To: linux-kernel
Cc: Shrikanth Hegde, Pierre Gondois, Ingo Molnar, Peter Zijlstra,
Juri Lelli, Vincent Guittot, Dietmar Eggemann, Steven Rostedt,
Ben Segall, Mel Gorman, Daniel Bristot de Oliveira,
Valentin Schneider, Huang Ying
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@arm.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;
nr_levels = sched_domains_numa_levels;
sched_domains_numa_levels = 0;
@@ -2003,7 +2003,7 @@ static void sched_reset_numa(void)
int i, j;
synchronize_rcu();
- kfree(distances);
+ kfree((void *)distances);
for (i = 0; i < nr_levels && masks; i++) {
if (!masks[i])
continue;
@@ -2011,7 +2011,7 @@ static void sched_reset_numa(void)
kfree(masks[i][j]);
kfree(masks[i]);
}
- kfree(masks);
+ kfree((void *)masks);
}
if (sched_domain_topology_saved) {
kfree(sched_domain_topology);
--
2.25.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v2 2/3] sched/fair: Use rq in idle_cpu_without()
2024-01-15 14:34 [PATCH v2 0/3] Small cleanup around sparse report Pierre Gondois
2024-01-15 14:34 ` [PATCH v2 1/3] sched/topology: Annotate RCU pointers properly Pierre Gondois
@ 2024-01-15 14:34 ` Pierre Gondois
2024-01-15 14:34 ` [PATCH v2 3/3] sched/fair: Use rq in update_blocked_averages() Pierre Gondois
2 siblings, 0 replies; 8+ messages in thread
From: Pierre Gondois @ 2024-01-15 14:34 UTC (permalink / raw)
To: linux-kernel
Cc: Shrikanth Hegde, Pierre Gondois, Ingo Molnar, Peter Zijlstra,
Juri Lelli, Vincent Guittot, Dietmar Eggemann, Steven Rostedt,
Ben Segall, Mel Gorman, Daniel Bristot de Oliveira,
Valentin Schneider, Huang Ying
idle_cpu_without() could receive a 'struct rq' instead of a
CPU number to avoid converting the CPU number to a 'struct rq'
two times. Indeed update_sg_wakeup_stats() already makes the
conversion.
idle_cpu_without() is also renamed to idle_rq_without()
to match the input parameter.
Reviewed-by: Shrikanth Hegde <sshegde@linux.vnet.ibm.com>
Signed-off-by: Pierre Gondois <pierre.gondois@arm.com>
---
kernel/sched/fair.c | 16 +++++++---------
1 file changed, 7 insertions(+), 9 deletions(-)
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index d7a3c63a2171..97d9e0d32337 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -10105,23 +10105,21 @@ static unsigned int task_running_on_cpu(int cpu, struct task_struct *p)
}
/**
- * idle_cpu_without - would a given CPU be idle without p ?
- * @cpu: the processor on which idleness is tested.
+ * idle_rq_without - would a given rq be idle without p ?
+ * @rq: the rq on which idleness is tested.
* @p: task which should be ignored.
*
- * Return: 1 if the CPU would be idle. 0 otherwise.
+ * Return: 1 if the rq would be idle. 0 otherwise.
*/
-static int idle_cpu_without(int cpu, struct task_struct *p)
+static int idle_rq_without(struct rq *rq, struct task_struct *p)
{
- struct rq *rq = cpu_rq(cpu);
-
if (rq->curr != rq->idle && rq->curr != p)
return 0;
/*
* rq->nr_running can't be used but an updated version without the
* impact of p on cpu must be used instead. The updated nr_running
- * be computed and tested before calling idle_cpu_without().
+ * be computed and tested before calling idle_rq_without().
*/
#ifdef CONFIG_SMP
@@ -10166,9 +10164,9 @@ static inline void update_sg_wakeup_stats(struct sched_domain *sd,
sgs->sum_nr_running += nr_running;
/*
- * No need to call idle_cpu_without() if nr_running is not 0
+ * No need to call idle_rq_without() if nr_running is not 0
*/
- if (!nr_running && idle_cpu_without(i, p))
+ if (!nr_running && idle_rq_without(rq, p))
sgs->idle_cpus++;
/* Check if task fits in the CPU */
--
2.25.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v2 3/3] sched/fair: Use rq in update_blocked_averages()
2024-01-15 14:34 [PATCH v2 0/3] Small cleanup around sparse report Pierre Gondois
2024-01-15 14:34 ` [PATCH v2 1/3] sched/topology: Annotate RCU pointers properly Pierre Gondois
2024-01-15 14:34 ` [PATCH v2 2/3] sched/fair: Use rq in idle_cpu_without() Pierre Gondois
@ 2024-01-15 14:34 ` Pierre Gondois
2 siblings, 0 replies; 8+ messages in thread
From: Pierre Gondois @ 2024-01-15 14:34 UTC (permalink / raw)
To: linux-kernel
Cc: Shrikanth Hegde, Pierre Gondois, Ingo Molnar, Peter Zijlstra,
Juri Lelli, Vincent Guittot, Dietmar Eggemann, Steven Rostedt,
Ben Segall, Mel Gorman, Daniel Bristot de Oliveira,
Valentin Schneider, Huang Ying
update_blocked_averages() could receive a 'struct rq' instead of a
CPU number to avoid converting the CPU number to a 'struct rq'
multiple times.
Suggested-by: Shrikanth Hegde <sshegde@linux.vnet.ibm.com>
Signed-off-by: Pierre Gondois <pierre.gondois@arm.com>
---
kernel/sched/fair.c | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index 97d9e0d32337..c70bb993f473 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -9349,10 +9349,9 @@ static unsigned long task_h_load(struct task_struct *p)
}
#endif
-static void update_blocked_averages(int cpu)
+static void update_blocked_averages(struct rq *rq)
{
bool decayed = false, done = true;
- struct rq *rq = cpu_rq(cpu);
struct rq_flags rf;
rq_lock_irqsave(rq, &rf);
@@ -12026,7 +12025,7 @@ static bool update_nohz_stats(struct rq *rq)
if (!time_after(jiffies, READ_ONCE(rq->last_blocked_load_update_tick)))
return true;
- update_blocked_averages(cpu);
+ update_blocked_averages(rq);
return rq->has_blocked_load;
}
@@ -12286,7 +12285,7 @@ static int newidle_balance(struct rq *this_rq, struct rq_flags *rf)
raw_spin_rq_unlock(this_rq);
t0 = sched_clock_cpu(this_cpu);
- update_blocked_averages(this_cpu);
+ update_blocked_averages(this_rq);
rcu_read_lock();
for_each_domain(this_cpu, sd) {
@@ -12376,7 +12375,7 @@ static __latent_entropy void run_rebalance_domains(struct softirq_action *h)
return;
/* normal load balance */
- update_blocked_averages(this_rq->cpu);
+ update_blocked_averages(this_rq);
rebalance_domains(this_rq, idle);
}
--
2.25.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH v2 1/3] sched/topology: Annotate RCU pointers properly
2024-01-15 14:34 ` [PATCH v2 1/3] sched/topology: Annotate RCU pointers properly Pierre Gondois
@ 2024-01-16 1:23 ` Huang, Ying
2024-02-02 17:35 ` Valentin Schneider
2024-01-16 3:56 ` kernel test robot
1 sibling, 1 reply; 8+ messages in thread
From: Huang, Ying @ 2024-01-16 1:23 UTC (permalink / raw)
To: Pierre Gondois
Cc: linux-kernel, Shrikanth Hegde, Ingo Molnar, Peter Zijlstra,
Juri Lelli, Vincent Guittot, Dietmar Eggemann, Steven Rostedt,
Ben Segall, Mel Gorman, Daniel Bristot de Oliveira,
Valentin Schneider
Pierre Gondois <pierre.gondois@arm.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@arm.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.
https://docs.kernel.org/RCU/index.html
> nr_levels = sched_domains_numa_levels;
> sched_domains_numa_levels = 0;
> @@ -2003,7 +2003,7 @@ static void sched_reset_numa(void)
> int i, j;
>
> synchronize_rcu();
> - kfree(distances);
> + kfree((void *)distances);
> for (i = 0; i < nr_levels && masks; i++) {
> if (!masks[i])
> continue;
> @@ -2011,7 +2011,7 @@ static void sched_reset_numa(void)
> kfree(masks[i][j]);
> kfree(masks[i]);
> }
> - kfree(masks);
> + kfree((void *)masks);
> }
> if (sched_domain_topology_saved) {
> kfree(sched_domain_topology);
--
Best Regards,
Huang, Ying
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 1/3] sched/topology: Annotate RCU pointers properly
2024-01-15 14:34 ` [PATCH v2 1/3] sched/topology: Annotate RCU pointers properly Pierre Gondois
2024-01-16 1:23 ` Huang, Ying
@ 2024-01-16 3:56 ` kernel test robot
1 sibling, 0 replies; 8+ messages in thread
From: kernel test robot @ 2024-01-16 3:56 UTC (permalink / raw)
To: Pierre Gondois, linux-kernel
Cc: oe-kbuild-all, Shrikanth Hegde, Pierre Gondois, Ingo Molnar,
Peter Zijlstra, Juri Lelli, Vincent Guittot, Dietmar Eggemann,
Steven Rostedt, Ben Segall, Mel Gorman,
Daniel Bristot de Oliveira, Valentin Schneider, Huang Ying
Hi Pierre,
kernel test robot noticed the following build warnings:
[auto build test WARNING on tip/sched/core]
[also build test WARNING on linus/master v6.7 next-20240112]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Pierre-Gondois/sched-topology-Annotate-RCU-pointers-properly/20240115-223658
base: tip/sched/core
patch link: https://lore.kernel.org/r/20240115143427.1820628-2-pierre.gondois%40arm.com
patch subject: [PATCH v2 1/3] sched/topology: Annotate RCU pointers properly
config: arm64-randconfig-r133-20240116 (https://download.01.org/0day-ci/archive/20240116/202401161144.OJH5PySm-lkp@intel.com/config)
compiler: aarch64-linux-gcc (GCC) 13.2.0
reproduce: (https://download.01.org/0day-ci/archive/20240116/202401161144.OJH5PySm-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202401161144.OJH5PySm-lkp@intel.com/
sparse warnings: (new ones prefixed by >>)
kernel/sched/build_utility.c: note: in included file:
kernel/sched/debug.c:468:17: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct sched_domain *[assigned] sd @@ got struct sched_domain [noderef] __rcu *parent @@
kernel/sched/debug.c:468:17: sparse: expected struct sched_domain *[assigned] sd
kernel/sched/debug.c:468:17: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/debug.c:793:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct task_struct *tsk @@ got struct task_struct [noderef] __rcu *curr @@
kernel/sched/debug.c:793:9: sparse: expected struct task_struct *tsk
kernel/sched/debug.c:793:9: sparse: got struct task_struct [noderef] __rcu *curr
kernel/sched/debug.c:793:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct task_struct *tsk @@ got struct task_struct [noderef] __rcu *curr @@
kernel/sched/debug.c:793:9: sparse: expected struct task_struct *tsk
kernel/sched/debug.c:793:9: sparse: got struct task_struct [noderef] __rcu *curr
kernel/sched/build_utility.c: note: in included file:
kernel/sched/stats.c:148:17: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct sched_domain *[assigned] sd @@ got struct sched_domain [noderef] __rcu *parent @@
kernel/sched/stats.c:148:17: sparse: expected struct sched_domain *[assigned] sd
kernel/sched/stats.c:148:17: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/build_utility.c: note: in included file:
kernel/sched/topology.c:107:56: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct sched_domain *sd @@ got struct sched_domain [noderef] __rcu *child @@
kernel/sched/topology.c:107:56: sparse: expected struct sched_domain *sd
kernel/sched/topology.c:107:56: sparse: got struct sched_domain [noderef] __rcu *child
kernel/sched/topology.c:126:60: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct sched_domain *sd @@ got struct sched_domain [noderef] __rcu *parent @@
kernel/sched/topology.c:126:60: sparse: expected struct sched_domain *sd
kernel/sched/topology.c:126:60: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/topology.c:149:20: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct sched_domain *sd @@ got struct sched_domain [noderef] __rcu *parent @@
kernel/sched/topology.c:149:20: sparse: expected struct sched_domain *sd
kernel/sched/topology.c:149:20: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/topology.c:485:19: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct perf_domain *pd @@ got struct perf_domain [noderef] __rcu *pd @@
kernel/sched/topology.c:485:19: sparse: expected struct perf_domain *pd
kernel/sched/topology.c:485:19: sparse: got struct perf_domain [noderef] __rcu *pd
kernel/sched/topology.c:647:49: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct sched_domain *parent @@ got struct sched_domain [noderef] __rcu *parent @@
kernel/sched/topology.c:647:49: sparse: expected struct sched_domain *parent
kernel/sched/topology.c:647:49: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/topology.c:732:50: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct sched_domain *parent @@ got struct sched_domain [noderef] __rcu *parent @@
kernel/sched/topology.c:732:50: sparse: expected struct sched_domain *parent
kernel/sched/topology.c:732:50: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/topology.c:740:55: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct sched_domain [noderef] __rcu *[noderef] __rcu child @@ got struct sched_domain *[assigned] tmp @@
kernel/sched/topology.c:740:55: sparse: expected struct sched_domain [noderef] __rcu *[noderef] __rcu child
kernel/sched/topology.c:740:55: sparse: got struct sched_domain *[assigned] tmp
kernel/sched/topology.c:753:29: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct sched_domain *[assigned] tmp @@ got struct sched_domain [noderef] __rcu *parent @@
kernel/sched/topology.c:753:29: sparse: expected struct sched_domain *[assigned] tmp
kernel/sched/topology.c:753:29: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/topology.c:758:20: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct sched_domain *sd @@ got struct sched_domain [noderef] __rcu *parent @@
kernel/sched/topology.c:758:20: sparse: expected struct sched_domain *sd
kernel/sched/topology.c:758:20: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/topology.c:779:13: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct sched_domain *[assigned] tmp @@ got struct sched_domain [noderef] __rcu *sd @@
kernel/sched/topology.c:779:13: sparse: expected struct sched_domain *[assigned] tmp
kernel/sched/topology.c:779:13: sparse: got struct sched_domain [noderef] __rcu *sd
kernel/sched/topology.c:941:70: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct sched_domain *sd @@ got struct sched_domain [noderef] __rcu *child @@
kernel/sched/topology.c:941:70: sparse: expected struct sched_domain *sd
kernel/sched/topology.c:941:70: sparse: got struct sched_domain [noderef] __rcu *child
kernel/sched/topology.c:970:59: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct sched_domain *sd @@ got struct sched_domain [noderef] __rcu *child @@
kernel/sched/topology.c:970:59: sparse: expected struct sched_domain *sd
kernel/sched/topology.c:970:59: sparse: got struct sched_domain [noderef] __rcu *child
kernel/sched/topology.c:1016:57: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct sched_domain *sd @@ got struct sched_domain [noderef] __rcu *child @@
kernel/sched/topology.c:1016:57: sparse: expected struct sched_domain *sd
kernel/sched/topology.c:1016:57: sparse: got struct sched_domain [noderef] __rcu *child
kernel/sched/topology.c:1018:25: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct sched_domain *sibling @@ got struct sched_domain [noderef] __rcu *child @@
kernel/sched/topology.c:1018:25: sparse: expected struct sched_domain *sibling
kernel/sched/topology.c:1018:25: sparse: got struct sched_domain [noderef] __rcu *child
kernel/sched/topology.c:1026:55: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct sched_domain *sd @@ got struct sched_domain [noderef] __rcu *child @@
kernel/sched/topology.c:1026:55: sparse: expected struct sched_domain *sd
kernel/sched/topology.c:1026:55: sparse: got struct sched_domain [noderef] __rcu *child
kernel/sched/topology.c:1028:25: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct sched_domain *sibling @@ got struct sched_domain [noderef] __rcu *child @@
kernel/sched/topology.c:1028:25: sparse: expected struct sched_domain *sibling
kernel/sched/topology.c:1028:25: sparse: got struct sched_domain [noderef] __rcu *child
kernel/sched/topology.c:1098:62: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct sched_domain *sd @@ got struct sched_domain [noderef] __rcu *child @@
kernel/sched/topology.c:1098:62: sparse: expected struct sched_domain *sd
kernel/sched/topology.c:1098:62: sparse: got struct sched_domain [noderef] __rcu *child
kernel/sched/topology.c:1202:40: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct sched_domain *child @@ got struct sched_domain [noderef] __rcu *child @@
kernel/sched/topology.c:1202:40: sparse: expected struct sched_domain *child
kernel/sched/topology.c:1202:40: sparse: got struct sched_domain [noderef] __rcu *child
kernel/sched/topology.c:1622:43: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct sched_domain [noderef] __rcu *child @@ got struct sched_domain *child @@
kernel/sched/topology.c:1622:43: sparse: expected struct sched_domain [noderef] __rcu *child
kernel/sched/topology.c:1622:43: sparse: got struct sched_domain *child
>> kernel/sched/topology.c:2006:24: sparse: sparse: cast removes address space '__rcu' of expression
kernel/sched/topology.c:2014:24: sparse: sparse: cast removes address space '__rcu' of expression
kernel/sched/topology.c:2321:31: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct sched_domain [noderef] __rcu *parent @@ got struct sched_domain *sd @@
kernel/sched/topology.c:2321:31: sparse: expected struct sched_domain [noderef] __rcu *parent
kernel/sched/topology.c:2321:31: sparse: got struct sched_domain *sd
kernel/sched/topology.c:2425:57: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct sched_domain *[assigned] sd @@ got struct sched_domain [noderef] __rcu *parent @@
kernel/sched/topology.c:2425:57: sparse: expected struct sched_domain *[assigned] sd
kernel/sched/topology.c:2425:57: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/topology.c:2446:56: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct sched_domain *child @@ got struct sched_domain [noderef] __rcu *child @@
kernel/sched/topology.c:2446:56: sparse: expected struct sched_domain *child
kernel/sched/topology.c:2446:56: sparse: got struct sched_domain [noderef] __rcu *child
kernel/sched/topology.c:2445:57: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct sched_domain *[assigned] sd @@ got struct sched_domain [noderef] __rcu *parent @@
kernel/sched/topology.c:2445:57: sparse: expected struct sched_domain *[assigned] sd
kernel/sched/topology.c:2445:57: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/topology.c:2500:57: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct sched_domain *[assigned] sd @@ got struct sched_domain [noderef] __rcu *parent @@
kernel/sched/topology.c:2500:57: sparse: expected struct sched_domain *[assigned] sd
kernel/sched/topology.c:2500:57: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/build_utility.c: note: in included file:
kernel/sched/core_sched.c:276:37: sparse: sparse: incompatible types in conditional expression (different address spaces):
kernel/sched/core_sched.c:276:37: sparse: struct task_struct *
kernel/sched/core_sched.c:276:37: sparse: struct task_struct [noderef] __rcu *
kernel/sched/build_utility.c: note: in included file:
kernel/sched/sched.h:2142:25: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/sched.h:2142:25: sparse: struct task_struct [noderef] __rcu *
kernel/sched/sched.h:2142:25: sparse: struct task_struct *
vim +/__rcu +2006 kernel/sched/topology.c
1987
1988
1989 static void sched_reset_numa(void)
1990 {
1991 int nr_levels, __rcu *distances;
1992 struct cpumask ** __rcu *masks;
1993
1994 nr_levels = sched_domains_numa_levels;
1995 sched_domains_numa_levels = 0;
1996 sched_max_numa_distance = 0;
1997 sched_numa_topology_type = NUMA_DIRECT;
1998 distances = sched_domains_numa_distance;
1999 rcu_assign_pointer(sched_domains_numa_distance, NULL);
2000 masks = sched_domains_numa_masks;
2001 rcu_assign_pointer(sched_domains_numa_masks, NULL);
2002 if (distances || masks) {
2003 int i, j;
2004
2005 synchronize_rcu();
> 2006 kfree((void *)distances);
2007 for (i = 0; i < nr_levels && masks; i++) {
2008 if (!masks[i])
2009 continue;
2010 for_each_node(j)
2011 kfree(masks[i][j]);
2012 kfree(masks[i]);
2013 }
2014 kfree((void *)masks);
2015 }
2016 if (sched_domain_topology_saved) {
2017 kfree(sched_domain_topology);
2018 sched_domain_topology = sched_domain_topology_saved;
2019 sched_domain_topology_saved = NULL;
2020 }
2021 }
2022
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 1/3] sched/topology: Annotate RCU pointers properly
2024-01-16 1:23 ` Huang, Ying
@ 2024-02-02 17:35 ` Valentin Schneider
2024-02-04 1:28 ` Huang, Ying
0 siblings, 1 reply; 8+ messages in thread
From: Valentin Schneider @ 2024-02-02 17:35 UTC (permalink / raw)
To: Huang, Ying, Pierre Gondois
Cc: linux-kernel, Shrikanth Hegde, Ingo Molnar, Peter Zijlstra,
Juri Lelli, Vincent Guittot, Dietmar Eggemann, Steven Rostedt,
Ben Segall, Mel Gorman, Daniel Bristot de Oliveira
On 16/01/24 09:23, Huang, Ying wrote:
> Pierre Gondois <pierre.gondois@arm.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@arm.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());
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 1/3] sched/topology: Annotate RCU pointers properly
2024-02-02 17:35 ` Valentin Schneider
@ 2024-02-04 1:28 ` Huang, Ying
0 siblings, 0 replies; 8+ messages in thread
From: Huang, Ying @ 2024-02-04 1:28 UTC (permalink / raw)
To: Valentin Schneider
Cc: Pierre Gondois, linux-kernel, Shrikanth Hegde, Ingo Molnar,
Peter Zijlstra, Juri Lelli, Vincent Guittot, Dietmar Eggemann,
Steven Rostedt, Ben Segall, Mel Gorman,
Daniel Bristot de Oliveira
Valentin Schneider <vschneid@redhat.com> writes:
> On 16/01/24 09:23, Huang, Ying wrote:
>> Pierre Gondois <pierre.gondois@arm.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@arm.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
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2024-02-04 1:30 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-01-15 14:34 [PATCH v2 0/3] Small cleanup around sparse report Pierre Gondois
2024-01-15 14:34 ` [PATCH v2 1/3] sched/topology: Annotate RCU pointers properly Pierre Gondois
2024-01-16 1:23 ` Huang, Ying
2024-02-02 17:35 ` Valentin Schneider
2024-02-04 1:28 ` Huang, Ying
2024-01-16 3:56 ` kernel test robot
2024-01-15 14:34 ` [PATCH v2 2/3] sched/fair: Use rq in idle_cpu_without() Pierre Gondois
2024-01-15 14:34 ` [PATCH v2 3/3] sched/fair: Use rq in update_blocked_averages() Pierre Gondois
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.