@@ -2849,6 +2849,12 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size,
28492849 if (nr_pages < 2 )
28502850 nr_pages = 2 ;
28512851
2852+ /*
2853+ * Keep CPUs from coming online while resizing to synchronize
2854+ * with new per CPU buffers being created.
2855+ */
2856+ guard (cpus_read_lock )();
2857+
28522858 /* prevent another thread from changing buffer sizes */
28532859 mutex_lock (& buffer -> mutex );
28542860 atomic_inc (& buffer -> resizing );
@@ -2893,7 +2899,6 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size,
28932899 cond_resched ();
28942900 }
28952901
2896- cpus_read_lock ();
28972902 /*
28982903 * Fire off all the required work handlers
28992904 * We can't schedule on offline CPUs, but it's not necessary
@@ -2933,7 +2938,6 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size,
29332938 cpu_buffer -> nr_pages_to_update = 0 ;
29342939 }
29352940
2936- cpus_read_unlock ();
29372941 } else {
29382942 cpu_buffer = buffer -> buffers [cpu_id ];
29392943
@@ -2961,8 +2965,6 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size,
29612965 goto out_err ;
29622966 }
29632967
2964- cpus_read_lock ();
2965-
29662968 /* Can't run something on an offline CPU. */
29672969 if (!cpu_online (cpu_id ))
29682970 rb_update_pages (cpu_buffer );
@@ -2981,7 +2983,6 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size,
29812983 }
29822984
29832985 cpu_buffer -> nr_pages_to_update = 0 ;
2984- cpus_read_unlock ();
29852986 }
29862987
29872988 out :
0 commit comments