[dpdk-dev] [PATCH v2] net/virtio-user: fix multiple queues fail in server mode
zhiyong.yang at intel.com
zhiyong.yang at intel.com
Thu May 10 11:36:23 CEST 2018
This patch fixes multiple queues failure when virtio-user works in
server mode.
This patch adds feature negotiation in the processing of virtio-user
reccnnection.
Fixes: bd8f50a45d0f ("net/virtio-user: support server mode")
Signed-off-by: Zhiyong Yang <zhiyong.yang at intel.com>
---
Changes in V2:
1. fix a comment typo.
2. add feature negotiation in the processing of reconnection.
drivers/net/virtio/virtio_user/vhost_user.c | 3 +++
drivers/net/virtio/virtio_user/virtio_user_dev.c | 14 ++++++++++----
drivers/net/virtio/virtio_user_ethdev.c | 20 ++++++++++++++++++++
3 files changed, 33 insertions(+), 4 deletions(-)
diff --git a/drivers/net/virtio/virtio_user/vhost_user.c b/drivers/net/virtio/virtio_user/vhost_user.c
index a6df97a..93e4d92 100644
--- a/drivers/net/virtio/virtio_user/vhost_user.c
+++ b/drivers/net/virtio/virtio_user/vhost_user.c
@@ -263,6 +263,9 @@ struct hugepage_file_info {
PMD_DRV_LOG(INFO, "%s", vhost_msg_strings[req]);
+ if (dev->is_server && vhostfd < 0)
+ return -1;
+
msg.request = req;
msg.flags = VHOST_USER_VERSION;
msg.size = 0;
diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c b/drivers/net/virtio/virtio_user/virtio_user_dev.c
index 38b8bc9..b7e1915 100644
--- a/drivers/net/virtio/virtio_user/virtio_user_dev.c
+++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c
@@ -447,10 +447,16 @@ int virtio_user_stop_device(struct virtio_user_dev *dev)
return -1;
}
- for (i = 0; i < q_pairs; ++i)
- ret |= dev->ops->enable_qp(dev, i, 1);
- for (i = q_pairs; i < dev->max_queue_pairs; ++i)
- ret |= dev->ops->enable_qp(dev, i, 0);
+ /* Server mode can't enable queue pairs if vhostfd is invalid,
+ * always return 0 in this case.
+ */
+ if (dev->vhostfd >= 0) {
+ for (i = 0; i < q_pairs; ++i)
+ ret |= dev->ops->enable_qp(dev, i, 1);
+ for (i = q_pairs; i < dev->max_queue_pairs; ++i)
+ ret |= dev->ops->enable_qp(dev, i, 0);
+ } else if (!dev->is_server)
+ ret = ~0;
dev->queue_pairs = q_pairs;
diff --git a/drivers/net/virtio/virtio_user_ethdev.c b/drivers/net/virtio/virtio_user_ethdev.c
index 4e7b3c3..91a0c44 100644
--- a/drivers/net/virtio/virtio_user_ethdev.c
+++ b/drivers/net/virtio/virtio_user_ethdev.c
@@ -30,6 +30,7 @@
int ret;
int flag;
int connectfd;
+ uint64_t features = dev->device_features, status;
struct rte_eth_dev *eth_dev = &rte_eth_devices[dev->port_id];
connectfd = accept(dev->listenfd, NULL, NULL);
@@ -37,6 +38,25 @@
return -1;
dev->vhostfd = connectfd;
+ if (dev->ops->send_request(dev, VHOST_USER_GET_FEATURES,
+ &dev->device_features) < 0) {
+ PMD_INIT_LOG(ERR, "get_features failed: %s",
+ strerror(errno));
+ return -1;
+ }
+
+ status = features & ~dev->device_features;
+ /* For following bits, vhost-user doesn't really need to know */
+ status &= ~(1ull << VIRTIO_NET_F_MAC);
+ status &= ~(1ull << VIRTIO_NET_F_CTRL_VLAN);
+ status &= ~(1ull << VIRTIO_NET_F_CTRL_MAC_ADDR);
+ status &= ~(1ull << VIRTIO_NET_F_STATUS);
+ if (status)
+ PMD_INIT_LOG(ERR, "WARNING: Some features (0x%lx) are not supported by vhost-user!",
+ status);
+
+ dev->features &= dev->device_features;
+
flag = fcntl(connectfd, F_GETFD);
fcntl(connectfd, F_SETFL, flag | O_NONBLOCK);
--
1.8.3.1
More information about the dev
mailing list