| From df3cfe2aab8fbc415d4ae2485e94aa3caa55fbed Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 12 Apr 2023 09:36:11 +0200 |
| Subject: igc: Avoid transmit queue timeout for XDP |
| |
| From: Kurt Kanzenbach <kurt@linutronix.de> |
| |
| [ Upstream commit 95b681485563c64585de78662ee52d06b7fa47d9 ] |
| |
| High XDP load triggers the netdev watchdog: |
| |
| |NETDEV WATCHDOG: enp3s0 (igc): transmit queue 2 timed out |
| |
| The reason is the Tx queue transmission start (txq->trans_start) is not updated |
| in XDP code path. Therefore, add it for all XDP transmission functions. |
| |
| Signed-off-by: Kurt Kanzenbach <kurt@linutronix.de> |
| Tested-by: Naama Meir <naamax.meir@linux.intel.com> |
| Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com> |
| Stable-dep-of: 78adb4bcf99e ("igc: Prevent garbled TX queue with XDP ZEROCOPY") |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/intel/igc/igc_main.c | 8 ++++++++ |
| 1 file changed, 8 insertions(+) |
| |
| diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethernet/intel/igc/igc_main.c |
| index 44aa4342cbbb5..ef4ea46442f21 100644 |
| --- a/drivers/net/ethernet/intel/igc/igc_main.c |
| +++ b/drivers/net/ethernet/intel/igc/igc_main.c |
| @@ -2417,6 +2417,8 @@ static int igc_xdp_xmit_back(struct igc_adapter *adapter, struct xdp_buff *xdp) |
| nq = txring_txq(ring); |
| |
| __netif_tx_lock(nq, cpu); |
| + /* Avoid transmit queue timeout since we share it with the slow path */ |
| + txq_trans_cond_update(nq); |
| res = igc_xdp_init_tx_descriptor(ring, xdpf); |
| __netif_tx_unlock(nq); |
| return res; |
| @@ -2833,6 +2835,9 @@ static void igc_xdp_xmit_zc(struct igc_ring *ring) |
| |
| __netif_tx_lock(nq, cpu); |
| |
| + /* Avoid transmit queue timeout since we share it with the slow path */ |
| + txq_trans_cond_update(nq); |
| + |
| budget = igc_desc_unused(ring); |
| |
| while (xsk_tx_peek_desc(pool, &xdp_desc) && budget--) { |
| @@ -6385,6 +6390,9 @@ static int igc_xdp_xmit(struct net_device *dev, int num_frames, |
| |
| __netif_tx_lock(nq, cpu); |
| |
| + /* Avoid transmit queue timeout since we share it with the slow path */ |
| + txq_trans_cond_update(nq); |
| + |
| drops = 0; |
| for (i = 0; i < num_frames; i++) { |
| int err; |
| -- |
| 2.39.2 |
| |