• Ingo Molnar's avatar
    perf_counter tools: Fix vmlinux fallback when running on a different kernel · c1f47b45
    Ingo Molnar authored
    Lucas De Marchi reported that perf report and perf annotate
    displays mismatching profile if a perf.data is analyzed on
    an older kernel - even if the correct vmlinux is specified
    via the -k option.
    
    The reason is the fallback path in util/symbol.c:dso__load_kernel():
    
    int dso__load_kernel(struct dso *self, const char *vmlinux,
                         symbol_filter_t filter, int verbose)
    {
            int err = -1;
    
            if (vmlinux)
                    err = dso__load_vmlinux(self, vmlinux, filter, verbose);
    
            if (err)
                    err = dso__load_kallsyms(self, filter, verbose);
    
            return err;
    }
    
    dso__load_vmlinux() returns negative on error, but on success it
    returns the number of symbols loaded - which confuses the function
    to load the kallsyms.
    
    This is normally harmless, as reporting is usually performed on the
    same kernel that is analyzed - but if there's a mismatch then we
    load the wrong kallsyms and create a non-sensical symbol tree.
    
    The fix is to only fall back to kallsyms on errors.
    Reported-by: default avatarLucas De Marchi <lucas.de.marchi@gmail.com>
    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Mike Galbraith <efault@gmx.de>
    Cc: Paul Mackerras <paulus@samba.org>
    Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
    LKML-Reference: <new-submission>
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    c1f47b45
symbol.c 13.4 KB