bpf, devmap: Move drop error path to devmap for XDP_REDIRECT
We want to change the current ndo_xdp_xmit drop semantics because it will allow us to implement better queue overflow handling. This is working towards the larger goal of a XDP TX queue-hook. Move XDP_REDIRECT error path handling from each XDP ethernet driver to devmap code. According to the new APIs, the driver running the ndo_xdp_xmit pointer, will break tx loop whenever the hw reports a tx error and it will just return to devmap caller the number of successfully transmitted frames. It will be devmap responsibility to free dropped frames. Move each XDP ndo_xdp_xmit capable driver to the new APIs: - veth - virtio-net - mvneta - mvpp2 - socionext - amazon ena - bnxt - freescale (dpaa2, dpaa) - xen-frontend - qede - ice - igb - ixgbe - i40e - mlx5 - ti (cpsw, cpsw-new) - tun - sfc Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Reviewed-by: Ioana Ciornei <ioana.ciornei@nxp.com> Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org> Reviewed-by: Camelia Groza <camelia.groza@nxp.com> Acked-by: Edward Cree <ecree.xilinx@gmail.com> Acked-by: Jesper Dangaard Brouer <brouer@redhat.com> Acked-by: Shay Agroskin <shayagr@amazon.com> Link: https://lore.kernel.org/bpf/ed670de24f951cfd77590decf0229a0ad7fd12f6.1615201152.git.lorenzo@kernel.org
This commit is contained in:
committed by
Daniel Borkmann
parent
6b28276512
commit
fdc13979f9
@@ -608,8 +608,8 @@ static int xennet_xdp_xmit(struct net_device *dev, int n,
|
||||
struct netfront_info *np = netdev_priv(dev);
|
||||
struct netfront_queue *queue = NULL;
|
||||
unsigned long irq_flags;
|
||||
int drops = 0;
|
||||
int i, err;
|
||||
int nxmit = 0;
|
||||
int i;
|
||||
|
||||
if (unlikely(flags & ~XDP_XMIT_FLAGS_MASK))
|
||||
return -EINVAL;
|
||||
@@ -622,15 +622,13 @@ static int xennet_xdp_xmit(struct net_device *dev, int n,
|
||||
|
||||
if (!xdpf)
|
||||
continue;
|
||||
err = xennet_xdp_xmit_one(dev, queue, xdpf);
|
||||
if (err) {
|
||||
xdp_return_frame_rx_napi(xdpf);
|
||||
drops++;
|
||||
}
|
||||
if (xennet_xdp_xmit_one(dev, queue, xdpf))
|
||||
break;
|
||||
nxmit++;
|
||||
}
|
||||
spin_unlock_irqrestore(&queue->tx_lock, irq_flags);
|
||||
|
||||
return n - drops;
|
||||
return nxmit;
|
||||
}
|
||||
|
||||
|
||||
@@ -875,7 +873,9 @@ static u32 xennet_run_xdp(struct netfront_queue *queue, struct page *pdata,
|
||||
get_page(pdata);
|
||||
xdpf = xdp_convert_buff_to_frame(xdp);
|
||||
err = xennet_xdp_xmit(queue->info->netdev, 1, &xdpf, 0);
|
||||
if (unlikely(err < 0))
|
||||
if (unlikely(!err))
|
||||
xdp_return_frame_rx_napi(xdpf);
|
||||
else if (unlikely(err < 0))
|
||||
trace_xdp_exception(queue->info->netdev, prog, act);
|
||||
break;
|
||||
case XDP_REDIRECT:
|
||||
|
||||
Reference in New Issue
Block a user