diff options
author | 2014-01-14 16:37:14 +0100 | |
---|---|---|
committer | 2014-01-16 16:44:39 -0300 | |
commit | 3178f58b989430fd0721df97bf21cf1c0e8cc419 (patch) | |
tree | 26a1d69797a907bedb10bac2a8f84f67e901af0f /tools/perf/util/comm.c | |
parent | perf symbols: Export elf_section_by_name and reuse (diff) | |
download | linux-3178f58b989430fd0721df97bf21cf1c0e8cc419.tar.gz linux-3178f58b989430fd0721df97bf21cf1c0e8cc419.tar.bz2 linux-3178f58b989430fd0721df97bf21cf1c0e8cc419.zip |
perf tools: Do proper comm override error handling
The comm overriding API ignores memory allocation failures by silently
keeping the previous and out of date comm.
As a result, the user may get buggy events without ever being notified
about the problem and its source.
Lets start to fix this by propagating the error from the API. Not all
callers may be doing proper error handling on comm set yet but this is
the first step toward it.
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/1389713836-13375-2-git-send-email-fweisbec@gmail.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/util/comm.c')
-rw-r--r-- | tools/perf/util/comm.c | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/tools/perf/util/comm.c b/tools/perf/util/comm.c index 67d1e404c0cb..f9e777629e21 100644 --- a/tools/perf/util/comm.c +++ b/tools/perf/util/comm.c @@ -94,19 +94,20 @@ struct comm *comm__new(const char *str, u64 timestamp) return comm; } -void comm__override(struct comm *comm, const char *str, u64 timestamp) +int comm__override(struct comm *comm, const char *str, u64 timestamp) { - struct comm_str *old = comm->comm_str; + struct comm_str *new, *old = comm->comm_str; - comm->comm_str = comm_str__findnew(str, &comm_str_root); - if (!comm->comm_str) { - comm->comm_str = old; - return; - } + new = comm_str__findnew(str, &comm_str_root); + if (!new) + return -ENOMEM; - comm->start = timestamp; - comm_str__get(comm->comm_str); + comm_str__get(new); comm_str__put(old); + comm->comm_str = new; + comm->start = timestamp; + + return 0; } void comm__free(struct comm *comm) |