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