Message ID | 20240529112337.3639084-2-maciej.fijalkowski@intel.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | ice: fix AF_XDP ZC timeout and concurrency issues | expand |
Context | Check | Description |
---|---|---|
netdev/tree_selection | success | Clearly marked for net |
netdev/apply | fail | Patch does not apply to net-0 |
>-----Original Message----- >From: Intel-wired-lan <intel-wired-lan-bounces@osuosl.org> On Behalf Of >Fijalkowski, Maciej >Sent: Wednesday, May 29, 2024 4:54 PM >To: intel-wired-lan@lists.osuosl.org >Cc: Fijalkowski, Maciej <maciej.fijalkowski@intel.com>; Zaremba, Larysa ><larysa.zaremba@intel.com>; netdev@vger.kernel.org; Kubiak, Michal ><michal.kubiak@intel.com>; Nguyen, Anthony L ><anthony.l.nguyen@intel.com>; Karlsson, Magnus ><magnus.karlsson@intel.com> >Subject: [Intel-wired-lan] [PATCH v2 iwl-net 1/8] ice: respect netif readiness in >AF_XDP ZC related ndo's > >From: Michal Kubiak <michal.kubiak@intel.com> > >Address a scenario in which XSK ZC Tx produces descriptors to XDP Tx ring >when link is either not yet fully initialized or process of stopping the netdev has >already started. To avoid this, add checks against carrier readiness in >ice_xsk_wakeup() and in ice_xmit_zc(). >One could argue that bailing out early in ice_xsk_wakeup() would be sufficient >but given the fact that we produce Tx descriptors on behalf of NAPI that is >triggered for Rx traffic, the latter is also needed. > >Bringing link up is an asynchronous event executed within ice_service_task so >even though interface has been brought up there is still a time frame where link >is not yet ok. > >Without this patch, when AF_XDP ZC Tx is used simultaneously with stack Tx, Tx >timeouts occur after going through link flap (admin brings interface down then >up again). HW seem to be unable to transmit descriptor to the wire after HW >tail register bump which in turn causes bit __QUEUE_STATE_STACK_XOFF to be >set forever as >netdev_tx_completed_queue() sees no cleaned bytes on the input. > >Fixes: 126cdfe1007a ("ice: xsk: Improve AF_XDP ZC Tx and use batching API") >Fixes: 2d4238f55697 ("ice: Add support for AF_XDP") >Signed-off-by: Michal Kubiak <michal.kubiak@intel.com> >Signed-off-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com> >--- > drivers/net/ethernet/intel/ice/ice_xsk.c | 6 +++++- > 1 file changed, 5 insertions(+), 1 deletion(-) > Tested-by: Chandan Kumar Rout <chandanx.rout@intel.com> (A Contingent Worker at Intel)
diff --git a/drivers/net/ethernet/intel/ice/ice_xsk.c b/drivers/net/ethernet/intel/ice/ice_xsk.c index 2015f66b0cf9..1bd4b054dd80 100644 --- a/drivers/net/ethernet/intel/ice/ice_xsk.c +++ b/drivers/net/ethernet/intel/ice/ice_xsk.c @@ -1048,6 +1048,10 @@ bool ice_xmit_zc(struct ice_tx_ring *xdp_ring) ice_clean_xdp_irq_zc(xdp_ring); + if (!netif_carrier_ok(xdp_ring->vsi->netdev) || + !netif_running(xdp_ring->vsi->netdev)) + return true; + budget = ICE_DESC_UNUSED(xdp_ring); budget = min_t(u16, budget, ICE_RING_QUARTER(xdp_ring)); @@ -1091,7 +1095,7 @@ ice_xsk_wakeup(struct net_device *netdev, u32 queue_id, struct ice_vsi *vsi = np->vsi; struct ice_tx_ring *ring; - if (test_bit(ICE_VSI_DOWN, vsi->state)) + if (test_bit(ICE_VSI_DOWN, vsi->state) || !netif_carrier_ok(netdev)) return -ENETDOWN; if (!ice_is_xdp_ena_vsi(vsi))