@@ -535,6 +535,7 @@ struct trace_buffer {
535
535
unsigned flags ;
536
536
int cpus ;
537
537
atomic_t record_disabled ;
538
+ atomic_t resizing ;
538
539
cpumask_var_t cpumask ;
539
540
540
541
struct lock_class_key * reader_lock_key ;
@@ -2137,7 +2138,7 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size,
2137
2138
2138
2139
/* prevent another thread from changing buffer sizes */
2139
2140
mutex_lock (& buffer -> mutex );
2140
-
2141
+ atomic_inc ( & buffer -> resizing );
2141
2142
2142
2143
if (cpu_id == RING_BUFFER_ALL_CPUS ) {
2143
2144
/*
@@ -2276,6 +2277,7 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size,
2276
2277
atomic_dec (& buffer -> record_disabled );
2277
2278
}
2278
2279
2280
+ atomic_dec (& buffer -> resizing );
2279
2281
mutex_unlock (& buffer -> mutex );
2280
2282
return 0 ;
2281
2283
@@ -2296,6 +2298,7 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size,
2296
2298
}
2297
2299
}
2298
2300
out_err_unlock :
2301
+ atomic_dec (& buffer -> resizing );
2299
2302
mutex_unlock (& buffer -> mutex );
2300
2303
return err ;
2301
2304
}
@@ -5497,6 +5500,15 @@ int ring_buffer_swap_cpu(struct trace_buffer *buffer_a,
5497
5500
if (local_read (& cpu_buffer_b -> committing ))
5498
5501
goto out_dec ;
5499
5502
5503
+ /*
5504
+ * When resize is in progress, we cannot swap it because
5505
+ * it will mess the state of the cpu buffer.
5506
+ */
5507
+ if (atomic_read (& buffer_a -> resizing ))
5508
+ goto out_dec ;
5509
+ if (atomic_read (& buffer_b -> resizing ))
5510
+ goto out_dec ;
5511
+
5500
5512
buffer_a -> buffers [cpu ] = cpu_buffer_b ;
5501
5513
buffer_b -> buffers [cpu ] = cpu_buffer_a ;
5502
5514
0 commit comments