@@ -536,6 +536,7 @@ struct trace_buffer {
536
536
unsigned flags ;
537
537
int cpus ;
538
538
atomic_t record_disabled ;
539
+ atomic_t resizing ;
539
540
cpumask_var_t cpumask ;
540
541
541
542
struct lock_class_key * reader_lock_key ;
@@ -2167,7 +2168,7 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size,
2167
2168
2168
2169
/* prevent another thread from changing buffer sizes */
2169
2170
mutex_lock (& buffer -> mutex );
2170
-
2171
+ atomic_inc ( & buffer -> resizing );
2171
2172
2172
2173
if (cpu_id == RING_BUFFER_ALL_CPUS ) {
2173
2174
/*
@@ -2322,6 +2323,7 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size,
2322
2323
atomic_dec (& buffer -> record_disabled );
2323
2324
}
2324
2325
2326
+ atomic_dec (& buffer -> resizing );
2325
2327
mutex_unlock (& buffer -> mutex );
2326
2328
return 0 ;
2327
2329
@@ -2342,6 +2344,7 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size,
2342
2344
}
2343
2345
}
2344
2346
out_err_unlock :
2347
+ atomic_dec (& buffer -> resizing );
2345
2348
mutex_unlock (& buffer -> mutex );
2346
2349
return err ;
2347
2350
}
@@ -5541,6 +5544,15 @@ int ring_buffer_swap_cpu(struct trace_buffer *buffer_a,
5541
5544
if (local_read (& cpu_buffer_b -> committing ))
5542
5545
goto out_dec ;
5543
5546
5547
+ /*
5548
+ * When resize is in progress, we cannot swap it because
5549
+ * it will mess the state of the cpu buffer.
5550
+ */
5551
+ if (atomic_read (& buffer_a -> resizing ))
5552
+ goto out_dec ;
5553
+ if (atomic_read (& buffer_b -> resizing ))
5554
+ goto out_dec ;
5555
+
5544
5556
buffer_a -> buffers [cpu ] = cpu_buffer_b ;
5545
5557
buffer_b -> buffers [cpu ] = cpu_buffer_a ;
5546
5558
0 commit comments