]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - tools/perf/builtin-trace.c
shmem: avoid maybe-uninitialized warning
[linux.git] / tools / perf / builtin-trace.c
index c298bd3e1d909cfd808f911af1df053e608f55fe..206bf72b77fcb9c795486ec9fba184b9d6321b7b 100644 (file)
@@ -74,8 +74,6 @@ struct trace {
                size_t          nr;
                int             *entries;
        }                       ev_qualifier_ids;
-       struct intlist          *tid_list;
-       struct intlist          *pid_list;
        struct {
                size_t          nr;
                pid_t           *entries;
@@ -843,7 +841,6 @@ static size_t fprintf_duration(unsigned long t, FILE *fp)
  */
 struct thread_trace {
        u64               entry_time;
-       u64               exit_time;
        bool              entry_pending;
        unsigned long     nr_events;
        unsigned long     pfmaj, pfmin;
@@ -1452,7 +1449,7 @@ static int trace__printf_interrupted_entry(struct trace *trace, struct perf_samp
 
        duration = sample->time - ttrace->entry_time;
 
-       printed  = trace__fprintf_entry_head(trace, trace->current, duration, sample->time, trace->output);
+       printed  = trace__fprintf_entry_head(trace, trace->current, duration, ttrace->entry_time, trace->output);
        printed += fprintf(trace->output, "%-70s) ...\n", ttrace->entry_str);
        ttrace->entry_pending = false;
 
@@ -1499,7 +1496,7 @@ static int trace__sys_enter(struct trace *trace, struct perf_evsel *evsel,
 
        if (sc->is_exit) {
                if (!(trace->duration_filter || trace->summary_only || trace->min_stack)) {
-                       trace__fprintf_entry_head(trace, thread, 1, sample->time, trace->output);
+                       trace__fprintf_entry_head(trace, thread, 1, ttrace->entry_time, trace->output);
                        fprintf(trace->output, "%-70s)\n", ttrace->entry_str);
                }
        } else {
@@ -1571,8 +1568,6 @@ static int trace__sys_exit(struct trace *trace, struct perf_evsel *evsel,
                ++trace->stats.vfs_getname;
        }
 
-       ttrace->exit_time = sample->time;
-
        if (ttrace->entry_time) {
                duration = sample->time - ttrace->entry_time;
                if (trace__filter_duration(trace, duration))
@@ -1592,7 +1587,7 @@ static int trace__sys_exit(struct trace *trace, struct perf_evsel *evsel,
        if (trace->summary_only)
                goto out;
 
-       trace__fprintf_entry_head(trace, thread, duration, sample->time, trace->output);
+       trace__fprintf_entry_head(trace, thread, duration, ttrace->entry_time, trace->output);
 
        if (ttrace->entry_pending) {
                fprintf(trace->output, "%-70s", ttrace->entry_str);
@@ -1893,18 +1888,6 @@ static int trace__pgfault(struct trace *trace,
        return err;
 }
 
-static bool skip_sample(struct trace *trace, struct perf_sample *sample)
-{
-       if ((trace->pid_list && intlist__find(trace->pid_list, sample->pid)) ||
-           (trace->tid_list && intlist__find(trace->tid_list, sample->tid)))
-               return false;
-
-       if (trace->pid_list || trace->tid_list)
-               return true;
-
-       return false;
-}
-
 static void trace__set_base_time(struct trace *trace,
                                 struct perf_evsel *evsel,
                                 struct perf_sample *sample)
@@ -1929,11 +1912,13 @@ static int trace__process_sample(struct perf_tool *tool,
                                 struct machine *machine __maybe_unused)
 {
        struct trace *trace = container_of(tool, struct trace, tool);
+       struct thread *thread;
        int err = 0;
 
        tracepoint_handler handler = evsel->handler;
 
-       if (skip_sample(trace, sample))
+       thread = machine__findnew_thread(trace->host, sample->pid, sample->tid);
+       if (thread && thread__is_filtered(thread))
                return 0;
 
        trace__set_base_time(trace, evsel, sample);
@@ -1946,27 +1931,6 @@ static int trace__process_sample(struct perf_tool *tool,
        return err;
 }
 
-static int parse_target_str(struct trace *trace)
-{
-       if (trace->opts.target.pid) {
-               trace->pid_list = intlist__new(trace->opts.target.pid);
-               if (trace->pid_list == NULL) {
-                       pr_err("Error parsing process id string\n");
-                       return -EINVAL;
-               }
-       }
-
-       if (trace->opts.target.tid) {
-               trace->tid_list = intlist__new(trace->opts.target.tid);
-               if (trace->tid_list == NULL) {
-                       pr_err("Error parsing thread id string\n");
-                       return -EINVAL;
-               }
-       }
-
-       return 0;
-}
-
 static int trace__record(struct trace *trace, int argc, const char **argv)
 {
        unsigned int rec_argc, i, j;
@@ -2310,12 +2274,17 @@ static int trace__run(struct trace *trace, int argc, const char **argv)
        if (err < 0)
                goto out_error_mmap;
 
-       if (!target__none(&trace->opts.target))
+       if (!target__none(&trace->opts.target) && !trace->opts.initial_delay)
                perf_evlist__enable(evlist);
 
        if (forks)
                perf_evlist__start_workload(evlist);
 
+       if (trace->opts.initial_delay) {
+               usleep(trace->opts.initial_delay * 1000);
+               perf_evlist__enable(evlist);
+       }
+
        trace->multiple_threads = thread_map__pid(evlist->threads, 0) == -1 ||
                                  evlist->threads->nr > 1 ||
                                  perf_evlist__first(evlist)->attr.inherit;
@@ -2458,6 +2427,12 @@ static int trace__replay(struct trace *trace)
        if (session == NULL)
                return -1;
 
+       if (trace->opts.target.pid)
+               symbol_conf.pid_list_str = strdup(trace->opts.target.pid);
+
+       if (trace->opts.target.tid)
+               symbol_conf.tid_list_str = strdup(trace->opts.target.tid);
+
        if (symbol__init(&session->header.env) < 0)
                goto out;
 
@@ -2501,10 +2476,6 @@ static int trace__replay(struct trace *trace)
                        evsel->handler = trace__pgfault;
        }
 
-       err = parse_target_str(trace);
-       if (err != 0)
-               goto out;
-
        setup_pager();
 
        err = perf_session__process_events(session);
@@ -2816,6 +2787,9 @@ int cmd_trace(int argc, const char **argv, const char *prefix __maybe_unused)
                     "Default: kernel.perf_event_max_stack or " __stringify(PERF_MAX_STACK_DEPTH)),
        OPT_UINTEGER(0, "proc-map-timeout", &trace.opts.proc_map_timeout,
                        "per thread proc mmap processing timeout in ms"),
+       OPT_UINTEGER('D', "delay", &trace.opts.initial_delay,
+                    "ms to wait before starting measurement after program "
+                    "start"),
        OPT_END()
        };
        bool __maybe_unused max_stack_user_set = true;