[PATCH 1/1] ixgbevf: avoid checking hang when performing hardware reset

Subsystems: intel ethernet drivers, networking drivers, the rest

STALE3675d

5 messages, 2 authors, 2016-07-20 · open the first message on its own page

[PATCH 1/1] ixgbevf: avoid checking hang when performing hardware reset

From: zyjzyj2000@gmail.com
Date: 2016-07-18 13:50:32

From: Zhu Yanjun <zyjzyj2000@gmail.com>

When performing hardware reset, it is not necessary to check hang.
Or else, the call trace will appear.

Signed-off-by: Zhu Yanjun <zyjzyj2000@gmail.com>
---
 drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | 5 +++++
 1 file changed, 5 insertions(+)
diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
index acc2401..d563d24 100644
--- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
+++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
@@ -2792,9 +2792,14 @@ static void ixgbevf_reset_subtask(struct ixgbevf_adapter *adapter)
 static void ixgbevf_check_hang_subtask(struct ixgbevf_adapter *adapter)
 {
 	struct ixgbe_hw *hw = &adapter->hw;
+	struct ixgbe_mbx_info *mbx = &hw->mbx;
 	u32 eics = 0;
 	int i;
 
+	/* When performing hardware reset, unnecessary to check hang. */
+	if (mbx->ops.check_for_rst(hw))
+		return;
+
 	/* If we're down or resetting, just bail */
 	if (test_bit(__IXGBEVF_DOWN, &adapter->state) ||
 	    test_bit(__IXGBEVF_RESETTING, &adapter->state))
-- 
2.7.4

RE: [E1000-devel] [PATCH 1/1] ixgbevf: avoid checking hang when performing hardware reset

From: Skidmore, Donald C <hidden>
Date: 2016-07-18 22:30:31

quoted hunk
-----Original Message-----
From: zyjzyj2000@gmail.com [mailto:zyjzyj2000@gmail.com]
Sent: Monday, July 18, 2016 6:45 AM
To: e1000-devel@lists.sourceforge.net; netdev@vger.kernel.org; Kirsher,
Jeffrey T [off-list ref]
Subject: [E1000-devel] [PATCH 1/1] ixgbevf: avoid checking hang when
performing hardware reset

From: Zhu Yanjun <zyjzyj2000@gmail.com>

When performing hardware reset, it is not necessary to check hang.
Or else, the call trace will appear.

Signed-off-by: Zhu Yanjun <zyjzyj2000@gmail.com>
---
 drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | 5 +++++
 1 file changed, 5 insertions(+)
diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
index acc2401..d563d24 100644
--- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
+++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
@@ -2792,9 +2792,14 @@ static void ixgbevf_reset_subtask(struct
ixgbevf_adapter *adapter)  static void ixgbevf_check_hang_subtask(struct
ixgbevf_adapter *adapter)  {
 	struct ixgbe_hw *hw = &adapter->hw;
+	struct ixgbe_mbx_info *mbx = &hw->mbx;
 	u32 eics = 0;
 	int i;

+	/* When performing hardware reset, unnecessary to check hang. */
+	if (mbx->ops.check_for_rst(hw))
+		return;
+
 	/* If we're down or resetting, just bail */
 	if (test_bit(__IXGBEVF_DOWN, &adapter->state) ||
 	    test_bit(__IXGBEVF_RESETTING, &adapter->state))
--
2.7.4
My concern with this patch is that the check_for_rst does a read to clear on the RSTD and RSTI bits.  So reading it in the service task may mean we miss this transition in the mailbox protocol.  Likewise it is possible they may have already been cleared and you won't even catch the state your looking for.

-Don Skidmore [off-list ref]

Re: [PATCH 1/1] ixgbevf: avoid checking hang when performing hardware reset

From: zhuyj <zyjzyj2000@gmail.com>
Date: 2016-07-20 02:42:33

Hi, Don

I use a state variable to replace reading directly from the register. I
hope it can alleviate your concern. Please  comment.
Sorry. My mail service can not work well with netdev maillist. So I write
this mail to make sure that you can read this patch.

If any problem, please feel free to let me know.

Zhu Yanjun

On Tue, Jul 19, 2016 at 6:30 AM, Skidmore, Donald C <
donald.c.skidmore@intel.com> wrote:
quoted
-----Original Message-----
From: zyjzyj2000@gmail.com [mailto:zyjzyj2000@gmail.com]
Sent: Monday, July 18, 2016 6:45 AM
To: e1000-devel@lists.sourceforge.net; netdev@vger.kernel.org; Kirsher,
Jeffrey T [off-list ref]
Subject: [E1000-devel] [PATCH 1/1] ixgbevf: avoid checking hang when
performing hardware reset

From: Zhu Yanjun <zyjzyj2000@gmail.com>

When performing hardware reset, it is not necessary to check hang.
Or else, the call trace will appear.

Signed-off-by: Zhu Yanjun <zyjzyj2000@gmail.com>
---
 drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | 5 +++++
 1 file changed, 5 insertions(+)
diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
index acc2401..d563d24 100644
--- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
+++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
@@ -2792,9 +2792,14 @@ static void ixgbevf_reset_subtask(struct
ixgbevf_adapter *adapter)  static void ixgbevf_check_hang_subtask(struct
ixgbevf_adapter *adapter)  {
      struct ixgbe_hw *hw = &adapter->hw;
+     struct ixgbe_mbx_info *mbx = &hw->mbx;
      u32 eics = 0;
      int i;

+     /* When performing hardware reset, unnecessary to check hang. */
+     if (mbx->ops.check_for_rst(hw))
+             return;
+
      /* If we're down or resetting, just bail */
      if (test_bit(__IXGBEVF_DOWN, &adapter->state) ||
          test_bit(__IXGBEVF_RESETTING, &adapter->state))
--
2.7.4
My concern with this patch is that the check_for_rst does a read to clear
on the RSTD and RSTI bits.  So reading it in the service task may mean we
miss this transition in the mailbox protocol.  Likewise it is possible they
may have already been cleared and you won't even catch the state your
looking for.

-Don Skidmore [off-list ref]

[PATCH 1/1] ixgbevf: avoid checking hang when performing hardware reset

From: zyjzyj2000@gmail.com
Date: 2016-07-20 02:56:55

From: Zhu Yanjun <zyjzyj2000@gmail.com>

When performing hardware reset, it is not necessary to check hang.
Or else, the call trace will appear.

Signed-off-by: Zhu Yanjun <zyjzyj2000@gmail.com>
---
 drivers/net/ethernet/intel/ixgbevf/ixgbevf.h      | 1 +
 drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | 5 +++--
 drivers/net/ethernet/intel/ixgbevf/vf.c           | 5 +++++
 3 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h b/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h
index d5944c3..60fc63b 100644
--- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h
+++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h
@@ -446,6 +446,7 @@ enum ixbgevf_state_t {
 	__IXGBEVF_SERVICE_INITED,
 	__IXGBEVF_RESET_REQUESTED,
 	__IXGBEVF_QUEUE_RESET_REQUESTED,
+	__IXGBEVF_HW_RESETTING,
 };
 
 enum ixgbevf_boards {
diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
index acc2401..530005b 100644
--- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
+++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
@@ -2795,9 +2795,10 @@ static void ixgbevf_check_hang_subtask(struct ixgbevf_adapter *adapter)
 	u32 eics = 0;
 	int i;
 
-	/* If we're down or resetting, just bail */
+	/* If we're down, resetting or hw resetting, just bail */
 	if (test_bit(__IXGBEVF_DOWN, &adapter->state) ||
-	    test_bit(__IXGBEVF_RESETTING, &adapter->state))
+	    test_bit(__IXGBEVF_RESETTING, &adapter->state) ||
+	    test_bit(__IXGBEVF_HW_RESETTING, &adapter->state))
 		return;
 
 	/* Force detection of hung controller */
diff --git a/drivers/net/ethernet/intel/ixgbevf/vf.c b/drivers/net/ethernet/intel/ixgbevf/vf.c
index e670d3b..4ec4484 100644
--- a/drivers/net/ethernet/intel/ixgbevf/vf.c
+++ b/drivers/net/ethernet/intel/ixgbevf/vf.c
@@ -80,6 +80,9 @@ static s32 ixgbevf_reset_hw_vf(struct ixgbe_hw *hw)
 	s32 ret_val = IXGBE_ERR_INVALID_MAC_ADDR;
 	u32 msgbuf[IXGBE_VF_PERMADDR_MSG_LEN];
 	u8 *addr = (u8 *)(&msgbuf[1]);
+	struct ixgbevf_adapter *adapter = hw->back;
+
+	set_bit(__IXGBEVF_HW_RESETTING, &adapter->state);
 
 	/* Call adapter stop to disable tx/rx and clear interrupts */
 	hw->mac.ops.stop_adapter(hw);
@@ -128,6 +131,8 @@ static s32 ixgbevf_reset_hw_vf(struct ixgbe_hw *hw)
 
 	hw->mac.mc_filter_type = msgbuf[IXGBE_VF_MC_TYPE_WORD];
 
+	clear_bit(__IXGBEVF_HW_RESETTING, &adapter->state);
+
 	return 0;
 }
 
-- 
2.7.4

(unknown)

From: zyjzyj2000@gmail.com
Date: 2016-07-20 02:56:55

v1->v2:
Follow the advice from Donald, replacing read directly from RSTD and 
RSTI register with a state variable __IXGBEVF_HW_RESETTING;
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help