diff options
| author | Linux Build Service Account <lnxbuild@localhost> | 2019-09-19 23:47:01 -0700 |
|---|---|---|
| committer | Linux Build Service Account <lnxbuild@localhost> | 2019-09-19 23:47:01 -0700 |
| commit | d4009ffcd8674d76a77441c1edaefcb886668fb9 (patch) | |
| tree | 7b2ca75730e4f9de891b22efdbd5babf3e6381b1 /tools/perf | |
| parent | 88dccf7d633bf154097ee158ec19965bdc1cc429 (diff) | |
| parent | 36f663352d8e241b313ae19a94c5d30ea077e243 (diff) | |
Merge 36f663352d8e241b313ae19a94c5d30ea077e243 on remote branch
Change-Id: I65222b09858e0e72a2532954573a1d191882e6c3
Diffstat (limited to 'tools/perf')
| -rw-r--r-- | tools/perf/bench/numa.c | 6 | ||||
| -rw-r--r-- | tools/perf/builtin-probe.c | 10 | ||||
| -rw-r--r-- | tools/perf/tests/mmap-thread-lookup.c | 2 | ||||
| -rw-r--r-- | tools/perf/util/evsel.c | 8 | ||||
| -rw-r--r-- | tools/perf/util/header.c | 9 | ||||
| -rw-r--r-- | tools/perf/util/thread.c | 12 |
6 files changed, 41 insertions, 6 deletions
diff --git a/tools/perf/bench/numa.c b/tools/perf/bench/numa.c index df41deed0320..3bfba81d1911 100644 --- a/tools/perf/bench/numa.c +++ b/tools/perf/bench/numa.c @@ -370,8 +370,10 @@ static u8 *alloc_data(ssize_t bytes0, int map_flags, /* Allocate and initialize all memory on CPU#0: */ if (init_cpu0) { - orig_mask = bind_to_node(0); - bind_to_memnode(0); + int node = numa_node_of_cpu(0); + + orig_mask = bind_to_node(node); + bind_to_memnode(node); } bytes = bytes0 + HPSIZE; diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c index 9d4ac90ca87e..66fb1d53d0f0 100644 --- a/tools/perf/builtin-probe.c +++ b/tools/perf/builtin-probe.c @@ -613,6 +613,16 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused) ret = perf_add_probe_events(params.events, params.nevents); if (ret < 0) { + + /* + * When perf_add_probe_events() fails it calls + * cleanup_perf_probe_events(pevs, npevs), i.e. + * cleanup_perf_probe_events(params.events, params.nevents), which + * will call clear_perf_probe_event(), so set nevents to zero + * to avoid cleanup_params() to call clear_perf_probe_event() again + * on the same pevs. + */ + params.nevents = 0; pr_err_with_code(" Error: Failed to add events.", ret); return ret; } diff --git a/tools/perf/tests/mmap-thread-lookup.c b/tools/perf/tests/mmap-thread-lookup.c index 145050e2e544..195ba31e2f35 100644 --- a/tools/perf/tests/mmap-thread-lookup.c +++ b/tools/perf/tests/mmap-thread-lookup.c @@ -49,7 +49,7 @@ static void *thread_fn(void *arg) { struct thread_data *td = arg; ssize_t ret; - int go; + int go = 0; if (thread_init(td)) return NULL; diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 9aa10043103a..448b43ca7234 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -492,6 +492,9 @@ const char *perf_evsel__name(struct perf_evsel *evsel) { char bf[128]; + if (!evsel) + goto out_unknown; + if (evsel->name) return evsel->name; @@ -528,7 +531,10 @@ const char *perf_evsel__name(struct perf_evsel *evsel) evsel->name = strdup(bf); - return evsel->name ?: "unknown"; + if (evsel->name) + return evsel->name; +out_unknown: + return "unknown"; } const char *perf_evsel__group_name(struct perf_evsel *evsel) diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index 304f5d710143..81ceb4ace88d 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c @@ -2591,6 +2591,13 @@ int perf_session__read_header(struct perf_session *session) file->path); } + if (f_header.attr_size == 0) { + pr_err("ERROR: The %s file's attr size field is 0 which is unexpected.\n" + "Was the 'perf record' command properly terminated?\n", + file->path); + return -EINVAL; + } + nr_attrs = f_header.attrs.size / f_header.attr_size; lseek(fd, f_header.attrs.offset, SEEK_SET); @@ -2673,7 +2680,7 @@ int perf_event__synthesize_attr(struct perf_tool *tool, size += sizeof(struct perf_event_header); size += ids * sizeof(u64); - ev = malloc(size); + ev = zalloc(size); if (ev == NULL) return -ENOMEM; diff --git a/tools/perf/util/thread.c b/tools/perf/util/thread.c index 829508a21448..45c19b443f2f 100644 --- a/tools/perf/util/thread.c +++ b/tools/perf/util/thread.c @@ -110,14 +110,24 @@ struct comm *thread__comm(const struct thread *thread) struct comm *thread__exec_comm(const struct thread *thread) { - struct comm *comm, *last = NULL; + struct comm *comm, *last = NULL, *second_last = NULL; list_for_each_entry(comm, &thread->comm_list, list) { if (comm->exec) return comm; + second_last = last; last = comm; } + /* + * 'last' with no start time might be the parent's comm of a synthesized + * thread (created by processing a synthesized fork event). For a main + * thread, that is very probably wrong. Prefer a later comm to avoid + * that case. + */ + if (second_last && !last->start && thread->pid_ == thread->tid) + return second_last; + return last; } |
