public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [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