[dpdk-dev] net/ixgbe: fix LSC interrupt issue

Message ID D9E7459352598649B9DF0563CBC90AEB6B2D88E5@SHSMSX101.ccr.corp.intel.com (mailing list archive)
State Not Applicable, archived
Headers

Checks

Context Check Description
ci/checkpatch warning coding style issues
ci/Intel-compilation success Compilation OK

Commit Message

Liu, Yu Y May 8, 2017, 11:49 a.m. UTC
  Hi Thomas,

This is fix for critical issues exposed by Gaetan Rivet's commit(8ea656f8c300175ac84f3cbe1117f5ef11ffc4eb) to enable LSC. 

This fix two issues. One is "VF testpmd can't set up successfully on Niantic nic.", another is " kernel VF sometimes can't link up successfully when test DPDK PF+kernel VF".

The fix is verified and code review show it is low risk.

It would be great if it can be released with DPDK 17.05.

Thanks & Regards,
Yu Liu

-----Original Message-----
From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Qi Zhang
Sent: Monday, May 8, 2017 11:58 AM
To: Zhang, Helin <helin.zhang@intel.com>; Lu, Wenzhuo <wenzhuo.lu@intel.com>
Cc: dev@dpdk.org; Zhang, Qi Z <qi.z.zhang@intel.com>; stable@dpdk.org
Subject: [dpdk-dev] [PATCH] net/ixgbe: fix LSC interrupt issue

There is a bug in previous fix for lsc interrupt.
lsc interrupt is not disabled before delayed handler, that cause the delayed handler be re-entered.

Fixes: 9b667210700e ("net/ixgbe: fix blocked interrupts")
Cc: stable@dpdk.org

Signed-off-by: Qi Zhang <qi.z.zhang@intel.com>
---
 drivers/net/ixgbe/ixgbe_ethdev.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

--
2.7.4
  

Patch

diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index ec667d8..c680aab 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -4107,14 +4107,15 @@  ixgbe_dev_interrupt_action(struct rte_eth_dev *dev,
 			timeout = IXGBE_LINK_DOWN_CHECK_TIMEOUT;
 
 		ixgbe_dev_link_status_print(dev);
-		intr->mask_original = intr->mask;
-		/* only disable lsc interrupt */
-		intr->mask &= ~IXGBE_EIMS_LSC;
 		if (rte_eal_alarm_set(timeout * 1000,
 				      ixgbe_dev_interrupt_delayed_handler, (void *)dev) < 0)
 			PMD_DRV_LOG(ERR, "Error setting alarm");
-		else
-			intr->mask = intr->mask_original;
+		else {
+			/* remember orignal mask */
+			intr->mask_original = intr->mask;
+			/* only disable lsc interrupt */
+			intr->mask &= ~IXGBE_EIMS_LSC;
+		}
 	}
 
 	PMD_DRV_LOG(DEBUG, "enable intr immediately");