Merge tag 'exfat-for-5.11-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/linki...
[linux-2.6-microblaze.git] / kernel / trace / ftrace.c
index 9c1bba8..4d8e355 100644 (file)
@@ -80,7 +80,7 @@ enum {
 
 struct ftrace_ops ftrace_list_end __read_mostly = {
        .func           = ftrace_stub,
-       .flags          = FTRACE_OPS_FL_RECURSION_SAFE | FTRACE_OPS_FL_STUB,
+       .flags          = FTRACE_OPS_FL_STUB,
        INIT_OPS_HASH(ftrace_list_end)
 };
 
@@ -121,7 +121,7 @@ struct ftrace_ops global_ops;
 
 #if ARCH_SUPPORTS_FTRACE_OPS
 static void ftrace_ops_list_func(unsigned long ip, unsigned long parent_ip,
-                                struct ftrace_ops *op, struct pt_regs *regs);
+                                struct ftrace_ops *op, struct ftrace_regs *fregs);
 #else
 /* See comment below, where ftrace_ops_list_func is defined */
 static void ftrace_ops_no_ops(unsigned long ip, unsigned long parent_ip);
@@ -140,7 +140,7 @@ static inline void ftrace_ops_init(struct ftrace_ops *ops)
 }
 
 static void ftrace_pid_func(unsigned long ip, unsigned long parent_ip,
-                           struct ftrace_ops *op, struct pt_regs *regs)
+                           struct ftrace_ops *op, struct ftrace_regs *fregs)
 {
        struct trace_array *tr = op->private;
        int pid;
@@ -154,7 +154,7 @@ static void ftrace_pid_func(unsigned long ip, unsigned long parent_ip,
                        return;
        }
 
-       op->saved_func(ip, parent_ip, op, regs);
+       op->saved_func(ip, parent_ip, op, fregs);
 }
 
 static void ftrace_sync_ipi(void *data)
@@ -754,7 +754,7 @@ ftrace_profile_alloc(struct ftrace_profile_stat *stat, unsigned long ip)
 
 static void
 function_profile_call(unsigned long ip, unsigned long parent_ip,
-                     struct ftrace_ops *ops, struct pt_regs *regs)
+                     struct ftrace_ops *ops, struct ftrace_regs *fregs)
 {
        struct ftrace_profile_stat *stat;
        struct ftrace_profile *rec;
@@ -866,7 +866,7 @@ static void unregister_ftrace_profiler(void)
 #else
 static struct ftrace_ops ftrace_profile_ops __read_mostly = {
        .func           = function_profile_call,
-       .flags          = FTRACE_OPS_FL_RECURSION_SAFE | FTRACE_OPS_FL_INITIALIZED,
+       .flags          = FTRACE_OPS_FL_INITIALIZED,
        INIT_OPS_HASH(ftrace_profile_ops)
 };
 
@@ -1040,8 +1040,7 @@ struct ftrace_ops global_ops = {
        .local_hash.notrace_hash        = EMPTY_HASH,
        .local_hash.filter_hash         = EMPTY_HASH,
        INIT_OPS_HASH(global_ops)
-       .flags                          = FTRACE_OPS_FL_RECURSION_SAFE |
-                                         FTRACE_OPS_FL_INITIALIZED |
+       .flags                          = FTRACE_OPS_FL_INITIALIZED |
                                          FTRACE_OPS_FL_PID,
 };
 
@@ -2146,6 +2145,7 @@ static int ftrace_check_record(struct dyn_ftrace *rec, bool enable, bool update)
                                else
                                        rec->flags &= ~FTRACE_FL_TRAMP_EN;
                        }
+
                        if (flag & FTRACE_FL_DIRECT) {
                                /*
                                 * If there's only one user (direct_ops helper)
@@ -2389,8 +2389,9 @@ unsigned long ftrace_find_rec_direct(unsigned long ip)
 }
 
 static void call_direct_funcs(unsigned long ip, unsigned long pip,
-                             struct ftrace_ops *ops, struct pt_regs *regs)
+                             struct ftrace_ops *ops, struct ftrace_regs *fregs)
 {
+       struct pt_regs *regs = ftrace_get_regs(fregs);
        unsigned long addr;
 
        addr = ftrace_find_rec_direct(ip);
@@ -2402,7 +2403,7 @@ static void call_direct_funcs(unsigned long ip, unsigned long pip,
 
 struct ftrace_ops direct_ops = {
        .func           = call_direct_funcs,
-       .flags          = FTRACE_OPS_FL_IPMODIFY | FTRACE_OPS_FL_RECURSION_SAFE
+       .flags          = FTRACE_OPS_FL_IPMODIFY
                          | FTRACE_OPS_FL_DIRECT | FTRACE_OPS_FL_SAVE_REGS
                          | FTRACE_OPS_FL_PERMANENT,
        /*
@@ -4183,7 +4184,6 @@ static void process_mod_list(struct list_head *head, struct ftrace_ops *ops,
        struct ftrace_hash **orig_hash, *new_hash;
        LIST_HEAD(process_mods);
        char *func;
-       int ret;
 
        mutex_lock(&ops->func_hash->regex_lock);
 
@@ -4236,7 +4236,7 @@ static void process_mod_list(struct list_head *head, struct ftrace_ops *ops,
 
        mutex_lock(&ftrace_lock);
 
-       ret = ftrace_hash_move_and_update_ops(ops, orig_hash,
+       ftrace_hash_move_and_update_ops(ops, orig_hash,
                                              new_hash, enable);
        mutex_unlock(&ftrace_lock);
 
@@ -4314,7 +4314,7 @@ static int __init ftrace_mod_cmd_init(void)
 core_initcall(ftrace_mod_cmd_init);
 
 static void function_trace_probe_call(unsigned long ip, unsigned long parent_ip,
-                                     struct ftrace_ops *op, struct pt_regs *pt_regs)
+                                     struct ftrace_ops *op, struct ftrace_regs *fregs)
 {
        struct ftrace_probe_ops *probe_ops;
        struct ftrace_func_probe *probe;
@@ -5588,7 +5588,6 @@ int ftrace_regex_release(struct inode *inode, struct file *file)
        struct ftrace_hash **orig_hash;
        struct trace_parser *parser;
        int filter_hash;
-       int ret;
 
        if (file->f_mode & FMODE_READ) {
                iter = m->private;
@@ -5616,7 +5615,7 @@ int ftrace_regex_release(struct inode *inode, struct file *file)
                        orig_hash = &iter->ops->func_hash->notrace_hash;
 
                mutex_lock(&ftrace_lock);
-               ret = ftrace_hash_move_and_update_ops(iter->ops, orig_hash,
+               ftrace_hash_move_and_update_ops(iter->ops, orig_hash,
                                                      iter->hash, filter_hash);
                mutex_unlock(&ftrace_lock);
        } else {
@@ -6884,8 +6883,7 @@ void ftrace_init_trace_array(struct trace_array *tr)
 
 struct ftrace_ops global_ops = {
        .func                   = ftrace_stub,
-       .flags                  = FTRACE_OPS_FL_RECURSION_SAFE |
-                                 FTRACE_OPS_FL_INITIALIZED |
+       .flags                  = FTRACE_OPS_FL_INITIALIZED |
                                  FTRACE_OPS_FL_PID,
 };
 
@@ -6935,12 +6933,13 @@ void ftrace_reset_array_ops(struct trace_array *tr)
 
 static nokprobe_inline void
 __ftrace_ops_list_func(unsigned long ip, unsigned long parent_ip,
-                      struct ftrace_ops *ignored, struct pt_regs *regs)
+                      struct ftrace_ops *ignored, struct ftrace_regs *fregs)
 {
+       struct pt_regs *regs = ftrace_get_regs(fregs);
        struct ftrace_ops *op;
        int bit;
 
-       bit = trace_test_and_set_recursion(TRACE_LIST_START, TRACE_LIST_MAX);
+       bit = trace_test_and_set_recursion(ip, parent_ip, TRACE_LIST_START, TRACE_LIST_MAX);
        if (bit < 0)
                return;
 
@@ -6969,7 +6968,7 @@ __ftrace_ops_list_func(unsigned long ip, unsigned long parent_ip,
                                pr_warn("op=%p %pS\n", op, op);
                                goto out;
                        }
-                       op->func(ip, parent_ip, op, regs);
+                       op->func(ip, parent_ip, op, fregs);
                }
        } while_for_each_ftrace_op(op);
 out:
@@ -6992,9 +6991,9 @@ out:
  */
 #if ARCH_SUPPORTS_FTRACE_OPS
 static void ftrace_ops_list_func(unsigned long ip, unsigned long parent_ip,
-                                struct ftrace_ops *op, struct pt_regs *regs)
+                                struct ftrace_ops *op, struct ftrace_regs *fregs)
 {
-       __ftrace_ops_list_func(ip, parent_ip, NULL, regs);
+       __ftrace_ops_list_func(ip, parent_ip, NULL, fregs);
 }
 NOKPROBE_SYMBOL(ftrace_ops_list_func);
 #else
@@ -7011,18 +7010,18 @@ NOKPROBE_SYMBOL(ftrace_ops_no_ops);
  * this function will be called by the mcount trampoline.
  */
 static void ftrace_ops_assist_func(unsigned long ip, unsigned long parent_ip,
-                                  struct ftrace_ops *op, struct pt_regs *regs)
+                                  struct ftrace_ops *op, struct ftrace_regs *fregs)
 {
        int bit;
 
-       bit = trace_test_and_set_recursion(TRACE_LIST_START, TRACE_LIST_MAX);
+       bit = trace_test_and_set_recursion(ip, parent_ip, TRACE_LIST_START, TRACE_LIST_MAX);
        if (bit < 0)
                return;
 
        preempt_disable_notrace();
 
        if (!(op->flags & FTRACE_OPS_FL_RCU) || rcu_is_watching())
-               op->func(ip, parent_ip, op, regs);
+               op->func(ip, parent_ip, op, fregs);
 
        preempt_enable_notrace();
        trace_clear_recursion(bit);
@@ -7043,11 +7042,11 @@ NOKPROBE_SYMBOL(ftrace_ops_assist_func);
 ftrace_func_t ftrace_ops_get_func(struct ftrace_ops *ops)
 {
        /*
-        * If the function does not handle recursion, needs to be RCU safe,
-        * or does per cpu logic, then we need to call the assist handler.
+        * If the function does not handle recursion or needs to be RCU safe,
+        * then we need to call the assist handler.
         */
-       if (!(ops->flags & FTRACE_OPS_FL_RECURSION_SAFE) ||
-           ops->flags & FTRACE_OPS_FL_RCU)
+       if (ops->flags & (FTRACE_OPS_FL_RECURSION |
+                         FTRACE_OPS_FL_RCU))
                return ftrace_ops_assist_func;
 
        return ops->func;