• Lendacky, Thomas's avatar
    x86/perf/amd: Resolve race condition when disabling PMC · 914123fa
    Lendacky, Thomas authored
    On AMD processors, the detection of an overflowed counter in the NMI
    handler relies on the current value of the counter. So, for example, to
    check for overflow on a 48 bit counter, bit 47 is checked to see if it
    is 1 (not overflowed) or 0 (overflowed).
    
    There is currently a race condition present when disabling and then
    updating the PMC. Increased NMI latency in newer AMD processors makes this
    race condition more pronounced. If the counter value has overflowed, it is
    possible to update the PMC value before the NMI handler can run. The
    updated PMC value is not an overflowed value, so when the perf NMI handler
    does run, it will not find an overflowed counter. This may appear as an
    unknown NMI resulting in either a panic or a series of messages, depending
    on how the kernel is configured.
    
    To eliminate this race condition, the PMC value must be checked after
    disabling the counter. Add an AMD function, amd_pmu_disable_all(), that
    will wait for the NMI handler to reset any active and overflowed counter
    after calling x86_pmu_disable_all().
    Signed-off-by: default avatarTom Lendacky <thomas.lendacky@amd.com>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Cc: <stable@vger.kernel.org> # 4.14.x-
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
    Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Stephane Eranian <eranian@google.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Vince Weaver <vincent.weaver@maine.edu>
    Link: https://lkml.kernel.org/r/Message-ID:
    Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
    914123fa
core.c 20.2 KB