To avoid failing in the middle of an allocation of a ring-buffer,
__rb_allocate_pages() looks at the available memory estimation with
si_mem_available(). Use the subbuffer order with this estimation to fail
early if necessary for ring-buffers with an order > 0.

Fixes: f9b94daa542a ("ring-buffer: Set new size of the ring buffer sub page")
Signed-off-by: Vincent Donnefort <[email protected]>
---
 kernel/trace/ring_buffer.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
index b3a30a0413a5..63001ab1eef2 100644
--- a/kernel/trace/ring_buffer.c
+++ b/kernel/trace/ring_buffer.c
@@ -2440,6 +2440,7 @@ static int __rb_allocate_pages(struct ring_buffer_per_cpu 
*cpu_buffer,
                               unsigned long nr_pages, struct list_head *pages)
 {
        struct trace_buffer *buffer = cpu_buffer->buffer;
+       unsigned int subbuf_order = buffer->subbuf_order;
        struct ring_buffer_cpu_meta *meta = NULL;
        struct buffer_page *bpage, *tmp;
        struct ring_buffer_desc *desc = NULL;
@@ -2461,7 +2462,7 @@ static int __rb_allocate_pages(struct ring_buffer_per_cpu 
*cpu_buffer,
                 * not going to succeed.
                 */
                i = si_mem_available();
-               if (i < nr_pages)
+               if (i < (nr_pages << subbuf_order))
                        return -ENOMEM;
 
                user_thread = current->mm != NULL;
@@ -2514,12 +2515,11 @@ static int __rb_allocate_pages(struct 
ring_buffer_per_cpu *cpu_buffer,
                        bpage->id = i + 1;
                        cpu_buffer->subbuf_ids[i + 1] = bpage;
                } else {
-                       bpage->page = alloc_cpu_data(cpu_buffer->cpu,
-                                                    
cpu_buffer->buffer->subbuf_order);
+                       bpage->page = alloc_cpu_data(cpu_buffer->cpu, 
subbuf_order);
                        if (!bpage->page)
                                goto free_pages;
                }
-               bpage->order = cpu_buffer->buffer->subbuf_order;
+               bpage->order = subbuf_order;
 
                if (user_thread && fatal_signal_pending(current))
                        goto free_pages;
-- 
2.56.0.385.gd3acb90ef8-goog


Reply via email to