• Stephane Eranian's avatar
    perf stat: Fix memory corruption of xyarray when cpumask is used · 8ad9219e
    Stephane Eranian authored
    This patch fixes a memory corruption problem with the xyarray when the
    evsel fds get closed at the end of the run_perf_stat() call.
    
    It could be triggered with:
    
     # perf stat -a -e power/energy-cores/ ls
    
    When cpumask are used by events (.e.g, RAPL or uncores) then the evsel
    fds are allocated based on the actual number of CPUs monitored. That
    number can be smaller than the total number of CPUs on the system.
    
    The problem arises at the end by perf stat closes the fds twice. When
    fds are closed, their entry in the xyarray are set to -1.
    
    The first close() on the evsel is made from __run_perf_stat() and it
    uses the actual number of CPUS for the event which is how the xyarray
    was allocated for.
    
    The second is from perf_evlist_close() but that one is on the total
    number of CPUs in the system, so it assume the xyarray was allocated to
    cover it. However it was not, and some writes corrupt memory.
    
    The fix is in perf_evlist_close() is to first try with the evsel->cpus
    if present, if not use the evlist->cpus. That fixes the problem.
    Signed-off-by: default avatarStephane Eranian <eranian@google.com>
    Cc: David Ahern <dsahern@gmail.com>
    Cc: Ingo Molnar <mingo@elte.hu>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Link: http://lkml.kernel.org/r/1389972846-6566-3-git-send-email-eranian@google.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    8ad9219e
evlist.c 28 KB