aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/events/ring_buffer.c14
1 files changed, 14 insertions, 0 deletions
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)