* [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).