This is a revert of commit 013bf0da047481 ("ftrace: Add
ftrace_find_direct_func()")

ftrace_find_direct_func() was meant for use in the function graph tracer
by architecture specific code. However, commit ff205766dbbee0 ("ftrace:
Fix function_graph tracer interaction with BPF trampoline") disabled
function graph tracer for direct calls leaving this without any users.

In addition, modify_ftrace_direct() allowed redirecting the direct call
to a different trampoline that was never registered through
register_ftrace_direct(). This meant that ftrace_direct_funcs didn't
capture all trampolines.

Signed-off-by: Naveen N. Rao <naveen.n....@linux.vnet.ibm.com>
---
 include/linux/ftrace.h |  5 ---
 kernel/trace/ftrace.c  | 84 ++----------------------------------------
 2 files changed, 4 insertions(+), 85 deletions(-)

diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h
index 1bd3a0356ae478..46b4b7ee28c41f 100644
--- a/include/linux/ftrace.h
+++ b/include/linux/ftrace.h
@@ -285,7 +285,6 @@ extern int ftrace_direct_func_count;
 int register_ftrace_direct(unsigned long ip, unsigned long addr);
 int unregister_ftrace_direct(unsigned long ip, unsigned long addr);
 int modify_ftrace_direct(unsigned long ip, unsigned long old_addr, unsigned 
long new_addr);
-struct ftrace_direct_func *ftrace_find_direct_func(unsigned long addr);
 int ftrace_modify_direct_caller(struct ftrace_func_entry *entry,
                                struct dyn_ftrace *rec,
                                unsigned long old_addr,
@@ -306,10 +305,6 @@ static inline int modify_ftrace_direct(unsigned long ip,
 {
        return -ENOTSUPP;
 }
-static inline struct ftrace_direct_func *ftrace_find_direct_func(unsigned long 
addr)
-{
-       return NULL;
-}
 static inline int ftrace_modify_direct_caller(struct ftrace_func_entry *entry,
                                              struct dyn_ftrace *rec,
                                              unsigned long old_addr,
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
index 3844a4a1346a9c..7476f2458b6d95 100644
--- a/kernel/trace/ftrace.c
+++ b/kernel/trace/ftrace.c
@@ -5005,46 +5005,6 @@ ftrace_set_addr(struct ftrace_ops *ops, unsigned long 
ip, int remove,
 }
 
 #ifdef CONFIG_DYNAMIC_FTRACE_WITH_DIRECT_CALLS
-
-struct ftrace_direct_func {
-       struct list_head        next;
-       unsigned long           addr;
-       int                     count;
-};
-
-static LIST_HEAD(ftrace_direct_funcs);
-
-/**
- * ftrace_find_direct_func - test an address if it is a registered direct 
caller
- * @addr: The address of a registered direct caller
- *
- * This searches to see if a ftrace direct caller has been registered
- * at a specific address, and if so, it returns a descriptor for it.
- *
- * This can be used by architecture code to see if an address is
- * a direct caller (trampoline) attached to a fentry/mcount location.
- * This is useful for the function_graph tracer, as it may need to
- * do adjustments if it traced a location that also has a direct
- * trampoline attached to it.
- */
-struct ftrace_direct_func *ftrace_find_direct_func(unsigned long addr)
-{
-       struct ftrace_direct_func *entry;
-       bool found = false;
-
-       /* May be called by fgraph trampoline (protected by rcu tasks) */
-       list_for_each_entry_rcu(entry, &ftrace_direct_funcs, next) {
-               if (entry->addr == addr) {
-                       found = true;
-                       break;
-               }
-       }
-       if (found)
-               return entry;
-
-       return NULL;
-}
-
 /**
  * register_ftrace_direct - Call a custom trampoline directly
  * @ip: The address of the nop at the beginning of a function
@@ -5064,7 +5024,6 @@ struct ftrace_direct_func 
*ftrace_find_direct_func(unsigned long addr)
  */
 int register_ftrace_direct(unsigned long ip, unsigned long addr)
 {
-       struct ftrace_direct_func *direct;
        struct ftrace_func_entry *entry;
        struct ftrace_hash *free_hash = NULL;
        struct dyn_ftrace *rec;
@@ -5118,19 +5077,7 @@ int register_ftrace_direct(unsigned long ip, unsigned 
long addr)
        if (!entry)
                goto out_unlock;
 
-       direct = ftrace_find_direct_func(addr);
-       if (!direct) {
-               direct = kmalloc(sizeof(*direct), GFP_KERNEL);
-               if (!direct) {
-                       kfree(entry);
-                       goto out_unlock;
-               }
-               direct->addr = addr;
-               direct->count = 0;
-               list_add_rcu(&direct->next, &ftrace_direct_funcs);
-               ftrace_direct_func_count++;
-       }
-
+       ftrace_direct_func_count++;
        entry->ip = ip;
        entry->direct = addr;
        __add_hash_entry(direct_functions, entry);
@@ -5145,18 +5092,8 @@ int register_ftrace_direct(unsigned long ip, unsigned 
long addr)
 
        if (ret) {
                remove_hash_entry(direct_functions, entry);
+               ftrace_direct_func_count--;
                kfree(entry);
-               if (!direct->count) {
-                       list_del_rcu(&direct->next);
-                       synchronize_rcu_tasks();
-                       kfree(direct);
-                       if (free_hash)
-                               free_ftrace_hash(free_hash);
-                       free_hash = NULL;
-                       ftrace_direct_func_count--;
-               }
-       } else {
-               direct->count++;
        }
  out_unlock:
        mutex_unlock(&direct_mutex);
@@ -5199,7 +5136,6 @@ static struct ftrace_func_entry 
*find_direct_entry(unsigned long *ip,
 
 int unregister_ftrace_direct(unsigned long ip, unsigned long addr)
 {
-       struct ftrace_direct_func *direct;
        struct ftrace_func_entry *entry;
        int ret = -ENODEV;
 
@@ -5217,20 +5153,8 @@ int unregister_ftrace_direct(unsigned long ip, unsigned 
long addr)
        WARN_ON(ret);
 
        remove_hash_entry(direct_functions, entry);
-
-       direct = ftrace_find_direct_func(addr);
-       if (!WARN_ON(!direct)) {
-               /* This is the good path (see the ! before WARN) */
-               direct->count--;
-               WARN_ON(direct->count < 0);
-               if (!direct->count) {
-                       list_del_rcu(&direct->next);
-                       synchronize_rcu_tasks();
-                       kfree(direct);
-                       kfree(entry);
-                       ftrace_direct_func_count--;
-               }
-       }
+       ftrace_direct_func_count--;
+       kfree(entry);
  out_unlock:
        mutex_unlock(&direct_mutex);
 
-- 
2.25.4

Reply via email to