lkml.org 
[lkml]   [2021]   [Mar]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.11 466/775] perf unwind: Set userdata for all __report_module() paths
    Date
    From: Dave Rigby <d.rigby@me.com>

    [ Upstream commit 4e1481445407b86a483616c4542ffdc810efb680 ]

    When locating the DWARF module for a given address, __find_debuginfo()
    requires a 'struct dso' passed via the userdata argument.

    However, this field is only set in __report_module() if the module is
    found in via dwfl_addrmodule(), not if it is found later via
    dwfl_report_elf().

    Set userdata irrespective of how the DWARF module was found, as long as
    we found a module.

    Fixes: bf53fc6b5f41 ("perf unwind: Fix separate debug info files when using elfutils' libdw's unwinder")
    Signed-off-by: Dave Rigby <d.rigby@me.com>
    Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=211801
    Acked-by: Jan Kratochvil <jan.kratochvil@redhat.com>
    Acked-by: Jiri Olsa <jolsa@redhat.com>
    Link: https://lore.kernel.org/linux-perf-users/20210218165654.36604-1-d.rigby@me.com/
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    tools/perf/util/unwind-libdw.c | 11 ++++++++---
    1 file changed, 8 insertions(+), 3 deletions(-)

    diff --git a/tools/perf/util/unwind-libdw.c b/tools/perf/util/unwind-libdw.c
    index 0ada907c60d49..a74b517f74974 100644
    --- a/tools/perf/util/unwind-libdw.c
    +++ b/tools/perf/util/unwind-libdw.c
    @@ -60,10 +60,8 @@ static int __report_module(struct addr_location *al, u64 ip,
    mod = dwfl_addrmodule(ui->dwfl, ip);
    if (mod) {
    Dwarf_Addr s;
    - void **userdatap;

    - dwfl_module_info(mod, &userdatap, &s, NULL, NULL, NULL, NULL, NULL);
    - *userdatap = dso;
    + dwfl_module_info(mod, NULL, &s, NULL, NULL, NULL, NULL, NULL);
    if (s != al->map->start - al->map->pgoff)
    mod = 0;
    }
    @@ -79,6 +77,13 @@ static int __report_module(struct addr_location *al, u64 ip,
    al->map->start - al->map->pgoff, false);
    }

    + if (mod) {
    + void **userdatap;
    +
    + dwfl_module_info(mod, &userdatap, NULL, NULL, NULL, NULL, NULL, NULL);
    + *userdatap = dso;
    + }
    +
    return mod && dwfl_addrmodule(ui->dwfl, ip) == mod ? 0 : -1;
    }

    --
    2.27.0


    \
     
     \ /
      Last update: 2021-03-02 05:10    [W:4.153 / U:0.716 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site