aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2015-06-05 13:00:53 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2015-06-05 13:00:53 -0400
commita0e9c6efa585897f00eb22e67887e5a25482b1b8 (patch)
treebf77a44476211119b67fd3872745a58ea6787358 /kernel
parent5943334737b0447f7f3e6268bd6c7da7c02f5948 (diff)
parentb44a2b53becf2485f484bd6bb6c1d963ebc339f8 (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.c3
-rw-r--r--kernel/events/ring_buffer.c14
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)