Creating a remote ring buffer requires allocating an array of bpage. For large ring buffers, this contiguous allocation is likely to fail with memory fragmentation.
Switch it to kvzalloc_objs() to use the vmalloc fallback under memory pressure. Signed-off-by: Vincent Donnefort <[email protected]> --- kernel/trace/ring_buffer.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index f9be87c2cc3d..1a158a24b3c8 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c @@ -2620,8 +2620,8 @@ rb_allocate_cpu_buffer(struct trace_buffer *buffer, unsigned long nr_pages, int cpu_buffer->remote = buffer->remote; cpu_buffer->meta_page = (struct trace_buffer_meta *)(void *)desc->meta_va; cpu_buffer->nr_pages = nr_pages; - cpu_buffer->subbuf_ids = kzalloc_objs(*cpu_buffer->subbuf_ids, - cpu_buffer->nr_pages + 1); + cpu_buffer->subbuf_ids = kvzalloc_objs(*cpu_buffer->subbuf_ids, + cpu_buffer->nr_pages + 1); if (!cpu_buffer->subbuf_ids) goto fail_free_reader; @@ -2681,7 +2681,7 @@ rb_allocate_cpu_buffer(struct trace_buffer *buffer, unsigned long nr_pages, int return_ptr(cpu_buffer); fail_free_reader: - kfree(cpu_buffer->subbuf_ids); + kvfree(cpu_buffer->subbuf_ids); free_buffer_page(cpu_buffer->reader_page); return NULL; @@ -2694,8 +2694,8 @@ static void rb_free_cpu_buffer(struct ring_buffer_per_cpu *cpu_buffer) irq_work_sync(&cpu_buffer->irq_work.work); - if (cpu_buffer->remote) - kfree(cpu_buffer->subbuf_ids); + kvfree(cpu_buffer->subbuf_ids); + cpu_buffer->subbuf_ids = NULL; free_buffer_page(cpu_buffer->reader_page); -- 2.55.0.1082.g2b9226bbc0-goog
