@@ -252,9 +252,7 @@ __bpf_prog_test_run_raw_tp(void *data)
252
252
struct bpf_raw_tp_test_run_info * info = data ;
253
253
254
254
rcu_read_lock ();
255
- migrate_disable ();
256
255
info -> retval = BPF_PROG_RUN (info -> prog , info -> ctx );
257
- migrate_enable ();
258
256
rcu_read_unlock ();
259
257
}
260
258
@@ -266,6 +264,7 @@ int bpf_prog_test_run_raw_tp(struct bpf_prog *prog,
266
264
__u32 ctx_size_in = kattr -> test .ctx_size_in ;
267
265
struct bpf_raw_tp_test_run_info info ;
268
266
int cpu = kattr -> test .cpu , err = 0 ;
267
+ int current_cpu ;
269
268
270
269
/* doesn't support data_in/out, ctx_out, duration, or repeat */
271
270
if (kattr -> test .data_in || kattr -> test .data_out ||
@@ -293,27 +292,25 @@ int bpf_prog_test_run_raw_tp(struct bpf_prog *prog,
293
292
294
293
info .prog = prog ;
295
294
295
+ current_cpu = get_cpu ();
296
296
if ((kattr -> test .flags & BPF_F_TEST_RUN_ON_CPU ) == 0 ||
297
- cpu == smp_processor_id () ) {
297
+ cpu == current_cpu ) {
298
298
__bpf_prog_test_run_raw_tp (& info );
299
- } else {
299
+ } else if ( cpu >= nr_cpu_ids || ! cpu_online ( cpu )) {
300
300
/* smp_call_function_single() also checks cpu_online()
301
301
* after csd_lock(). However, since cpu is from user
302
302
* space, let's do an extra quick check to filter out
303
303
* invalid value before smp_call_function_single().
304
304
*/
305
- if (cpu >= nr_cpu_ids || !cpu_online (cpu )) {
306
- err = - ENXIO ;
307
- goto out ;
308
- }
309
-
305
+ err = - ENXIO ;
306
+ } else {
310
307
err = smp_call_function_single (cpu , __bpf_prog_test_run_raw_tp ,
311
308
& info , 1 );
312
- if (err )
313
- goto out ;
314
309
}
310
+ put_cpu ();
315
311
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 )))
317
314
err = - EFAULT ;
318
315
319
316
out :
0 commit comments