Merge tag 'amd-drm-next-5.8-2020-04-24' of git://people.freedesktop.org/~agd5f/linux...
[linux-2.6-microblaze.git] / tools / perf / builtin-script.c
index 656b347..1f57a7e 100644 (file)
@@ -63,7 +63,9 @@
 static char const              *script_name;
 static char const              *generate_script_lang;
 static bool                    reltime;
+static bool                    deltatime;
 static u64                     initial_time;
+static u64                     previous_time;
 static bool                    debug_mode;
 static u64                     last_timestamp;
 static u64                     nr_unordered;
@@ -704,6 +706,13 @@ static int perf_sample__fprintf_start(struct perf_sample *sample,
                        if (!initial_time)
                                initial_time = sample->time;
                        t = sample->time - initial_time;
+               } else if (deltatime) {
+                       if (previous_time)
+                               t = sample->time - previous_time;
+                       else {
+                               t = 0;
+                       }
+                       previous_time = sample->time;
                }
                nsecs = t;
                secs = nsecs / NSEC_PER_SEC;
@@ -1685,6 +1694,7 @@ struct perf_script {
        bool                    show_lost_events;
        bool                    show_round_events;
        bool                    show_bpf_events;
+       bool                    show_cgroup_events;
        bool                    allocated;
        bool                    per_event_dump;
        struct evswitch         evswitch;
@@ -2203,6 +2213,41 @@ out:
        return ret;
 }
 
+static int process_cgroup_event(struct perf_tool *tool,
+                               union perf_event *event,
+                               struct perf_sample *sample,
+                               struct machine *machine)
+{
+       struct thread *thread;
+       struct perf_script *script = container_of(tool, struct perf_script, tool);
+       struct perf_session *session = script->session;
+       struct evsel *evsel = perf_evlist__id2evsel(session->evlist, sample->id);
+       int ret = -1;
+
+       thread = machine__findnew_thread(machine, sample->pid, sample->tid);
+       if (thread == NULL) {
+               pr_debug("problem processing CGROUP event, skipping it.\n");
+               return -1;
+       }
+
+       if (perf_event__process_cgroup(tool, event, sample, machine) < 0)
+               goto out;
+
+       if (!evsel->core.attr.sample_id_all) {
+               sample->cpu = 0;
+               sample->time = 0;
+       }
+       if (!filter_cpu(sample)) {
+               perf_sample__fprintf_start(sample, thread, evsel,
+                                          PERF_RECORD_CGROUP, stdout);
+               perf_event__fprintf(event, stdout);
+       }
+       ret = 0;
+out:
+       thread__put(thread);
+       return ret;
+}
+
 static int process_fork_event(struct perf_tool *tool,
                              union perf_event *event,
                              struct perf_sample *sample,
@@ -2542,6 +2587,8 @@ static int __cmd_script(struct perf_script *script)
                script->tool.context_switch = process_switch_event;
        if (script->show_namespace_events)
                script->tool.namespaces = process_namespaces_event;
+       if (script->show_cgroup_events)
+               script->tool.cgroup = process_cgroup_event;
        if (script->show_lost_events)
                script->tool.lost = process_lost_event;
        if (script->show_round_events) {
@@ -3218,10 +3265,10 @@ static char *get_script_path(const char *script_root, const char *suffix)
                        __script_root = get_script_root(script_dirent, suffix);
                        if (__script_root && !strcmp(script_root, __script_root)) {
                                free(__script_root);
-                               closedir(lang_dir);
                                closedir(scripts_dir);
                                scnprintf(script_path, MAXPATHLEN, "%s/%s",
                                          lang_path, script_dirent->d_name);
+                               closedir(lang_dir);
                                return strdup(script_path);
                        }
                        free(__script_root);
@@ -3467,6 +3514,7 @@ int cmd_script(int argc, const char **argv)
                        .mmap2           = perf_event__process_mmap2,
                        .comm            = perf_event__process_comm,
                        .namespaces      = perf_event__process_namespaces,
+                       .cgroup          = perf_event__process_cgroup,
                        .exit            = perf_event__process_exit,
                        .fork            = perf_event__process_fork,
                        .attr            = process_attr,
@@ -3555,6 +3603,7 @@ int cmd_script(int argc, const char **argv)
                     "anything beyond the specified depth will be ignored. "
                     "Default: kernel.perf_event_max_stack or " __stringify(PERF_MAX_STACK_DEPTH)),
        OPT_BOOLEAN(0, "reltime", &reltime, "Show time stamps relative to start"),
+       OPT_BOOLEAN(0, "deltatime", &deltatime, "Show time stamps relative to previous event"),
        OPT_BOOLEAN('I', "show-info", &show_full_info,
                    "display extended information from perf.data file"),
        OPT_BOOLEAN('\0', "show-kernel-path", &symbol_conf.show_kernel_path,
@@ -3567,6 +3616,8 @@ int cmd_script(int argc, const char **argv)
                    "Show context switch events (if recorded)"),
        OPT_BOOLEAN('\0', "show-namespace-events", &script.show_namespace_events,
                    "Show namespace events (if recorded)"),
+       OPT_BOOLEAN('\0', "show-cgroup-events", &script.show_cgroup_events,
+                   "Show cgroup events (if recorded)"),
        OPT_BOOLEAN('\0', "show-lost-events", &script.show_lost_events,
                    "Show lost events (if recorded)"),
        OPT_BOOLEAN('\0', "show-round-events", &script.show_round_events,
@@ -3651,6 +3702,13 @@ int cmd_script(int argc, const char **argv)
                }
        }
 
+       if (reltime && deltatime) {
+               fprintf(stderr,
+                       "reltime and deltatime - the two don't get along well. "
+                       "Please limit to --reltime or --deltatime.\n");
+               return -1;
+       }
+
        if (itrace_synth_opts.callchain &&
            itrace_synth_opts.callchain_sz > scripting_max_stack)
                scripting_max_stack = itrace_synth_opts.callchain_sz;