]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - tools/perf/util/session.c
perf tools: Add new PERF_RECORD_SWITCH event
[karo-tx-linux.git] / tools / perf / util / session.c
index aa482c10469d748fb2c6379ff854ba80f53b2b73..2d9574710543dc79e0e8be14607e289f18a6d406 100644 (file)
@@ -180,6 +180,7 @@ static void perf_session_env__delete(struct perf_session_env *env)
        zfree(&env->cpuid);
 
        zfree(&env->cmdline);
+       zfree(&env->cmdline_argv);
        zfree(&env->sibling_cores);
        zfree(&env->sibling_threads);
        zfree(&env->numa_nodes);
@@ -332,6 +333,8 @@ void perf_tool__fill_defaults(struct perf_tool *tool)
                tool->aux = perf_event__process_aux;
        if (tool->itrace_start == NULL)
                tool->itrace_start = perf_event__process_itrace_start;
+       if (tool->context_switch == NULL)
+               tool->context_switch = perf_event__process_switch;
        if (tool->read == NULL)
                tool->read = process_event_sample_stub;
        if (tool->throttle == NULL)
@@ -470,6 +473,19 @@ static void perf_event__itrace_start_swap(union perf_event *event,
                swap_sample_id_all(event, &event->itrace_start + 1);
 }
 
+static void perf_event__switch_swap(union perf_event *event, bool sample_id_all)
+{
+       if (event->header.type == PERF_RECORD_SWITCH_CPU_WIDE) {
+               event->context_switch.next_prev_pid =
+                               bswap_32(event->context_switch.next_prev_pid);
+               event->context_switch.next_prev_tid =
+                               bswap_32(event->context_switch.next_prev_tid);
+       }
+
+       if (sample_id_all)
+               swap_sample_id_all(event, &event->context_switch + 1);
+}
+
 static void perf_event__throttle_swap(union perf_event *event,
                                      bool sample_id_all)
 {
@@ -632,6 +648,8 @@ static perf_event__swap_op perf_event__swap_ops[] = {
        [PERF_RECORD_AUX]                 = perf_event__aux_swap,
        [PERF_RECORD_ITRACE_START]        = perf_event__itrace_start_swap,
        [PERF_RECORD_LOST_SAMPLES]        = perf_event__all64_swap,
+       [PERF_RECORD_SWITCH]              = perf_event__switch_swap,
+       [PERF_RECORD_SWITCH_CPU_WIDE]     = perf_event__switch_swap,
        [PERF_RECORD_HEADER_ATTR]         = perf_event__hdr_attr_swap,
        [PERF_RECORD_HEADER_EVENT_TYPE]   = perf_event__event_type_swap,
        [PERF_RECORD_HEADER_TRACING_DATA] = perf_event__tracing_data_swap,
@@ -686,6 +704,8 @@ static int process_finished_round(struct perf_tool *tool __maybe_unused,
                                  union perf_event *event __maybe_unused,
                                  struct ordered_events *oe)
 {
+       if (dump_trace)
+               fprintf(stdout, "\n");
        return ordered_events__flush(oe, OE_FLUSH__ROUND);
 }
 
@@ -1091,6 +1111,9 @@ static int machines__deliver_event(struct machines *machines,
                return tool->aux(tool, event, sample, machine);
        case PERF_RECORD_ITRACE_START:
                return tool->itrace_start(tool, event, sample, machine);
+       case PERF_RECORD_SWITCH:
+       case PERF_RECORD_SWITCH_CPU_WIDE:
+               return tool->context_switch(tool, event, sample, machine);
        default:
                ++evlist->stats.nr_unknown_events;
                return -1;
@@ -1726,7 +1749,7 @@ size_t perf_session__fprintf_nr_events(struct perf_session *session, FILE *fp)
        if (perf_header__has_feat(&session->header, HEADER_AUXTRACE))
                msg = " (excludes AUX area (e.g. instruction trace) decoded / synthesized events)";
 
-       ret = fprintf(fp, "Aggregated stats:%s\n", msg);
+       ret = fprintf(fp, "\nAggregated stats:%s\n", msg);
 
        ret += events_stats__fprintf(&session->evlist->stats, fp);
        return ret;
@@ -1893,7 +1916,7 @@ int perf_session__cpu_bitmap(struct perf_session *session,
        err = 0;
 
 out_delete_map:
-       cpu_map__delete(map);
+       cpu_map__put(map);
        return err;
 }