@@ -535,6 +535,7 @@ struct trace_buffer {
535535 unsigned flags ;
536536 int cpus ;
537537 atomic_t record_disabled ;
538+ atomic_t resizing ;
538539 cpumask_var_t cpumask ;
539540
540541 struct lock_class_key * reader_lock_key ;
@@ -2137,7 +2138,7 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size,
21372138
21382139 /* prevent another thread from changing buffer sizes */
21392140 mutex_lock (& buffer -> mutex );
2140-
2141+ atomic_inc ( & buffer -> resizing );
21412142
21422143 if (cpu_id == RING_BUFFER_ALL_CPUS ) {
21432144 /*
@@ -2276,6 +2277,7 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size,
22762277 atomic_dec (& buffer -> record_disabled );
22772278 }
22782279
2280+ atomic_dec (& buffer -> resizing );
22792281 mutex_unlock (& buffer -> mutex );
22802282 return 0 ;
22812283
@@ -2296,6 +2298,7 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size,
22962298 }
22972299 }
22982300 out_err_unlock :
2301+ atomic_dec (& buffer -> resizing );
22992302 mutex_unlock (& buffer -> mutex );
23002303 return err ;
23012304}
@@ -5497,6 +5500,15 @@ int ring_buffer_swap_cpu(struct trace_buffer *buffer_a,
54975500 if (local_read (& cpu_buffer_b -> committing ))
54985501 goto out_dec ;
54995502
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+
55005512 buffer_a -> buffers [cpu ] = cpu_buffer_b ;
55015513 buffer_b -> buffers [cpu ] = cpu_buffer_a ;
55025514
0 commit comments