@@ -2849,6 +2849,12 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size,
2849
2849
if (nr_pages < 2 )
2850
2850
nr_pages = 2 ;
2851
2851
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
+
2852
2858
/* prevent another thread from changing buffer sizes */
2853
2859
mutex_lock (& buffer -> mutex );
2854
2860
atomic_inc (& buffer -> resizing );
@@ -2893,7 +2899,6 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size,
2893
2899
cond_resched ();
2894
2900
}
2895
2901
2896
- cpus_read_lock ();
2897
2902
/*
2898
2903
* Fire off all the required work handlers
2899
2904
* 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,
2933
2938
cpu_buffer -> nr_pages_to_update = 0 ;
2934
2939
}
2935
2940
2936
- cpus_read_unlock ();
2937
2941
} else {
2938
2942
cpu_buffer = buffer -> buffers [cpu_id ];
2939
2943
@@ -2961,8 +2965,6 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size,
2961
2965
goto out_err ;
2962
2966
}
2963
2967
2964
- cpus_read_lock ();
2965
-
2966
2968
/* Can't run something on an offline CPU. */
2967
2969
if (!cpu_online (cpu_id ))
2968
2970
rb_update_pages (cpu_buffer );
@@ -2981,7 +2983,6 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size,
2981
2983
}
2982
2984
2983
2985
cpu_buffer -> nr_pages_to_update = 0 ;
2984
- cpus_read_unlock ();
2985
2986
}
2986
2987
2987
2988
out :
0 commit comments