perf script: Filter COMM/FORK/.. events by CPU
authorAndi Kleen <ak@linux.intel.com>
Mon, 11 Mar 2019 14:44:52 +0000 (07:44 -0700)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 11 Mar 2019 19:13:05 +0000 (16:13 -0300)
The --cpu option only filtered samples. Filter other perf events, such
as COMM, FORK, SWITCH by the CPU too.

Reported-by: Jiri Olsa <jolsa@kernel.org>
Signed-off-by: Andi Kleen <ak@linux.intel.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Link: http://lkml.kernel.org/r/20190311144502.15423-2-andi@firstfloor.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/builtin-script.c

index 111787e837845ef2572c0598182eb5ecc830d662..b695b20ffc8a0517c93b823407c61fe5b28697d6 100644 (file)
@@ -1933,6 +1933,13 @@ static int cleanup_scripting(void)
        return scripting_ops ? scripting_ops->stop_script() : 0;
 }
 
+static bool filter_cpu(struct perf_sample *sample)
+{
+       if (cpu_list)
+               return !test_bit(sample->cpu, cpu_bitmap);
+       return false;
+}
+
 static int process_sample_event(struct perf_tool *tool,
                                union perf_event *event,
                                struct perf_sample *sample,
@@ -1967,7 +1974,7 @@ static int process_sample_event(struct perf_tool *tool,
        if (al.filtered)
                goto out_put;
 
-       if (cpu_list && !test_bit(sample->cpu, cpu_bitmap))
+       if (filter_cpu(sample))
                goto out_put;
 
        if (scripting_ops)
@@ -2052,9 +2059,11 @@ static int process_comm_event(struct perf_tool *tool,
                sample->tid = event->comm.tid;
                sample->pid = event->comm.pid;
        }
-       perf_sample__fprintf_start(sample, thread, evsel,
+       if (!filter_cpu(sample)) {
+               perf_sample__fprintf_start(sample, thread, evsel,
                                   PERF_RECORD_COMM, stdout);
-       perf_event__fprintf(event, stdout);
+               perf_event__fprintf(event, stdout);
+       }
        ret = 0;
 out:
        thread__put(thread);
@@ -2088,9 +2097,11 @@ static int process_namespaces_event(struct perf_tool *tool,
                sample->tid = event->namespaces.tid;
                sample->pid = event->namespaces.pid;
        }
-       perf_sample__fprintf_start(sample, thread, evsel,
-                                  PERF_RECORD_NAMESPACES, stdout);
-       perf_event__fprintf(event, stdout);
+       if (!filter_cpu(sample)) {
+               perf_sample__fprintf_start(sample, thread, evsel,
+                                          PERF_RECORD_NAMESPACES, stdout);
+               perf_event__fprintf(event, stdout);
+       }
        ret = 0;
 out:
        thread__put(thread);
@@ -2122,9 +2133,11 @@ static int process_fork_event(struct perf_tool *tool,
                sample->tid = event->fork.tid;
                sample->pid = event->fork.pid;
        }
-       perf_sample__fprintf_start(sample, thread, evsel,
-                                  PERF_RECORD_FORK, stdout);
-       perf_event__fprintf(event, stdout);
+       if (!filter_cpu(sample)) {
+               perf_sample__fprintf_start(sample, thread, evsel,
+                                          PERF_RECORD_FORK, stdout);
+               perf_event__fprintf(event, stdout);
+       }
        thread__put(thread);
 
        return 0;
@@ -2152,9 +2165,11 @@ static int process_exit_event(struct perf_tool *tool,
                sample->tid = event->fork.tid;
                sample->pid = event->fork.pid;
        }
-       perf_sample__fprintf_start(sample, thread, evsel,
-                                  PERF_RECORD_EXIT, stdout);
-       perf_event__fprintf(event, stdout);
+       if (!filter_cpu(sample)) {
+               perf_sample__fprintf_start(sample, thread, evsel,
+                                          PERF_RECORD_EXIT, stdout);
+               perf_event__fprintf(event, stdout);
+       }
 
        if (perf_event__process_exit(tool, event, sample, machine) < 0)
                err = -1;
@@ -2188,9 +2203,11 @@ static int process_mmap_event(struct perf_tool *tool,
                sample->tid = event->mmap.tid;
                sample->pid = event->mmap.pid;
        }
-       perf_sample__fprintf_start(sample, thread, evsel,
-                                  PERF_RECORD_MMAP, stdout);
-       perf_event__fprintf(event, stdout);
+       if (!filter_cpu(sample)) {
+               perf_sample__fprintf_start(sample, thread, evsel,
+                                          PERF_RECORD_MMAP, stdout);
+               perf_event__fprintf(event, stdout);
+       }
        thread__put(thread);
        return 0;
 }
@@ -2220,9 +2237,11 @@ static int process_mmap2_event(struct perf_tool *tool,
                sample->tid = event->mmap2.tid;
                sample->pid = event->mmap2.pid;
        }
-       perf_sample__fprintf_start(sample, thread, evsel,
-                                  PERF_RECORD_MMAP2, stdout);
-       perf_event__fprintf(event, stdout);
+       if (!filter_cpu(sample)) {
+               perf_sample__fprintf_start(sample, thread, evsel,
+                                          PERF_RECORD_MMAP2, stdout);
+               perf_event__fprintf(event, stdout);
+       }
        thread__put(thread);
        return 0;
 }
@@ -2247,9 +2266,11 @@ static int process_switch_event(struct perf_tool *tool,
                return -1;
        }
 
-       perf_sample__fprintf_start(sample, thread, evsel,
-                                  PERF_RECORD_SWITCH, stdout);
-       perf_event__fprintf(event, stdout);
+       if (!filter_cpu(sample)) {
+               perf_sample__fprintf_start(sample, thread, evsel,
+                                          PERF_RECORD_SWITCH, stdout);
+               perf_event__fprintf(event, stdout);
+       }
        thread__put(thread);
        return 0;
 }
@@ -2270,9 +2291,11 @@ process_lost_event(struct perf_tool *tool,
        if (thread == NULL)
                return -1;
 
-       perf_sample__fprintf_start(sample, thread, evsel,
-                                  PERF_RECORD_LOST, stdout);
-       perf_event__fprintf(event, stdout);
+       if (!filter_cpu(sample)) {
+               perf_sample__fprintf_start(sample, thread, evsel,
+                                          PERF_RECORD_LOST, stdout);
+               perf_event__fprintf(event, stdout);
+       }
        thread__put(thread);
        return 0;
 }