[dpdk-dev] net/virtio-user: fix LSC not working

Message ID 1492150230-131946-1-git-send-email-jianfeng.tan@intel.com (mailing list archive)
State Accepted, archived
Delegated to: Yuanhan Liu
Headers

Checks

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

Commit Message

Jianfeng Tan April 14, 2017, 6:10 a.m. UTC
  Previously, we miss to set intr_handle->fd which will be used as
target file for epoll to check LSC.

As a result, stdin (0) is used and intr thread keeps busy whenever
data comes from stdin.

To fix this, we use vhostfd as the target file for epoll to check
the link status change events. And we move intr_handle initialization
after vhost backend settup to make sure vhostfd is initialized.

Fixes: 35c4f8554833 ("net/virtio-user: support to report net status")

Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
---
 drivers/net/virtio/virtio_user/virtio_user_dev.c | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)
  

Comments

Yuanhan Liu April 19, 2017, 2:14 a.m. UTC | #1
On Fri, Apr 14, 2017 at 06:10:30AM +0000, Jianfeng Tan wrote:
> Previously, we miss to set intr_handle->fd which will be used as
> target file for epoll to check LSC.
> 
> As a result, stdin (0) is used and intr thread keeps busy whenever
> data comes from stdin.
> 
> To fix this, we use vhostfd as the target file for epoll to check
> the link status change events. And we move intr_handle initialization
> after vhost backend settup to make sure vhostfd is initialized.
> 
> Fixes: 35c4f8554833 ("net/virtio-user: support to report net status")
> 
> Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>

Applied to dpdk-next-virtio.

Thanks.

	--yliu
  

Patch

diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c b/drivers/net/virtio/virtio_user/virtio_user_dev.c
index c9e8ac5..450404b 100644
--- a/drivers/net/virtio/virtio_user/virtio_user_dev.c
+++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c
@@ -271,6 +271,8 @@  virtio_user_fill_intr_handle(struct virtio_user_dev *dev)
 	eth_dev->intr_handle->nb_efd = dev->max_queue_pairs;
 	eth_dev->intr_handle->max_intr = dev->max_queue_pairs + 1;
 	eth_dev->intr_handle->type = RTE_INTR_HANDLE_VDEV;
+	if (dev->vhostfd >= 0)
+		eth_dev->intr_handle->fd = dev->vhostfd;
 
 	return 0;
 }
@@ -284,12 +286,6 @@  virtio_user_dev_setup(struct virtio_user_dev *dev)
 	dev->vhostfds = NULL;
 	dev->tapfds = NULL;
 
-	if (virtio_user_dev_init_notify(dev) < 0)
-		return -1;
-
-	if (virtio_user_fill_intr_handle(dev) < 0)
-		return -1;
-
 	if (is_vhost_user_by_type(dev->path)) {
 		dev->ops = &ops_user;
 	} else {
@@ -308,7 +304,16 @@  virtio_user_dev_setup(struct virtio_user_dev *dev)
 		}
 	}
 
-	return dev->ops->setup(dev);
+	if (dev->ops->setup(dev) < 0)
+		return -1;
+
+	if (virtio_user_dev_init_notify(dev) < 0)
+		return -1;
+
+	if (virtio_user_fill_intr_handle(dev) < 0)
+		return -1;
+
+	return 0;
 }
 
 /* Use below macro to filter features from vhost backend */