trace: consolidate unlikely and likely profiler
authorSteven Rostedt <srostedt@redhat.com>
Fri, 21 Nov 2008 05:40:40 +0000 (00:40 -0500)
committerIngo Molnar <mingo@elte.hu>
Sun, 23 Nov 2008 10:39:56 +0000 (11:39 +0100)
Impact: clean up to make one profiler of like and unlikely tracer

The likely and unlikely profiler prints out the file and line numbers
of the annotated branches that it is profiling. It shows the number
of times it was correct or incorrect in its guess. Having two
different files or sections for that matter to tell us if it was a
likely or unlikely is pretty pointless. We really only care if
it was correct or not.

Signed-off-by: Steven Rostedt <srostedt@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
include/asm-generic/vmlinux.lds.h
include/linux/compiler.h
kernel/trace/Kconfig
kernel/trace/trace_branch.c

index 3b46ae464933f7af1a3908e32218d95ca45356c5..8bccb49981e576958508165500f0a94dd2511de8 100644 (file)
 #endif
 
 #ifdef CONFIG_TRACE_BRANCH_PROFILING
-#define LIKELY_PROFILE()       VMLINUX_SYMBOL(__start_likely_profile) = .;   \
-                               *(_ftrace_likely)                             \
-                               VMLINUX_SYMBOL(__stop_likely_profile) = .;    \
-                               VMLINUX_SYMBOL(__start_unlikely_profile) = .; \
-                               *(_ftrace_unlikely)                           \
-                               VMLINUX_SYMBOL(__stop_unlikely_profile) = .;
+#define LIKELY_PROFILE()       VMLINUX_SYMBOL(__start_annotated_branch_profile) = .; \
+                               *(_ftrace_annotated_branch)                           \
+                               VMLINUX_SYMBOL(__stop_annotated_branch_profile) = .;
 #else
 #define LIKELY_PROFILE()
 #endif
index c25e525121f0ae5ab04a91ba1dd498b917a5a758..0628a2013fae9edbda8c79b47a32906f1bb6f11f 100644 (file)
@@ -77,32 +77,18 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);
 #define likely_notrace(x)      __builtin_expect(!!(x), 1)
 #define unlikely_notrace(x)    __builtin_expect(!!(x), 0)
 
-#define likely_check(x) ({                                             \
+#define __branch_check__(x, expect) ({                                 \
                        int ______r;                                    \
                        static struct ftrace_branch_data                \
                                __attribute__((__aligned__(4)))         \
-                               __attribute__((section("_ftrace_likely"))) \
+                               __attribute__((section("_ftrace_annotated_branch"))) \
                                ______f = {                             \
                                .func = __func__,                       \
                                .file = __FILE__,                       \
                                .line = __LINE__,                       \
                        };                                              \
                        ______r = likely_notrace(x);                    \
-                       ftrace_likely_update(&______f, ______r, 1);     \
-                       ______r;                                        \
-               })
-#define unlikely_check(x) ({                                           \
-                       int ______r;                                    \
-                       static struct ftrace_branch_data                \
-                               __attribute__((__aligned__(4)))         \
-                               __attribute__((section("_ftrace_unlikely"))) \
-                               ______f = {                             \
-                               .func = __func__,                       \
-                               .file = __FILE__,                       \
-                               .line = __LINE__,                       \
-                       };                                              \
-                       ______r = unlikely_notrace(x);                  \
-                       ftrace_likely_update(&______f, ______r, 0);     \
+                       ftrace_likely_update(&______f, ______r, expect); \
                        ______r;                                        \
                })
 
@@ -112,10 +98,10 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);
  * written by Daniel Walker.
  */
 # ifndef likely
-#  define likely(x)    (__builtin_constant_p(x) ? !!(x) : likely_check(x))
+#  define likely(x)    (__builtin_constant_p(x) ? !!(x) : __branch_check__(x, 1))
 # endif
 # ifndef unlikely
-#  define unlikely(x)  (__builtin_constant_p(x) ? !!(x) : unlikely_check(x))
+#  define unlikely(x)  (__builtin_constant_p(x) ? !!(x) : __branch_check__(x, 0))
 # endif
 #else
 # define likely(x)     __builtin_expect(!!(x), 1)
index b8378fad29a36602e951d6d0d59afbec5a357aa8..7e354870570830cdbd381e102e08e92ccf9c1f32 100644 (file)
@@ -166,8 +166,7 @@ config TRACE_BRANCH_PROFILING
          This tracer profiles all the the likely and unlikely macros
          in the kernel. It will display the results in:
 
-         /debugfs/tracing/profile_likely
-         /debugfs/tracing/profile_unlikely
+         /debugfs/tracing/profile_annotated_branch
 
          Note: this will add a significant overhead, only turn this
          on if you need to profile the system's use of these macros.
index 23f9b02ce967a2a2564a13e67e77b92552bbfb6f..21dedc8b50a4c8d4f6abab81089070f5de3c8724 100644 (file)
@@ -261,7 +261,7 @@ static struct seq_operations tracing_likely_seq_ops = {
        .show           = t_show,
 };
 
-static int tracing_likely_open(struct inode *inode, struct file *file)
+static int tracing_branch_open(struct inode *inode, struct file *file)
 {
        int ret;
 
@@ -274,25 +274,18 @@ static int tracing_likely_open(struct inode *inode, struct file *file)
        return ret;
 }
 
-static struct file_operations tracing_likely_fops = {
-       .open           = tracing_likely_open,
+static const struct file_operations tracing_branch_fops = {
+       .open           = tracing_branch_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
 };
 
-extern unsigned long __start_likely_profile[];
-extern unsigned long __stop_likely_profile[];
-extern unsigned long __start_unlikely_profile[];
-extern unsigned long __stop_unlikely_profile[];
+extern unsigned long __start_annotated_branch_profile[];
+extern unsigned long __stop_annotated_branch_profile[];
 
-static struct ftrace_pointer ftrace_likely_pos = {
-       .start                  = __start_likely_profile,
-       .stop                   = __stop_likely_profile,
-};
-
-static struct ftrace_pointer ftrace_unlikely_pos = {
-       .start                  = __start_unlikely_profile,
-       .stop                   = __stop_unlikely_profile,
+static const struct ftrace_pointer ftrace_annotated_branch_pos = {
+       .start                  = __start_annotated_branch_profile,
+       .stop                   = __stop_annotated_branch_profile,
 };
 
 static __init int ftrace_branch_init(void)
@@ -302,18 +295,12 @@ static __init int ftrace_branch_init(void)
 
        d_tracer = tracing_init_dentry();
 
-       entry = debugfs_create_file("profile_likely", 0444, d_tracer,
-                                   &ftrace_likely_pos,
-                                   &tracing_likely_fops);
-       if (!entry)
-               pr_warning("Could not create debugfs 'profile_likely' entry\n");
-
-       entry = debugfs_create_file("profile_unlikely", 0444, d_tracer,
-                                   &ftrace_unlikely_pos,
-                                   &tracing_likely_fops);
+       entry = debugfs_create_file("profile_annotated_branch", 0444, d_tracer,
+                                   &ftrace_annotated_branch_pos,
+                                   &tracing_branch_fops);
        if (!entry)
-               pr_warning("Could not create debugfs"
-                          " 'profile_unlikely' entry\n");
+               pr_warning("Could not create debugfs "
+                          "'profile_annotatet_branch' entry\n");
 
        return 0;
 }