diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-06-05 13:00:53 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-06-05 13:00:53 -0400 |
commit | a0e9c6efa585897f00eb22e67887e5a25482b1b8 (patch) | |
tree | bf77a44476211119b67fd3872745a58ea6787358 /kernel | |
parent | 5943334737b0447f7f3e6268bd6c7da7c02f5948 (diff) | |
parent | b44a2b53becf2485f484bd6bb6c1d963ebc339f8 (diff) |
Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull perf fixes from Ingo Molnar:
"The biggest chunk of the changes are two regression fixes: a HT
workaround fix and an event-group scheduling fix. It's been verified
with 5 days of fuzzer testing.
Other fixes:
- eBPF fix
- a BIOS breakage detection fix
- PMU driver fixes"
* 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
perf/x86/intel/pt: Fix a refactoring bug
perf/x86: Tweak broken BIOS rules during check_hw_exists()
perf/x86/intel/pt: Untangle pt_buffer_reset_markers()
perf: Disallow sparse AUX allocations for non-SG PMUs in overwrite mode
perf/x86: Improve HT workaround GP counter constraint
perf/x86: Fix event/group validation
perf: Fix race in BPF program unregister
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/events/core.c | 3 | ||||
-rw-r--r-- | kernel/events/ring_buffer.c | 14 |
2 files changed, 16 insertions, 1 deletions
diff --git a/kernel/events/core.c b/kernel/events/core.c index 1a3bf48743ce..eddf1ed4155e 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c | |||
@@ -3442,7 +3442,6 @@ static void free_event_rcu(struct rcu_head *head) | |||
3442 | if (event->ns) | 3442 | if (event->ns) |
3443 | put_pid_ns(event->ns); | 3443 | put_pid_ns(event->ns); |
3444 | perf_event_free_filter(event); | 3444 | perf_event_free_filter(event); |
3445 | perf_event_free_bpf_prog(event); | ||
3446 | kfree(event); | 3445 | kfree(event); |
3447 | } | 3446 | } |
3448 | 3447 | ||
@@ -3573,6 +3572,8 @@ static void __free_event(struct perf_event *event) | |||
3573 | put_callchain_buffers(); | 3572 | put_callchain_buffers(); |
3574 | } | 3573 | } |
3575 | 3574 | ||
3575 | perf_event_free_bpf_prog(event); | ||
3576 | |||
3576 | if (event->destroy) | 3577 | if (event->destroy) |
3577 | event->destroy(event); | 3578 | event->destroy(event); |
3578 | 3579 | ||
diff --git a/kernel/events/ring_buffer.c b/kernel/events/ring_buffer.c index 232f00f273cb..725c416085e3 100644 --- a/kernel/events/ring_buffer.c +++ b/kernel/events/ring_buffer.c | |||
@@ -493,6 +493,20 @@ int rb_alloc_aux(struct ring_buffer *rb, struct perf_event *event, | |||
493 | rb->aux_pages[rb->aux_nr_pages] = page_address(page++); | 493 | rb->aux_pages[rb->aux_nr_pages] = page_address(page++); |
494 | } | 494 | } |
495 | 495 | ||
496 | /* | ||
497 | * In overwrite mode, PMUs that don't support SG may not handle more | ||
498 | * than one contiguous allocation, since they rely on PMI to do double | ||
499 | * buffering. In this case, the entire buffer has to be one contiguous | ||
500 | * chunk. | ||
501 | */ | ||
502 | if ((event->pmu->capabilities & PERF_PMU_CAP_AUX_NO_SG) && | ||
503 | overwrite) { | ||
504 | struct page *page = virt_to_page(rb->aux_pages[0]); | ||
505 | |||
506 | if (page_private(page) != max_order) | ||
507 | goto out; | ||
508 | } | ||
509 | |||
496 | rb->aux_priv = event->pmu->setup_aux(event->cpu, rb->aux_pages, nr_pages, | 510 | rb->aux_priv = event->pmu->setup_aux(event->cpu, rb->aux_pages, nr_pages, |
497 | overwrite); | 511 | overwrite); |
498 | if (!rb->aux_priv) | 512 | if (!rb->aux_priv) |