Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull perf fixes from Thomas Gleixner:
 "Three fixlets for perf:

   - add a missing NULL pointer check in the intel BTS driver

   - make BTS an exclusive PMU because BTS can only handle one event at
     a time

   - ensure that exclusive events are limited to one PMU so that several
     exclusive events can be scheduled on different PMU instances"

* 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  perf/core: Limit matching exclusive events to one PMU
  perf/x86/intel/bts: Make it an exclusive PMU
  perf/x86/intel/bts: Make sure debug store is valid
This commit is contained in:
Linus Torvalds 2016-09-24 12:44:28 -07:00
commit 9c0e28a7be
2 changed files with 4 additions and 3 deletions

View File

@ -455,7 +455,7 @@ int intel_bts_interrupt(void)
* The only surefire way of knowing if this NMI is ours is by checking * The only surefire way of knowing if this NMI is ours is by checking
* the write ptr against the PMI threshold. * the write ptr against the PMI threshold.
*/ */
if (ds->bts_index >= ds->bts_interrupt_threshold) if (ds && (ds->bts_index >= ds->bts_interrupt_threshold))
handled = 1; handled = 1;
/* /*
@ -584,7 +584,8 @@ static __init int bts_init(void)
if (!boot_cpu_has(X86_FEATURE_DTES64) || !x86_pmu.bts) if (!boot_cpu_has(X86_FEATURE_DTES64) || !x86_pmu.bts)
return -ENODEV; return -ENODEV;
bts_pmu.capabilities = PERF_PMU_CAP_AUX_NO_SG | PERF_PMU_CAP_ITRACE; bts_pmu.capabilities = PERF_PMU_CAP_AUX_NO_SG | PERF_PMU_CAP_ITRACE |
PERF_PMU_CAP_EXCLUSIVE;
bts_pmu.task_ctx_nr = perf_sw_context; bts_pmu.task_ctx_nr = perf_sw_context;
bts_pmu.event_init = bts_event_init; bts_pmu.event_init = bts_event_init;
bts_pmu.add = bts_event_add; bts_pmu.add = bts_event_add;

View File

@ -3929,7 +3929,7 @@ static void exclusive_event_destroy(struct perf_event *event)
static bool exclusive_event_match(struct perf_event *e1, struct perf_event *e2) static bool exclusive_event_match(struct perf_event *e1, struct perf_event *e2)
{ {
if ((e1->pmu->capabilities & PERF_PMU_CAP_EXCLUSIVE) && if ((e1->pmu == e2->pmu) &&
(e1->cpu == e2->cpu || (e1->cpu == e2->cpu ||
e1->cpu == -1 || e1->cpu == -1 ||
e2->cpu == -1)) e2->cpu == -1))