]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - kernel/trace/trace_kprobe.c
Merge branch 'turbostat' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux
[karo-tx-linux.git] / kernel / trace / trace_kprobe.c
index eb6c9f1d3a932f93a9a88b3d6b9c742457f84d11..a133ecd741e437d938ca377cf5e4358bcb586aa4 100644 (file)
@@ -73,6 +73,17 @@ static nokprobe_inline bool trace_kprobe_is_on_module(struct trace_kprobe *tk)
        return !!strchr(trace_kprobe_symbol(tk), ':');
 }
 
+static nokprobe_inline unsigned long trace_kprobe_nhit(struct trace_kprobe *tk)
+{
+       unsigned long nhit = 0;
+       int cpu;
+
+       for_each_possible_cpu(cpu)
+               nhit += *per_cpu_ptr(tk->nhit, cpu);
+
+       return nhit;
+}
+
 static int register_kprobe_event(struct trace_kprobe *tk);
 static int unregister_kprobe_event(struct trace_kprobe *tk);
 
@@ -882,14 +893,10 @@ static const struct file_operations kprobe_events_ops = {
 static int probes_profile_seq_show(struct seq_file *m, void *v)
 {
        struct trace_kprobe *tk = v;
-       unsigned long nhit = 0;
-       int cpu;
-
-       for_each_possible_cpu(cpu)
-               nhit += *per_cpu_ptr(tk->nhit, cpu);
 
        seq_printf(m, "  %-44s %15lu %15lu\n",
-                  trace_event_name(&tk->tp.call), nhit,
+                  trace_event_name(&tk->tp.call),
+                  trace_kprobe_nhit(tk),
                   tk->rp.kp.nmissed);
 
        return 0;
@@ -1354,18 +1361,18 @@ fs_initcall(init_kprobe_trace);
 
 
 #ifdef CONFIG_FTRACE_STARTUP_TEST
-
 /*
  * The "__used" keeps gcc from removing the function symbol
- * from the kallsyms table.
+ * from the kallsyms table. 'noinline' makes sure that there
+ * isn't an inlined version used by the test method below
  */
-static __used int kprobe_trace_selftest_target(int a1, int a2, int a3,
-                                              int a4, int a5, int a6)
+static __used __init noinline int
+kprobe_trace_selftest_target(int a1, int a2, int a3, int a4, int a5, int a6)
 {
        return a1 + a2 + a3 + a4 + a5 + a6;
 }
 
-static struct trace_event_file *
+static struct __init trace_event_file *
 find_trace_probe_file(struct trace_kprobe *tk, struct trace_array *tr)
 {
        struct trace_event_file *file;
@@ -1443,12 +1450,25 @@ static __init int kprobe_trace_self_tests_init(void)
 
        ret = target(1, 2, 3, 4, 5, 6);
 
+       /*
+        * Not expecting an error here, the check is only to prevent the
+        * optimizer from removing the call to target() as otherwise there
+        * are no side-effects and the call is never performed.
+        */
+       if (ret != 21)
+               warn++;
+
        /* Disable trace points before removing it */
        tk = find_trace_kprobe("testprobe", KPROBE_EVENT_SYSTEM);
        if (WARN_ON_ONCE(tk == NULL)) {
                pr_warn("error on getting test probe.\n");
                warn++;
        } else {
+               if (trace_kprobe_nhit(tk) != 1) {
+                       pr_warn("incorrect number of testprobe hits\n");
+                       warn++;
+               }
+
                file = find_trace_probe_file(tk, top_trace_array());
                if (WARN_ON_ONCE(file == NULL)) {
                        pr_warn("error on getting probe file.\n");
@@ -1462,6 +1482,11 @@ static __init int kprobe_trace_self_tests_init(void)
                pr_warn("error on getting 2nd test probe.\n");
                warn++;
        } else {
+               if (trace_kprobe_nhit(tk) != 1) {
+                       pr_warn("incorrect number of testprobe2 hits\n");
+                       warn++;
+               }
+
                file = find_trace_probe_file(tk, top_trace_array());
                if (WARN_ON_ONCE(file == NULL)) {
                        pr_warn("error on getting probe file.\n");