• P
    perf/x86/intel: Delay memory deallocation until x86_pmu_dead_cpu() · f6841ae0
    Peter Zijlstra 提交于
    commit 602cae04c4864bb3487dfe4c2126c8d9e7e1614a upstream.
    
    intel_pmu_cpu_prepare() allocated memory for ->shared_regs among other
    members of struct cpu_hw_events. This memory is released in
    intel_pmu_cpu_dying() which is wrong. The counterpart of the
    intel_pmu_cpu_prepare() callback is x86_pmu_dead_cpu().
    
    Otherwise if the CPU fails on the UP path between CPUHP_PERF_X86_PREPARE
    and CPUHP_AP_PERF_X86_STARTING then it won't release the memory but
    allocate new memory on the next attempt to online the CPU (leaking the
    old memory).
    Also, if the CPU down path fails between CPUHP_AP_PERF_X86_STARTING and
    CPUHP_PERF_X86_PREPARE then the CPU will go back online but never
    allocate the memory that was released in x86_pmu_dying_cpu().
    
    Make the memory allocation/free symmetrical in regard to the CPU hotplug
    notifier by moving the deallocation to intel_pmu_cpu_dead().
    
    This started in commit:
    
       a7e3ed1e ("perf: Add support for supplementary event registers").
    
    In principle the bug was introduced in v2.6.39 (!), but it will almost
    certainly not backport cleanly across the big CPU hotplug rewrite between v4.7-v4.15...
    
    [ bigeasy: Added patch description. ]
    [ mingo: Added backporting guidance. ]
    Reported-by: NHe Zhe <zhe.he@windriver.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> # With developer hat on
    Signed-off-by: NSebastian Andrzej Siewior <bigeasy@linutronix.de>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> # With maintainer hat on
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: acme@kernel.org
    Cc: bp@alien8.de
    Cc: hpa@zytor.com
    Cc: jolsa@kernel.org
    Cc: kan.liang@linux.intel.com
    Cc: namhyung@kernel.org
    Cc: <stable@vger.kernel.org>
    Fixes: a7e3ed1e ("perf: Add support for supplementary event registers").
    Link: https://lkml.kernel.org/r/20181219165350.6s3jvyxbibpvlhtq@linutronix.deSigned-off-by: NIngo Molnar <mingo@kernel.org>
    [ He Zhe: Fixes conflict caused by missing disable_counter_freeze which is
     introduced since v4.20 af3bdb991a5cb. ]
    Signed-off-by: NHe Zhe <zhe.he@windriver.com>
    Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
    f6841ae0
core.c 125.3 KB