lkml.org 
[lkml]   [2019]   [Dec]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.4 239/350] perf probe: Fix to show calling lines of inlined functions
    Date
    From: Masami Hiramatsu <mhiramat@kernel.org>

    [ Upstream commit 86c0bf8539e7f46d91bd105e55eda96e0064caef ]

    Fix to show calling lines of inlined functions (where an inline function
    is called).

    die_walk_lines() filtered out the lines inside inlined functions based
    on the address. However this also filtered out the lines which call
    those inlined functions from the target function.

    To solve this issue, check the call_file and call_line attributes and do
    not filter out if it matches to the line information.

    Without this fix, perf probe -L doesn't show some lines correctly.
    (don't see the lines after 17)

    # perf probe -L vfs_read
    <vfs_read@/home/mhiramat/ksrc/linux/fs/read_write.c:0>
    0 ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
    1 {
    2 ssize_t ret;

    4 if (!(file->f_mode & FMODE_READ))
    return -EBADF;
    6 if (!(file->f_mode & FMODE_CAN_READ))
    return -EINVAL;
    8 if (unlikely(!access_ok(buf, count)))
    return -EFAULT;

    11 ret = rw_verify_area(READ, file, pos, count);
    12 if (!ret) {
    13 if (count > MAX_RW_COUNT)
    count = MAX_RW_COUNT;
    15 ret = __vfs_read(file, buf, count, pos);
    16 if (ret > 0) {
    fsnotify_access(file);
    add_rchar(current, ret);
    }

    With this fix:

    # perf probe -L vfs_read
    <vfs_read@/home/mhiramat/ksrc/linux/fs/read_write.c:0>
    0 ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
    1 {
    2 ssize_t ret;

    4 if (!(file->f_mode & FMODE_READ))
    return -EBADF;
    6 if (!(file->f_mode & FMODE_CAN_READ))
    return -EINVAL;
    8 if (unlikely(!access_ok(buf, count)))
    return -EFAULT;

    11 ret = rw_verify_area(READ, file, pos, count);
    12 if (!ret) {
    13 if (count > MAX_RW_COUNT)
    count = MAX_RW_COUNT;
    15 ret = __vfs_read(file, buf, count, pos);
    16 if (ret > 0) {
    17 fsnotify_access(file);
    18 add_rchar(current, ret);
    }
    20 inc_syscr(current);
    }

    Fixes: 4cc9cec636e7 ("perf probe: Introduce lines walker interface")
    Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
    Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Link: http://lore.kernel.org/lkml/157241937995.32002.17899884017011512577.stgit@devnote2
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    tools/perf/util/dwarf-aux.c | 10 +++++++++-
    1 file changed, 9 insertions(+), 1 deletion(-)

    diff --git a/tools/perf/util/dwarf-aux.c b/tools/perf/util/dwarf-aux.c
    index 08aba015e0725..2b718cfd62d93 100644
    --- a/tools/perf/util/dwarf-aux.c
    +++ b/tools/perf/util/dwarf-aux.c
    @@ -755,7 +755,7 @@ int die_walk_lines(Dwarf_Die *rt_die, line_walk_callback_t callback, void *data)
    Dwarf_Lines *lines;
    Dwarf_Line *line;
    Dwarf_Addr addr;
    - const char *fname, *decf = NULL;
    + const char *fname, *decf = NULL, *inf = NULL;
    int lineno, ret = 0;
    int decl = 0, inl;
    Dwarf_Die die_mem, *cu_die;
    @@ -799,13 +799,21 @@ int die_walk_lines(Dwarf_Die *rt_die, line_walk_callback_t callback, void *data)
    */
    if (!dwarf_haspc(rt_die, addr))
    continue;
    +
    if (die_find_inlinefunc(rt_die, addr, &die_mem)) {
    + /* Call-site check */
    + inf = die_get_call_file(&die_mem);
    + if ((inf && !strcmp(inf, decf)) &&
    + die_get_call_lineno(&die_mem) == lineno)
    + goto found;
    +
    dwarf_decl_line(&die_mem, &inl);
    if (inl != decl ||
    decf != dwarf_decl_file(&die_mem))
    continue;
    }
    }
    +found:
    /* Get source line */
    fname = dwarf_linesrc(line, NULL, NULL);

    --
    2.20.1
    \
     
     \ /
      Last update: 2019-12-10 22:22    [W:4.190 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site