@@ -544,6 +544,7 @@ struct trace_buffer {
544
544
unsigned flags ;
545
545
int cpus ;
546
546
atomic_t record_disabled ;
547
+ atomic_t resizing ;
547
548
cpumask_var_t cpumask ;
548
549
549
550
struct lock_class_key * reader_lock_key ;
@@ -2173,7 +2174,7 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size,
2173
2174
2174
2175
/* prevent another thread from changing buffer sizes */
2175
2176
mutex_lock (& buffer -> mutex );
2176
-
2177
+ atomic_inc ( & buffer -> resizing );
2177
2178
2178
2179
if (cpu_id == RING_BUFFER_ALL_CPUS ) {
2179
2180
/*
@@ -2312,6 +2313,7 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size,
2312
2313
atomic_dec (& buffer -> record_disabled );
2313
2314
}
2314
2315
2316
+ atomic_dec (& buffer -> resizing );
2315
2317
mutex_unlock (& buffer -> mutex );
2316
2318
return 0 ;
2317
2319
@@ -2332,6 +2334,7 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size,
2332
2334
}
2333
2335
}
2334
2336
out_err_unlock :
2337
+ atomic_dec (& buffer -> resizing );
2335
2338
mutex_unlock (& buffer -> mutex );
2336
2339
return err ;
2337
2340
}
@@ -5539,6 +5542,15 @@ int ring_buffer_swap_cpu(struct trace_buffer *buffer_a,
5539
5542
if (local_read (& cpu_buffer_b -> committing ))
5540
5543
goto out_dec ;
5541
5544
5545
+ /*
5546
+ * When resize is in progress, we cannot swap it because
5547
+ * it will mess the state of the cpu buffer.
5548
+ */
5549
+ if (atomic_read (& buffer_a -> resizing ))
5550
+ goto out_dec ;
5551
+ if (atomic_read (& buffer_b -> resizing ))
5552
+ goto out_dec ;
5553
+
5542
5554
buffer_a -> buffers [cpu ] = cpu_buffer_b ;
5543
5555
buffer_b -> buffers [cpu ] = cpu_buffer_a ;
5544
5556
0 commit comments