@@ -2796,6 +2796,12 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size,
27962796 if (nr_pages < 2 )
27972797 nr_pages = 2 ;
27982798
2799+ /*
2800+ * Keep CPUs from coming online while resizing to synchronize
2801+ * with new per CPU buffers being created.
2802+ */
2803+ guard (cpus_read_lock )();
2804+
27992805 /* prevent another thread from changing buffer sizes */
28002806 mutex_lock (& buffer -> mutex );
28012807 atomic_inc (& buffer -> resizing );
@@ -2840,7 +2846,6 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size,
28402846 cond_resched ();
28412847 }
28422848
2843- cpus_read_lock ();
28442849 /*
28452850 * Fire off all the required work handlers
28462851 * We can't schedule on offline CPUs, but it's not necessary
@@ -2880,7 +2885,6 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size,
28802885 cpu_buffer -> nr_pages_to_update = 0 ;
28812886 }
28822887
2883- cpus_read_unlock ();
28842888 } else {
28852889 cpu_buffer = buffer -> buffers [cpu_id ];
28862890
@@ -2908,8 +2912,6 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size,
29082912 goto out_err ;
29092913 }
29102914
2911- cpus_read_lock ();
2912-
29132915 /* Can't run something on an offline CPU. */
29142916 if (!cpu_online (cpu_id ))
29152917 rb_update_pages (cpu_buffer );
@@ -2928,7 +2930,6 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size,
29282930 }
29292931
29302932 cpu_buffer -> nr_pages_to_update = 0 ;
2931- cpus_read_unlock ();
29322933 }
29332934
29342935 out :
0 commit comments