@@ -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