lkml.org 
[lkml]   [2020]   [Jun]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 258/261] perf probe: Fix to check blacklist address correctly
    Date
    From: Masami Hiramatsu <mhiramat@kernel.org>

    commit 80526491c2ca6abc028c0f0dbb0707a1f35fb18a upstream.

    Fix to check kprobe blacklist address correctly with relocated address
    by adjusting debuginfo address.

    Since the address in the debuginfo is same as objdump, it is different
    from relocated kernel address with KASLR. Thus, 'perf probe' always
    misses to catch the blacklisted addresses.

    Without this patch, 'perf probe' can not detect the blacklist addresses
    on a KASLR enabled kernel.

    # perf probe kprobe_dispatcher
    Failed to write event: Invalid argument
    Error: Failed to add events.
    #

    With this patch, it correctly shows the error message.

    # perf probe kprobe_dispatcher
    kprobe_dispatcher is blacklisted function, skip it.
    Probe point 'kprobe_dispatcher' not found.
    Error: Failed to add events.
    #

    Fixes: 9aaf5a5f479b ("perf probe: Check kprobes blacklist when adding new events")
    Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
    Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: stable@vger.kernel.org
    Link: http://lore.kernel.org/lkml/158763966411.30755.5882376357738273695.stgit@devnote2
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    tools/perf/util/probe-event.c | 21 +++++++++++++++------
    1 file changed, 15 insertions(+), 6 deletions(-)

    --- a/tools/perf/util/probe-event.c
    +++ b/tools/perf/util/probe-event.c
    @@ -102,7 +102,7 @@ void exit_probe_symbol_maps(void)
    symbol__exit();
    }

    -static struct ref_reloc_sym *kernel_get_ref_reloc_sym(void)
    +static struct ref_reloc_sym *kernel_get_ref_reloc_sym(struct map **pmap)
    {
    /* kmap->ref_reloc_sym should be set if host_machine is initialized */
    struct kmap *kmap;
    @@ -114,6 +114,10 @@ static struct ref_reloc_sym *kernel_get_
    kmap = map__kmap(map);
    if (!kmap)
    return NULL;
    +
    + if (pmap)
    + *pmap = map;
    +
    return kmap->ref_reloc_sym;
    }

    @@ -125,7 +129,7 @@ static int kernel_get_symbol_address_by_
    struct map *map;

    /* ref_reloc_sym is just a label. Need a special fix*/
    - reloc_sym = kernel_get_ref_reloc_sym();
    + reloc_sym = kernel_get_ref_reloc_sym(NULL);
    if (reloc_sym && strcmp(name, reloc_sym->name) == 0)
    *addr = (reloc) ? reloc_sym->addr : reloc_sym->unrelocated_addr;
    else {
    @@ -745,6 +749,7 @@ post_process_kernel_probe_trace_events(s
    int ntevs)
    {
    struct ref_reloc_sym *reloc_sym;
    + struct map *map;
    char *tmp;
    int i, skipped = 0;

    @@ -753,7 +758,7 @@ post_process_kernel_probe_trace_events(s
    return post_process_offline_probe_trace_events(tevs, ntevs,
    symbol_conf.vmlinux_name);

    - reloc_sym = kernel_get_ref_reloc_sym();
    + reloc_sym = kernel_get_ref_reloc_sym(&map);
    if (!reloc_sym) {
    pr_warning("Relocated base symbol is not found!\n");
    return -EINVAL;
    @@ -764,9 +769,13 @@ post_process_kernel_probe_trace_events(s
    continue;
    if (tevs[i].point.retprobe && !kretprobe_offset_is_supported())
    continue;
    - /* If we found a wrong one, mark it by NULL symbol */
    + /*
    + * If we found a wrong one, mark it by NULL symbol.
    + * Since addresses in debuginfo is same as objdump, we need
    + * to convert it to addresses on memory.
    + */
    if (kprobe_warn_out_range(tevs[i].point.symbol,
    - tevs[i].point.address)) {
    + map__objdump_2mem(map, tevs[i].point.address))) {
    tmp = NULL;
    skipped++;
    } else {
    @@ -2922,7 +2931,7 @@ static int find_probe_trace_events_from_
    /* Note that the symbols in the kmodule are not relocated */
    if (!pev->uprobes && !pev->target &&
    (!pp->retprobe || kretprobe_offset_is_supported())) {
    - reloc_sym = kernel_get_ref_reloc_sym();
    + reloc_sym = kernel_get_ref_reloc_sym(NULL);
    if (!reloc_sym) {
    pr_warning("Relocated base symbol is not found!\n");
    ret = -EINVAL;

    \
     
     \ /
      Last update: 2020-06-19 17:55    [W:2.460 / U:1.436 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site