diff --cc net/xdp/xsk.c index 4f1e0599146e,b89adb52a977..d4ccffcab982 --- a/net/xdp/xsk.c +++ b/net/xdp/xsk.c @@@ -682,22 -505,11 +682,22 @@@ static struct sk_buff *xsk_build_skb(st skb->dev = dev; skb->priority = xs->sk.sk_priority; - skb->mark = xs->sk.sk_mark; + skb->mark = READ_ONCE(xs->sk.sk_mark); - skb_shinfo(skb)->destructor_arg = (void *)(long)desc->addr; skb->destructor = xsk_destruct_skb; + xsk_set_destructor_arg(skb); return skb; + +free_err: + if (err == -EAGAIN) { + xsk_cq_cancel_locked(xs, 1); + } else { + xsk_set_destructor_arg(skb); + xsk_drop_skb(skb); + xskq_cons_release(xs->tx); + } + + return ERR_PTR(err); } static int __xsk_generic_xmit(struct sock *sk)