diff options
author | Adrian Hunter <adrian.hunter@intel.com> | 2014-01-29 09:14:37 -0500 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2014-01-31 15:21:47 -0500 |
commit | 29b596b57426831fce92cd0ebb01c77627616fdf (patch) | |
tree | 9978d84daf7717aac94c774755e474c7eac2deee | |
parent | 9176753d1ed56951a6ee2a0f0a3f367904e35567 (diff) |
perf tools: Add kallsyms__get_function_start()
Separate out the logic used to find the start address of the reference
symbol used to track kernel relocation. kallsyms__get_function_start()
is used in subsequent patches.
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Tested-by: Jiri Olsa <jolsa@redhat.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/1391004884-10334-3-git-send-email-adrian.hunter@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
-rw-r--r-- | tools/perf/util/event.c | 18 | ||||
-rw-r--r-- | tools/perf/util/event.h | 3 |
2 files changed, 18 insertions, 3 deletions
diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c index 1fc1c2f04772..17476df5c7b2 100644 --- a/tools/perf/util/event.c +++ b/tools/perf/util/event.c | |||
@@ -470,6 +470,17 @@ static int find_symbol_cb(void *arg, const char *name, char type, | |||
470 | return 1; | 470 | return 1; |
471 | } | 471 | } |
472 | 472 | ||
473 | u64 kallsyms__get_function_start(const char *kallsyms_filename, | ||
474 | const char *symbol_name) | ||
475 | { | ||
476 | struct process_symbol_args args = { .name = symbol_name, }; | ||
477 | |||
478 | if (kallsyms__parse(kallsyms_filename, &args, find_symbol_cb) <= 0) | ||
479 | return 0; | ||
480 | |||
481 | return args.start; | ||
482 | } | ||
483 | |||
473 | int perf_event__synthesize_kernel_mmap(struct perf_tool *tool, | 484 | int perf_event__synthesize_kernel_mmap(struct perf_tool *tool, |
474 | perf_event__handler_t process, | 485 | perf_event__handler_t process, |
475 | struct machine *machine, | 486 | struct machine *machine, |
@@ -480,13 +491,13 @@ int perf_event__synthesize_kernel_mmap(struct perf_tool *tool, | |||
480 | char path[PATH_MAX]; | 491 | char path[PATH_MAX]; |
481 | char name_buff[PATH_MAX]; | 492 | char name_buff[PATH_MAX]; |
482 | struct map *map; | 493 | struct map *map; |
494 | u64 start; | ||
483 | int err; | 495 | int err; |
484 | /* | 496 | /* |
485 | * We should get this from /sys/kernel/sections/.text, but till that is | 497 | * We should get this from /sys/kernel/sections/.text, but till that is |
486 | * available use this, and after it is use this as a fallback for older | 498 | * available use this, and after it is use this as a fallback for older |
487 | * kernels. | 499 | * kernels. |
488 | */ | 500 | */ |
489 | struct process_symbol_args args = { .name = symbol_name, }; | ||
490 | union perf_event *event = zalloc((sizeof(event->mmap) + | 501 | union perf_event *event = zalloc((sizeof(event->mmap) + |
491 | machine->id_hdr_size)); | 502 | machine->id_hdr_size)); |
492 | if (event == NULL) { | 503 | if (event == NULL) { |
@@ -513,7 +524,8 @@ int perf_event__synthesize_kernel_mmap(struct perf_tool *tool, | |||
513 | } | 524 | } |
514 | } | 525 | } |
515 | 526 | ||
516 | if (kallsyms__parse(filename, &args, find_symbol_cb) <= 0) { | 527 | start = kallsyms__get_function_start(filename, symbol_name); |
528 | if (!start) { | ||
517 | free(event); | 529 | free(event); |
518 | return -ENOENT; | 530 | return -ENOENT; |
519 | } | 531 | } |
@@ -525,7 +537,7 @@ int perf_event__synthesize_kernel_mmap(struct perf_tool *tool, | |||
525 | event->mmap.header.type = PERF_RECORD_MMAP; | 537 | event->mmap.header.type = PERF_RECORD_MMAP; |
526 | event->mmap.header.size = (sizeof(event->mmap) - | 538 | event->mmap.header.size = (sizeof(event->mmap) - |
527 | (sizeof(event->mmap.filename) - size) + machine->id_hdr_size); | 539 | (sizeof(event->mmap.filename) - size) + machine->id_hdr_size); |
528 | event->mmap.pgoff = args.start; | 540 | event->mmap.pgoff = start; |
529 | event->mmap.start = map->start; | 541 | event->mmap.start = map->start; |
530 | event->mmap.len = map->end - event->mmap.start; | 542 | event->mmap.len = map->end - event->mmap.start; |
531 | event->mmap.pid = machine->pid; | 543 | event->mmap.pid = machine->pid; |
diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h index faf6e219be21..66a0c0392863 100644 --- a/tools/perf/util/event.h +++ b/tools/perf/util/event.h | |||
@@ -279,4 +279,7 @@ size_t perf_event__fprintf_mmap2(union perf_event *event, FILE *fp); | |||
279 | size_t perf_event__fprintf_task(union perf_event *event, FILE *fp); | 279 | size_t perf_event__fprintf_task(union perf_event *event, FILE *fp); |
280 | size_t perf_event__fprintf(union perf_event *event, FILE *fp); | 280 | size_t perf_event__fprintf(union perf_event *event, FILE *fp); |
281 | 281 | ||
282 | u64 kallsyms__get_function_start(const char *kallsyms_filename, | ||
283 | const char *symbol_name); | ||
284 | |||
282 | #endif /* __PERF_RECORD_H */ | 285 | #endif /* __PERF_RECORD_H */ |