| From 6c7273a266759d9d36f7c862149f248bcdeddc0f Mon Sep 17 00:00:00 2001 |
| From: Maciej Fijalkowski <maciej.fijalkowski@intel.com> |
| Date: Wed, 2 Mar 2022 09:59:27 -0800 |
| Subject: ixgbe: xsk: change !netif_carrier_ok() handling in ixgbe_xmit_zc() |
| |
| From: Maciej Fijalkowski <maciej.fijalkowski@intel.com> |
| |
| commit 6c7273a266759d9d36f7c862149f248bcdeddc0f upstream. |
| |
| Commit c685c69fba71 ("ixgbe: don't do any AF_XDP zero-copy transmit if |
| netif is not OK") addressed the ring transient state when |
| MEM_TYPE_XSK_BUFF_POOL was being configured which in turn caused the |
| interface to through down/up. Maurice reported that when carrier is not |
| ok and xsk_pool is present on ring pair, ksoftirqd will consume 100% CPU |
| cycles due to the constant NAPI rescheduling as ixgbe_poll() states that |
| there is still some work to be done. |
| |
| To fix this, do not set work_done to false for a !netif_carrier_ok(). |
| |
| Fixes: c685c69fba71 ("ixgbe: don't do any AF_XDP zero-copy transmit if netif is not OK") |
| Reported-by: Maurice Baijens <maurice.baijens@ellips.com> |
| Tested-by: Maurice Baijens <maurice.baijens@ellips.com> |
| Signed-off-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com> |
| Tested-by: Sandeep Penigalapati <sandeep.penigalapati@intel.com> |
| Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com> |
| Signed-off-by: Jakub Kicinski <kuba@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c | 6 ++++-- |
| 1 file changed, 4 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c |
| +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c |
| @@ -583,12 +583,14 @@ static bool ixgbe_xmit_zc(struct ixgbe_r |
| u32 cmd_type; |
| |
| while (budget-- > 0) { |
| - if (unlikely(!ixgbe_desc_unused(xdp_ring)) || |
| - !netif_carrier_ok(xdp_ring->netdev)) { |
| + if (unlikely(!ixgbe_desc_unused(xdp_ring))) { |
| work_done = false; |
| break; |
| } |
| |
| + if (!netif_carrier_ok(xdp_ring->netdev)) |
| + break; |
| + |
| if (!xsk_umem_consume_tx(xdp_ring->xsk_umem, &desc)) |
| break; |
| |