lkml.org 
[lkml]   [2022]   [Jun]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    Date
    SubjectRe: [PATCH bpf-next 2/3] ftrace: Keep address offset in ftrace_lookup_symbols
    On Fri, May 27, 2022 at 1:56 PM Jiri Olsa <jolsa@kernel.org> wrote:
    >
    > We want to store the resolved address on the same index as
    > the symbol string, because that's the user (bpf kprobe link)
    > code assumption.
    >
    > Also making sure we don't store duplicates that might be
    > present in kallsyms.
    >
    > Fixes: bed0d9a50dac ("ftrace: Add ftrace_lookup_symbols function")
    > Signed-off-by: Jiri Olsa <jolsa@kernel.org>
    > ---
    > kernel/trace/ftrace.c | 13 +++++++++++--
    > 1 file changed, 11 insertions(+), 2 deletions(-)
    >
    > diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
    > index 674add0aafb3..00d0ba6397ed 100644
    > --- a/kernel/trace/ftrace.c
    > +++ b/kernel/trace/ftrace.c
    > @@ -7984,15 +7984,23 @@ static int kallsyms_callback(void *data, const char *name,
    > struct module *mod, unsigned long addr)
    > {
    > struct kallsyms_data *args = data;
    > + const char **sym;
    > + int idx;
    >
    > - if (!bsearch(&name, args->syms, args->cnt, sizeof(*args->syms), symbols_cmp))
    > + sym = bsearch(&name, args->syms, args->cnt, sizeof(*args->syms), symbols_cmp);
    > + if (!sym)
    > + return 0;
    > +
    > + idx = sym - args->syms;
    > + if (args->addrs[idx])

    if we have duplicated symbols we won't increment args->found here,
    right? So we won't stop early. But we also don't want to increment
    args->found here because we use it to check that we don't have
    duplicates (in addition to making sure we resolved all the unique
    symbols), right?

    So I wonder if in this situation should we return some error code to
    signify that we encountered symbol duplicate?


    > return 0;
    >
    > addr = ftrace_location(addr);
    > if (!addr)
    > return 0;
    >
    > - args->addrs[args->found++] = addr;
    > + args->addrs[idx] = addr;
    > + args->found++;
    > return args->found == args->cnt ? 1 : 0;
    > }
    >
    > @@ -8017,6 +8025,7 @@ int ftrace_lookup_symbols(const char **sorted_syms, size_t cnt, unsigned long *a
    > struct kallsyms_data args;
    > int err;
    >
    > + memset(addrs, 0x0, sizeof(*addrs) * cnt);
    > args.addrs = addrs;
    > args.syms = sorted_syms;
    > args.cnt = cnt;
    > --
    > 2.35.3
    >

    \
     
     \ /
      Last update: 2022-06-03 00:52    [W:3.303 / U:0.064 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site