@@ -252,9 +252,7 @@ __bpf_prog_test_run_raw_tp(void *data)
252252 struct bpf_raw_tp_test_run_info * info = data ;
253253
254254 rcu_read_lock ();
255- migrate_disable ();
256255 info -> retval = BPF_PROG_RUN (info -> prog , info -> ctx );
257- migrate_enable ();
258256 rcu_read_unlock ();
259257}
260258
@@ -266,6 +264,7 @@ int bpf_prog_test_run_raw_tp(struct bpf_prog *prog,
266264 __u32 ctx_size_in = kattr -> test .ctx_size_in ;
267265 struct bpf_raw_tp_test_run_info info ;
268266 int cpu = kattr -> test .cpu , err = 0 ;
267+ int current_cpu ;
269268
270269 /* doesn't support data_in/out, ctx_out, duration, or repeat */
271270 if (kattr -> test .data_in || kattr -> test .data_out ||
@@ -293,27 +292,25 @@ int bpf_prog_test_run_raw_tp(struct bpf_prog *prog,
293292
294293 info .prog = prog ;
295294
295+ current_cpu = get_cpu ();
296296 if ((kattr -> test .flags & BPF_F_TEST_RUN_ON_CPU ) == 0 ||
297- cpu == smp_processor_id () ) {
297+ cpu == current_cpu ) {
298298 __bpf_prog_test_run_raw_tp (& info );
299- } else {
299+ } else if ( cpu >= nr_cpu_ids || ! cpu_online ( cpu )) {
300300 /* smp_call_function_single() also checks cpu_online()
301301 * after csd_lock(). However, since cpu is from user
302302 * space, let's do an extra quick check to filter out
303303 * invalid value before smp_call_function_single().
304304 */
305- if (cpu >= nr_cpu_ids || !cpu_online (cpu )) {
306- err = - ENXIO ;
307- goto out ;
308- }
309-
305+ err = - ENXIO ;
306+ } else {
310307 err = smp_call_function_single (cpu , __bpf_prog_test_run_raw_tp ,
311308 & info , 1 );
312- if (err )
313- goto out ;
314309 }
310+ put_cpu ();
315311
316- if (copy_to_user (& uattr -> test .retval , & info .retval , sizeof (u32 )))
312+ if (!err &&
313+ copy_to_user (& uattr -> test .retval , & info .retval , sizeof (u32 )))
317314 err = - EFAULT ;
318315
319316out :
0 commit comments