lkml.org 
[lkml]   [2020]   [Nov]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 11/25] perf tools: Use struct extra_kernel_map in machine__process_kernel_mmap_event
    Date
    Using struct extra_kernel_map in machine__process_kernel_mmap_event,
    to pass mmap details. This way we can used single function for all 3
    mmap versions.

    Acked-by: Ian Rogers <irogers@google.com>
    Signed-off-by: Jiri Olsa <jolsa@kernel.org>
    ---
    tools/perf/util/machine.c | 62 +++++++++++++++++++++------------------
    1 file changed, 33 insertions(+), 29 deletions(-)

    diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c
    index 15385ea00190..1ae32a81639c 100644
    --- a/tools/perf/util/machine.c
    +++ b/tools/perf/util/machine.c
    @@ -1581,32 +1581,25 @@ static bool machine__uses_kcore(struct machine *machine)
    }

    static bool perf_event__is_extra_kernel_mmap(struct machine *machine,
    - union perf_event *event)
    + struct extra_kernel_map *xm)
    {
    return machine__is(machine, "x86_64") &&
    - is_entry_trampoline(event->mmap.filename);
    + is_entry_trampoline(xm->name);
    }

    static int machine__process_extra_kernel_map(struct machine *machine,
    - union perf_event *event)
    + struct extra_kernel_map *xm)
    {
    struct dso *kernel = machine__kernel_dso(machine);
    - struct extra_kernel_map xm = {
    - .start = event->mmap.start,
    - .end = event->mmap.start + event->mmap.len,
    - .pgoff = event->mmap.pgoff,
    - };

    if (kernel == NULL)
    return -1;

    - strlcpy(xm.name, event->mmap.filename, KMAP_NAME_LEN);
    -
    - return machine__create_extra_kernel_map(machine, kernel, &xm);
    + return machine__create_extra_kernel_map(machine, kernel, xm);
    }

    static int machine__process_kernel_mmap_event(struct machine *machine,
    - union perf_event *event)
    + struct extra_kernel_map *xm)
    {
    struct map *map;
    enum dso_space_type dso_space;
    @@ -1621,20 +1614,18 @@ static int machine__process_kernel_mmap_event(struct machine *machine,
    else
    dso_space = DSO_SPACE__KERNEL_GUEST;

    - is_kernel_mmap = memcmp(event->mmap.filename,
    - machine->mmap_name,
    + is_kernel_mmap = memcmp(xm->name, machine->mmap_name,
    strlen(machine->mmap_name) - 1) == 0;
    - if (event->mmap.filename[0] == '/' ||
    - (!is_kernel_mmap && event->mmap.filename[0] == '[')) {
    - map = machine__addnew_module_map(machine, event->mmap.start,
    - event->mmap.filename);
    + if (xm->name[0] == '/' ||
    + (!is_kernel_mmap && xm->name[0] == '[')) {
    + map = machine__addnew_module_map(machine, xm->start,
    + xm->name);
    if (map == NULL)
    goto out_problem;

    - map->end = map->start + event->mmap.len;
    + map->end = map->start + xm->end - xm->start;
    } else if (is_kernel_mmap) {
    - const char *symbol_name = (event->mmap.filename +
    - strlen(machine->mmap_name));
    + const char *symbol_name = (xm->name + strlen(machine->mmap_name));
    /*
    * Should be there already, from the build-id table in
    * the header.
    @@ -1688,18 +1679,17 @@ static int machine__process_kernel_mmap_event(struct machine *machine,
    if (strstr(kernel->long_name, "vmlinux"))
    dso__set_short_name(kernel, "[kernel.vmlinux]", false);

    - machine__update_kernel_mmap(machine, event->mmap.start,
    - event->mmap.start + event->mmap.len);
    + machine__update_kernel_mmap(machine, xm->start, xm->end);

    /*
    * Avoid using a zero address (kptr_restrict) for the ref reloc
    * symbol. Effectively having zero here means that at record
    * time /proc/sys/kernel/kptr_restrict was non zero.
    */
    - if (event->mmap.pgoff != 0) {
    + if (xm->pgoff != 0) {
    map__set_kallsyms_ref_reloc_sym(machine->vmlinux_map,
    symbol_name,
    - event->mmap.pgoff);
    + xm->pgoff);
    }

    if (machine__is_default_guest(machine)) {
    @@ -1708,8 +1698,8 @@ static int machine__process_kernel_mmap_event(struct machine *machine,
    */
    dso__load(kernel, machine__kernel_map(machine));
    }
    - } else if (perf_event__is_extra_kernel_mmap(machine, event)) {
    - return machine__process_extra_kernel_map(machine, event);
    + } else if (perf_event__is_extra_kernel_mmap(machine, xm)) {
    + return machine__process_extra_kernel_map(machine, xm);
    }
    return 0;
    out_problem:
    @@ -1735,7 +1725,14 @@ int machine__process_mmap2_event(struct machine *machine,

    if (sample->cpumode == PERF_RECORD_MISC_GUEST_KERNEL ||
    sample->cpumode == PERF_RECORD_MISC_KERNEL) {
    - ret = machine__process_kernel_mmap_event(machine, event);
    + struct extra_kernel_map xm = {
    + .start = event->mmap2.start,
    + .end = event->mmap2.start + event->mmap2.len,
    + .pgoff = event->mmap2.pgoff,
    + };
    +
    + strlcpy(xm.name, event->mmap2.filename, KMAP_NAME_LEN);
    + ret = machine__process_kernel_mmap_event(machine, &xm);
    if (ret < 0)
    goto out_problem;
    return 0;
    @@ -1785,7 +1782,14 @@ int machine__process_mmap_event(struct machine *machine, union perf_event *event

    if (sample->cpumode == PERF_RECORD_MISC_GUEST_KERNEL ||
    sample->cpumode == PERF_RECORD_MISC_KERNEL) {
    - ret = machine__process_kernel_mmap_event(machine, event);
    + struct extra_kernel_map xm = {
    + .start = event->mmap.start,
    + .end = event->mmap.start + event->mmap.len,
    + .pgoff = event->mmap.pgoff,
    + };
    +
    + strlcpy(xm.name, event->mmap.filename, KMAP_NAME_LEN);
    + ret = machine__process_kernel_mmap_event(machine, &xm);
    if (ret < 0)
    goto out_problem;
    return 0;
    --
    2.26.2
    \
     
     \ /
      Last update: 2020-11-24 00:09    [W:4.273 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site