@@ -536,6 +536,7 @@ struct trace_buffer {
536536 unsigned flags ;
537537 int cpus ;
538538 atomic_t record_disabled ;
539+ atomic_t resizing ;
539540 cpumask_var_t cpumask ;
540541
541542 struct lock_class_key * reader_lock_key ;
@@ -2167,7 +2168,7 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size,
21672168
21682169 /* prevent another thread from changing buffer sizes */
21692170 mutex_lock (& buffer -> mutex );
2170-
2171+ atomic_inc ( & buffer -> resizing );
21712172
21722173 if (cpu_id == RING_BUFFER_ALL_CPUS ) {
21732174 /*
@@ -2322,6 +2323,7 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size,
23222323 atomic_dec (& buffer -> record_disabled );
23232324 }
23242325
2326+ atomic_dec (& buffer -> resizing );
23252327 mutex_unlock (& buffer -> mutex );
23262328 return 0 ;
23272329
@@ -2342,6 +2344,7 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size,
23422344 }
23432345 }
23442346 out_err_unlock :
2347+ atomic_dec (& buffer -> resizing );
23452348 mutex_unlock (& buffer -> mutex );
23462349 return err ;
23472350}
@@ -5541,6 +5544,15 @@ int ring_buffer_swap_cpu(struct trace_buffer *buffer_a,
55415544 if (local_read (& cpu_buffer_b -> committing ))
55425545 goto out_dec ;
55435546
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+
55445556 buffer_a -> buffers [cpu ] = cpu_buffer_b ;
55455557 buffer_b -> buffers [cpu ] = cpu_buffer_a ;
55465558
0 commit comments