• Stephane Eranian's avatar
    perf/x86/pebs: Fix handling of PEBS buffer overflows · daa864b8
    Stephane Eranian authored
    This patch solves a race condition between PEBS and the PMU handler.
    In case multiple PEBS events are sampled at the same time,
    it is possible to have GLOBAL_STATUS bit 62 set indicating
    PEBS buffer overflow and also seeing at most 3 PEBS counters
    having their bits set in the status register. This is a sign
    that there was at least one PEBS record pending at the time
    of the PMU interrupt. PEBS counters must only be processed
    via the drain_pebs() calls, and not via the regular sample
    processing loop coming after that the function, otherwise
    phony regular samples may be generated in the sampling buffer
    not marked with the EXACT tag.
    Another possibility is to have one PEBS event and at least
    one non-PEBS event whic hoverflows while PEBS has armed. In this
    case, bit 62 of GLOBAL_STATUS will not be set, yet the overflow
    status bit for the PEBS counter will be on Skylake.
    To avoid this problem, we systematically ignore the PEBS-enabled
    counters from the GLOBAL_STATUS mask and we always process PEBS
    events via drain_pebs().
    The problem manifested itself by having non-exact samples when
    sampling only PEBS events, i.e., the PERF_SAMPLE_RECORD would
    not have the EXACT flag set.
    Note that this problem is only present on Skylake processor.
    This fix is harmless on older processors.
    Reported-by: default avatarPeter Zijlstra <peterz@infradead.org>
    Signed-off-by: default avatarStephane Eranian <eranian@google.com>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    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: Thomas Gleixner <tglx@linutronix.de>
    Cc: Vince Weaver <vincent.weaver@maine.edu>
    Link: http://lkml.kernel.org/r/1482395366-8992-1-git-send-email-eranian@google.comSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
core.c 115 KB