> 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 <[email protected]>

Acked-by: Lorenzo Bianconi <[email protected]>

> ---
>  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
> 

Attachment: signature.asc
Description: PGP signature

Reply via email to