diff --git a/kernel/bpf/cpumap.c b/kernel/bpf/cpumap.c index 703e5df1f4ef..248336df591a 100644 --- a/kernel/bpf/cpumap.c +++ b/kernel/bpf/cpumap.c @@ -450,6 +450,7 @@ __cpu_map_entry_alloc(struct bpf_map *map, struct bpf_cpumap_val *value, for_each_possible_cpu(i) { bq = per_cpu_ptr(rcpu->bulkq, i); + INIT_LIST_HEAD(&bq->flush_node); bq->obj = rcpu; } @@ -737,7 +738,8 @@ static void bq_flush_to_queue(struct xdp_bulk_queue *bq) bq->count = 0; spin_unlock(&q->producer_lock); - __list_del_clearprev(&bq->flush_node); + if (bq->flush_node.prev) + __list_del_clearprev(&bq->flush_node); /* Feedback loop via tracepoints */ trace_xdp_cpumap_enqueue(rcpu->map_id, processed, drops, to_cpu); diff --git a/kernel/bpf/devmap.c b/kernel/bpf/devmap.c index 2625601de76e..7a7347e709cc 100644 --- a/kernel/bpf/devmap.c +++ b/kernel/bpf/devmap.c @@ -428,7 +428,8 @@ void __dev_flush(struct list_head *flush_list) bq_xmit_all(bq, XDP_XMIT_FLUSH); bq->dev_rx = NULL; bq->xdp_prog = NULL; - __list_del_clearprev(&bq->flush_node); + if (bq->flush_node.prev) + __list_del_clearprev(&bq->flush_node); } } diff --git a/net/xdp/xsk.c b/net/xdp/xsk.c index f093c3453f64..052b8583542d 100644 --- a/net/xdp/xsk.c +++ b/net/xdp/xsk.c @@ -406,7 +406,8 @@ void __xsk_map_flush(struct list_head *flush_list) list_for_each_entry_safe(xs, tmp, flush_list, flush_node) { xsk_flush(xs); - __list_del_clearprev(&xs->flush_node); + if (xs->flush_node.prev) + __list_del_clearprev(&xs->flush_node); } }