* [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; 15+ 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] 15+ 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-04-03 8:39 ` [tip:sched/core] " tip-bot for Joel Fernandes (Google)
2019-04-03 10:46 ` tip-bot for 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, 2 replies; 15+ 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] 15+ 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-04-03 8:39 ` [tip:sched/core] " tip-bot for Joel Fernandes (Google)
2019-04-03 10:46 ` tip-bot for 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, 2 replies; 15+ 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] 15+ 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-04-03 8:40 ` [tip:sched/core] " tip-bot for Joel Fernandes (Google)
2019-04-03 10:47 ` tip-bot for 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, 2 replies; 15+ 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] 15+ 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-04-03 8:41 ` [tip:sched/core] sched/core: " tip-bot for Joel Fernandes (Google)
2019-04-03 10:48 ` tip-bot for 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, 2 replies; 15+ 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] 15+ 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; 15+ 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] 15+ 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; 15+ 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] 15+ messages in thread
* [tip:sched/core] sched/cpufreq: Annotate cpufreq_update_util_data pointer with __rcu
2019-03-21 0:34 ` [PATCH v2 1/4] sched/cpufreq: Annotate cpufreq_update_util_data pointer with __rcu Joel Fernandes (Google)
@ 2019-04-03 8:39 ` tip-bot for Joel Fernandes (Google)
2019-04-03 10:46 ` tip-bot for Joel Fernandes (Google)
1 sibling, 0 replies; 15+ messages in thread
From: tip-bot for Joel Fernandes (Google) @ 2019-04-03 8:39 UTC (permalink / raw)
To: linux-tip-commits
Cc: morten.rasmussen, josh, jiangshanlai, mingo, torvalds, joel,
rostedt, linux-kernel, efault, mathieu.desnoyers, hpa, tglx,
peterz, luc.vanoostenryck, paulmck
Commit-ID: 8f9affdf4094bde418a0dbd8b52bb503ee486469
Gitweb: https://git.kernel.org/tip/8f9affdf4094bde418a0dbd8b52bb503ee486469
Author: Joel Fernandes (Google) <joel@joelfernandes.org>
AuthorDate: Wed, 20 Mar 2019 20:34:23 -0400
Committer: Ingo Molnar <mingo@kernel.org>
CommitDate: Wed, 3 Apr 2019 09:51:01 +0200
sched/cpufreq: Annotate cpufreq_update_util_data pointer with __rcu
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.
Signed-off-by: Joel Fernandes (Google) <joel@joelfernandes.org>
[ From an RCU perspective. ]
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Paul E. McKenney <paulmck@linux.ibm.com>
Cc: Josh Triplett <josh@joshtriplett.org>
Cc: Lai Jiangshan <jiangshanlai@gmail.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Morten Rasmussen <morten.rasmussen@arm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: keescook@chromium.org
Cc: kernel-hardening@lists.openwall.com
Cc: kernel-team@android.com
Link: https://lkml.kernel.org/r/20190321003426.160260-2-joel@joelfernandes.org
Signed-off-by: Ingo Molnar <mingo@kernel.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.
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [tip:sched/core] sched_domain: Annotate RCU pointers properly
2019-03-21 0:34 ` [PATCH v2 2/4] sched_domain: Annotate RCU pointers properly Joel Fernandes (Google)
@ 2019-04-03 8:39 ` tip-bot for Joel Fernandes (Google)
2019-04-03 10:46 ` tip-bot for Joel Fernandes (Google)
1 sibling, 0 replies; 15+ messages in thread
From: tip-bot for Joel Fernandes (Google) @ 2019-04-03 8:39 UTC (permalink / raw)
To: linux-tip-commits
Cc: mingo, jiangshanlai, peterz, torvalds, efault, linux-kernel,
luc.vanoostenryck, paulmck, morten.rasmussen, mathieu.desnoyers,
rostedt, josh, hpa, joel, tglx
Commit-ID: 8e000ec0716d953f905e8f8ca2a6c71bb31bbf5d
Gitweb: https://git.kernel.org/tip/8e000ec0716d953f905e8f8ca2a6c71bb31bbf5d
Author: Joel Fernandes (Google) <joel@joelfernandes.org>
AuthorDate: Wed, 20 Mar 2019 20:34:24 -0400
Committer: Ingo Molnar <mingo@kernel.org>
CommitDate: Wed, 3 Apr 2019 09:51:03 +0200
sched_domain: Annotate RCU pointers properly
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
Signed-off-by: Joel Fernandes (Google) <joel@joelfernandes.org>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
[ From an RCU perspective. ]
Reviewed-by: Paul E. McKenney <paulmck@linux.ibm.com>
Cc: Josh Triplett <josh@joshtriplett.org>
Cc: Lai Jiangshan <jiangshanlai@gmail.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Morten Rasmussen <morten.rasmussen@arm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: keescook@chromium.org
Cc: kernel-hardening@lists.openwall.com
Cc: kernel-team@android.com
Link: https://lkml.kernel.org/r/20190321003426.160260-3-joel@joelfernandes.org
Signed-off-by: Ingo Molnar <mingo@kernel.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)
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [tip:sched/core] rcuwait: Annotate task_struct with __rcu
2019-03-21 0:34 ` [PATCH v2 3/4] rcuwait: Annotate task_struct with __rcu Joel Fernandes (Google)
@ 2019-04-03 8:40 ` tip-bot for Joel Fernandes (Google)
2019-04-03 10:47 ` tip-bot for Joel Fernandes (Google)
1 sibling, 0 replies; 15+ messages in thread
From: tip-bot for Joel Fernandes (Google) @ 2019-04-03 8:40 UTC (permalink / raw)
To: linux-tip-commits
Cc: paulmck, josh, rostedt, linux-kernel, joel, efault, torvalds,
mathieu.desnoyers, morten.rasmussen, luc.vanoostenryck, mingo,
tglx, peterz, jiangshanlai, hpa
Commit-ID: ea3ce866b568e087737df666c2c035496f54fdcb
Gitweb: https://git.kernel.org/tip/ea3ce866b568e087737df666c2c035496f54fdcb
Author: Joel Fernandes (Google) <joel@joelfernandes.org>
AuthorDate: Wed, 20 Mar 2019 20:34:25 -0400
Committer: Ingo Molnar <mingo@kernel.org>
CommitDate: Wed, 3 Apr 2019 09:51:04 +0200
rcuwait: Annotate task_struct with __rcu
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
Signed-off-by: Joel Fernandes (Google) <joel@joelfernandes.org>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
[ From an RCU perspective. ]
Reviewed-by: Paul E. McKenney <paulmck@linux.ibm.com>
Cc: Josh Triplett <josh@joshtriplett.org>
Cc: Lai Jiangshan <jiangshanlai@gmail.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Morten Rasmussen <morten.rasmussen@arm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: keescook@chromium.org
Cc: kernel-hardening@lists.openwall.com
Cc: kernel-team@android.com
Link: https://lkml.kernel.org/r/20190321003426.160260-4-joel@joelfernandes.org
Signed-off-by: Ingo Molnar <mingo@kernel.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) \
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [tip:sched/core] sched/core: Annotate perf_domain pointer with __rcu
2019-03-21 0:34 ` [PATCH v2 4/4] sched: Annotate perf_domain pointer " Joel Fernandes (Google)
@ 2019-04-03 8:41 ` tip-bot for Joel Fernandes (Google)
2019-04-03 10:48 ` tip-bot for Joel Fernandes (Google)
1 sibling, 0 replies; 15+ messages in thread
From: tip-bot for Joel Fernandes (Google) @ 2019-04-03 8:41 UTC (permalink / raw)
To: linux-tip-commits
Cc: peterz, paulmck, torvalds, hpa, efault, mingo, morten.rasmussen,
josh, linux-kernel, mathieu.desnoyers, joel, jiangshanlai,
luc.vanoostenryck, tglx, rostedt
Commit-ID: 2e7d58babd2a6073d1afb38519e246dd4a423da5
Gitweb: https://git.kernel.org/tip/2e7d58babd2a6073d1afb38519e246dd4a423da5
Author: Joel Fernandes (Google) <joel@joelfernandes.org>
AuthorDate: Wed, 20 Mar 2019 20:34:26 -0400
Committer: Ingo Molnar <mingo@kernel.org>
CommitDate: Wed, 3 Apr 2019 09:51:04 +0200
sched/core: Annotate perf_domain pointer with __rcu
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.
Signed-off-by: Joel Fernandes (Google) <joel@joelfernandes.org>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
[ From an RCU perspective. ]
Reviewed-by: Paul E. McKenney <paulmck@linux.ibm.com>
Cc: Josh Triplett <josh@joshtriplett.org>
Cc: Lai Jiangshan <jiangshanlai@gmail.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Morten Rasmussen <morten.rasmussen@arm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: keescook@chromium.org
Cc: kernel-hardening@lists.openwall.com
Cc: kernel-team@android.com
Link: https://lkml.kernel.org/r/20190321003426.160260-5-joel@joelfernandes.org
Signed-off-by: Ingo Molnar <mingo@kernel.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;
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [tip:sched/core] sched/cpufreq: Annotate cpufreq_update_util_data pointer with __rcu
2019-03-21 0:34 ` [PATCH v2 1/4] sched/cpufreq: Annotate cpufreq_update_util_data pointer with __rcu Joel Fernandes (Google)
2019-04-03 8:39 ` [tip:sched/core] " tip-bot for Joel Fernandes (Google)
@ 2019-04-03 10:46 ` tip-bot for Joel Fernandes (Google)
1 sibling, 0 replies; 15+ messages in thread
From: tip-bot for Joel Fernandes (Google) @ 2019-04-03 10:46 UTC (permalink / raw)
To: linux-tip-commits
Cc: mingo, tglx, rostedt, josh, luc.vanoostenryck, efault, joel,
torvalds, hpa, jiangshanlai, morten.rasmussen, linux-kernel,
paulmck, mathieu.desnoyers, peterz
Commit-ID: b10abd0a8859493a93c6b8020f2be2587557749d
Gitweb: https://git.kernel.org/tip/b10abd0a8859493a93c6b8020f2be2587557749d
Author: Joel Fernandes (Google) <joel@joelfernandes.org>
AuthorDate: Wed, 20 Mar 2019 20:34:23 -0400
Committer: Ingo Molnar <mingo@kernel.org>
CommitDate: Wed, 3 Apr 2019 12:34:31 +0200
sched/cpufreq: Annotate cpufreq_update_util_data pointer with __rcu
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.
Signed-off-by: Joel Fernandes (Google) <joel@joelfernandes.org>
[ From an RCU perspective. ]
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Paul E. McKenney <paulmck@linux.ibm.com>
Cc: Josh Triplett <josh@joshtriplett.org>
Cc: Lai Jiangshan <jiangshanlai@gmail.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Morten Rasmussen <morten.rasmussen@arm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: keescook@chromium.org
Cc: kernel-hardening@lists.openwall.com
Cc: kernel-team@android.com
Link: https://lkml.kernel.org/r/20190321003426.160260-2-joel@joelfernandes.org
Signed-off-by: Ingo Molnar <mingo@kernel.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.
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [tip:sched/core] sched_domain: Annotate RCU pointers properly
2019-03-21 0:34 ` [PATCH v2 2/4] sched_domain: Annotate RCU pointers properly Joel Fernandes (Google)
2019-04-03 8:39 ` [tip:sched/core] " tip-bot for Joel Fernandes (Google)
@ 2019-04-03 10:46 ` tip-bot for Joel Fernandes (Google)
1 sibling, 0 replies; 15+ messages in thread
From: tip-bot for Joel Fernandes (Google) @ 2019-04-03 10:46 UTC (permalink / raw)
To: linux-tip-commits
Cc: peterz, linux-kernel, rostedt, paulmck, jiangshanlai, tglx,
luc.vanoostenryck, joel, morten.rasmussen, hpa, josh,
mathieu.desnoyers, torvalds, mingo, efault
Commit-ID: 994aeb7a93e43d28f6074195ccb03a384342e1bf
Gitweb: https://git.kernel.org/tip/994aeb7a93e43d28f6074195ccb03a384342e1bf
Author: Joel Fernandes (Google) <joel@joelfernandes.org>
AuthorDate: Wed, 20 Mar 2019 20:34:24 -0400
Committer: Ingo Molnar <mingo@kernel.org>
CommitDate: Wed, 3 Apr 2019 12:34:31 +0200
sched_domain: Annotate RCU pointers properly
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
Signed-off-by: Joel Fernandes (Google) <joel@joelfernandes.org>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
[ From an RCU perspective. ]
Reviewed-by: Paul E. McKenney <paulmck@linux.ibm.com>
Cc: Josh Triplett <josh@joshtriplett.org>
Cc: Lai Jiangshan <jiangshanlai@gmail.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Morten Rasmussen <morten.rasmussen@arm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: keescook@chromium.org
Cc: kernel-hardening@lists.openwall.com
Cc: kernel-team@android.com
Link: https://lkml.kernel.org/r/20190321003426.160260-3-joel@joelfernandes.org
Signed-off-by: Ingo Molnar <mingo@kernel.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)
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [tip:sched/core] rcuwait: Annotate task_struct with __rcu
2019-03-21 0:34 ` [PATCH v2 3/4] rcuwait: Annotate task_struct with __rcu Joel Fernandes (Google)
2019-04-03 8:40 ` [tip:sched/core] " tip-bot for Joel Fernandes (Google)
@ 2019-04-03 10:47 ` tip-bot for Joel Fernandes (Google)
1 sibling, 0 replies; 15+ messages in thread
From: tip-bot for Joel Fernandes (Google) @ 2019-04-03 10:47 UTC (permalink / raw)
To: linux-tip-commits
Cc: rostedt, morten.rasmussen, hpa, mingo, tglx, linux-kernel,
paulmck, josh, efault, joel, jiangshanlai, luc.vanoostenryck,
peterz, torvalds, mathieu.desnoyers
Commit-ID: 03f4b48edae7d936c5bf23488c1ce3fbe7fc2733
Gitweb: https://git.kernel.org/tip/03f4b48edae7d936c5bf23488c1ce3fbe7fc2733
Author: Joel Fernandes (Google) <joel@joelfernandes.org>
AuthorDate: Wed, 20 Mar 2019 20:34:25 -0400
Committer: Ingo Molnar <mingo@kernel.org>
CommitDate: Wed, 3 Apr 2019 12:34:31 +0200
rcuwait: Annotate task_struct with __rcu
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
Signed-off-by: Joel Fernandes (Google) <joel@joelfernandes.org>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
[ From an RCU perspective. ]
Reviewed-by: Paul E. McKenney <paulmck@linux.ibm.com>
Cc: Josh Triplett <josh@joshtriplett.org>
Cc: Lai Jiangshan <jiangshanlai@gmail.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Morten Rasmussen <morten.rasmussen@arm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: keescook@chromium.org
Cc: kernel-hardening@lists.openwall.com
Cc: kernel-team@android.com
Link: https://lkml.kernel.org/r/20190321003426.160260-4-joel@joelfernandes.org
Signed-off-by: Ingo Molnar <mingo@kernel.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) \
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [tip:sched/core] sched/core: Annotate perf_domain pointer with __rcu
2019-03-21 0:34 ` [PATCH v2 4/4] sched: Annotate perf_domain pointer " Joel Fernandes (Google)
2019-04-03 8:41 ` [tip:sched/core] sched/core: " tip-bot for Joel Fernandes (Google)
@ 2019-04-03 10:48 ` tip-bot for Joel Fernandes (Google)
1 sibling, 0 replies; 15+ messages in thread
From: tip-bot for Joel Fernandes (Google) @ 2019-04-03 10:48 UTC (permalink / raw)
To: linux-tip-commits
Cc: josh, linux-kernel, tglx, torvalds, rostedt, mingo,
morten.rasmussen, jiangshanlai, paulmck, joel, luc.vanoostenryck,
hpa, mathieu.desnoyers, peterz, efault
Commit-ID: 7ba7319f9e3898101bff5d63cbae5a6cc174c8c9
Gitweb: https://git.kernel.org/tip/7ba7319f9e3898101bff5d63cbae5a6cc174c8c9
Author: Joel Fernandes (Google) <joel@joelfernandes.org>
AuthorDate: Wed, 20 Mar 2019 20:34:26 -0400
Committer: Ingo Molnar <mingo@kernel.org>
CommitDate: Wed, 3 Apr 2019 12:34:31 +0200
sched/core: Annotate perf_domain pointer with __rcu
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.
Signed-off-by: Joel Fernandes (Google) <joel@joelfernandes.org>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
[ From an RCU perspective. ]
Reviewed-by: Paul E. McKenney <paulmck@linux.ibm.com>
Cc: Josh Triplett <josh@joshtriplett.org>
Cc: Lai Jiangshan <jiangshanlai@gmail.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Morten Rasmussen <morten.rasmussen@arm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: keescook@chromium.org
Cc: kernel-hardening@lists.openwall.com
Cc: kernel-team@android.com
Link: https://lkml.kernel.org/r/20190321003426.160260-5-joel@joelfernandes.org
Signed-off-by: Ingo Molnar <mingo@kernel.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;
^ permalink raw reply related [flat|nested] 15+ messages in thread
end of thread, other threads:[~2019-04-03 10:48 UTC | newest]
Thread overview: 15+ 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-04-03 8:39 ` [tip:sched/core] " tip-bot for Joel Fernandes (Google)
2019-04-03 10:46 ` tip-bot for Joel Fernandes (Google)
2019-03-21 0:34 ` [PATCH v2 2/4] sched_domain: Annotate RCU pointers properly Joel Fernandes (Google)
2019-04-03 8:39 ` [tip:sched/core] " tip-bot for Joel Fernandes (Google)
2019-04-03 10:46 ` tip-bot for Joel Fernandes (Google)
2019-03-21 0:34 ` [PATCH v2 3/4] rcuwait: Annotate task_struct with __rcu Joel Fernandes (Google)
2019-04-03 8:40 ` [tip:sched/core] " tip-bot for Joel Fernandes (Google)
2019-04-03 10:47 ` tip-bot for Joel Fernandes (Google)
2019-03-21 0:34 ` [PATCH v2 4/4] sched: Annotate perf_domain pointer " Joel Fernandes (Google)
2019-04-03 8:41 ` [tip:sched/core] sched/core: " tip-bot for Joel Fernandes (Google)
2019-04-03 10:48 ` tip-bot for 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).