lkml.org 
[lkml]   [2022]   [Mar]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 57/57] perf symbols: Fix symbol size calculation condition
    Date
    From: Michael Petlan <mpetlan@redhat.com>

    commit 3cf6a32f3f2a45944dd5be5c6ac4deb46bcd3bee upstream.

    Before this patch, the symbol end address fixup to be called, needed two
    conditions being met:

    if (prev->end == prev->start && prev->end != curr->start)

    Where
    "prev->end == prev->start" means that prev is zero-long
    (and thus needs a fixup)
    and
    "prev->end != curr->start" means that fixup hasn't been applied yet

    However, this logic is incorrect in the following situation:

    *curr = {rb_node = {__rb_parent_color = 278218928,
    rb_right = 0x0, rb_left = 0x0},
    start = 0xc000000000062354,
    end = 0xc000000000062354, namelen = 40, type = 2 '\002',
    binding = 0 '\000', idle = 0 '\000', ignore = 0 '\000',
    inlined = 0 '\000', arch_sym = 0 '\000', annotate2 = false,
    name = 0x1159739e "kprobe_optinsn_page\t[__builtin__kprobes]"}

    *prev = {rb_node = {__rb_parent_color = 278219041,
    rb_right = 0x109548b0, rb_left = 0x109547c0},
    start = 0xc000000000062354,
    end = 0xc000000000062354, namelen = 12, type = 2 '\002',
    binding = 1 '\001', idle = 0 '\000', ignore = 0 '\000',
    inlined = 0 '\000', arch_sym = 0 '\000', annotate2 = false,
    name = 0x1095486e "optinsn_slot"}

    In this case, prev->start == prev->end == curr->start == curr->end,
    thus the condition above thinks that "we need a fixup due to zero
    length of prev symbol, but it has been probably done, since the
    prev->end == curr->start", which is wrong.

    After the patch, the execution path proceeds to arch__symbols__fixup_end
    function which fixes up the size of prev symbol by adding page_size to
    its end offset.

    Fixes: 3b01a413c196c910 ("perf symbols: Improve kallsyms symbol end addr calculation")
    Signed-off-by: Michael Petlan <mpetlan@redhat.com>
    Cc: Athira Jajeev <atrajeev@linux.vnet.ibm.com>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Kajol Jain <kjain@linux.ibm.com>
    Cc: Madhavan Srinivasan <maddy@linux.ibm.com>
    Link: http://lore.kernel.org/lkml/20220317135536.805-1-mpetlan@redhat.com
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    tools/perf/util/symbol.c | 2 +-
    1 file changed, 1 insertion(+), 1 deletion(-)

    --- a/tools/perf/util/symbol.c
    +++ b/tools/perf/util/symbol.c
    @@ -217,7 +217,7 @@ void symbols__fixup_end(struct rb_root *
    prev = curr;
    curr = rb_entry(nd, struct symbol, rb_node);

    - if (prev->end == prev->start && prev->end != curr->start)
    + if (prev->end == prev->start || prev->end != curr->start)
    arch__symbols__fixup_end(prev, curr);
    }


    \
     
     \ /
      Last update: 2022-03-21 15:03    [W:2.283 / U:0.552 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site