diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2016-09-24 15:44:28 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-09-24 15:44:28 -0400 |
commit | 9c0e28a7be656d737fb18998e2dcb0b8ce595643 (patch) | |
tree | 10f54f40da96c519ba2d781cae9398dfc73a3a2c | |
parent | 2507c856620cc7474e6101b0a05f82ac0ae5bf69 (diff) | |
parent | 3bf6215a1b30db7df6083c708caab3fe1a8e8abe (diff) |
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
-rw-r--r-- | arch/x86/events/intel/bts.c | 5 | ||||
-rw-r--r-- | kernel/events/core.c | 2 |
2 files changed, 4 insertions, 3 deletions
diff --git a/arch/x86/events/intel/bts.c b/arch/x86/events/intel/bts.c index bdcd6510992c..982c9e31daca 100644 --- a/arch/x86/events/intel/bts.c +++ b/arch/x86/events/intel/bts.c | |||
@@ -455,7 +455,7 @@ int intel_bts_interrupt(void) | |||
455 | * The only surefire way of knowing if this NMI is ours is by checking | 455 | * The only surefire way of knowing if this NMI is ours is by checking |
456 | * the write ptr against the PMI threshold. | 456 | * the write ptr against the PMI threshold. |
457 | */ | 457 | */ |
458 | if (ds->bts_index >= ds->bts_interrupt_threshold) | 458 | if (ds && (ds->bts_index >= ds->bts_interrupt_threshold)) |
459 | handled = 1; | 459 | handled = 1; |
460 | 460 | ||
461 | /* | 461 | /* |
@@ -584,7 +584,8 @@ static __init int bts_init(void) | |||
584 | if (!boot_cpu_has(X86_FEATURE_DTES64) || !x86_pmu.bts) | 584 | if (!boot_cpu_has(X86_FEATURE_DTES64) || !x86_pmu.bts) |
585 | return -ENODEV; | 585 | return -ENODEV; |
586 | 586 | ||
587 | bts_pmu.capabilities = PERF_PMU_CAP_AUX_NO_SG | PERF_PMU_CAP_ITRACE; | 587 | bts_pmu.capabilities = PERF_PMU_CAP_AUX_NO_SG | PERF_PMU_CAP_ITRACE | |
588 | PERF_PMU_CAP_EXCLUSIVE; | ||
588 | bts_pmu.task_ctx_nr = perf_sw_context; | 589 | bts_pmu.task_ctx_nr = perf_sw_context; |
589 | bts_pmu.event_init = bts_event_init; | 590 | bts_pmu.event_init = bts_event_init; |
590 | bts_pmu.add = bts_event_add; | 591 | bts_pmu.add = bts_event_add; |
diff --git a/kernel/events/core.c b/kernel/events/core.c index a54f2c2cdb20..fc9bb2225291 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c | |||
@@ -3929,7 +3929,7 @@ static void exclusive_event_destroy(struct perf_event *event) | |||
3929 | 3929 | ||
3930 | static bool exclusive_event_match(struct perf_event *e1, struct perf_event *e2) | 3930 | static bool exclusive_event_match(struct perf_event *e1, struct perf_event *e2) |
3931 | { | 3931 | { |
3932 | if ((e1->pmu->capabilities & PERF_PMU_CAP_EXCLUSIVE) && | 3932 | if ((e1->pmu == e2->pmu) && |
3933 | (e1->cpu == e2->cpu || | 3933 | (e1->cpu == e2->cpu || |
3934 | e1->cpu == -1 || | 3934 | e1->cpu == -1 || |
3935 | e2->cpu == -1)) | 3935 | e2->cpu == -1)) |