* [PATCH 0/2] Small cleanup around sparse report
@ 2024-01-03 12:56 Pierre Gondois
2024-01-03 12:56 ` [PATCH 1/2] sched/topology: Annotate RCU pointers properly Pierre Gondois
2024-01-03 12:56 ` [PATCH 2/2] sched/fair: Use rq in idle_cpu_without() Pierre Gondois
0 siblings, 2 replies; 8+ messages in thread
From: Pierre Gondois @ 2024-01-03 12:56 UTC (permalink / raw)
To: linux-kernel
Cc: Pierre Gondois, Ingo Molnar, Peter Zijlstra, Juri Lelli,
Vincent Guittot, Dietmar Eggemann, Steven Rostedt, Ben Segall,
Mel Gorman, Daniel Bristot de Oliveira, Valentin Schneider
While checking spare's tool report, some RCU pointers appeared
to be not annotated. In the same effort, idle_cpu_without() seemed
to be subject to a small optimization.
Pierre Gondois (2):
sched/topology: Annotate RCU pointers properly
sched/fair: Use rq in idle_cpu_without()
kernel/sched/fair.c | 8 +++-----
kernel/sched/topology.c | 4 ++--
2 files changed, 5 insertions(+), 7 deletions(-)
--
2.25.1
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 1/2] sched/topology: Annotate RCU pointers properly
2024-01-03 12:56 [PATCH 0/2] Small cleanup around sparse report Pierre Gondois
@ 2024-01-03 12:56 ` Pierre Gondois
2024-01-04 9:54 ` Valentin Schneider
2024-01-04 14:54 ` kernel test robot
2024-01-03 12:56 ` [PATCH 2/2] sched/fair: Use rq in idle_cpu_without() Pierre Gondois
1 sibling, 2 replies; 8+ messages in thread
From: Pierre Gondois @ 2024-01-03 12:56 UTC (permalink / raw)
To: linux-kernel
Cc: Pierre Gondois, Ingo Molnar, Peter Zijlstra, Juri Lelli,
Vincent Guittot, Dietmar Eggemann, Steven Rostedt, Ben Segall,
Mel Gorman, Daniel Bristot de Oliveira, Valentin Schneider
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 ***
Signed-off-by: Pierre Gondois <pierre.gondois@arm.com>
---
kernel/sched/topology.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/kernel/sched/topology.c b/kernel/sched/topology.c
index 10d1391e7416..0342a4f41f09 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
/*
--
2.25.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 2/2] sched/fair: Use rq in idle_cpu_without()
2024-01-03 12:56 [PATCH 0/2] Small cleanup around sparse report Pierre Gondois
2024-01-03 12:56 ` [PATCH 1/2] sched/topology: Annotate RCU pointers properly Pierre Gondois
@ 2024-01-03 12:56 ` Pierre Gondois
2024-01-04 5:15 ` Shrikanth Hegde
1 sibling, 1 reply; 8+ messages in thread
From: Pierre Gondois @ 2024-01-03 12:56 UTC (permalink / raw)
To: linux-kernel
Cc: Pierre Gondois, Ingo Molnar, Peter Zijlstra, Juri Lelli,
Vincent Guittot, Dietmar Eggemann, Steven Rostedt, Ben Segall,
Mel Gorman, Daniel Bristot de Oliveira, Valentin Schneider
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.
Signed-off-by: Pierre Gondois <pierre.gondois@arm.com>
---
kernel/sched/fair.c | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index 93e928e76959..d38fec26fd3d 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -10184,15 +10184,13 @@ 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.
+ * @rq: the rq on which idleness is tested.
* @p: task which should be ignored.
*
* Return: 1 if the CPU would be idle. 0 otherwise.
*/
-static int idle_cpu_without(int cpu, struct task_struct *p)
+static int idle_cpu_without(struct rq *rq, struct task_struct *p)
{
- struct rq *rq = cpu_rq(cpu);
-
if (rq->curr != rq->idle && rq->curr != p)
return 0;
@@ -10247,7 +10245,7 @@ static inline void update_sg_wakeup_stats(struct sched_domain *sd,
/*
* No need to call idle_cpu_without() if nr_running is not 0
*/
- if (!nr_running && idle_cpu_without(i, p))
+ if (!nr_running && idle_cpu_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
* Re: [PATCH 2/2] sched/fair: Use rq in idle_cpu_without()
2024-01-03 12:56 ` [PATCH 2/2] sched/fair: Use rq in idle_cpu_without() Pierre Gondois
@ 2024-01-04 5:15 ` Shrikanth Hegde
2024-01-04 16:12 ` Pierre Gondois
0 siblings, 1 reply; 8+ messages in thread
From: Shrikanth Hegde @ 2024-01-04 5:15 UTC (permalink / raw)
To: Pierre Gondois
Cc: Ingo Molnar, Peter Zijlstra, Juri Lelli, Vincent Guittot,
Dietmar Eggemann, Steven Rostedt, Ben Segall, Mel Gorman,
Daniel Bristot de Oliveira, Valentin Schneider, linux-kernel
On 1/3/24 6:26 PM, Pierre Gondois wrote:
> idle_cpu_without() could receive a 'struct rq' instead of a
> cpu number to avoid converting the cpu number to a 'struct rq'
nit: s/cpu/CPU
> two times. Indeed update_sg_wakeup_stats() already makes the
> conversion.
This change looks good. There maybe other candidates which might get simplified
as well. for example, update_blocked_averages. (and then there are some
like balance_push_set which maybe borderline when it comes to such simplification)
>
> Signed-off-by: Pierre Gondois <pierre.gondois@arm.com>
> ---
> kernel/sched/fair.c | 8 +++-----
> 1 file changed, 3 insertions(+), 5 deletions(-)
>
> diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
> index 93e928e76959..d38fec26fd3d 100644
> --- a/kernel/sched/fair.c
> +++ b/kernel/sched/fair.c
> @@ -10184,15 +10184,13 @@ 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.
> + * @rq: the rq on which idleness is tested.
> * @p: task which should be ignored.
> *
> * Return: 1 if the CPU would be idle. 0 otherwise.
> */
> -static int idle_cpu_without(int cpu, struct task_struct *p)
> +static int idle_cpu_without(struct rq *rq, struct task_struct *p)
This might need change in the function name too. perception here is that, is the
CPU idle without task p.
Otherwise LGTM.
Reviewed-by: Shrikanth Hegde <sshegde@linux.vnet.ibm.com>
> {
> - struct rq *rq = cpu_rq(cpu);
> -
> if (rq->curr != rq->idle && rq->curr != p)
> return 0;
>
> @@ -10247,7 +10245,7 @@ static inline void update_sg_wakeup_stats(struct sched_domain *sd,
> /*
> * No need to call idle_cpu_without() if nr_running is not 0
> */
> - if (!nr_running && idle_cpu_without(i, p))
> + if (!nr_running && idle_cpu_without(rq, p))
> sgs->idle_cpus++;
>
> /* Check if task fits in the CPU */
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] sched/topology: Annotate RCU pointers properly
2024-01-03 12:56 ` [PATCH 1/2] sched/topology: Annotate RCU pointers properly Pierre Gondois
@ 2024-01-04 9:54 ` Valentin Schneider
2024-01-04 15:46 ` Pierre Gondois
2024-01-04 14:54 ` kernel test robot
1 sibling, 1 reply; 8+ messages in thread
From: Valentin Schneider @ 2024-01-04 9:54 UTC (permalink / raw)
To: Pierre Gondois, linux-kernel
Cc: Pierre Gondois, Ingo Molnar, Peter Zijlstra, Juri Lelli,
Vincent Guittot, Dietmar Eggemann, Steven Rostedt, Ben Segall,
Mel Gorman, Daniel Bristot de Oliveira
On 03/01/24 13:56, Pierre Gondois wrote:
> 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 ***
>
> Signed-off-by: Pierre Gondois <pierre.gondois@arm.com>
That's from when the NUMA topologies were made dynamic, which should be:
Fixes: 0fb3978b0aac ("sched/numa: Fix NUMA topology for systems with CPU-less nodes")
> ---
> kernel/sched/topology.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/kernel/sched/topology.c b/kernel/sched/topology.c
> index 10d1391e7416..0342a4f41f09 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;
I understand that's what sparse is asking for, but that looks odd to me. We
use it as:
rcu_assign_pointer(sched_domains_numa_masks, foo);
so why isn't it
__rcu ***sched_domains_numa_masks;
?
This isn't a pointer to an RCU-protected array of masks, this is an
RCU-protected double array of masks.
> #endif
>
> /*
> --
> 2.25.1
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] sched/topology: Annotate RCU pointers properly
2024-01-03 12:56 ` [PATCH 1/2] sched/topology: Annotate RCU pointers properly Pierre Gondois
2024-01-04 9:54 ` Valentin Schneider
@ 2024-01-04 14:54 ` kernel test robot
1 sibling, 0 replies; 8+ messages in thread
From: kernel test robot @ 2024-01-04 14:54 UTC (permalink / raw)
To: Pierre Gondois, linux-kernel
Cc: oe-kbuild-all, Pierre Gondois, Ingo Molnar, Peter Zijlstra,
Juri Lelli, Vincent Guittot, Dietmar Eggemann, Steven Rostedt,
Ben Segall, Mel Gorman, Daniel Bristot de Oliveira,
Valentin Schneider
Hi Pierre,
kernel test robot noticed the following build warnings:
[auto build test WARNING on tip/sched/core]
[also build test WARNING on tip/master peterz-queue/sched/core tip/auto-latest linus/master v6.7-rc8 next-20240104]
[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/20240103-210154
base: tip/sched/core
patch link: https://lore.kernel.org/r/20240103125648.194516-2-pierre.gondois%40arm.com
patch subject: [PATCH 1/2] sched/topology: Annotate RCU pointers properly
config: arm64-randconfig-r111-20240104 (https://download.01.org/0day-ci/archive/20240104/202401042241.EQntOcPK-lkp@intel.com/config)
compiler: aarch64-linux-gcc (GCC) 13.2.0
reproduce: (https://download.01.org/0day-ci/archive/20240104/202401042241.EQntOcPK-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/202401042241.EQntOcPK-lkp@intel.com/
sparse warnings: (new ones prefixed by >>)
kernel/sched/build_utility.c: note: in included file:
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:1998:19: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected int *distances @@ got int [noderef] __rcu *static [addressable] [assigned] [toplevel] sched_domains_numa_distance @@
kernel/sched/topology.c:1998:19: sparse: expected int *distances
kernel/sched/topology.c:1998:19: sparse: got int [noderef] __rcu *static [addressable] [assigned] [toplevel] sched_domains_numa_distance
>> kernel/sched/topology.c:2000:15: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct cpumask ***masks @@ got struct cpumask **[noderef] __rcu *static [addressable] [assigned] [toplevel] sched_domains_numa_masks @@
kernel/sched/topology.c:2000:15: sparse: expected struct cpumask ***masks
kernel/sched/topology.c:2000:15: sparse: got struct cpumask **[noderef] __rcu *static [addressable] [assigned] [toplevel] sched_domains_numa_masks
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 (through include/linux/smp.h, include/linux/sched/clock.h):
include/linux/list.h:83:21: sparse: sparse: self-comparison always evaluates to true
include/linux/list.h:83:21: sparse: sparse: self-comparison always evaluates to true
include/linux/list.h:83:21: sparse: sparse: self-comparison always evaluates to true
include/linux/list.h:83:21: sparse: sparse: self-comparison always evaluates to true
include/linux/list.h:83:21: sparse: sparse: self-comparison always evaluates to true
include/linux/list.h:83:21: sparse: sparse: self-comparison always evaluates to true
include/linux/list.h:83:21: sparse: sparse: self-comparison always evaluates to true
include/linux/list.h:83:21: sparse: sparse: self-comparison always evaluates to true
include/linux/list.h:83:21: sparse: sparse: self-comparison always evaluates to true
include/linux/list.h:83:21: sparse: sparse: self-comparison always evaluates to true
kernel/sched/build_utility.c: note: in included file:
kernel/sched/sched.h:1846:9: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct sched_domain *[assigned] sd @@ got struct sched_domain [noderef] __rcu *parent @@
kernel/sched/sched.h:1846:9: sparse: expected struct sched_domain *[assigned] sd
kernel/sched/sched.h:1846:9: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/sched.h:1867:9: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct sched_domain *[assigned] sd @@ got struct sched_domain [noderef] __rcu *parent @@
kernel/sched/sched.h:1867:9: sparse: expected struct sched_domain *[assigned] sd
kernel/sched/sched.h:1867:9: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/sched.h:1867:9: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct sched_domain *[assigned] sd @@ got struct sched_domain [noderef] __rcu *parent @@
kernel/sched/sched.h:1867:9: sparse: expected struct sched_domain *[assigned] sd
kernel/sched/sched.h:1867:9: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/sched.h:1846:9: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct sched_domain *[assigned] sd @@ got struct sched_domain [noderef] __rcu *parent @@
kernel/sched/sched.h:1846:9: sparse: expected struct sched_domain *[assigned] sd
kernel/sched/sched.h:1846:9: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/sched.h:1867:9: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct sched_domain *[assigned] sd @@ got struct sched_domain [noderef] __rcu *parent @@
kernel/sched/sched.h:1867:9: sparse: expected struct sched_domain *[assigned] sd
kernel/sched/sched.h:1867:9: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/build_utility.c: note: in included file:
kernel/sched/topology.c:741:39: sparse: sparse: dereference of noderef expression
kernel/sched/topology.c:971:31: sparse: sparse: dereference of noderef expression
kernel/sched/build_utility.c: note: in included file (through include/linux/smp.h, include/linux/sched/clock.h):
include/linux/list.h:83:21: sparse: sparse: self-comparison always evaluates to true
kernel/sched/build_utility.c: note: in included file:
kernel/sched/topology.c:1643:19: sparse: sparse: dereference of noderef expression
kernel/sched/topology.c:1658:48: sparse: sparse: dereference of noderef expression
kernel/sched/topology.c:1723:40: sparse: sparse: dereference of noderef expression
kernel/sched/topology.c:1934:86: sparse: sparse: dereference of noderef expression
kernel/sched/topology.c:1983:9: sparse: sparse: dereference of noderef expression
kernel/sched/topology.c:2053:82: sparse: sparse: dereference of noderef expression
kernel/sched/topology.c:2054:78: sparse: sparse: dereference of noderef expression
kernel/sched/topology.c:2054:78: sparse: sparse: dereference of noderef expression
kernel/sched/topology.c:2065:53: sparse: sparse: dereference of noderef expression
kernel/sched/topology.c:2066:80: sparse: sparse: dereference of noderef expression
kernel/sched/topology.c:2066:80: sparse: sparse: dereference of noderef expression
kernel/sched/topology.c:2483:51: sparse: sparse: dereference of noderef expression
kernel/sched/topology.c:2484:49: sparse: sparse: dereference of noderef expression
kernel/sched/topology.c:2486:52: sparse: sparse: dereference of noderef expression
kernel/sched/build_utility.c: note: in included file:
kernel/sched/sched.h:1867:9: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct sched_domain *[assigned] sd @@ got struct sched_domain [noderef] __rcu *parent @@
kernel/sched/sched.h:1867:9: sparse: expected struct sched_domain *[assigned] sd
kernel/sched/sched.h:1867:9: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/build_utility.c: note: in included file:
kernel/sched/core_sched.c:94:23: sparse: sparse: context imbalance in 'sched_core_update_cookie' - wrong count at exit
vim +1998 kernel/sched/topology.c
0083242c93759d Valentin Schneider 2021-08-18 1987
0083242c93759d Valentin Schneider 2021-08-18 1988
0fb3978b0aac3a Huang Ying 2022-02-14 1989 static void sched_reset_numa(void)
0fb3978b0aac3a Huang Ying 2022-02-14 1990 {
0fb3978b0aac3a Huang Ying 2022-02-14 1991 int nr_levels, *distances;
0fb3978b0aac3a Huang Ying 2022-02-14 1992 struct cpumask ***masks;
0083242c93759d Valentin Schneider 2021-08-18 1993
0fb3978b0aac3a Huang Ying 2022-02-14 1994 nr_levels = sched_domains_numa_levels;
0fb3978b0aac3a Huang Ying 2022-02-14 1995 sched_domains_numa_levels = 0;
0fb3978b0aac3a Huang Ying 2022-02-14 1996 sched_max_numa_distance = 0;
0fb3978b0aac3a Huang Ying 2022-02-14 1997 sched_numa_topology_type = NUMA_DIRECT;
0fb3978b0aac3a Huang Ying 2022-02-14 @1998 distances = sched_domains_numa_distance;
0fb3978b0aac3a Huang Ying 2022-02-14 1999 rcu_assign_pointer(sched_domains_numa_distance, NULL);
0fb3978b0aac3a Huang Ying 2022-02-14 @2000 masks = sched_domains_numa_masks;
0fb3978b0aac3a Huang Ying 2022-02-14 2001 rcu_assign_pointer(sched_domains_numa_masks, NULL);
0fb3978b0aac3a Huang Ying 2022-02-14 2002 if (distances || masks) {
0fb3978b0aac3a Huang Ying 2022-02-14 2003 int i, j;
0083242c93759d Valentin Schneider 2021-08-18 2004
0fb3978b0aac3a Huang Ying 2022-02-14 2005 synchronize_rcu();
0fb3978b0aac3a Huang Ying 2022-02-14 2006 kfree(distances);
0fb3978b0aac3a Huang Ying 2022-02-14 2007 for (i = 0; i < nr_levels && masks; i++) {
0fb3978b0aac3a Huang Ying 2022-02-14 2008 if (!masks[i])
0083242c93759d Valentin Schneider 2021-08-18 2009 continue;
0fb3978b0aac3a Huang Ying 2022-02-14 2010 for_each_node(j)
0fb3978b0aac3a Huang Ying 2022-02-14 2011 kfree(masks[i][j]);
0fb3978b0aac3a Huang Ying 2022-02-14 2012 kfree(masks[i]);
0fb3978b0aac3a Huang Ying 2022-02-14 2013 }
0fb3978b0aac3a Huang Ying 2022-02-14 2014 kfree(masks);
0fb3978b0aac3a Huang Ying 2022-02-14 2015 }
0fb3978b0aac3a Huang Ying 2022-02-14 2016 if (sched_domain_topology_saved) {
0fb3978b0aac3a Huang Ying 2022-02-14 2017 kfree(sched_domain_topology);
0fb3978b0aac3a Huang Ying 2022-02-14 2018 sched_domain_topology = sched_domain_topology_saved;
0fb3978b0aac3a Huang Ying 2022-02-14 2019 sched_domain_topology_saved = NULL;
0083242c93759d Valentin Schneider 2021-08-18 2020 }
0083242c93759d Valentin Schneider 2021-08-18 2021 }
0083242c93759d Valentin Schneider 2021-08-18 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 1/2] sched/topology: Annotate RCU pointers properly
2024-01-04 9:54 ` Valentin Schneider
@ 2024-01-04 15:46 ` Pierre Gondois
0 siblings, 0 replies; 8+ messages in thread
From: Pierre Gondois @ 2024-01-04 15:46 UTC (permalink / raw)
To: Valentin Schneider, linux-kernel
Cc: Ingo Molnar, Peter Zijlstra, Juri Lelli, Vincent Guittot,
Dietmar Eggemann, Steven Rostedt, Ben Segall, Mel Gorman,
Daniel Bristot de Oliveira
Hello Valentin,
On 1/4/24 10:54, Valentin Schneider wrote:
> On 03/01/24 13:56, Pierre Gondois wrote:
>> 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 ***
>>
>> Signed-off-by: Pierre Gondois <pierre.gondois@arm.com>
>
> That's from when the NUMA topologies were made dynamic, which should be:
> Fixes: 0fb3978b0aac ("sched/numa: Fix NUMA topology for systems with CPU-less nodes")
Ok yes
>> ---
>> kernel/sched/topology.c | 4 ++--
>> 1 file changed, 2 insertions(+), 2 deletions(-)
>>
>> diff --git a/kernel/sched/topology.c b/kernel/sched/topology.c
>> index 10d1391e7416..0342a4f41f09 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;
>
> I understand that's what sparse is asking for, but that looks odd to me. We
> use it as:
>
> rcu_assign_pointer(sched_domains_numa_masks, foo);
>
> so why isn't it
>
> __rcu ***sched_domains_numa_masks;
>
> ?
>
> This isn't a pointer to an RCU-protected array of masks, this is an
> RCU-protected double array of masks.
I think:
static struct cpumask ** __rcu *sched_domains_numa_masks;
should denote an RCU-protected array^3 of 'struct cpumask', when
static struct cpumask __rcu ***sched_domains_numa_masks;
would denote an array^2 of RCU-protected 'struct cpumask*',
and assignments would look like:
rcu_assign_pointer(**sched_domains_numa_masks, foo);
Meaning that, when taking as a better example:
static int __rcu *sched_domains_numa_distance;
Here we would like to avoid having 'access after free' to the array of
integer allocated to sched_domains_numa_distance.
For sched_domains_numa_masks:
static struct cpumask ** __rcu *sched_domains_numa_masks;
rcu_assign_pointer(sched_domains_numa_masks, foo);
bar = rcu_dereference(sched_domains_numa_masks);
once the first array pointed by sched_domains_numa_masks is accessed/assigned,
we know the RCU-framework makes it safe against 'accesses after free' when
accessing the level-2 array of sched_domains_numa_masks, or accessing the mask
(level 3).
Please let me know if the reasoning seems dodgy.
About the kernel test robot:
kernel/sched/topology.c:1998:19: sparse: sparse: incorrect type in assignment (different address spaces) @@
expected int *distances @@
got int [noderef] __rcu *static [addressable] [assigned] [toplevel] sched_domains_numa_distance
kernel/sched/topology.c:2000:15: sparse: sparse: incorrect type in assignment (different address spaces) @@
expected struct cpumask ***masks @@
got struct cpumask **[noderef] __rcu *static [addressable] [assigned] [toplevel] sched_domains_numa_masks @@
I think the warnings can be ignored since the two pointers (distances, masks)
are only dereferenced after a 'synchronize_rcu()'
Regards,
Pierre
>> #endif
>>
>> /*
>> --
>> 2.25.1
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2/2] sched/fair: Use rq in idle_cpu_without()
2024-01-04 5:15 ` Shrikanth Hegde
@ 2024-01-04 16:12 ` Pierre Gondois
0 siblings, 0 replies; 8+ messages in thread
From: Pierre Gondois @ 2024-01-04 16:12 UTC (permalink / raw)
To: Shrikanth Hegde
Cc: Ingo Molnar, Peter Zijlstra, Juri Lelli, Vincent Guittot,
Dietmar Eggemann, Steven Rostedt, Ben Segall, Mel Gorman,
Daniel Bristot de Oliveira, Valentin Schneider, linux-kernel
Hello Shrikanth,
On 1/4/24 06:15, Shrikanth Hegde wrote:
>
>
> On 1/3/24 6:26 PM, Pierre Gondois wrote:
>> idle_cpu_without() could receive a 'struct rq' instead of a
>> cpu number to avoid converting the cpu number to a 'struct rq'
>
> nit: s/cpu/CPU
>
>> two times. Indeed update_sg_wakeup_stats() already makes the
>> conversion.
>
> This change looks good. There maybe other candidates which might get simplified
> as well. for example, update_blocked_averages. (and then there are some
> like balance_push_set which maybe borderline when it comes to such simplification)
Ok yes, I'll check the functions you pointed out.
>
>>
>> Signed-off-by: Pierre Gondois <pierre.gondois@arm.com>
>> ---
>> kernel/sched/fair.c | 8 +++-----
>> 1 file changed, 3 insertions(+), 5 deletions(-)
>>
>> diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
>> index 93e928e76959..d38fec26fd3d 100644
>> --- a/kernel/sched/fair.c
>> +++ b/kernel/sched/fair.c
>> @@ -10184,15 +10184,13 @@ 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.
>> + * @rq: the rq on which idleness is tested.
>> * @p: task which should be ignored.
>> *
>> * Return: 1 if the CPU would be idle. 0 otherwise.
>> */
>> -static int idle_cpu_without(int cpu, struct task_struct *p)
>> +static int idle_cpu_without(struct rq *rq, struct task_struct *p)
>
> This might need change in the function name too. perception here is that, is the
> CPU idle without task p.
Yes right, I'll rename to idle_rq_without() in the next version.
Regards,
Pierre
> Otherwise LGTM.
>
> Reviewed-by: Shrikanth Hegde <sshegde@linux.vnet.ibm.com>
>
>> {
>> - struct rq *rq = cpu_rq(cpu);
>> -
>> if (rq->curr != rq->idle && rq->curr != p)
>> return 0;
>>
>> @@ -10247,7 +10245,7 @@ static inline void update_sg_wakeup_stats(struct sched_domain *sd,
>> /*
>> * No need to call idle_cpu_without() if nr_running is not 0
>> */
>> - if (!nr_running && idle_cpu_without(i, p))
>> + if (!nr_running && idle_cpu_without(rq, p))
>> sgs->idle_cpus++;
>>
>> /* Check if task fits in the CPU */
>
>
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2024-01-04 16:12 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-01-03 12:56 [PATCH 0/2] Small cleanup around sparse report Pierre Gondois
2024-01-03 12:56 ` [PATCH 1/2] sched/topology: Annotate RCU pointers properly Pierre Gondois
2024-01-04 9:54 ` Valentin Schneider
2024-01-04 15:46 ` Pierre Gondois
2024-01-04 14:54 ` kernel test robot
2024-01-03 12:56 ` [PATCH 2/2] sched/fair: Use rq in idle_cpu_without() Pierre Gondois
2024-01-04 5:15 ` Shrikanth Hegde
2024-01-04 16:12 ` Pierre Gondois
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox