lkml.org 
[lkml]   [2019]   [May]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 05/12] perf tools: Read also the end of the kernel
    Date
    We mark the end of kernel based on the first module,
    but that could cover some bpf program maps. Reading
    _etext symbol if it's present to get precise kernel
    map end.

    Link: http://lkml.kernel.org/n/tip-ynut991ttyyhvo1sbhlm4c42@git.kernel.org
    Signed-off-by: Jiri Olsa <jolsa@kernel.org>
    ---
    tools/perf/util/machine.c | 27 ++++++++++++++++++---------
    1 file changed, 18 insertions(+), 9 deletions(-)

    diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c
    index 3c520baa198c..ad0205fbb506 100644
    --- a/tools/perf/util/machine.c
    +++ b/tools/perf/util/machine.c
    @@ -924,7 +924,8 @@ const char *ref_reloc_sym_names[] = {"_text", "_stext", NULL};
    * symbol_name if it's not that important.
    */
    static int machine__get_running_kernel_start(struct machine *machine,
    - const char **symbol_name, u64 *start)
    + const char **symbol_name,
    + u64 *start, u64 *end)
    {
    char filename[PATH_MAX];
    int i, err = -1;
    @@ -949,6 +950,11 @@ static int machine__get_running_kernel_start(struct machine *machine,
    *symbol_name = name;

    *start = addr;
    +
    + err = kallsyms__get_function_start(filename, "_etext", &addr);
    + if (!err)
    + *end = addr;
    +
    return 0;
    }

    @@ -1440,7 +1446,7 @@ int machine__create_kernel_maps(struct machine *machine)
    struct dso *kernel = machine__get_kernel(machine);
    const char *name = NULL;
    struct map *map;
    - u64 addr = 0;
    + u64 start = 0, end = ~0ULL;
    int ret;

    if (kernel == NULL)
    @@ -1459,9 +1465,9 @@ int machine__create_kernel_maps(struct machine *machine)
    "continuing anyway...\n", machine->pid);
    }

    - if (!machine__get_running_kernel_start(machine, &name, &addr)) {
    + if (!machine__get_running_kernel_start(machine, &name, &start, &end)) {
    if (name &&
    - map__set_kallsyms_ref_reloc_sym(machine->vmlinux_map, name, addr)) {
    + map__set_kallsyms_ref_reloc_sym(machine->vmlinux_map, name, start)) {
    machine__destroy_kernel_maps(machine);
    ret = -1;
    goto out_put;
    @@ -1471,16 +1477,19 @@ int machine__create_kernel_maps(struct machine *machine)
    * we have a real start address now, so re-order the kmaps
    * assume it's the last in the kmaps
    */
    - machine__update_kernel_mmap(machine, addr, ~0ULL);
    + machine__update_kernel_mmap(machine, start, end);
    }

    if (machine__create_extra_kernel_maps(machine, kernel))
    pr_debug("Problems creating extra kernel maps, continuing anyway...\n");

    - /* update end address of the kernel map using adjacent module address */
    - map = map__next(machine__kernel_map(machine));
    - if (map)
    - machine__set_kernel_mmap(machine, addr, map->start);
    + if (end == ~0ULL) {
    + /* update end address of the kernel map using adjacent module address */
    + map = map__next(machine__kernel_map(machine));
    + if (map)
    + machine__set_kernel_mmap(machine, start, map->start);
    + }
    +
    out_put:
    dso__put(kernel);
    return ret;
    --
    2.20.1
    \
     
     \ /
      Last update: 2019-05-08 15:22    [W:4.261 / U:0.052 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site