This is needed for kgr to find fentry location to be "ftraced". We use
this to find a place where to jump to a new/old code location.

Signed-off-by: Jiri Slaby <[email protected]>
Cc: Steven Rostedt <[email protected]>
Cc: Frederic Weisbecker <[email protected]>
Cc: Ingo Molnar <[email protected]>
---
 include/linux/ftrace.h |  1 +
 kernel/trace/ftrace.c  | 29 +++++++++++++++++++++++++++++
 2 files changed, 30 insertions(+)

diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h
index ae9504b4b67d..8b447493b6a5 100644
--- a/include/linux/ftrace.h
+++ b/include/linux/ftrace.h
@@ -299,6 +299,7 @@ extern void
 unregister_ftrace_function_probe_func(char *glob, struct ftrace_probe_ops 
*ops);
 extern void unregister_ftrace_function_probe_all(char *glob);
 
+extern unsigned long ftrace_function_to_fentry(unsigned long addr);
 extern int ftrace_text_reserved(const void *start, const void *end);
 
 extern int ftrace_nr_registered_ops(void);
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
index 4a54a25afa2f..9968695cdcf9 100644
--- a/kernel/trace/ftrace.c
+++ b/kernel/trace/ftrace.c
@@ -1495,6 +1495,35 @@ ftrace_ops_test(struct ftrace_ops *ops, unsigned long 
ip, void *regs)
                }                               \
        }
 
+/**
+ * ftrace_function_to_fentry -- lookup fentry location for a function
+ * @addr: function address to find a fentry in
+ *
+ * Perform a lookup in a list of fentry callsites to find one that fits a
+ * specified function @addr. It returns the corresponding fentry callsite or
+ * zero on failure.
+ */
+unsigned long ftrace_function_to_fentry(unsigned long addr)
+{
+       const struct dyn_ftrace *rec;
+       const struct ftrace_page *pg;
+       unsigned long ret = 0;
+
+       mutex_lock(&ftrace_lock);
+       do_for_each_ftrace_rec(pg, rec) {
+               unsigned long off;
+               if (!kallsyms_lookup_size_offset(rec->ip, NULL, &off))
+                       continue;
+               if (addr + off == rec->ip) {
+                       ret = rec->ip;
+                       goto end;
+               }
+       } while_for_each_ftrace_rec()
+end:
+       mutex_unlock(&ftrace_lock);
+
+       return ret;
+}
 
 static int ftrace_cmp_recs(const void *a, const void *b)
 {
-- 
1.9.2

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to