[dpdk-dev,v2,1/4] net/ixgbevf: unregister irq handler when other interrupts

Message ID 1509026701-17478-1-git-send-email-xiangxia.m.yue@gmail.com (mailing list archive)
State Superseded, archived
Delegated to: Helin Zhang
Headers

Checks

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

Commit Message

Tonghao Zhang Oct. 26, 2017, 2:04 p.m. UTC
  From: Tonghao Zhang <zhangtonghao@didichuxing.com>

When we bind the ixgbe VF (e.g 82599 card) to igb_uio and enable the
rx-interrupt, there will be more than one epoll_wait on intr_handle.fd.
One is in "eal-intr-thread" thread, and the others are in the thread
which call the "rte_epoll_wait". The problem is that  sometiems
"eal-intr-thread" thread will process the rx interrupt, and rte_epoll_wait
can’t get the event any more, and the packets may be lost.

We should unregister the status interrupt handler in "eal-intr-thread"
thread and the ixgbe is in the same case.

Signed-off-by: Tonghao Zhang <zhangtonghao@didichuxing.com>
---
 drivers/net/ixgbe/ixgbe_ethdev.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)
  

Comments

Ferruh Yigit Oct. 31, 2017, 12:12 a.m. UTC | #1
On 10/26/2017 7:04 AM, xiangxia.m.yue@gmail.com wrote:
> From: Tonghao Zhang <zhangtonghao@didichuxing.com>
> 
> When we bind the ixgbe VF (e.g 82599 card) to igb_uio and enable the
> rx-interrupt, there will be more than one epoll_wait on intr_handle.fd.
> One is in "eal-intr-thread" thread, and the others are in the thread
> which call the "rte_epoll_wait". The problem is that  sometiems
> "eal-intr-thread" thread will process the rx interrupt, and rte_epoll_wait
> can’t get the event any more, and the packets may be lost.
> 
> We should unregister the status interrupt handler in "eal-intr-thread"
> thread and the ixgbe is in the same case.
> 
> Signed-off-by: Tonghao Zhang <zhangtonghao@didichuxing.com>

Thanks for the patches!
We are very close to 17.11 release and only fix patches are considered at this
phase, this patchset will be evaluated for next release.

Thanks,
ferruh
  

Patch

diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index 4339347..94d9df3 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -5070,6 +5070,15 @@  static int ixgbevf_dev_xstats_get_names(__rte_unused struct rte_eth_dev *dev,
 	}
 	ixgbevf_configure_msix(dev);
 
+	if (!rte_intr_allow_others(intr_handle)) {
+		rte_intr_callback_unregister(intr_handle,
+					     ixgbevf_dev_interrupt_handler,
+					     dev);
+		if (dev->data->dev_conf.intr_conf.lsc != 0)
+			PMD_INIT_LOG(INFO, "lsc won't enable because of"
+				     " no intr multiplex");
+	}
+
 	/* When a VF port is bound to VFIO-PCI, only miscellaneous interrupt
 	 * is mapped to VFIO vector 0 in eth_ixgbevf_dev_init( ).
 	 * If previous VFIO interrupt mapping setting in eth_ixgbevf_dev_init( )
@@ -5112,6 +5121,12 @@  static int ixgbevf_dev_xstats_get_names(__rte_unused struct rte_eth_dev *dev,
 
 	ixgbe_dev_clear_queues(dev);
 
+	if (!rte_intr_allow_others(intr_handle))
+		/* resume to the default handler */
+		rte_intr_callback_register(intr_handle,
+					   ixgbevf_dev_interrupt_handler,
+					   (void *)dev);
+
 	/* Clean datapath event and queue/vec mapping */
 	rte_intr_efd_disable(intr_handle);
 	if (intr_handle->intr_vec != NULL) {