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 /tools/perf/util | |
| 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>
Diffstat (limited to 'tools/perf/util')
| -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 */ |
