]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
ftrace: Add comment to why rcu_dereference_sched() is open coded
authorSteven Rostedt (VMware) <rostedt@goodmis.org>
Wed, 5 Feb 2020 07:17:57 +0000 (02:17 -0500)
committerKhalid Elmously <khalid.elmously@canonical.com>
Fri, 13 Mar 2020 04:31:00 +0000 (00:31 -0400)
BugLink: https://bugs.launchpad.net/bugs/1866678
[ 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>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Khalid Elmously <khalid.elmously@canonical.com>
kernel/trace/trace.h

index eb7b60d99af501bd50a14d158ae4a49b6dfd24bf..6c4e84f451ce3794ecff7a44a1a3a08beac0cd21 100644 (file)
@@ -877,6 +877,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)) {
@@ -924,6 +929,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());