History

perf: Cap allocation order at aux_watermark

Currently, we start allocating AUX pages half the size of the total requested AUX buffer size, ignoring the attr.aux_watermark setting. This, in turn, makes intel_pt driver disregard the watermark also, as it uses page order for its SG (ToPA) configuration. Now, this can be fixed in the intel_pt PMU driver, but seeing as it's the only one currently making use of high order allocations, there is no reason not to fix the allocator instead. This way, any other driver wishing to add this support would not have to worry about this.

Alexander Shishkin committed 5 years ago

Commit d68e6791 parent cface031 file · +18 −16Browse files

Unified · Split

kernel/events/ring_buffer.c+18−16
@@ -674,21 +674,26 @@ int rb_alloc_aux(struct perf_buffer *rb, struct perf_event *event, · 673 unmodified lines
674 if (!has_aux(event))674 if (!has_aux(event))
675 return -EOPNOTSUPP;675 return -EOPNOTSUPP;
676 676
677 /*
678 * We need to start with the max_order that fits in nr_pages,
679 * not the other way around, hence ilog2() and not get_order.
680 */
681 max_order = ilog2(nr_pages);
682
683 /*
684 * PMU requests more than one contiguous chunks of memory
685 * for SW double buffering
686 */
687 if (!overwrite) {677 if (!overwrite) {
688 if (!max_order)678 /*
689 return -EINVAL;679 * Watermark defaults to half the buffer, and so does the
680 * max_order, to aid PMU drivers in double buffering.
681 */
682 if (!watermark)
683 watermark = nr_pages << (PAGE_SHIFT - 1);
690 684
691 max_order--;685 /*
686 * Use aux_watermark as the basis for chunking to
687 * help PMU drivers honor the watermark.
688 */
689 max_order = get_order(watermark);
690 } else {
691 /*
692 * We need to start with the max_order that fits in nr_pages,
693 * not the other way around, hence ilog2() and not get_order.
694 */
695 max_order = ilog2(nr_pages);
696 watermark = 0;
692 }697 }
693 698
694 rb->aux_pages = kcalloc_node(nr_pages, sizeof(void *), GFP_KERNEL,699 rb->aux_pages = kcalloc_node(nr_pages, sizeof(void *), GFP_KERNEL,
@@ -743,9 +748,6 @@ int rb_alloc_aux(struct perf_buffer *rb, struct perf_event *event, · 48 unmodified lines
743 rb->aux_overwrite = overwrite;748 rb->aux_overwrite = overwrite;
744 rb->aux_watermark = watermark;749 rb->aux_watermark = watermark;
745 750
746 if (!rb->aux_watermark && !rb->aux_overwrite)
747 rb->aux_watermark = nr_pages << (PAGE_SHIFT - 1);
748
749out:751out:
750 if (!ret)752 if (!ret)
751 rb->aux_pgoff = pgoff;753 rb->aux_pgoff = pgoff;

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t