patches for DPDK stable branches
 help / color / mirror / Atom feed
* [dpdk-stable] [PATCH] net/virtio: fix read isr as MSI is enabled
@ 2017-03-28  6:46 Jianfeng Tan
  2017-04-06  5:19 ` Yuanhan Liu
  0 siblings, 1 reply; 5+ messages in thread
From: Jianfeng Tan @ 2017-03-28  6:46 UTC (permalink / raw)
  To: zhiyong.yang; +Cc: Jianfeng Tan, stable, Stephen Hemminger

We should not always check isr to know if link status is changed.

Here is how driver should handle interrupt quoted from virtio spec,

    If MSI-X capability is disabled:
      – Read the ISR Status field, which will reset it to zero.
      – If the lower bit is set: look through the used rings of all
      virtqueues for the device, to see if any progress has been made
      by the device which requires servicing.
      – If the second lower bit is set: re-examine the configuration
      space to see what changed.
    If MSI-X capability is enabled:
      – Look through the used rings of all virtqueues mapped to that
      MSI-X vector for the device, to see if any progress has been
      made by the device which requires servicing.
      – If the MSI-X vector is equal to config_msix_vector, re-examine
      the configuration space to see what changed

Fixes: 8d6d7e5cb3b1 ("virtio: support link state interrupt")
CC: stable@dpdk.org

CC: Stephen Hemminger <stephen@networkplumber.org>
Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
---
 drivers/net/virtio/virtio_ethdev.c | 22 +++++++++++++---------
 1 file changed, 13 insertions(+), 9 deletions(-)

diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c
index 3cf4102..cb30d11 100644
--- a/drivers/net/virtio/virtio_ethdev.c
+++ b/drivers/net/virtio/virtio_ethdev.c
@@ -36,6 +36,7 @@
 #include <stdio.h>
 #include <errno.h>
 #include <unistd.h>
+#include <stdbool.h>
 
 #include <rte_ethdev.h>
 #include <rte_memcpy.h>
@@ -1197,20 +1198,23 @@ virtio_interrupt_handler(struct rte_intr_handle *handle,
 	struct rte_eth_dev *dev = param;
 	struct virtio_hw *hw = dev->data->dev_private;
 	uint8_t isr;
+	bool check_config;
 
-	/* Read interrupt status which clears interrupt */
-	isr = vtpci_isr(hw);
-	PMD_DRV_LOG(INFO, "interrupt status = %#x", isr);
+	/* isr is used only when msix is not enabled */
+	if (!hw->modern && !hw->use_msix) {
+		isr = vtpci_isr(hw); /* Read to clears interrupt */
+		PMD_DRV_LOG(INFO, "interrupt status = %#x", isr);
+		check_config = (isr & VIRTIO_PCI_ISR_CONFIG) ? true : false;
+	} else {
+		check_config = true;
+	}
 
 	if (rte_intr_enable(handle) < 0)
 		PMD_DRV_LOG(ERR, "interrupt enable failed");
 
-	if (isr & VIRTIO_PCI_ISR_CONFIG) {
-		if (virtio_dev_link_update(dev, 0) == 0)
-			_rte_eth_dev_callback_process(dev,
-						      RTE_ETH_EVENT_INTR_LSC, NULL);
-	}
-
+	if (check_config && virtio_dev_link_update(dev, 0) == 0)
+		_rte_eth_dev_callback_process(dev,
+					      RTE_ETH_EVENT_INTR_LSC, NULL);
 }
 
 static void
-- 
2.7.4

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2017-04-06  5:40 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-03-28  6:46 [dpdk-stable] [PATCH] net/virtio: fix read isr as MSI is enabled Jianfeng Tan
2017-04-06  5:19 ` Yuanhan Liu
2017-04-06  5:30   ` Tan, Jianfeng
2017-04-06  5:36     ` Yuanhan Liu
2017-04-06  5:40       ` Tan, Jianfeng

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).