aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/bpf/test_run.c26
1 files changed, 20 insertions, 6 deletions
diff --git a/net/bpf/test_run.c b/net/bpf/test_run.c
index 2c5172b33209..619655db8d9e 100644
--- a/net/bpf/test_run.c
+++ b/net/bpf/test_run.c
@@ -293,31 +293,45 @@ int bpf_prog_test_run_flow_dissector(struct bpf_prog *prog,
293 if (!repeat) 293 if (!repeat)
294 repeat = 1; 294 repeat = 1;
295 295
296 rcu_read_lock();
297 preempt_disable();
296 time_start = ktime_get_ns(); 298 time_start = ktime_get_ns();
297 for (i = 0; i < repeat; i++) { 299 for (i = 0; i < repeat; i++) {
298 preempt_disable();
299 rcu_read_lock();
300 retval = __skb_flow_bpf_dissect(prog, skb, 300 retval = __skb_flow_bpf_dissect(prog, skb,
301 &flow_keys_dissector, 301 &flow_keys_dissector,
302 &flow_keys); 302 &flow_keys);
303 rcu_read_unlock(); 303
304 preempt_enable(); 304 if (signal_pending(current)) {
305 preempt_enable();
306 rcu_read_unlock();
307
308 ret = -EINTR;
309 goto out;
310 }
305 311
306 if (need_resched()) { 312 if (need_resched()) {
307 if (signal_pending(current))
308 break;
309 time_spent += ktime_get_ns() - time_start; 313 time_spent += ktime_get_ns() - time_start;
314 preempt_enable();
315 rcu_read_unlock();
316
310 cond_resched(); 317 cond_resched();
318
319 rcu_read_lock();
320 preempt_disable();
311 time_start = ktime_get_ns(); 321 time_start = ktime_get_ns();
312 } 322 }
313 } 323 }
314 time_spent += ktime_get_ns() - time_start; 324 time_spent += ktime_get_ns() - time_start;
325 preempt_enable();
326 rcu_read_unlock();
327
315 do_div(time_spent, repeat); 328 do_div(time_spent, repeat);
316 duration = time_spent > U32_MAX ? U32_MAX : (u32)time_spent; 329 duration = time_spent > U32_MAX ? U32_MAX : (u32)time_spent;
317 330
318 ret = bpf_test_finish(kattr, uattr, &flow_keys, sizeof(flow_keys), 331 ret = bpf_test_finish(kattr, uattr, &flow_keys, sizeof(flow_keys),
319 retval, duration); 332 retval, duration);
320 333
334out:
321 kfree_skb(skb); 335 kfree_skb(skb);
322 kfree(sk); 336 kfree(sk);
323 return ret; 337 return ret;