#include "util/thread.h"
#include "util/sort.h"
#include "util/hist.h"
+#include "util/process_events.h"
static char const *input_name = "perf.data";
struct sym_ext *ext;
};
+static struct symbol_conf symbol_conf = {
+ .priv_size = sizeof(struct sym_priv),
+ .try_vmlinux_path = true,
+};
+
static const char *sym_hist_filter;
-static int symbol_filter(struct map *map, struct symbol *sym)
+static int symbol_filter(struct map *map __used, struct symbol *sym)
{
if (sym_hist_filter == NULL ||
strcmp(sym->name, sym_hist_filter) == 0) {
- struct sym_priv *priv = dso__sym_priv(map->dso, sym);
+ struct sym_priv *priv = symbol__priv(sym);
const int size = (sizeof(*priv->hist) +
(sym->end - sym->start) * sizeof(u64));
if (!sym || !he->map)
return;
- priv = dso__sym_priv(he->map->dso, sym);
+ priv = symbol__priv(sym);
if (!priv->hist)
return;
if (event->header.misc & PERF_RECORD_MISC_KERNEL) {
level = 'k';
- sym = kernel_maps__find_symbol(ip, &map);
+ sym = kernel_maps__find_function(ip, &map, symbol_filter);
dump_printf(" ...... dso: %s\n",
map ? map->dso->long_name : "<not found>");
} else if (event->header.misc & PERF_RECORD_MISC_USER) {
if (map != NULL) {
got_map:
ip = map->map_ip(map, ip);
- sym = map->dso->find_symbol(map->dso, ip);
+ sym = map__find_function(map, ip, symbol_filter);
} else {
/*
* If this is outside of all known maps,
return 0;
}
-static int
-process_mmap_event(event_t *event, unsigned long offset, unsigned long head)
-{
- struct map *map = map__new(&event->mmap, NULL, 0,
- sizeof(struct sym_priv), symbol_filter,
- verbose);
- struct thread *thread = threads__findnew(event->mmap.pid);
-
- dump_printf("%p [%p]: PERF_RECORD_MMAP %d: [%p(%p) @ %p]: %s\n",
- (void *)(offset + head),
- (void *)(long)(event->header.size),
- event->mmap.pid,
- (void *)(long)event->mmap.start,
- (void *)(long)event->mmap.len,
- (void *)(long)event->mmap.pgoff,
- event->mmap.filename);
-
- if (thread == NULL || map == NULL) {
- dump_printf("problem processing PERF_RECORD_MMAP, skipping event.\n");
- return 0;
- }
-
- thread__insert_map(thread, map);
- total_mmap++;
-
- return 0;
-}
-
static int
process_comm_event(event_t *event, unsigned long offset, unsigned long head)
{
return 0;
}
-static int
-process_fork_event(event_t *event, unsigned long offset, unsigned long head)
-{
- struct thread *thread = threads__findnew(event->fork.pid);
- struct thread *parent = threads__findnew(event->fork.ppid);
-
- dump_printf("%p [%p]: PERF_RECORD_FORK: %d:%d\n",
- (void *)(offset + head),
- (void *)(long)(event->header.size),
- event->fork.pid, event->fork.ppid);
-
- /*
- * A thread clone will have the same PID for both
- * parent and child.
- */
- if (thread == parent)
- return 0;
-
- if (!thread || !parent || thread__fork(thread, parent)) {
- dump_printf("problem processing PERF_RECORD_FORK, skipping event.\n");
- return -1;
- }
- total_fork++;
-
- return 0;
-}
-
static int
process_event(event_t *event, unsigned long offset, unsigned long head)
{
return process_comm_event(event, offset, head);
case PERF_RECORD_FORK:
- return process_fork_event(event, offset, head);
+ return process_task_event(event, offset, head);
/*
* We dont process them right now but they are fine:
*/
unsigned int hits = 0;
double percent = 0.0;
const char *color;
- struct sym_priv *priv = dso__sym_priv(he->map->dso, sym);
+ struct sym_priv *priv = symbol__priv(sym);
struct sym_ext *sym_ext = priv->ext;
struct sym_hist *h = priv->hist;
static void free_source_line(struct hist_entry *he, int len)
{
- struct sym_priv *priv = dso__sym_priv(he->map->dso, he->sym);
+ struct sym_priv *priv = symbol__priv(he->sym);
struct sym_ext *sym_ext = priv->ext;
int i;
int i;
char cmd[PATH_MAX * 2];
struct sym_ext *sym_ext;
- struct sym_priv *priv = dso__sym_priv(he->map->dso, sym);
+ struct sym_priv *priv = symbol__priv(sym);
struct sym_hist *h = priv->hist;
if (!h->sum)
if (he->sym == NULL)
continue;
- priv = dso__sym_priv(he->map->dso, he->sym);
+ priv = symbol__priv(he->sym);
if (priv->hist == NULL)
continue;
exit(0);
}
- if (load_kernel(sizeof(struct sym_priv), symbol_filter) < 0) {
- perror("failed to load kernel symbols");
- return EXIT_FAILURE;
- }
-
remap:
buf = (char *)mmap(NULL, page_size * mmap_window, PROT_READ,
MAP_SHARED, input, offset);
"be more verbose (show symbol address, etc)"),
OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace,
"dump raw trace in ASCII"),
- OPT_STRING('k', "vmlinux", &vmlinux_name, "file", "vmlinux pathname"),
- OPT_BOOLEAN('m', "modules", &modules,
+ OPT_STRING('k', "vmlinux", &symbol_conf.vmlinux_name,
+ "file", "vmlinux pathname"),
+ OPT_BOOLEAN('m', "modules", &symbol_conf.use_modules,
"load module symbols - WARNING: use only with -k and LIVE kernel"),
OPT_BOOLEAN('l', "print-line", &print_line,
"print matching source lines (may be slow)"),
int cmd_annotate(int argc, const char **argv, const char *prefix __used)
{
- symbol__init();
+ if (symbol__init(&symbol_conf) < 0)
+ return -1;
page_size = getpagesize();