> veth_xdp_xmit() queues XDP_TX frames on the peer's ring if the peer has > NAPI. A peer with GRO enabled and no XDP program also has NAPI. > > veth_xdp_flush() then schedules the peer's NAPI, but only if the peer's > xdp_prog is set, so for such a peer the frames are never processed. > Nothing else schedules that NAPI by default. > > Once the ring is full, every XDP_TX frame is dropped, and so are the > skbs that veth_xmit() queues on the same ring. > > Commit 0e672f306a28 ("veth: check for NAPI instead of xdp_prog before > xmit of XDP frame") changed the check in veth_xdp_xmit() but not the one > in veth_xdp_flush(). Make veth_xdp_flush() check the napi pointer > instead of xdp_prog, as veth_xdp_xmit() does. > > Fixes: 0e672f306a28 ("veth: check for NAPI instead of xdp_prog before xmit of XDP frame") > Signed-off-by: Tianyi Gao Acked-by: Lorenzo Bianconi > --- > drivers/net/veth.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/net/veth.c b/drivers/net/veth.c > index 643b97dc5245..9405ffac598a 100644 > --- a/drivers/net/veth.c > +++ b/drivers/net/veth.c > @@ -612,7 +612,7 @@ static void veth_xdp_flush(struct veth_rq *rq, struct veth_xdp_tx_bq *bq) > rcv_priv = netdev_priv(rcv); > rcv_rq = &rcv_priv->rq[veth_select_rxq(rcv)]; > /* xdp_ring is initialized on receive side? */ > - if (unlikely(!rcu_access_pointer(rcv_rq->xdp_prog))) > + if (unlikely(!rcu_access_pointer(rcv_rq->napi))) > goto out; > > __veth_xdp_flush(rcv_rq); > -- > 2.55.0 >