diff options
author | David Ahern <dsahern@gmail.com> | 2012-08-26 14:24:42 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2012-09-05 16:17:30 -0400 |
commit | 1e6d53223884225f0c3f9f1a3ac54a224d97ab24 (patch) | |
tree | 9caceac3bec39a6a7124b8809ddb8228c9ecd347 | |
parent | d25380cd3be38baff4ab31935b9d19b7f58ba7ac (diff) |
perf tool: handle errors in synthesized event functions
Handle error from process callback and propagate back to caller.
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/1346005487-62961-3-git-send-email-dsahern@gmail.com
Signed-off-by: David Ahern <dsahern@gmail.com>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
-rw-r--r-- | tools/perf/util/event.c | 35 |
1 files changed, 26 insertions, 9 deletions
diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c index 3a0f1a5da91c..84ff6f160cd0 100644 --- a/tools/perf/util/event.c +++ b/tools/perf/util/event.c | |||
@@ -120,7 +120,9 @@ static pid_t perf_event__synthesize_comm(struct perf_tool *tool, | |||
120 | if (!full) { | 120 | if (!full) { |
121 | event->comm.tid = pid; | 121 | event->comm.tid = pid; |
122 | 122 | ||
123 | process(tool, event, &synth_sample, machine); | 123 | if (process(tool, event, &synth_sample, machine) != 0) |
124 | return -1; | ||
125 | |||
124 | goto out; | 126 | goto out; |
125 | } | 127 | } |
126 | 128 | ||
@@ -151,7 +153,10 @@ static pid_t perf_event__synthesize_comm(struct perf_tool *tool, | |||
151 | 153 | ||
152 | event->comm.tid = pid; | 154 | event->comm.tid = pid; |
153 | 155 | ||
154 | process(tool, event, &synth_sample, machine); | 156 | if (process(tool, event, &synth_sample, machine) != 0) { |
157 | tgid = -1; | ||
158 | break; | ||
159 | } | ||
155 | } | 160 | } |
156 | 161 | ||
157 | closedir(tasks); | 162 | closedir(tasks); |
@@ -167,6 +172,7 @@ static int perf_event__synthesize_mmap_events(struct perf_tool *tool, | |||
167 | { | 172 | { |
168 | char filename[PATH_MAX]; | 173 | char filename[PATH_MAX]; |
169 | FILE *fp; | 174 | FILE *fp; |
175 | int rc = 0; | ||
170 | 176 | ||
171 | snprintf(filename, sizeof(filename), "/proc/%d/maps", pid); | 177 | snprintf(filename, sizeof(filename), "/proc/%d/maps", pid); |
172 | 178 | ||
@@ -231,18 +237,22 @@ static int perf_event__synthesize_mmap_events(struct perf_tool *tool, | |||
231 | event->mmap.pid = tgid; | 237 | event->mmap.pid = tgid; |
232 | event->mmap.tid = pid; | 238 | event->mmap.tid = pid; |
233 | 239 | ||
234 | process(tool, event, &synth_sample, machine); | 240 | if (process(tool, event, &synth_sample, machine) != 0) { |
241 | rc = -1; | ||
242 | break; | ||
243 | } | ||
235 | } | 244 | } |
236 | } | 245 | } |
237 | 246 | ||
238 | fclose(fp); | 247 | fclose(fp); |
239 | return 0; | 248 | return rc; |
240 | } | 249 | } |
241 | 250 | ||
242 | int perf_event__synthesize_modules(struct perf_tool *tool, | 251 | int perf_event__synthesize_modules(struct perf_tool *tool, |
243 | perf_event__handler_t process, | 252 | perf_event__handler_t process, |
244 | struct machine *machine) | 253 | struct machine *machine) |
245 | { | 254 | { |
255 | int rc = 0; | ||
246 | struct rb_node *nd; | 256 | struct rb_node *nd; |
247 | struct map_groups *kmaps = &machine->kmaps; | 257 | struct map_groups *kmaps = &machine->kmaps; |
248 | union perf_event *event = zalloc((sizeof(event->mmap) + | 258 | union perf_event *event = zalloc((sizeof(event->mmap) + |
@@ -284,11 +294,14 @@ int perf_event__synthesize_modules(struct perf_tool *tool, | |||
284 | 294 | ||
285 | memcpy(event->mmap.filename, pos->dso->long_name, | 295 | memcpy(event->mmap.filename, pos->dso->long_name, |
286 | pos->dso->long_name_len + 1); | 296 | pos->dso->long_name_len + 1); |
287 | process(tool, event, &synth_sample, machine); | 297 | if (process(tool, event, &synth_sample, machine) != 0) { |
298 | rc = -1; | ||
299 | break; | ||
300 | } | ||
288 | } | 301 | } |
289 | 302 | ||
290 | free(event); | 303 | free(event); |
291 | return 0; | 304 | return rc; |
292 | } | 305 | } |
293 | 306 | ||
294 | static int __event__synthesize_thread(union perf_event *comm_event, | 307 | static int __event__synthesize_thread(union perf_event *comm_event, |
@@ -392,12 +405,16 @@ int perf_event__synthesize_threads(struct perf_tool *tool, | |||
392 | if (*end) /* only interested in proper numerical dirents */ | 405 | if (*end) /* only interested in proper numerical dirents */ |
393 | continue; | 406 | continue; |
394 | 407 | ||
395 | __event__synthesize_thread(comm_event, mmap_event, pid, 1, | 408 | if (__event__synthesize_thread(comm_event, mmap_event, pid, 1, |
396 | process, tool, machine); | 409 | process, tool, machine) != 0) { |
410 | err = -1; | ||
411 | goto out_closedir; | ||
412 | } | ||
397 | } | 413 | } |
398 | 414 | ||
399 | closedir(proc); | ||
400 | err = 0; | 415 | err = 0; |
416 | out_closedir: | ||
417 | closedir(proc); | ||
401 | out_free_mmap: | 418 | out_free_mmap: |
402 | free(mmap_event); | 419 | free(mmap_event); |
403 | out_free_comm: | 420 | out_free_comm: |