| From b7cb2bfdda56f5d45eb9b603be0e5751c1046711 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 5 Feb 2020 02:17:57 -0500 |
| Subject: ftrace: Add comment to why rcu_dereference_sched() is open coded |
| |
| From: Steven Rostedt (VMware) <rostedt@goodmis.org> |
| |
| [ Upstream commit 16052dd5bdfa16dbe18d8c1d4cde2ddab9d23177 ] |
| |
| Because the function graph tracer can execute in sections where RCU is not |
| "watching", the rcu_dereference_sched() for the has needs to be open coded. |
| This is fine because the RCU "flavor" of the ftrace hash is protected by |
| its own RCU handling (it does its own little synchronization on every CPU |
| and does not rely on RCU sched). |
| |
| Acked-by: Joel Fernandes (Google) <joel@joelfernandes.org> |
| Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| kernel/trace/trace.h | 10 ++++++++++ |
| 1 file changed, 10 insertions(+) |
| |
| diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h |
| index cf1a7d1f35109..1721b95ba9b7d 100644 |
| --- a/kernel/trace/trace.h |
| +++ b/kernel/trace/trace.h |
| @@ -883,6 +883,11 @@ static inline int ftrace_graph_addr(struct ftrace_graph_ent *trace) |
| |
| preempt_disable_notrace(); |
| |
| + /* |
| + * Have to open code "rcu_dereference_sched()" because the |
| + * function graph tracer can be called when RCU is not |
| + * "watching". |
| + */ |
| hash = rcu_dereference_protected(ftrace_graph_hash, !preemptible()); |
| |
| if (ftrace_hash_empty(hash)) { |
| @@ -930,6 +935,11 @@ static inline int ftrace_graph_notrace_addr(unsigned long addr) |
| |
| preempt_disable_notrace(); |
| |
| + /* |
| + * Have to open code "rcu_dereference_sched()" because the |
| + * function graph tracer can be called when RCU is not |
| + * "watching". |
| + */ |
| notrace_hash = rcu_dereference_protected(ftrace_graph_notrace_hash, |
| !preemptible()); |
| |
| -- |
| 2.20.1 |
| |