Commit 3178f58b authored by Frederic Weisbecker's avatar Frederic Weisbecker Committed by Arnaldo Carvalho de Melo

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: default avatarFrederic Weisbecker <fweisbec@gmail.com>
Acked-by: default avatarNamhyung 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.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 99ca4233
...@@ -94,19 +94,20 @@ struct comm *comm__new(const char *str, u64 timestamp) ...@@ -94,19 +94,20 @@ struct comm *comm__new(const char *str, u64 timestamp)
return comm; 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); new = comm_str__findnew(str, &comm_str_root);
if (!comm->comm_str) { if (!new)
comm->comm_str = old; return -ENOMEM;
return;
}
comm->start = timestamp; comm_str__get(new);
comm_str__get(comm->comm_str);
comm_str__put(old); comm_str__put(old);
comm->comm_str = new;
comm->start = timestamp;
return 0;
} }
void comm__free(struct comm *comm) void comm__free(struct comm *comm)
......
...@@ -16,6 +16,6 @@ struct comm { ...@@ -16,6 +16,6 @@ struct comm {
void comm__free(struct comm *comm); void comm__free(struct comm *comm);
struct comm *comm__new(const char *str, u64 timestamp); struct comm *comm__new(const char *str, u64 timestamp);
const char *comm__str(const struct comm *comm); const char *comm__str(const struct comm *comm);
void comm__override(struct comm *comm, const char *str, u64 timestamp); int comm__override(struct comm *comm, const char *str, u64 timestamp);
#endif /* __PERF_COMM_H */ #endif /* __PERF_COMM_H */
...@@ -66,10 +66,13 @@ struct comm *thread__comm(const struct thread *thread) ...@@ -66,10 +66,13 @@ struct comm *thread__comm(const struct thread *thread)
int thread__set_comm(struct thread *thread, const char *str, u64 timestamp) int thread__set_comm(struct thread *thread, const char *str, u64 timestamp)
{ {
struct comm *new, *curr = thread__comm(thread); struct comm *new, *curr = thread__comm(thread);
int err;
/* Override latest entry if it had no specific time coverage */ /* Override latest entry if it had no specific time coverage */
if (!curr->start) { if (!curr->start) {
comm__override(curr, str, timestamp); err = comm__override(curr, str, timestamp);
if (err)
return err;
} else { } else {
new = comm__new(str, timestamp); new = comm__new(str, timestamp);
if (!new) if (!new)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment