rcu.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/4] RCU fixes for rcu_assign_pointer() usage
@ 2019-03-21  0:34 Joel Fernandes (Google)
  2019-03-21  0:34 ` [PATCH v2 1/4] sched/cpufreq: Annotate cpufreq_update_util_data pointer with __rcu Joel Fernandes (Google)
                   ` (5 more replies)
  0 siblings, 6 replies; 7+ messages in thread
From: Joel Fernandes (Google) @ 2019-03-21  0:34 UTC (permalink / raw)
  To: linux-kernel
  Cc: Joel Fernandes (Google),
	Ingo Molnar, Josh Triplett, keescook, kernel-hardening,
	kernel-team, Lai Jiangshan, Luc Van Oostenryck,
	Mathieu Desnoyers, Morten Rasmussen, Paul E. McKenney,
	Peter Zijlstra, rcu, Steven Rostedt

This is just a resend with scheduler patches split from the driver fixes and
Paul's Reviewed-by(s) added.

These patches fix various sparse errors ccaused as a result of the recent check
to add rcu_check_sparse() to rcu_assign_pointer().  The errors are due to
missing annotations. The annotations added in the series can also help avoid
future incorrect usages and bugs so it is a good idea to do in any case.

RFC v1 -> Patch v2:
Made changes based on Peter Zijlstra review.

Joel Fernandes (Google) (4):
sched/cpufreq: Annotate cpufreq_update_util_data pointer with __rcu
sched_domain: Annotate RCU pointers properly
rcuwait: Annotate task_struct with __rcu
sched: Annotate perf_domain pointer with __rcu

include/linux/rcuwait.h        |  2 +-
include/linux/sched/topology.h |  4 ++--
kernel/sched/cpufreq.c         |  2 +-
kernel/sched/sched.h           | 18 +++++++++---------
kernel/sched/topology.c        | 10 +++++-----
5 files changed, 18 insertions(+), 18 deletions(-)

--
2.21.0.225.g810b269d1ac-goog


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH v2 1/4] sched/cpufreq: Annotate cpufreq_update_util_data pointer with __rcu
  2019-03-21  0:34 [PATCH v2 0/4] RCU fixes for rcu_assign_pointer() usage Joel Fernandes (Google)
@ 2019-03-21  0:34 ` Joel Fernandes (Google)
  2019-03-21  0:34 ` [PATCH v2 2/4] sched_domain: Annotate RCU pointers properly Joel Fernandes (Google)
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Joel Fernandes (Google) @ 2019-03-21  0:34 UTC (permalink / raw)
  To: linux-kernel
  Cc: Joel Fernandes (Google),
	Paul E . McKenney, Ingo Molnar, Josh Triplett, keescook,
	kernel-hardening, kernel-team, Lai Jiangshan, Luc Van Oostenryck,
	Mathieu Desnoyers, Morten Rasmussen, Peter Zijlstra, rcu,
	Steven Rostedt

Recently I added an RCU annotation check to rcu_assign_pointer(). All
pointers assigned to RCU protected data are to be annotated with __rcu
inorder to be able to use rcu_assign_pointer() similar to checks in
other RCU APIs.

This resulted in a sparse error: kernel//sched/cpufreq.c:41:9: sparse:
error: incompatible types in comparison expression (different address
spaces)

Fix this by annotating cpufreq_update_util_data pointer with __rcu. This
will also help sparse catch any future RCU misuage bugs.

[From an RCU perspective]
Reviewed-by: Paul E. McKenney <paulmck@linux.ibm.com>
Signed-off-by: Joel Fernandes (Google) <joel@joelfernandes.org>
---
 kernel/sched/cpufreq.c | 2 +-
 kernel/sched/sched.h   | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/kernel/sched/cpufreq.c b/kernel/sched/cpufreq.c
index 835671f0f917..b5dcd1d83c7f 100644
--- a/kernel/sched/cpufreq.c
+++ b/kernel/sched/cpufreq.c
@@ -7,7 +7,7 @@
  */
 #include "sched.h"
 
-DEFINE_PER_CPU(struct update_util_data *, cpufreq_update_util_data);
+DEFINE_PER_CPU(struct update_util_data __rcu *, cpufreq_update_util_data);
 
 /**
  * cpufreq_add_update_util_hook - Populate the CPU's update_util_data pointer.
diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
index efa686eeff26..713715dd00cf 100644
--- a/kernel/sched/sched.h
+++ b/kernel/sched/sched.h
@@ -2185,7 +2185,7 @@ static inline u64 irq_time_read(int cpu)
 #endif /* CONFIG_IRQ_TIME_ACCOUNTING */
 
 #ifdef CONFIG_CPU_FREQ
-DECLARE_PER_CPU(struct update_util_data *, cpufreq_update_util_data);
+DECLARE_PER_CPU(struct update_util_data __rcu *, cpufreq_update_util_data);
 
 /**
  * cpufreq_update_util - Take a note about CPU utilization changes.
-- 
2.21.0.225.g810b269d1ac-goog


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v2 2/4] sched_domain: Annotate RCU pointers properly
  2019-03-21  0:34 [PATCH v2 0/4] RCU fixes for rcu_assign_pointer() usage Joel Fernandes (Google)
  2019-03-21  0:34 ` [PATCH v2 1/4] sched/cpufreq: Annotate cpufreq_update_util_data pointer with __rcu Joel Fernandes (Google)
@ 2019-03-21  0:34 ` Joel Fernandes (Google)
  2019-03-21  0:34 ` [PATCH v2 3/4] rcuwait: Annotate task_struct with __rcu Joel Fernandes (Google)
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Joel Fernandes (Google) @ 2019-03-21  0:34 UTC (permalink / raw)
  To: linux-kernel
  Cc: Joel Fernandes (Google),
	Paul E . McKenney, Ingo Molnar, Josh Triplett, keescook,
	kernel-hardening, kernel-team, Lai Jiangshan, Luc Van Oostenryck,
	Mathieu Desnoyers, Morten Rasmussen, Peter Zijlstra, rcu,
	Steven Rostedt

The scheduler uses RCU API in various places to access sched_domain
pointers. These cause sparse errors as below.

Many new errors show up because of an annotation check I added to
rcu_assign_pointer(). Let us annotate the pointers correctly which also
will help sparse catch any potential future bugs.

This fixes the following sparse errors:

rt.c:1681:9: error: incompatible types in comparison expression
deadline.c:1904:9: error: incompatible types in comparison expression
core.c:519:9: error: incompatible types in comparison expression
core.c:1634:17: error: incompatible types in comparison expression
fair.c:6193:14: error: incompatible types in comparison expression
fair.c:9883:22: error: incompatible types in comparison expression
fair.c:9897:9: error: incompatible types in comparison expression
sched.h:1287:9: error: incompatible types in comparison expression
topology.c:612:9: error: incompatible types in comparison expression
topology.c:615:9: error: incompatible types in comparison expression
sched.h:1300:9: error: incompatible types in comparison expression
topology.c:618:9: error: incompatible types in comparison expression
sched.h:1287:9: error: incompatible types in comparison expression
topology.c:621:9: error: incompatible types in comparison expression
sched.h:1300:9: error: incompatible types in comparison expression
topology.c:624:9: error: incompatible types in comparison expression
topology.c:671:9: error: incompatible types in comparison expression
stats.c:45:17: error: incompatible types in comparison expression
fair.c:5998:15: error: incompatible types in comparison expression
fair.c:5989:15: error: incompatible types in comparison expression
fair.c:5998:15: error: incompatible types in comparison expression
fair.c:5989:15: error: incompatible types in comparison expression
fair.c:6120:19: error: incompatible types in comparison expression
fair.c:6506:14: error: incompatible types in comparison expression
fair.c:6515:14: error: incompatible types in comparison expression
fair.c:6623:9: error: incompatible types in comparison expression
fair.c:5970:17: error: incompatible types in comparison expression
fair.c:8642:21: error: incompatible types in comparison expression
fair.c:9253:9: error: incompatible types in comparison expression
fair.c:9331:9: error: incompatible types in comparison expression
fair.c:9519:15: error: incompatible types in comparison expression
fair.c:9533:14: error: incompatible types in comparison expression
fair.c:9542:14: error: incompatible types in comparison expression
fair.c:9567:14: error: incompatible types in comparison expression
fair.c:9597:14: error: incompatible types in comparison expression
fair.c:9421:16: error: incompatible types in comparison expression
fair.c:9421:16: error: incompatible types in comparison expression

[From an RCU perspective]
Reviewed-by: Paul E. McKenney <paulmck@linux.ibm.com>
Signed-off-by: Joel Fernandes (Google) <joel@joelfernandes.org>
---
 include/linux/sched/topology.h |  4 ++--
 kernel/sched/sched.h           | 14 +++++++-------
 kernel/sched/topology.c        | 10 +++++-----
 3 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/include/linux/sched/topology.h b/include/linux/sched/topology.h
index 57c7ed3fe465..cfc0a89a7159 100644
--- a/include/linux/sched/topology.h
+++ b/include/linux/sched/topology.h
@@ -76,8 +76,8 @@ struct sched_domain_shared {
 
 struct sched_domain {
 	/* These fields must be setup */
-	struct sched_domain *parent;	/* top domain must be null terminated */
-	struct sched_domain *child;	/* bottom domain must be null terminated */
+	struct sched_domain __rcu *parent;	/* top domain must be null terminated */
+	struct sched_domain __rcu *child;	/* bottom domain must be null terminated */
 	struct sched_group *groups;	/* the balancing groups of the domain */
 	unsigned long min_interval;	/* Minimum balance interval ms */
 	unsigned long max_interval;	/* Maximum balance interval ms */
diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
index 713715dd00cf..2b452d68ab2e 100644
--- a/kernel/sched/sched.h
+++ b/kernel/sched/sched.h
@@ -869,8 +869,8 @@ struct rq {
 	atomic_t		nr_iowait;
 
 #ifdef CONFIG_SMP
-	struct root_domain	*rd;
-	struct sched_domain	*sd;
+	struct root_domain		*rd;
+	struct sched_domain __rcu	*sd;
 
 	unsigned long		cpu_capacity;
 	unsigned long		cpu_capacity_orig;
@@ -1324,13 +1324,13 @@ static inline struct sched_domain *lowest_flag_domain(int cpu, int flag)
 	return sd;
 }
 
-DECLARE_PER_CPU(struct sched_domain *, sd_llc);
+DECLARE_PER_CPU(struct sched_domain __rcu *, sd_llc);
 DECLARE_PER_CPU(int, sd_llc_size);
 DECLARE_PER_CPU(int, sd_llc_id);
-DECLARE_PER_CPU(struct sched_domain_shared *, sd_llc_shared);
-DECLARE_PER_CPU(struct sched_domain *, sd_numa);
-DECLARE_PER_CPU(struct sched_domain *, sd_asym_packing);
-DECLARE_PER_CPU(struct sched_domain *, sd_asym_cpucapacity);
+DECLARE_PER_CPU(struct sched_domain_shared __rcu *, sd_llc_shared);
+DECLARE_PER_CPU(struct sched_domain __rcu *, sd_numa);
+DECLARE_PER_CPU(struct sched_domain __rcu *, sd_asym_packing);
+DECLARE_PER_CPU(struct sched_domain __rcu *, sd_asym_cpucapacity);
 extern struct static_key_false sched_asym_cpucapacity;
 
 struct sched_group_capacity {
diff --git a/kernel/sched/topology.c b/kernel/sched/topology.c
index ab7f371a3a17..64bec54ded3e 100644
--- a/kernel/sched/topology.c
+++ b/kernel/sched/topology.c
@@ -615,13 +615,13 @@ static void destroy_sched_domains(struct sched_domain *sd)
  * the cpumask of the domain), this allows us to quickly tell if
  * two CPUs are in the same cache domain, see cpus_share_cache().
  */
-DEFINE_PER_CPU(struct sched_domain *, sd_llc);
+DEFINE_PER_CPU(struct sched_domain __rcu *, sd_llc);
 DEFINE_PER_CPU(int, sd_llc_size);
 DEFINE_PER_CPU(int, sd_llc_id);
-DEFINE_PER_CPU(struct sched_domain_shared *, sd_llc_shared);
-DEFINE_PER_CPU(struct sched_domain *, sd_numa);
-DEFINE_PER_CPU(struct sched_domain *, sd_asym_packing);
-DEFINE_PER_CPU(struct sched_domain *, sd_asym_cpucapacity);
+DEFINE_PER_CPU(struct sched_domain_shared __rcu *, sd_llc_shared);
+DEFINE_PER_CPU(struct sched_domain __rcu *, sd_numa);
+DEFINE_PER_CPU(struct sched_domain __rcu *, sd_asym_packing);
+DEFINE_PER_CPU(struct sched_domain __rcu *, sd_asym_cpucapacity);
 DEFINE_STATIC_KEY_FALSE(sched_asym_cpucapacity);
 
 static void update_top_cache_domain(int cpu)
-- 
2.21.0.225.g810b269d1ac-goog


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v2 3/4] rcuwait: Annotate task_struct with __rcu
  2019-03-21  0:34 [PATCH v2 0/4] RCU fixes for rcu_assign_pointer() usage Joel Fernandes (Google)
  2019-03-21  0:34 ` [PATCH v2 1/4] sched/cpufreq: Annotate cpufreq_update_util_data pointer with __rcu Joel Fernandes (Google)
  2019-03-21  0:34 ` [PATCH v2 2/4] sched_domain: Annotate RCU pointers properly Joel Fernandes (Google)
@ 2019-03-21  0:34 ` Joel Fernandes (Google)
  2019-03-21  0:34 ` [PATCH v2 4/4] sched: Annotate perf_domain pointer " Joel Fernandes (Google)
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Joel Fernandes (Google) @ 2019-03-21  0:34 UTC (permalink / raw)
  To: linux-kernel
  Cc: Joel Fernandes (Google),
	Paul E . McKenney, Ingo Molnar, Josh Triplett, keescook,
	kernel-hardening, kernel-team, Lai Jiangshan, Luc Van Oostenryck,
	Mathieu Desnoyers, Morten Rasmussen, Peter Zijlstra, rcu,
	Steven Rostedt

This suppresses sparse error generated due to the recently added
rcu_assign_pointer sparse check.

percpu-rwsem.c:162:9: sparse: error: incompatible types in comparison expression
exit.c:316:16: sparse: error: incompatible types in comparison expression

[From an RCU perspective]
Reviewed-by: Paul E. McKenney <paulmck@linux.ibm.com>
Signed-off-by: Joel Fernandes (Google) <joel@joelfernandes.org>
---
 include/linux/rcuwait.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/include/linux/rcuwait.h b/include/linux/rcuwait.h
index 90bfa3279a01..563290fc194f 100644
--- a/include/linux/rcuwait.h
+++ b/include/linux/rcuwait.h
@@ -18,7 +18,7 @@
  * awoken.
  */
 struct rcuwait {
-	struct task_struct *task;
+	struct task_struct __rcu *task;
 };
 
 #define __RCUWAIT_INITIALIZER(name)		\
-- 
2.21.0.225.g810b269d1ac-goog


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v2 4/4] sched: Annotate perf_domain pointer with __rcu
  2019-03-21  0:34 [PATCH v2 0/4] RCU fixes for rcu_assign_pointer() usage Joel Fernandes (Google)
                   ` (2 preceding siblings ...)
  2019-03-21  0:34 ` [PATCH v2 3/4] rcuwait: Annotate task_struct with __rcu Joel Fernandes (Google)
@ 2019-03-21  0:34 ` Joel Fernandes (Google)
  2019-03-21 17:58 ` [PATCH v2 0/4] RCU fixes for rcu_assign_pointer() usage Peter Zijlstra
  2019-03-21 20:12 ` Luc Van Oostenryck
  5 siblings, 0 replies; 7+ messages in thread
From: Joel Fernandes (Google) @ 2019-03-21  0:34 UTC (permalink / raw)
  To: linux-kernel
  Cc: Joel Fernandes (Google),
	Paul E . McKenney, Ingo Molnar, Josh Triplett, keescook,
	kernel-hardening, kernel-team, Lai Jiangshan, Luc Van Oostenryck,
	Mathieu Desnoyers, Morten Rasmussen, Peter Zijlstra, rcu,
	Steven Rostedt

This fixes the following sparse errors in sched/fair.c:

fair.c:6506:14: error: incompatible types in comparison expression
fair.c:8642:21: error: incompatible types in comparison expression

Using __rcu will also help sparse catch any future bugs.

[From an RCU perspective]
Reviewed-by: Paul E. McKenney <paulmck@linux.ibm.com>
Signed-off-by: Joel Fernandes (Google) <joel@joelfernandes.org>
---
 kernel/sched/sched.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
index 2b452d68ab2e..b52ed1ada0be 100644
--- a/kernel/sched/sched.h
+++ b/kernel/sched/sched.h
@@ -780,7 +780,7 @@ struct root_domain {
 	 * NULL-terminated list of performance domains intersecting with the
 	 * CPUs of the rd. Protected by RCU.
 	 */
-	struct perf_domain	*pd;
+	struct perf_domain __rcu *pd;
 };
 
 extern struct root_domain def_root_domain;
-- 
2.21.0.225.g810b269d1ac-goog


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 0/4] RCU fixes for rcu_assign_pointer() usage
  2019-03-21  0:34 [PATCH v2 0/4] RCU fixes for rcu_assign_pointer() usage Joel Fernandes (Google)
                   ` (3 preceding siblings ...)
  2019-03-21  0:34 ` [PATCH v2 4/4] sched: Annotate perf_domain pointer " Joel Fernandes (Google)
@ 2019-03-21 17:58 ` Peter Zijlstra
  2019-03-21 20:12 ` Luc Van Oostenryck
  5 siblings, 0 replies; 7+ messages in thread
From: Peter Zijlstra @ 2019-03-21 17:58 UTC (permalink / raw)
  To: Joel Fernandes (Google)
  Cc: linux-kernel, Ingo Molnar, Josh Triplett, keescook,
	kernel-hardening, kernel-team, Lai Jiangshan, Luc Van Oostenryck,
	Mathieu Desnoyers, Morten Rasmussen, Paul E. McKenney, rcu,
	Steven Rostedt

On Wed, Mar 20, 2019 at 08:34:22PM -0400, Joel Fernandes (Google) wrote:
> This is just a resend with scheduler patches split from the driver fixes and
> Paul's Reviewed-by(s) added.
> 
> These patches fix various sparse errors ccaused as a result of the recent check
> to add rcu_check_sparse() to rcu_assign_pointer().  The errors are due to
> missing annotations. The annotations added in the series can also help avoid
> future incorrect usages and bugs so it is a good idea to do in any case.
> 
> RFC v1 -> Patch v2:
> Made changes based on Peter Zijlstra review.
> 
> Joel Fernandes (Google) (4):
> sched/cpufreq: Annotate cpufreq_update_util_data pointer with __rcu
> sched_domain: Annotate RCU pointers properly
> rcuwait: Annotate task_struct with __rcu
> sched: Annotate perf_domain pointer with __rcu
> 
> include/linux/rcuwait.h        |  2 +-
> include/linux/sched/topology.h |  4 ++--
> kernel/sched/cpufreq.c         |  2 +-
> kernel/sched/sched.h           | 18 +++++++++---------
> kernel/sched/topology.c        | 10 +++++-----
> 5 files changed, 18 insertions(+), 18 deletions(-)

Thanks Joel

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 0/4] RCU fixes for rcu_assign_pointer() usage
  2019-03-21  0:34 [PATCH v2 0/4] RCU fixes for rcu_assign_pointer() usage Joel Fernandes (Google)
                   ` (4 preceding siblings ...)
  2019-03-21 17:58 ` [PATCH v2 0/4] RCU fixes for rcu_assign_pointer() usage Peter Zijlstra
@ 2019-03-21 20:12 ` Luc Van Oostenryck
  5 siblings, 0 replies; 7+ messages in thread
From: Luc Van Oostenryck @ 2019-03-21 20:12 UTC (permalink / raw)
  To: Joel Fernandes (Google)
  Cc: linux-kernel, Ingo Molnar, Josh Triplett, keescook,
	kernel-hardening, kernel-team, Lai Jiangshan, Mathieu Desnoyers,
	Morten Rasmussen, Paul E. McKenney, Peter Zijlstra, rcu,
	Steven Rostedt

On Wed, Mar 20, 2019 at 08:34:22PM -0400, Joel Fernandes (Google) wrote:
> This is just a resend with scheduler patches split from the driver fixes and
> Paul's Reviewed-by(s) added.
> 
> These patches fix various sparse errors ccaused as a result of the recent check
> to add rcu_check_sparse() to rcu_assign_pointer().  The errors are due to
> missing annotations. The annotations added in the series can also help avoid
> future incorrect usages and bugs so it is a good idea to do in any case.
> 
> RFC v1 -> Patch v2:
> Made changes based on Peter Zijlstra review.
> 
> Joel Fernandes (Google) (4):
> sched/cpufreq: Annotate cpufreq_update_util_data pointer with __rcu
> sched_domain: Annotate RCU pointers properly
> rcuwait: Annotate task_struct with __rcu
> sched: Annotate perf_domain pointer with __rcu
> 
> include/linux/rcuwait.h        |  2 +-
> include/linux/sched/topology.h |  4 ++--
> kernel/sched/cpufreq.c         |  2 +-
> kernel/sched/sched.h           | 18 +++++++++---------
> kernel/sched/topology.c        | 10 +++++-----
> 5 files changed, 18 insertions(+), 18 deletions(-)

Looks good to me.

-- Luc

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2019-03-21 20:12 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-03-21  0:34 [PATCH v2 0/4] RCU fixes for rcu_assign_pointer() usage Joel Fernandes (Google)
2019-03-21  0:34 ` [PATCH v2 1/4] sched/cpufreq: Annotate cpufreq_update_util_data pointer with __rcu Joel Fernandes (Google)
2019-03-21  0:34 ` [PATCH v2 2/4] sched_domain: Annotate RCU pointers properly Joel Fernandes (Google)
2019-03-21  0:34 ` [PATCH v2 3/4] rcuwait: Annotate task_struct with __rcu Joel Fernandes (Google)
2019-03-21  0:34 ` [PATCH v2 4/4] sched: Annotate perf_domain pointer " Joel Fernandes (Google)
2019-03-21 17:58 ` [PATCH v2 0/4] RCU fixes for rcu_assign_pointer() usage Peter Zijlstra
2019-03-21 20:12 ` Luc Van Oostenryck

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).