ring_buffer_per_cpu::mapped tracks if a ring-buffer is either mapped by
user-space or if it is a persistent buffer. We already have user_mapped
for the former and ring_meta for the latter. Get rid of mapped and
instead create rb_is_static(). A static ring-buffer cannot be resized,
swapped or have its pages extracted.

Signed-off-by: Vincent Donnefort <[email protected]>

diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
index d2480ccc81b8..e18e2c315545 100644
--- a/kernel/trace/ring_buffer.c
+++ b/kernel/trace/ring_buffer.c
@@ -503,7 +503,7 @@ struct ring_buffer_per_cpu {
        int                             cpu;
        atomic_t                        record_disabled;
        atomic_t                        resize_disabled;
-       struct trace_buffer     *buffer;
+       struct trace_buffer             *buffer;
        raw_spinlock_t                  reader_lock;    /* serialize readers */
        arch_spinlock_t                 lock;
        struct lock_class_key           lock_key;
@@ -541,7 +541,6 @@ struct ring_buffer_per_cpu {
        /* pages removed since last reset */
        unsigned long                   pages_removed;
 
-       unsigned int                    mapped;
        unsigned int                    user_mapped;    /* user space mapping */
        struct mutex                    mapping_lock;
        struct buffer_page              **subbuf_ids;   /* ID to subbuf VA */
@@ -615,6 +614,11 @@ static inline unsigned int rb_page_capacity(struct 
buffer_page *bpage)
        return (PAGE_SIZE << bpage->order) - BUF_PAGE_HDR_SIZE;
 }
 
+static inline bool rb_is_static(struct ring_buffer_per_cpu *cpu_buffer)
+{
+       return cpu_buffer->user_mapped || cpu_buffer->remote || 
cpu_buffer->ring_meta;
+}
+
 struct ring_buffer_iter {
        struct ring_buffer_per_cpu      *cpu_buffer;
        unsigned long                   head;
@@ -2545,7 +2549,6 @@ rb_allocate_cpu_buffer(struct trace_buffer *buffer, long 
nr_pages, int cpu)
                 * Range mapped buffers have the same restrictions as memory
                 * mapped ones do.
                 */
-               cpu_buffer->mapped = 1;
                cpu_buffer->ring_meta = rb_range_meta(buffer, nr_pages, cpu);
                bpage->page = rb_range_buffer(cpu_buffer, 0);
                if (!bpage->page)
@@ -6636,12 +6639,11 @@ rb_reset_cpu(struct ring_buffer_per_cpu *cpu_buffer)
        rb_head_page_activate(cpu_buffer);
        cpu_buffer->pages_removed = 0;
 
-       if (cpu_buffer->mapped) {
-               rb_update_meta_page(cpu_buffer);
-               if (cpu_buffer->ring_meta) {
-                       struct ring_buffer_cpu_meta *meta = 
cpu_buffer->ring_meta;
-                       meta->commit_buffer = meta->head_buffer;
-               }
+       rb_update_meta_page(cpu_buffer);
+       if (cpu_buffer->ring_meta) {
+               struct ring_buffer_cpu_meta *meta = cpu_buffer->ring_meta;
+
+               meta->commit_buffer = meta->head_buffer;
        }
 }
 
@@ -6890,8 +6892,8 @@ int ring_buffer_swap_cpu(struct trace_buffer *buffer_a,
        cpu_buffer_a = buffer_a->buffers[cpu];
        cpu_buffer_b = buffer_b->buffers[cpu];
 
-       /* It's up to the callers to not try to swap mapped buffers */
-       if (WARN_ON_ONCE(cpu_buffer_a->mapped || cpu_buffer_b->mapped))
+       /* It's up to the callers to not try to swap static buffers */
+       if (WARN_ON_ONCE(rb_is_static(cpu_buffer_a) || 
rb_is_static(cpu_buffer_b)))
                return -EBUSY;
 
        /* At least make sure the two buffers are somewhat the same */
@@ -7103,7 +7105,6 @@ int ring_buffer_read_page(struct trace_buffer *buffer,
        unsigned int size;
        unsigned int read;
        u64 save_timestamp;
-       bool force_memcpy;
 
        if (!cpumask_test_cpu(cpu, buffer->cpumask))
                return -1;
@@ -7142,8 +7143,6 @@ int ring_buffer_read_page(struct trace_buffer *buffer,
        /* Check if any events were dropped */
        missed_events = cpu_buffer->lost_events;
 
-       force_memcpy = cpu_buffer->mapped || cpu_buffer->remote;
-
        /*
         * If this page has been partially read or
         * if len is not big enough to read the rest of the page or
@@ -7153,7 +7152,7 @@ int ring_buffer_read_page(struct trace_buffer *buffer,
         */
        if (read || (len < (size - read)) ||
            cpu_buffer->reader_page == cpu_buffer->commit_page ||
-           force_memcpy) {
+           rb_is_static(cpu_buffer)) {
                struct buffer_data_page *rpage = cpu_buffer->reader_page->page;
                unsigned int rpos = read;
                unsigned int pos = 0;
@@ -7600,11 +7599,7 @@ static int __rb_inc_dec_mapped(struct 
ring_buffer_per_cpu *cpu_buffer,
 
        lockdep_assert_held(&cpu_buffer->mapping_lock);
 
-       /* mapped is always greater or equal to user_mapped */
-       if (WARN_ON(cpu_buffer->mapped < cpu_buffer->user_mapped))
-               return -EINVAL;
-
-       if (inc && cpu_buffer->mapped == UINT_MAX)
+       if (inc && cpu_buffer->user_mapped == UINT_MAX)
                return -EBUSY;
 
        if (WARN_ON(!inc && cpu_buffer->user_mapped == 0))
@@ -7613,13 +7608,10 @@ static int __rb_inc_dec_mapped(struct 
ring_buffer_per_cpu *cpu_buffer,
        mutex_lock(&cpu_buffer->buffer->mutex);
        raw_spin_lock_irqsave(&cpu_buffer->reader_lock, flags);
 
-       if (inc) {
+       if (inc)
                cpu_buffer->user_mapped++;
-               cpu_buffer->mapped++;
-       } else {
+       else
                cpu_buffer->user_mapped--;
-               cpu_buffer->mapped--;
-       }
 
        raw_spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags);
        mutex_unlock(&cpu_buffer->buffer->mutex);
@@ -7791,7 +7783,6 @@ int ring_buffer_map(struct trace_buffer *buffer, int cpu,
        if (!err) {
                raw_spin_lock_irqsave(&cpu_buffer->reader_lock, flags);
                /* This is the first time it is mapped by user */
-               cpu_buffer->mapped++;
                cpu_buffer->user_mapped = 1;
                raw_spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags);
        } else {
@@ -7848,8 +7839,6 @@ int ring_buffer_unmap(struct trace_buffer *buffer, int 
cpu)
        raw_spin_lock_irqsave(&cpu_buffer->reader_lock, flags);
 
        /* This is the last user space mapping */
-       if (!WARN_ON_ONCE(cpu_buffer->mapped < cpu_buffer->user_mapped))
-               cpu_buffer->mapped--;
        cpu_buffer->user_mapped = 0;
 
        raw_spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags);
-- 
2.55.0.654.g21b8a5bc05-goog


Reply via email to