Skip to content

Commit

Permalink
perf machine: Allow for extra kernel maps
Browse files Browse the repository at this point in the history
Identify extra kernel maps by name so that they can be distinguished
from the kernel map and module maps.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Dave Hansen <dave.hansen@linux.intel.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Joerg Roedel <joro@8bytes.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: x86@kernel.org
Link: http://lkml.kernel.org/r/1526986485-6562-8-git-send-email-adrian.hunter@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
  • Loading branch information
Adrian Hunter authored and Arnaldo Carvalho de Melo committed May 22, 2018
1 parent 4d00436 commit 5759a68
Show file tree
Hide file tree
Showing 5 changed files with 34 additions and 12 deletions.
2 changes: 1 addition & 1 deletion tools/perf/util/event.c
Original file line number Diff line number Diff line change
Expand Up @@ -487,7 +487,7 @@ int perf_event__synthesize_modules(struct perf_tool *tool,
for (pos = maps__first(maps); pos; pos = map__next(pos)) {
size_t size;

if (__map__is_kernel(pos))
if (!__map__is_kmodule(pos))
continue;

size = PERF_ALIGN(pos->dso->long_name_len + 1, sizeof(u64));
Expand Down
8 changes: 6 additions & 2 deletions tools/perf/util/machine.c
Original file line number Diff line number Diff line change
Expand Up @@ -856,6 +856,7 @@ struct extra_kernel_map {
u64 start;
u64 end;
u64 pgoff;
char name[KMAP_NAME_LEN];
};

static int machine__create_extra_kernel_map(struct machine *machine,
Expand All @@ -875,11 +876,12 @@ static int machine__create_extra_kernel_map(struct machine *machine,
kmap = map__kmap(map);

kmap->kmaps = &machine->kmaps;
strlcpy(kmap->name, xm->name, KMAP_NAME_LEN);

map_groups__insert(&machine->kmaps, map);

pr_debug2("Added extra kernel map %" PRIx64 "-%" PRIx64 "\n",
map->start, map->end);
pr_debug2("Added extra kernel map %s %" PRIx64 "-%" PRIx64 "\n",
kmap->name, map->start, map->end);

map__put(map);

Expand Down Expand Up @@ -940,6 +942,8 @@ int machine__map_x86_64_entry_trampolines(struct machine *machine,
.pgoff = pgoff,
};

strlcpy(xm.name, ENTRY_TRAMPOLINE_NAME, KMAP_NAME_LEN);

if (machine__create_extra_kernel_map(machine, kernel, &xm) < 0)
return -1;
}
Expand Down
22 changes: 18 additions & 4 deletions tools/perf/util/map.c
Original file line number Diff line number Diff line change
Expand Up @@ -252,6 +252,13 @@ bool __map__is_kernel(const struct map *map)
return machine__kernel_map(map->groups->machine) == map;
}

bool __map__is_extra_kernel_map(const struct map *map)
{
struct kmap *kmap = __map__kmap((struct map *)map);

return kmap && kmap->name[0];
}

bool map__has_symbols(const struct map *map)
{
return dso__has_symbols(map->dso);
Expand Down Expand Up @@ -846,15 +853,22 @@ struct map *map__next(struct map *map)
return NULL;
}

struct kmap *map__kmap(struct map *map)
struct kmap *__map__kmap(struct map *map)
{
if (!map->dso || !map->dso->kernel) {
pr_err("Internal error: map__kmap with a non-kernel map\n");
if (!map->dso || !map->dso->kernel)
return NULL;
}
return (struct kmap *)(map + 1);
}

struct kmap *map__kmap(struct map *map)
{
struct kmap *kmap = __map__kmap(map);

if (!kmap)
pr_err("Internal error: map__kmap with a non-kernel map\n");
return kmap;
}

struct map_groups *map__kmaps(struct map *map)
{
struct kmap *kmap = map__kmap(map);
Expand Down
7 changes: 6 additions & 1 deletion tools/perf/util/map.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,12 @@ struct map {
refcount_t refcnt;
};

#define KMAP_NAME_LEN 256

struct kmap {
struct ref_reloc_sym *ref_reloc_sym;
struct map_groups *kmaps;
char name[KMAP_NAME_LEN];
};

struct maps {
Expand All @@ -76,6 +79,7 @@ static inline struct map_groups *map_groups__get(struct map_groups *mg)

void map_groups__put(struct map_groups *mg);

struct kmap *__map__kmap(struct map *map);
struct kmap *map__kmap(struct map *map);
struct map_groups *map__kmaps(struct map *map);

Expand Down Expand Up @@ -232,10 +236,11 @@ int map_groups__fixup_overlappings(struct map_groups *mg, struct map *map,
struct map *map_groups__find_by_name(struct map_groups *mg, const char *name);

bool __map__is_kernel(const struct map *map);
bool __map__is_extra_kernel_map(const struct map *map);

static inline bool __map__is_kmodule(const struct map *map)
{
return !__map__is_kernel(map);
return !__map__is_kernel(map) && !__map__is_extra_kernel_map(map);
}

bool map__has_symbols(const struct map *map);
Expand Down
7 changes: 3 additions & 4 deletions tools/perf/util/symbol.c
Original file line number Diff line number Diff line change
Expand Up @@ -1030,7 +1030,7 @@ struct map *map_groups__first(struct map_groups *mg)
return maps__first(&mg->maps);
}

static int do_validate_kcore_modules(const char *filename, struct map *map,
static int do_validate_kcore_modules(const char *filename,
struct map_groups *kmaps)
{
struct rb_root modules = RB_ROOT;
Expand All @@ -1046,8 +1046,7 @@ static int do_validate_kcore_modules(const char *filename, struct map *map,
struct map *next = map_groups__next(old_map);
struct module_info *mi;

if (old_map == map || old_map->start == map->start) {
/* The kernel map */
if (!__map__is_kmodule(old_map)) {
old_map = next;
continue;
}
Expand Down Expand Up @@ -1104,7 +1103,7 @@ static int validate_kcore_modules(const char *kallsyms_filename,
kallsyms_filename))
return -EINVAL;

if (do_validate_kcore_modules(modules_filename, map, kmaps))
if (do_validate_kcore_modules(modules_filename, kmaps))
return -EINVAL;

return 0;
Expand Down

0 comments on commit 5759a68

Please sign in to comment.