Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull perf fixes from Ingo Molnar: "On the kernel side there's two x86 PMU driver fixes and a uprobes fix, plus on the tooling side there's a number of fixes and some late updates" * 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (36 commits) perf sched timehist: Fix invalid period calculation perf sched timehist: Remove hardcoded 'comm_width' check at print_summary perf sched timehist: Enlarge default 'comm_width' perf sched timehist: Honour 'comm_width' when aligning the headers perf/x86: Fix overlap counter scheduling bug perf/x86/pebs: Fix handling of PEBS buffer overflows samples/bpf: Move open_raw_sock to separate header samples/bpf: Remove perf_event_open() declaration samples/bpf: Be consistent with bpf_load_program bpf_insn parameter tools lib bpf: Add bpf_prog_{attach,detach} samples/bpf: Switch over to libbpf perf diff: Do not overwrite valid build id perf annotate: Don't throw error for zero length symbols perf bench futex: Fix lock-pi help string perf trace: Check if MAP_32BIT is defined (again) samples/bpf: Make perf_event_read() static uprobes: Fix uprobes on MIPS, allow for a cache flush after ixol breakpoint creation samples/bpf: Make samples more libbpf-centric tools lib bpf: Add flags to bpf_create_map() tools lib bpf: use __u32 from linux/types.h ...
This commit is contained in:
@@ -2110,6 +2110,27 @@ again:
|
||||
GLOBAL_STATUS_LBRS_FROZEN);
|
||||
if (!status)
|
||||
goto done;
|
||||
/*
|
||||
* 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().
|
||||
*/
|
||||
status &= ~cpuc->pebs_enabled;
|
||||
|
||||
/*
|
||||
* PEBS overflow sets bit 62 in the global status register
|
||||
@@ -2117,15 +2138,6 @@ again:
|
||||
if (__test_and_clear_bit(62, (unsigned long *)&status)) {
|
||||
handled++;
|
||||
x86_pmu.drain_pebs(regs);
|
||||
/*
|
||||
* There are cases where, even though, the PEBS ovfl bit is set
|
||||
* in GLOBAL_OVF_STATUS, the PEBS events may also have their
|
||||
* overflow bits set for their counters. We must clear them
|
||||
* here because they have been processed as exact samples in
|
||||
* the drain_pebs() routine. They must not be processed again
|
||||
* in the for_each_bit_set() loop for regular samples below.
|
||||
*/
|
||||
status &= ~cpuc->pebs_enabled;
|
||||
status &= x86_pmu.intel_ctrl | GLOBAL_STATUS_TRACE_TOPAPMI;
|
||||
}
|
||||
|
||||
|
@@ -669,7 +669,7 @@ static struct event_constraint snbep_uncore_cbox_constraints[] = {
|
||||
UNCORE_EVENT_CONSTRAINT(0x1c, 0xc),
|
||||
UNCORE_EVENT_CONSTRAINT(0x1d, 0xc),
|
||||
UNCORE_EVENT_CONSTRAINT(0x1e, 0xc),
|
||||
EVENT_CONSTRAINT_OVERLAP(0x1f, 0xe, 0xff),
|
||||
UNCORE_EVENT_CONSTRAINT(0x1f, 0xe),
|
||||
UNCORE_EVENT_CONSTRAINT(0x21, 0x3),
|
||||
UNCORE_EVENT_CONSTRAINT(0x23, 0x3),
|
||||
UNCORE_EVENT_CONSTRAINT(0x31, 0x3),
|
||||
|
Reference in New Issue
Block a user