| From 6112c1ba351c997f1ba2a0f7ab0bc3091f78819d 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 497defe9ed264..b769638f005c7 100644 |
| --- a/kernel/trace/trace.h |
| +++ b/kernel/trace/trace.h |
| @@ -961,6 +961,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)) { |
| @@ -1008,6 +1013,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 |
| |