OSDN Git Service

Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[uclinux-h8/linux.git] / kernel / trace / ftrace.c
index 57a6eea..b1870fb 100644 (file)
@@ -1030,8 +1030,7 @@ static __init void ftrace_profile_tracefs(struct dentry *d_tracer)
        for_each_possible_cpu(cpu) {
                stat = &per_cpu(ftrace_profile_stats, cpu);
 
-               /* allocate enough for function name + cpu number */
-               name = kmalloc(32, GFP_KERNEL);
+               name = kasprintf(GFP_KERNEL, "function%d", cpu);
                if (!name) {
                        /*
                         * The files created are permanent, if something happens
@@ -1043,7 +1042,6 @@ static __init void ftrace_profile_tracefs(struct dentry *d_tracer)
                        return;
                }
                stat->stat = function_stats;
-               snprintf(name, 32, "function%d", cpu);
                stat->stat.name = name;
                ret = register_stat_tracer(&stat->stat);
                if (ret) {
@@ -1058,8 +1056,7 @@ static __init void ftrace_profile_tracefs(struct dentry *d_tracer)
        entry = tracefs_create_file("function_profile_enabled", 0644,
                                    d_tracer, NULL, &ftrace_profile_fops);
        if (!entry)
-               pr_warning("Could not create tracefs "
-                          "'function_profile_enabled' entry\n");
+               pr_warn("Could not create tracefs 'function_profile_enabled' entry\n");
 }
 
 #else /* CONFIG_FUNCTION_PROFILER */
@@ -1610,7 +1607,7 @@ static bool test_rec_ops_needs_regs(struct dyn_ftrace *rec)
        return  keep_regs;
 }
 
-static void __ftrace_hash_rec_update(struct ftrace_ops *ops,
+static bool __ftrace_hash_rec_update(struct ftrace_ops *ops,
                                     int filter_hash,
                                     bool inc)
 {
@@ -1618,12 +1615,13 @@ static void __ftrace_hash_rec_update(struct ftrace_ops *ops,
        struct ftrace_hash *other_hash;
        struct ftrace_page *pg;
        struct dyn_ftrace *rec;
+       bool update = false;
        int count = 0;
        int all = 0;
 
        /* Only update if the ops has been registered */
        if (!(ops->flags & FTRACE_OPS_FL_ENABLED))
-               return;
+               return false;
 
        /*
         * In the filter_hash case:
@@ -1650,7 +1648,7 @@ static void __ftrace_hash_rec_update(struct ftrace_ops *ops,
                 * then there's nothing to do.
                 */
                if (ftrace_hash_empty(hash))
-                       return;
+                       return false;
        }
 
        do_for_each_ftrace_rec(pg, rec) {
@@ -1694,7 +1692,7 @@ static void __ftrace_hash_rec_update(struct ftrace_ops *ops,
                if (inc) {
                        rec->flags++;
                        if (FTRACE_WARN_ON(ftrace_rec_count(rec) == FTRACE_REF_MAX))
-                               return;
+                               return false;
 
                        /*
                         * If there's only a single callback registered to a
@@ -1720,7 +1718,7 @@ static void __ftrace_hash_rec_update(struct ftrace_ops *ops,
                                rec->flags |= FTRACE_FL_REGS;
                } else {
                        if (FTRACE_WARN_ON(ftrace_rec_count(rec) == 0))
-                               return;
+                               return false;
                        rec->flags--;
 
                        /*
@@ -1753,22 +1751,28 @@ static void __ftrace_hash_rec_update(struct ftrace_ops *ops,
                         */
                }
                count++;
+
+               /* Must match FTRACE_UPDATE_CALLS in ftrace_modify_all_code() */
+               update |= ftrace_test_record(rec, 1) != FTRACE_UPDATE_IGNORE;
+
                /* Shortcut, if we handled all records, we are done. */
                if (!all && count == hash->count)
-                       return;
+                       return update;
        } while_for_each_ftrace_rec();
+
+       return update;
 }
 
-static void ftrace_hash_rec_disable(struct ftrace_ops *ops,
+static bool ftrace_hash_rec_disable(struct ftrace_ops *ops,
                                    int filter_hash)
 {
-       __ftrace_hash_rec_update(ops, filter_hash, 0);
+       return __ftrace_hash_rec_update(ops, filter_hash, 0);
 }
 
-static void ftrace_hash_rec_enable(struct ftrace_ops *ops,
+static bool ftrace_hash_rec_enable(struct ftrace_ops *ops,
                                   int filter_hash)
 {
-       __ftrace_hash_rec_update(ops, filter_hash, 1);
+       return __ftrace_hash_rec_update(ops, filter_hash, 1);
 }
 
 static void ftrace_hash_rec_update_modify(struct ftrace_ops *ops,
@@ -2314,8 +2318,8 @@ unsigned long ftrace_get_addr_curr(struct dyn_ftrace *rec)
        if (rec->flags & FTRACE_FL_TRAMP_EN) {
                ops = ftrace_find_tramp_ops_curr(rec);
                if (FTRACE_WARN_ON(!ops)) {
-                       pr_warning("Bad trampoline accounting at: %p (%pS)\n",
-                                   (void *)rec->ip, (void *)rec->ip);
+                       pr_warn("Bad trampoline accounting at: %p (%pS)\n",
+                               (void *)rec->ip, (void *)rec->ip);
                        /* Ftrace is shutting down, return anything */
                        return (unsigned long)FTRACE_ADDR;
                }
@@ -2644,7 +2648,6 @@ static int ftrace_startup(struct ftrace_ops *ops, int command)
                return ret;
 
        ftrace_start_up++;
-       command |= FTRACE_UPDATE_CALLS;
 
        /*
         * Note that ftrace probes uses this to start up
@@ -2665,7 +2668,8 @@ static int ftrace_startup(struct ftrace_ops *ops, int command)
                return ret;
        }
 
-       ftrace_hash_rec_enable(ops, 1);
+       if (ftrace_hash_rec_enable(ops, 1))
+               command |= FTRACE_UPDATE_CALLS;
 
        ftrace_startup_enable(command);
 
@@ -2695,11 +2699,11 @@ static int ftrace_shutdown(struct ftrace_ops *ops, int command)
 
        /* Disabling ipmodify never fails */
        ftrace_hash_ipmodify_disable(ops);
-       ftrace_hash_rec_disable(ops, 1);
 
-       ops->flags &= ~FTRACE_OPS_FL_ENABLED;
+       if (ftrace_hash_rec_disable(ops, 1))
+               command |= FTRACE_UPDATE_CALLS;
 
-       command |= FTRACE_UPDATE_CALLS;
+       ops->flags &= ~FTRACE_OPS_FL_ENABLED;
 
        if (saved_ftrace_func != ftrace_trace_function) {
                saved_ftrace_func = ftrace_trace_function;