@@ -2789,6 +2789,12 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size,
27892789 if (nr_pages < 2 )
27902790 nr_pages = 2 ;
27912791
2792+ /*
2793+ * Keep CPUs from coming online while resizing to synchronize
2794+ * with new per CPU buffers being created.
2795+ */
2796+ guard (cpus_read_lock )();
2797+
27922798 /* prevent another thread from changing buffer sizes */
27932799 mutex_lock (& buffer -> mutex );
27942800 atomic_inc (& buffer -> resizing );
@@ -2833,7 +2839,6 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size,
28332839 cond_resched ();
28342840 }
28352841
2836- cpus_read_lock ();
28372842 /*
28382843 * Fire off all the required work handlers
28392844 * We can't schedule on offline CPUs, but it's not necessary
@@ -2873,7 +2878,6 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size,
28732878 cpu_buffer -> nr_pages_to_update = 0 ;
28742879 }
28752880
2876- cpus_read_unlock ();
28772881 } else {
28782882 cpu_buffer = buffer -> buffers [cpu_id ];
28792883
@@ -2901,8 +2905,6 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size,
29012905 goto out_err ;
29022906 }
29032907
2904- cpus_read_lock ();
2905-
29062908 /* Can't run something on an offline CPU. */
29072909 if (!cpu_online (cpu_id ))
29082910 rb_update_pages (cpu_buffer );
@@ -2921,7 +2923,6 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size,
29212923 }
29222924
29232925 cpu_buffer -> nr_pages_to_update = 0 ;
2924- cpus_read_unlock ();
29252926 }
29262927
29272928 out :
0 commit comments