DPDK patches and discussions
 help / color / mirror / Atom feed
From: Guinan Sun <guinanx.sun@intel.com>
To: dev@dpdk.org
Cc: Guinan Sun <guinanx.sun@intel.com>,
	Robert Konklewski <robertx.konklewski@intel.com>
Subject: [dpdk-dev] [PATCH 06/21] net/ixgbe/base: resolve infinite recursion on PCIe link down
Date: Fri, 12 Jun 2020 03:23:55 +0000	[thread overview]
Message-ID: <20200612032410.20864-7-guinanx.sun@intel.com> (raw)
In-Reply-To: <20200612032410.20864-1-guinanx.sun@intel.com>

In some corner cases the functions ixgbe_clear_rar_generic and
ixgbe_clear_vmdq_generic may call one another leading to infinite
recursion.

When ixgbe_clear_vmdq_generic is called with IXGBE_CLEAR_VMDQ_ALL
flag, it's going to clear MPSAR registers, and proceed to call
ixgbe_clear_rar_generic, which in turn will clear the RAR registers,
and recursively call back ixgbe_clear_vmdq_generic. Normally, the
latter would detect that MPSAR registers have already been cleared
and terminate the recursion.

However, when PCIe link is down, and before the driver has had the
opportunity to shut itself down, all register reads return 0xFFFFFFFF,
and all register writes fail silently. In such case, because
ixgbe_clear_vmdq_generic blindly assumes that clearing MPSAR registers
succeeded, it's going to always call ixgbe_clear_rar_generic, which
in turn will always call back ixgbe_clear_vmdq_generic, creating
inifinite recursion.

This patch re-reads MPSAR register values after they had been cleared.
In case of PCIe link failure, the values read will be non-zero, which
will terminate the recursion. On the other hand, under normal
circumstances the value read from MPSAR registers is going to be equal
to the value previously written, so this patch is expected not to cause
any regressions.

Testing Hints (required if no HSD):
Bring down the adapter's parent PCIe bridge.

Signed-off-by: Robert Konklewski <robertx.konklewski@intel.com>
Signed-off-by: Guinan Sun <guinanx.sun@intel.com>
---
 drivers/net/ixgbe/base/ixgbe_common.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ixgbe/base/ixgbe_common.c b/drivers/net/ixgbe/base/ixgbe_common.c
index 89ae2b462..420ad977b 100644
--- a/drivers/net/ixgbe/base/ixgbe_common.c
+++ b/drivers/net/ixgbe/base/ixgbe_common.c
@@ -3778,11 +3778,11 @@ s32 ixgbe_clear_vmdq_generic(struct ixgbe_hw *hw, u32 rar, u32 vmdq)
 	if (vmdq == IXGBE_CLEAR_VMDQ_ALL) {
 		if (mpsar_lo) {
 			IXGBE_WRITE_REG(hw, IXGBE_MPSAR_LO(rar), 0);
-			mpsar_lo = 0;
+			mpsar_lo = IXGBE_READ_REG(hw, IXGBE_MPSAR_LO(rar));
 		}
 		if (mpsar_hi) {
 			IXGBE_WRITE_REG(hw, IXGBE_MPSAR_HI(rar), 0);
-			mpsar_hi = 0;
+			mpsar_hi = IXGBE_READ_REG(hw, IXGBE_MPSAR_HI(rar));
 		}
 	} else if (vmdq < 32) {
 		mpsar_lo &= ~(1 << vmdq);
-- 
2.17.1


  parent reply	other threads:[~2020-06-12  3:46 UTC|newest]

Thread overview: 99+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-06-12  3:23 [dpdk-dev] [PATCH 00/21] update ixgbe base code Guinan Sun
2020-06-12  3:23 ` [dpdk-dev] [PATCH 01/21] net/ixgbe/base: clear VFMBMEM and toggle VF's Tx queues Guinan Sun
2020-06-22 11:58   ` Ferruh Yigit
2020-06-30  1:57     ` Sun, GuinanX
2020-06-12  3:23 ` [dpdk-dev] [PATCH 02/21] net/ixgbe/base: change in the condition for response HI Guinan Sun
2020-06-22 11:58   ` Ferruh Yigit
2020-06-29  9:27     ` Yang, Qiming
2020-06-30  2:17     ` Sun, GuinanX
2020-06-12  3:23 ` [dpdk-dev] [PATCH 03/21] net/ixgbe/base: hange flow for "Apply Update" command Guinan Sun
2020-06-22 11:58   ` Ferruh Yigit
2020-06-30  2:24     ` Sun, GuinanX
2020-06-12  3:23 ` [dpdk-dev] [PATCH 04/21] net/ixgbe/base: x550em 10G NIC driver issue Guinan Sun
2020-06-22 11:59   ` Ferruh Yigit
2020-07-01  2:54     ` Sun, GuinanX
2020-06-12  3:23 ` [dpdk-dev] [PATCH 05/21] net/ixgbe/base: added API for NVM update Guinan Sun
2020-06-22 11:59   ` Ferruh Yigit
2020-06-30  2:37     ` Sun, GuinanX
2020-06-12  3:23 ` Guinan Sun [this message]
2020-06-12  3:23 ` [dpdk-dev] [PATCH 07/21] net/ixgbe/base: added register definitions " Guinan Sun
2020-06-12  3:23 ` [dpdk-dev] [PATCH 08/21] net/ixgbe/base: cleanup spelling mistakes in comments Guinan Sun
2020-06-12  3:23 ` [dpdk-dev] [PATCH 09/21] net/ixgbe/base: remove whitespace in function comments Guinan Sun
2020-06-12  3:23 ` [dpdk-dev] [PATCH 10/21] net/ixgbe/base: move increments after evaluations Guinan Sun
2020-06-22 11:59   ` Ferruh Yigit
2020-06-30  2:51     ` Sun, GuinanX
2020-06-12  3:24 ` [dpdk-dev] [PATCH 11/21] net/ixgbe/base: modify loop accounting for retries Guinan Sun
2020-06-22 11:59   ` Ferruh Yigit
2020-06-30  2:52     ` Sun, GuinanX
2020-06-12  3:24 ` [dpdk-dev] [PATCH 12/21] net/ixgbe/base: create dedicated func to restart auto nego Guinan Sun
2020-06-22 11:59   ` Ferruh Yigit
2020-06-12  3:24 ` [dpdk-dev] [PATCH 13/21] net/ixgbe/base: modify Klocwork hits for DDK 7.0 Guinan Sun
2020-06-22 12:00   ` Ferruh Yigit
2020-07-01  4:52     ` Sun, GuinanX
2020-06-12  3:24 ` [dpdk-dev] [PATCH 14/21] net/ixgbe/base: add defines for min rollback revision fields Guinan Sun
2020-06-22 12:00   ` Ferruh Yigit
2020-07-01  5:08     ` Sun, GuinanX
2020-06-12  3:24 ` [dpdk-dev] [PATCH 15/21] net/ixgbe/base: remove unnecessary log message FC autonego Guinan Sun
2020-06-12  3:24 ` [dpdk-dev] [PATCH 16/21] net/ixgbe/base: initialize data field in struct buffer Guinan Sun
2020-06-12  3:24 ` [dpdk-dev] [PATCH 17/21] net/ixgbe/base: improve log about autonego being disabled Guinan Sun
2020-06-22 12:00   ` Ferruh Yigit
2020-07-01  5:19     ` Sun, GuinanX
2020-06-12  3:24 ` [dpdk-dev] [PATCH 18/21] net/ixgbe/base: ipv6 Mask for purpose FDIR VLAN Port Feature Guinan Sun
2020-06-22 12:00   ` Ferruh Yigit
2020-07-01  5:21     ` Sun, GuinanX
2020-06-12  3:24 ` [dpdk-dev] [PATCH 19/21] net/ixgbe/base: remove default advertising for 2.5G and 5G Guinan Sun
2020-06-22 12:00   ` Ferruh Yigit
2020-07-01  6:24     ` Sun, GuinanX
2020-06-12  3:24 ` [dpdk-dev] [PATCH 20/21] net/ixgbe/base: check Host Interface Return Status Guinan Sun
2020-06-12  3:24 ` [dpdk-dev] [PATCH 21/21] net/ixgbe/base: update version Guinan Sun
2020-06-22 12:01   ` Ferruh Yigit
2020-07-01  6:27     ` Sun, GuinanX
2020-06-15  5:47 ` [dpdk-dev] [PATCH 00/21] update ixgbe base code Zhao1, Wei
2020-06-15  5:59   ` Sun, GuinanX
2020-06-22  2:42 ` Zhao1, Wei
2020-06-22  3:50   ` Zhang, Qi Z
2020-07-02  3:13 ` [dpdk-dev] [PATCH v2 00/20] " Guinan Sun
2020-07-02  3:13   ` [dpdk-dev] [PATCH v2 01/20] net/ixgbe/base: toggle VF's Tx queues Guinan Sun
2020-07-02  3:13   ` [dpdk-dev] [PATCH v2 02/20] net/ixgbe/base: add support to clear VFMBMEM Guinan Sun
2020-07-02  3:13   ` [dpdk-dev] [PATCH v2 03/20] net/ixgbe/base: fix host interface shadow RAM read Guinan Sun
2020-07-02  3:13   ` [dpdk-dev] [PATCH v2 04/20] net/ixgbe/base: change flow for "Apply Update" command Guinan Sun
2020-07-02  3:13   ` [dpdk-dev] [PATCH v2 05/20] net/ixgbe/base: fix x550em 10G NIC link status report Guinan Sun
2020-07-02  3:13   ` [dpdk-dev] [PATCH v2 06/20] net/ixgbe/base: resolve infinite recursion on PCIe link down Guinan Sun
2020-07-02  3:13   ` [dpdk-dev] [PATCH v2 07/20] net/ixgbe/base: added register definitions for NVM update Guinan Sun
2020-07-02  3:13   ` [dpdk-dev] [PATCH v2 08/20] net/ixgbe/base: cleanup spelling mistakes in comments Guinan Sun
2020-07-02  3:13   ` [dpdk-dev] [PATCH v2 09/20] net/ixgbe/base: remove whitespace in function comments Guinan Sun
2020-07-02  3:13   ` [dpdk-dev] [PATCH v2 10/20] net/ixgbe/base: move increments after evaluations Guinan Sun
2020-07-02  3:13   ` [dpdk-dev] [PATCH v2 11/20] net/ixgbe/base: create dedicated func to restart auto nego Guinan Sun
2020-07-02  3:13   ` [dpdk-dev] [PATCH v2 12/20] net/ixgbe/base: modify coding style Guinan Sun
2020-07-08 15:26     ` Ferruh Yigit
2020-07-09  7:58       ` Sun, GuinanX
2020-07-02  3:13   ` [dpdk-dev] [PATCH v2 13/20] net/ixgbe/base: remove unnecessary log message FC autonego Guinan Sun
2020-07-02  3:13   ` [dpdk-dev] [PATCH v2 14/20] net/ixgbe/base: initialize data field in struct buffer Guinan Sun
2020-07-02  3:13   ` [dpdk-dev] [PATCH v2 15/20] net/ixgbe/base: improve log about autonego being disabled Guinan Sun
2020-07-02  3:13   ` [dpdk-dev] [PATCH v2 16/20] net/ixgbe/base: add ipv6 mask for FDIR feature Guinan Sun
2020-07-02  3:13   ` [dpdk-dev] [PATCH v2 17/20] net/ixgbe/base: remove default advertising for x550 2.5G/5G Guinan Sun
2020-07-02  3:13   ` [dpdk-dev] [PATCH v2 18/20] net/ixgbe/base: check host interface return status Guinan Sun
2020-07-02  3:13   ` [dpdk-dev] [PATCH v2 19/20] net/ixgbe/base: cleanup pre-processor tags Guinan Sun
2020-07-02  3:13   ` [dpdk-dev] [PATCH v2 20/20] net/ixgbe/base: update version Guinan Sun
2020-07-08  0:50   ` [dpdk-dev] [PATCH v2 00/20] update ixgbe base code Zhang, Qi Z
2020-07-09  8:00   ` [dpdk-dev] [PATCH v3 00/19] " Guinan Sun
2020-07-09  8:00     ` [dpdk-dev] [PATCH v3 01/19] net/ixgbe/base: fix host interface shadow RAM read Guinan Sun
2020-07-09  8:00     ` [dpdk-dev] [PATCH v3 02/19] net/ixgbe/base: change flow for "Apply Update" command Guinan Sun
2020-07-09  8:00     ` [dpdk-dev] [PATCH v3 03/19] net/ixgbe/base: fix x550em 10G NIC link status report Guinan Sun
2020-07-09  8:00     ` [dpdk-dev] [PATCH v3 04/19] net/ixgbe/base: resolve infinite recursion on PCIe link down Guinan Sun
2020-07-09  8:00     ` [dpdk-dev] [PATCH v3 05/19] net/ixgbe/base: added register definitions for NVM update Guinan Sun
2020-07-09  8:00     ` [dpdk-dev] [PATCH v3 06/19] net/ixgbe/base: cleanup spelling mistakes in comments Guinan Sun
2020-07-09  8:00     ` [dpdk-dev] [PATCH v3 07/19] net/ixgbe/base: remove whitespace in function comments Guinan Sun
2020-07-09  8:00     ` [dpdk-dev] [PATCH v3 08/19] net/ixgbe/base: move increments after evaluations Guinan Sun
2020-07-09  8:00     ` [dpdk-dev] [PATCH v3 09/19] net/ixgbe/base: create dedicated func to restart auto nego Guinan Sun
2020-07-09  8:00     ` [dpdk-dev] [PATCH v3 10/19] net/ixgbe/base: add typecast for type mismatch Guinan Sun
2020-07-09  8:00     ` [dpdk-dev] [PATCH v3 11/19] net/ixgbe/base: remove unnecessary return value check Guinan Sun
2020-07-09  8:00     ` [dpdk-dev] [PATCH v3 12/19] net/ixgbe/base: remove unnecessary log message FC autonego Guinan Sun
2020-07-09  8:00     ` [dpdk-dev] [PATCH v3 13/19] net/ixgbe/base: initialize data field in struct buffer Guinan Sun
2020-07-09  8:00     ` [dpdk-dev] [PATCH v3 14/19] net/ixgbe/base: improve log about autonego being disabled Guinan Sun
2020-07-09  8:00     ` [dpdk-dev] [PATCH v3 15/19] net/ixgbe/base: add ipv6 mask for FDIR feature Guinan Sun
2020-07-09  8:00     ` [dpdk-dev] [PATCH v3 16/19] net/ixgbe/base: remove default advertising for x550 2.5G/5G Guinan Sun
2020-07-09  8:00     ` [dpdk-dev] [PATCH v3 17/19] net/ixgbe/base: check host interface return status Guinan Sun
2020-07-09  8:00     ` [dpdk-dev] [PATCH v3 18/19] net/ixgbe/base: cleanup pre-processor tags Guinan Sun
2020-07-09  8:00     ` [dpdk-dev] [PATCH v3 19/19] net/ixgbe/base: update version Guinan Sun
2020-07-09 10:46     ` [dpdk-dev] [PATCH v3 00/19] update ixgbe base code Zhang, Qi Z

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200612032410.20864-7-guinanx.sun@intel.com \
    --to=guinanx.sun@intel.com \
    --cc=dev@dpdk.org \
    --cc=robertx.konklewski@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).