diff options
-rw-r--r-- | kernel/events/ring_buffer.c | 14 |
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) |