summaryrefslogtreecommitdiff
path: root/kernel/bpf/cpumap.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/bpf/cpumap.c')
-rw-r--r--kernel/bpf/cpumap.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/kernel/bpf/cpumap.c b/kernel/bpf/cpumap.c
index b4358d84ddf1..86e29cbf7827 100644
--- a/kernel/bpf/cpumap.c
+++ b/kernel/bpf/cpumap.c
@@ -288,13 +288,17 @@ static int cpu_map_kthread_run(void *data)
/* Release CPU reschedule checks */
if (__ptr_ring_empty(rcpu->queue)) {
- __set_current_state(TASK_INTERRUPTIBLE);
- schedule();
- sched = 1;
+ set_current_state(TASK_INTERRUPTIBLE);
+ /* Recheck to avoid lost wake-up */
+ if (__ptr_ring_empty(rcpu->queue)) {
+ schedule();
+ sched = 1;
+ } else {
+ __set_current_state(TASK_RUNNING);
+ }
} else {
sched = cond_resched();
}
- __set_current_state(TASK_RUNNING);
/* Process packets in rcpu->queue */
local_bh_disable();