2018-05-17 23:31 GMT+02:00 Jesper Dangaard Brouer <bro...@redhat.com>: > > On Tue, 15 May 2018 21:06:15 +0200 Björn Töpel <bjorn.to...@gmail.com> wrote: > >> From: Magnus Karlsson <magnus.karls...@intel.com> >> >> Here, the zero-copy ndo is implemented. As a shortcut, the existing >> XDP Tx rings are used for zero-copy. This means that and XDP program >> cannot redirect to an AF_XDP enabled XDP Tx ring. > > This "shortcut" is not acceptable, and completely broken. The > XDP_REDIRECT queue_index is based on smp_processor_id(), and can easily > clash with the configured XSK queue_index. Provided a bit more code > context below... >
Yes, and this is the reason we need to go for a solution with dedicated Tx rings. Again, we chose not to, and simply drops XDP_REDIRECT where the AF_XDP queue id clashes with the processor id. The queue id hijacked by AF_XDP's egress side. > On Tue, 15 May 2018 21:06:15 +0200 > Björn Töpel <bjorn.to...@gmail.com> wrote: > > int i40e_xdp_xmit(struct net_device *dev, struct xdp_frame *xdpf) > { > struct i40e_netdev_priv *np = netdev_priv(dev); > unsigned int queue_index = smp_processor_id(); > struct i40e_vsi *vsi = np->vsi; > int err; > > if (test_bit(__I40E_VSI_DOWN, vsi->state)) > return -ENETDOWN; > >> @@ -4025,6 +4158,9 @@ int i40e_xdp_xmit(struct net_device *dev, struct >> xdp_frame *xdpf) >> if (!i40e_enabled_xdp_vsi(vsi) || queue_index >= vsi->num_queue_pairs) >> return -ENXIO; >> >> + if (vsi->xdp_rings[queue_index]->xsk_umem) >> + return -ENXIO; >> + > > Using the sane errno makes this impossible to debug (via the tracepoints). > The rationale was that the situation was similar to an incorrectly configured receiving (from an XDP_REDIRECT perspective) interface. We'll rework this! Thanks for looking into this, Jesper! Björn >> err = i40e_xmit_xdp_ring(xdpf, vsi->xdp_rings[queue_index]); >> if (err != I40E_XDP_TX) >> return -ENOSPC; >> @@ -4048,5 +4184,34 @@ void i40e_xdp_flush(struct net_device *dev) >> if (!i40e_enabled_xdp_vsi(vsi) || queue_index >= vsi->num_queue_pairs) >> return; >> >> + if (vsi->xdp_rings[queue_index]->xsk_umem) >> + return; >> + >> i40e_xdp_ring_update_tail(vsi->xdp_rings[queue_index]); >> } > > > > -- > Best regards, > Jesper Dangaard Brouer > MSc.CS, Principal Kernel Engineer at Red Hat > LinkedIn: http://www.linkedin.com/in/brouer