diff options
-rw-r--r-- | net/bpf/test_run.c | 26 |
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 | ||
334 | out: | ||
321 | kfree_skb(skb); | 335 | kfree_skb(skb); |
322 | kfree(sk); | 336 | kfree(sk); |
323 | return ret; | 337 | return ret; |