All of lore.kernel.org
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH v4 0/2] net/virtio: add vhost-user protocol features support
@ 2020-07-03 15:57 Adrian Moreno
  2020-07-03 15:57 ` [dpdk-dev] [PATCH v4 1/2] " Adrian Moreno
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Adrian Moreno @ 2020-07-03 15:57 UTC (permalink / raw)
  To: dev
  Cc: chenbo.xia, zhihong.wang, xiao.w.wang, ferruh.yigit,
	maxime.coquelin, Adrian Moreno

This series adds Vhost-user protocol features support
to Virtio-user PMD's Vhost-user backend.

The first patch introduces protocol features
negotiation, and the second one reply-ack feature.

---
Changes since v3:
- [Chenbo] Do not process MQ if VHOST_USER_F_PROTOCOL_FEATURES is
  unsupported

Changes since v2:
- Added the new vhost-user messages to vhost_msg_strings[]

Changes since v1:
- Rebased on top of virtio-next
- Dropped patch 3 as it depends on a new SET_STATUS request being
merged into Qemu. Will submit independently.
- [Chenbo] Do not send SET_PROTOCOL_FEATURES request if not supported by
  backend


Maxime Coquelin (2):
  net/virtio: add vhost-user protocol features support
  net/virtio: add reply-ack support to Virtio-user

 drivers/net/virtio/virtio_user/vhost.h        | 13 ++++++
 drivers/net/virtio/virtio_user/vhost_user.c   | 29 +++++++++++--
 .../net/virtio/virtio_user/virtio_user_dev.c  | 41 ++++++++++++++++++-
 .../net/virtio/virtio_user/virtio_user_dev.h  |  3 ++
 drivers/net/virtio/virtio_user_ethdev.c       | 20 +++++++++
 5 files changed, 101 insertions(+), 5 deletions(-)

-- 
2.26.2


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

* [dpdk-dev] [PATCH v4 1/2] net/virtio: add vhost-user protocol features support
  2020-07-03 15:57 [dpdk-dev] [PATCH v4 0/2] net/virtio: add vhost-user protocol features support Adrian Moreno
@ 2020-07-03 15:57 ` Adrian Moreno
  2020-07-05 13:52   ` Xia, Chenbo
  2020-07-03 15:57 ` [dpdk-dev] [PATCH v4 2/2] net/virtio: add reply-ack support to Virtio-user Adrian Moreno
  2020-07-08 11:28 ` [dpdk-dev] [PATCH v4 0/2] net/virtio: add vhost-user protocol features support Ferruh Yigit
  2 siblings, 1 reply; 6+ messages in thread
From: Adrian Moreno @ 2020-07-03 15:57 UTC (permalink / raw)
  To: dev; +Cc: chenbo.xia, zhihong.wang, xiao.w.wang, ferruh.yigit, maxime.coquelin

From: Maxime Coquelin <maxime.coquelin@redhat.com>

This patch adds support for Vhost-user protocol features.
It is required to support protocol features that were not in
initial Vhost-user specification, such as reply-ack, MTU...

Also, this patch prevents Virtio multiqueue feature negotiation
if the slave does not support MQ protocol feature as stated
in Vhost-user specification:
"The multiple queues feature is supported only when the protocol
feature ``VHOST_USER_PROTOCOL_F_MQ`` (bit 0) is set."

Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
---
 drivers/net/virtio/virtio_user/vhost.h        |  9 +++++
 drivers/net/virtio/virtio_user/vhost_user.c   |  5 +++
 .../net/virtio/virtio_user/virtio_user_dev.c  | 40 ++++++++++++++++++-
 .../net/virtio/virtio_user/virtio_user_dev.h  |  3 ++
 drivers/net/virtio/virtio_user_ethdev.c       | 20 ++++++++++
 5 files changed, 75 insertions(+), 2 deletions(-)

diff --git a/drivers/net/virtio/virtio_user/vhost.h b/drivers/net/virtio/virtio_user/vhost.h
index 1e784e58e..9ace1a90c 100644
--- a/drivers/net/virtio/virtio_user/vhost.h
+++ b/drivers/net/virtio/virtio_user/vhost.h
@@ -44,6 +44,15 @@ struct vhost_vring_addr {
 	uint64_t log_guest_addr;
 };
 
+#ifndef VHOST_USER_F_PROTOCOL_FEATURES
+#define VHOST_USER_F_PROTOCOL_FEATURES 30
+#endif
+
+/** Protocol features. */
+#ifndef VHOST_USER_PROTOCOL_F_MQ
+#define VHOST_USER_PROTOCOL_F_MQ	0
+#endif
+
 enum vhost_user_request {
 	VHOST_USER_NONE = 0,
 	VHOST_USER_GET_FEATURES = 1,
diff --git a/drivers/net/virtio/virtio_user/vhost_user.c b/drivers/net/virtio/virtio_user/vhost_user.c
index 74b82e56e..e33067561 100644
--- a/drivers/net/virtio/virtio_user/vhost_user.c
+++ b/drivers/net/virtio/virtio_user/vhost_user.c
@@ -241,6 +241,8 @@ const char * const vhost_msg_strings[] = {
 	[VHOST_USER_SET_VRING_KICK] = "VHOST_SET_VRING_KICK",
 	[VHOST_USER_SET_MEM_TABLE] = "VHOST_SET_MEM_TABLE",
 	[VHOST_USER_SET_VRING_ENABLE] = "VHOST_SET_VRING_ENABLE",
+	[VHOST_USER_GET_PROTOCOL_FEATURES] = "VHOST_USER_GET_PROTOCOL_FEATURES",
+	[VHOST_USER_SET_PROTOCOL_FEATURES] = "VHOST_USER_SET_PROTOCOL_FEATURES",
 };
 
 static int
@@ -269,10 +271,12 @@ vhost_user_sock(struct virtio_user_dev *dev,
 
 	switch (req) {
 	case VHOST_USER_GET_FEATURES:
+	case VHOST_USER_GET_PROTOCOL_FEATURES:
 		need_reply = 1;
 		break;
 
 	case VHOST_USER_SET_FEATURES:
+	case VHOST_USER_SET_PROTOCOL_FEATURES:
 	case VHOST_USER_SET_LOG_BASE:
 		msg.payload.u64 = *((__u64 *)arg);
 		msg.size = sizeof(m.payload.u64);
@@ -351,6 +355,7 @@ vhost_user_sock(struct virtio_user_dev *dev,
 
 		switch (req) {
 		case VHOST_USER_GET_FEATURES:
+		case VHOST_USER_GET_PROTOCOL_FEATURES:
 			if (msg.size != sizeof(m.payload.u64)) {
 				PMD_DRV_LOG(ERR, "Received bad msg size");
 				return -1;
diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c b/drivers/net/virtio/virtio_user/virtio_user_dev.c
index 7fb135f49..105536d35 100644
--- a/drivers/net/virtio/virtio_user/virtio_user_dev.c
+++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c
@@ -151,8 +151,10 @@ virtio_user_start_device(struct virtio_user_dev *dev)
 	if (virtio_user_queue_setup(dev, virtio_user_create_queue) < 0)
 		goto error;
 
-	/* Step 1: set features */
+	/* Step 1: negotiate protocol features & set features */
 	features = dev->features;
+
+
 	/* Strip VIRTIO_NET_F_MAC, as MAC address is handled in vdev init */
 	features &= ~(1ull << VIRTIO_NET_F_MAC);
 	/* Strip VIRTIO_NET_F_CTRL_VQ, as devices do not really need to know */
@@ -417,13 +419,19 @@ virtio_user_dev_setup(struct virtio_user_dev *dev)
 	 1ULL << VIRTIO_NET_F_GUEST_TSO6	|	\
 	 1ULL << VIRTIO_F_IN_ORDER		|	\
 	 1ULL << VIRTIO_F_VERSION_1		|	\
-	 1ULL << VIRTIO_F_RING_PACKED)
+	 1ULL << VIRTIO_F_RING_PACKED		|	\
+	 1ULL << VHOST_USER_F_PROTOCOL_FEATURES)
+
+#define VIRTIO_USER_SUPPORTED_PROTOCOL_FEATURES		\
+	(1ULL << VHOST_USER_PROTOCOL_F_MQ)
 
 int
 virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues,
 		     int cq, int queue_size, const char *mac, char **ifname,
 		     int server, int mrg_rxbuf, int in_order, int packed_vq)
 {
+	uint64_t protocol_features = 0;
+
 	pthread_mutex_init(&dev->mutex, NULL);
 	strlcpy(dev->path, path, PATH_MAX);
 	dev->started = 0;
@@ -434,6 +442,7 @@ virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues,
 	dev->mac_specified = 0;
 	dev->frontend_features = 0;
 	dev->unsupported_features = ~VIRTIO_USER_SUPPORTED_FEATURES;
+	dev->protocol_features = VIRTIO_USER_SUPPORTED_PROTOCOL_FEATURES;
 	parse_mac(dev, mac);
 
 	if (*ifname) {
@@ -446,6 +455,10 @@ virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues,
 		return -1;
 	}
 
+	if (!is_vhost_user_by_type(dev->path))
+		dev->unsupported_features |=
+			(1ULL << VHOST_USER_F_PROTOCOL_FEATURES);
+
 	if (!dev->is_server) {
 		if (dev->ops->send_request(dev, VHOST_USER_SET_OWNER,
 					   NULL) < 0) {
@@ -460,6 +473,27 @@ virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues,
 				     strerror(errno));
 			return -1;
 		}
+
+
+		if (dev->device_features &
+				(1ULL << VHOST_USER_F_PROTOCOL_FEATURES)) {
+			if (dev->ops->send_request(dev,
+					VHOST_USER_GET_PROTOCOL_FEATURES,
+					&protocol_features))
+				return -1;
+
+			dev->protocol_features &= protocol_features;
+
+			if (dev->ops->send_request(dev,
+					VHOST_USER_SET_PROTOCOL_FEATURES,
+					&dev->protocol_features))
+				return -1;
+
+			if (!(dev->protocol_features &
+					(1ULL << VHOST_USER_PROTOCOL_F_MQ)))
+				dev->unsupported_features |=
+					(1ull << VIRTIO_NET_F_MQ);
+		}
 	} else {
 		/* We just pretend vhost-user can support all these features.
 		 * Note that this could be problematic that if some feature is
@@ -469,6 +503,8 @@ virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues,
 		dev->device_features = VIRTIO_USER_SUPPORTED_FEATURES;
 	}
 
+
+
 	if (!mrg_rxbuf)
 		dev->unsupported_features |= (1ull << VIRTIO_NET_F_MRG_RXBUF);
 
diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.h b/drivers/net/virtio/virtio_user/virtio_user_dev.h
index 3b6b6065a..56e638f8a 100644
--- a/drivers/net/virtio/virtio_user/virtio_user_dev.h
+++ b/drivers/net/virtio/virtio_user/virtio_user_dev.h
@@ -40,6 +40,9 @@ struct virtio_user_dev {
 	uint64_t	device_features; /* supported features by device */
 	uint64_t	frontend_features; /* enabled frontend features */
 	uint64_t	unsupported_features; /* unsupported features mask */
+	uint64_t	protocol_features; /* negotiated protocol features
+					    * (Vhost-user only)
+					    */
 	uint8_t		status;
 	uint16_t	port_id;
 	uint8_t		mac_addr[RTE_ETHER_ADDR_LEN];
diff --git a/drivers/net/virtio/virtio_user_ethdev.c b/drivers/net/virtio/virtio_user_ethdev.c
index 798f191c3..e51425c4f 100644
--- a/drivers/net/virtio/virtio_user_ethdev.c
+++ b/drivers/net/virtio/virtio_user_ethdev.c
@@ -68,6 +68,7 @@ virtio_user_server_reconnect(struct virtio_user_dev *dev)
 	int connectfd;
 	struct rte_eth_dev *eth_dev = &rte_eth_devices[dev->port_id];
 	struct virtio_hw *hw = eth_dev->data->dev_private;
+	uint64_t protocol_features;
 
 	connectfd = accept(dev->listenfd, NULL, NULL);
 	if (connectfd < 0)
@@ -81,6 +82,25 @@ virtio_user_server_reconnect(struct virtio_user_dev *dev)
 		return -1;
 	}
 
+	if (dev->device_features &
+			(1ULL << VHOST_USER_F_PROTOCOL_FEATURES)) {
+		if (dev->ops->send_request(dev,
+					VHOST_USER_GET_PROTOCOL_FEATURES,
+					&protocol_features))
+			return -1;
+
+		dev->protocol_features &= protocol_features;
+
+		if (dev->ops->send_request(dev,
+					VHOST_USER_SET_PROTOCOL_FEATURES,
+					&dev->protocol_features))
+			return -1;
+
+		if (!(dev->protocol_features &
+				(1ULL << VHOST_USER_PROTOCOL_F_MQ)))
+			dev->unsupported_features |= (1ull << VIRTIO_NET_F_MQ);
+	}
+
 	dev->device_features |= dev->frontend_features;
 
 	/* umask vhost-user unsupported features */
-- 
2.26.2


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

* [dpdk-dev] [PATCH v4 2/2] net/virtio: add reply-ack support to Virtio-user
  2020-07-03 15:57 [dpdk-dev] [PATCH v4 0/2] net/virtio: add vhost-user protocol features support Adrian Moreno
  2020-07-03 15:57 ` [dpdk-dev] [PATCH v4 1/2] " Adrian Moreno
@ 2020-07-03 15:57 ` Adrian Moreno
  2020-07-05 13:53   ` Xia, Chenbo
  2020-07-08 11:28 ` [dpdk-dev] [PATCH v4 0/2] net/virtio: add vhost-user protocol features support Ferruh Yigit
  2 siblings, 1 reply; 6+ messages in thread
From: Adrian Moreno @ 2020-07-03 15:57 UTC (permalink / raw)
  To: dev; +Cc: chenbo.xia, zhihong.wang, xiao.w.wang, ferruh.yigit, maxime.coquelin

From: Maxime Coquelin <maxime.coquelin@redhat.com>

This patch adds support reply-ack vhost-user protocol
feature, which is for now only used to ensure
VHOST_USER_SET_MEM_TABLE requests are handled by the
slave, but later will be used for VHOST_USER_SET_STATUS.

Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
---
 drivers/net/virtio/virtio_user/vhost.h        |  6 ++++-
 drivers/net/virtio/virtio_user/vhost_user.c   | 24 ++++++++++++++++---
 .../net/virtio/virtio_user/virtio_user_dev.c  |  3 ++-
 3 files changed, 28 insertions(+), 5 deletions(-)

diff --git a/drivers/net/virtio/virtio_user/vhost.h b/drivers/net/virtio/virtio_user/vhost.h
index 9ace1a90c..260e1c308 100644
--- a/drivers/net/virtio/virtio_user/vhost.h
+++ b/drivers/net/virtio/virtio_user/vhost.h
@@ -50,7 +50,11 @@ struct vhost_vring_addr {
 
 /** Protocol features. */
 #ifndef VHOST_USER_PROTOCOL_F_MQ
-#define VHOST_USER_PROTOCOL_F_MQ	0
+#define VHOST_USER_PROTOCOL_F_MQ 0
+#endif
+
+#ifndef VHOST_USER_PROTOCOL_F_REPLY_ACK
+#define VHOST_USER_PROTOCOL_F_REPLY_ACK 3
 #endif
 
 enum vhost_user_request {
diff --git a/drivers/net/virtio/virtio_user/vhost_user.c b/drivers/net/virtio/virtio_user/vhost_user.c
index e33067561..631d0e353 100644
--- a/drivers/net/virtio/virtio_user/vhost_user.c
+++ b/drivers/net/virtio/virtio_user/vhost_user.c
@@ -32,6 +32,7 @@ struct vhost_user_msg {
 
 #define VHOST_USER_VERSION_MASK     0x3
 #define VHOST_USER_REPLY_MASK       (0x1 << 2)
+#define VHOST_USER_NEED_REPLY_MASK  (0x1 << 3)
 	uint32_t flags;
 	uint32_t size; /* the following payload size */
 	union {
@@ -253,6 +254,7 @@ vhost_user_sock(struct virtio_user_dev *dev,
 	struct vhost_user_msg msg;
 	struct vhost_vring_file *file = 0;
 	int need_reply = 0;
+	int has_reply_ack;
 	int fds[VHOST_MEMORY_MAX_NREGIONS];
 	int fd_num = 0;
 	int len;
@@ -265,6 +267,9 @@ vhost_user_sock(struct virtio_user_dev *dev,
 	if (dev->is_server && vhostfd < 0)
 		return -1;
 
+	if (dev->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_REPLY_ACK))
+		has_reply_ack = 1;
+
 	msg.request = req;
 	msg.flags = VHOST_USER_VERSION;
 	msg.size = 0;
@@ -293,6 +298,9 @@ vhost_user_sock(struct virtio_user_dev *dev,
 		msg.size = sizeof(m.payload.memory.nregions);
 		msg.size += sizeof(m.payload.memory.padding);
 		msg.size += fd_num * sizeof(struct vhost_memory_region);
+
+		if (has_reply_ack)
+			msg.flags |= VHOST_USER_NEED_REPLY_MASK;
 		break;
 
 	case VHOST_USER_SET_LOG_FD:
@@ -341,7 +349,7 @@ vhost_user_sock(struct virtio_user_dev *dev,
 		return -1;
 	}
 
-	if (need_reply) {
+	if (need_reply || msg.flags & VHOST_USER_NEED_REPLY_MASK) {
 		if (vhost_user_read(vhostfd, &msg) < 0) {
 			PMD_DRV_LOG(ERR, "Received msg failed: %s",
 				    strerror(errno));
@@ -371,8 +379,18 @@ vhost_user_sock(struct virtio_user_dev *dev,
 			       sizeof(struct vhost_vring_state));
 			break;
 		default:
-			PMD_DRV_LOG(ERR, "Received unexpected msg type");
-			return -1;
+			/* Reply-ack handling */
+			if (msg.size != sizeof(m.payload.u64)) {
+				PMD_DRV_LOG(ERR, "Received bad msg size");
+				return -1;
+			}
+
+			if (msg.payload.u64 != 0) {
+				PMD_DRV_LOG(ERR, "Slave replied NACK");
+				return -1;
+			}
+
+			break;
 		}
 	}
 
diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c b/drivers/net/virtio/virtio_user/virtio_user_dev.c
index 105536d35..0a6991bcc 100644
--- a/drivers/net/virtio/virtio_user/virtio_user_dev.c
+++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c
@@ -423,7 +423,8 @@ virtio_user_dev_setup(struct virtio_user_dev *dev)
 	 1ULL << VHOST_USER_F_PROTOCOL_FEATURES)
 
 #define VIRTIO_USER_SUPPORTED_PROTOCOL_FEATURES		\
-	(1ULL << VHOST_USER_PROTOCOL_F_MQ)
+	(1ULL << VHOST_USER_PROTOCOL_F_MQ |		\
+	 1ULL << VHOST_USER_PROTOCOL_F_REPLY_ACK)
 
 int
 virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues,
-- 
2.26.2


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

* Re: [dpdk-dev] [PATCH v4 1/2] net/virtio: add vhost-user protocol features support
  2020-07-03 15:57 ` [dpdk-dev] [PATCH v4 1/2] " Adrian Moreno
@ 2020-07-05 13:52   ` Xia, Chenbo
  0 siblings, 0 replies; 6+ messages in thread
From: Xia, Chenbo @ 2020-07-05 13:52 UTC (permalink / raw)
  To: Adrian Moreno, dev
  Cc: Wang, Zhihong, Wang, Xiao W, Yigit, Ferruh, maxime.coquelin


> -----Original Message-----
> From: Adrian Moreno <amorenoz@redhat.com>
> Sent: Friday, July 3, 2020 11:57 PM
> To: dev@dpdk.org
> Cc: Xia, Chenbo <chenbo.xia@intel.com>; Wang, Zhihong
> <zhihong.wang@intel.com>; Wang, Xiao W <xiao.w.wang@intel.com>; Yigit,
> Ferruh <ferruh.yigit@intel.com>; maxime.coquelin@redhat.com
> Subject: [PATCH v4 1/2] net/virtio: add vhost-user protocol features support
> 
> From: Maxime Coquelin <maxime.coquelin@redhat.com>
> 
> This patch adds support for Vhost-user protocol features.
> It is required to support protocol features that were not in initial Vhost-user
> specification, such as reply-ack, MTU...
> 
> Also, this patch prevents Virtio multiqueue feature negotiation if the slave does
> not support MQ protocol feature as stated in Vhost-user specification:
> "The multiple queues feature is supported only when the protocol feature
> ``VHOST_USER_PROTOCOL_F_MQ`` (bit 0) is set."
> 
> Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
> ---
>  drivers/net/virtio/virtio_user/vhost.h        |  9 +++++
>  drivers/net/virtio/virtio_user/vhost_user.c   |  5 +++
>  .../net/virtio/virtio_user/virtio_user_dev.c  | 40 ++++++++++++++++++-
>   .../net/virtio/virtio_user/virtio_user_dev.h  |  3 ++
>  drivers/net/virtio/virtio_user_ethdev.c       | 20 ++++++++++
>  5 files changed, 75 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/net/virtio/virtio_user/vhost.h
> b/drivers/net/virtio/virtio_user/vhost.h
> index 1e784e58e..9ace1a90c 100644
> --- a/drivers/net/virtio/virtio_user/vhost.h
> +++ b/drivers/net/virtio/virtio_user/vhost.h
> @@ -44,6 +44,15 @@ struct vhost_vring_addr {
>  	uint64_t log_guest_addr;
>  };
> 
> +#ifndef VHOST_USER_F_PROTOCOL_FEATURES
> +#define VHOST_USER_F_PROTOCOL_FEATURES 30 #endif
> +
> +/** Protocol features. */
> +#ifndef VHOST_USER_PROTOCOL_F_MQ
> +#define VHOST_USER_PROTOCOL_F_MQ	0
> +#endif
> +
>  enum vhost_user_request {
>  	VHOST_USER_NONE = 0,
>  	VHOST_USER_GET_FEATURES = 1,
> diff --git a/drivers/net/virtio/virtio_user/vhost_user.c
> b/drivers/net/virtio/virtio_user/vhost_user.c
> index 74b82e56e..e33067561 100644
> --- a/drivers/net/virtio/virtio_user/vhost_user.c
> +++ b/drivers/net/virtio/virtio_user/vhost_user.c
> @@ -241,6 +241,8 @@ const char * const vhost_msg_strings[] = {
>  	[VHOST_USER_SET_VRING_KICK] = "VHOST_SET_VRING_KICK",
>  	[VHOST_USER_SET_MEM_TABLE] = "VHOST_SET_MEM_TABLE",
>  	[VHOST_USER_SET_VRING_ENABLE] = "VHOST_SET_VRING_ENABLE",
> +	[VHOST_USER_GET_PROTOCOL_FEATURES] =
> "VHOST_USER_GET_PROTOCOL_FEATURES",
> +	[VHOST_USER_SET_PROTOCOL_FEATURES] =
> +"VHOST_USER_SET_PROTOCOL_FEATURES",
>  };
> 
>  static int
> @@ -269,10 +271,12 @@ vhost_user_sock(struct virtio_user_dev *dev,
> 
>  	switch (req) {
>  	case VHOST_USER_GET_FEATURES:
> +	case VHOST_USER_GET_PROTOCOL_FEATURES:
>  		need_reply = 1;
>  		break;
> 
>  	case VHOST_USER_SET_FEATURES:
> +	case VHOST_USER_SET_PROTOCOL_FEATURES:
>  	case VHOST_USER_SET_LOG_BASE:
>  		msg.payload.u64 = *((__u64 *)arg);
>  		msg.size = sizeof(m.payload.u64);
> @@ -351,6 +355,7 @@ vhost_user_sock(struct virtio_user_dev *dev,
> 
>  		switch (req) {
>  		case VHOST_USER_GET_FEATURES:
> +		case VHOST_USER_GET_PROTOCOL_FEATURES:
>  			if (msg.size != sizeof(m.payload.u64)) {
>  				PMD_DRV_LOG(ERR, "Received bad msg size");
>  				return -1;
> diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c
> b/drivers/net/virtio/virtio_user/virtio_user_dev.c
> index 7fb135f49..105536d35 100644
> --- a/drivers/net/virtio/virtio_user/virtio_user_dev.c
> +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c
> @@ -151,8 +151,10 @@ virtio_user_start_device(struct virtio_user_dev *dev)
>  	if (virtio_user_queue_setup(dev, virtio_user_create_queue) < 0)
>  		goto error;
> 
> -	/* Step 1: set features */
> +	/* Step 1: negotiate protocol features & set features */
>  	features = dev->features;
> +
> +
>  	/* Strip VIRTIO_NET_F_MAC, as MAC address is handled in vdev init */
>  	features &= ~(1ull << VIRTIO_NET_F_MAC);
>  	/* Strip VIRTIO_NET_F_CTRL_VQ, as devices do not really need to know
> */ @@ -417,13 +419,19 @@ virtio_user_dev_setup(struct virtio_user_dev *dev)
>  	 1ULL << VIRTIO_NET_F_GUEST_TSO6	|	\
>  	 1ULL << VIRTIO_F_IN_ORDER		|	\
>  	 1ULL << VIRTIO_F_VERSION_1		|	\
> -	 1ULL << VIRTIO_F_RING_PACKED)
> +	 1ULL << VIRTIO_F_RING_PACKED		|	\
> +	 1ULL << VHOST_USER_F_PROTOCOL_FEATURES)
> +
> +#define VIRTIO_USER_SUPPORTED_PROTOCOL_FEATURES		\
> +	(1ULL << VHOST_USER_PROTOCOL_F_MQ)
> 
>  int
>  virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues,
>  		     int cq, int queue_size, const char *mac, char **ifname,
>  		     int server, int mrg_rxbuf, int in_order, int packed_vq)  {
> +	uint64_t protocol_features = 0;
> +
>  	pthread_mutex_init(&dev->mutex, NULL);
>  	strlcpy(dev->path, path, PATH_MAX);
>  	dev->started = 0;
> @@ -434,6 +442,7 @@ virtio_user_dev_init(struct virtio_user_dev *dev, char
> *path, int queues,
>  	dev->mac_specified = 0;
>  	dev->frontend_features = 0;
>  	dev->unsupported_features = ~VIRTIO_USER_SUPPORTED_FEATURES;
> +	dev->protocol_features =
> VIRTIO_USER_SUPPORTED_PROTOCOL_FEATURES;
>  	parse_mac(dev, mac);
> 
>  	if (*ifname) {
> @@ -446,6 +455,10 @@ virtio_user_dev_init(struct virtio_user_dev *dev, char
> *path, int queues,
>  		return -1;
>  	}
> 
> +	if (!is_vhost_user_by_type(dev->path))
> +		dev->unsupported_features |=
> +			(1ULL << VHOST_USER_F_PROTOCOL_FEATURES);
> +
>  	if (!dev->is_server) {
>  		if (dev->ops->send_request(dev, VHOST_USER_SET_OWNER,
>  					   NULL) < 0) {
> @@ -460,6 +473,27 @@ virtio_user_dev_init(struct virtio_user_dev *dev, char
> *path, int queues,
>  				     strerror(errno));
>  			return -1;
>  		}
> +
> +
> +		if (dev->device_features &
> +				(1ULL <<
> VHOST_USER_F_PROTOCOL_FEATURES)) {
> +			if (dev->ops->send_request(dev,
> +
> 	VHOST_USER_GET_PROTOCOL_FEATURES,
> +					&protocol_features))
> +				return -1;
> +
> +			dev->protocol_features &= protocol_features;
> +
> +			if (dev->ops->send_request(dev,
> +
> 	VHOST_USER_SET_PROTOCOL_FEATURES,
> +					&dev->protocol_features))
> +				return -1;
> +
> +			if (!(dev->protocol_features &
> +					(1ULL <<
> VHOST_USER_PROTOCOL_F_MQ)))
> +				dev->unsupported_features |=
> +					(1ull << VIRTIO_NET_F_MQ);
> +		}
>  	} else {
>  		/* We just pretend vhost-user can support all these features.
>  		 * Note that this could be problematic that if some feature is
> @@ -469,6 +503,8 @@ virtio_user_dev_init(struct virtio_user_dev *dev, char
> *path, int queues,
>  		dev->device_features = VIRTIO_USER_SUPPORTED_FEATURES;
>  	}
> 
> +
> +
>  	if (!mrg_rxbuf)
>  		dev->unsupported_features |= (1ull <<
> VIRTIO_NET_F_MRG_RXBUF);
> 
> diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.h
> b/drivers/net/virtio/virtio_user/virtio_user_dev.h
> index 3b6b6065a..56e638f8a 100644
> --- a/drivers/net/virtio/virtio_user/virtio_user_dev.h
> +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.h
> @@ -40,6 +40,9 @@ struct virtio_user_dev {
>  	uint64_t	device_features; /* supported features by device */
>  	uint64_t	frontend_features; /* enabled frontend features */
>  	uint64_t	unsupported_features; /* unsupported features mask
> */
> +	uint64_t	protocol_features; /* negotiated protocol features
> +					    * (Vhost-user only)
> +					    */
>  	uint8_t		status;
>  	uint16_t	port_id;
>  	uint8_t		mac_addr[RTE_ETHER_ADDR_LEN];
> diff --git a/drivers/net/virtio/virtio_user_ethdev.c
> b/drivers/net/virtio/virtio_user_ethdev.c
> index 798f191c3..e51425c4f 100644
> --- a/drivers/net/virtio/virtio_user_ethdev.c
> +++ b/drivers/net/virtio/virtio_user_ethdev.c
> @@ -68,6 +68,7 @@ virtio_user_server_reconnect(struct virtio_user_dev *dev)
>  	int connectfd;
>  	struct rte_eth_dev *eth_dev = &rte_eth_devices[dev->port_id];
>  	struct virtio_hw *hw = eth_dev->data->dev_private;
> +	uint64_t protocol_features;
> 
>  	connectfd = accept(dev->listenfd, NULL, NULL);
>  	if (connectfd < 0)
> @@ -81,6 +82,25 @@ virtio_user_server_reconnect(struct virtio_user_dev *dev)
>  		return -1;
>  	}
> 
> +	if (dev->device_features &
> +			(1ULL << VHOST_USER_F_PROTOCOL_FEATURES)) {
> +		if (dev->ops->send_request(dev,
> +
> 	VHOST_USER_GET_PROTOCOL_FEATURES,
> +					&protocol_features))
> +			return -1;
> +
> +		dev->protocol_features &= protocol_features;
> +
> +		if (dev->ops->send_request(dev,
> +
> 	VHOST_USER_SET_PROTOCOL_FEATURES,
> +					&dev->protocol_features))
> +			return -1;
> +
> +		if (!(dev->protocol_features &
> +				(1ULL << VHOST_USER_PROTOCOL_F_MQ)))
> +			dev->unsupported_features |= (1ull <<
> VIRTIO_NET_F_MQ);
> +	}
> +
>  	dev->device_features |= dev->frontend_features;
> 
>  	/* umask vhost-user unsupported features */
> --
> 2.26.2

Reviewed-by: Chenbo Xia <chenbo.xia@intel.com>

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

* Re: [dpdk-dev] [PATCH v4 2/2] net/virtio: add reply-ack support to Virtio-user
  2020-07-03 15:57 ` [dpdk-dev] [PATCH v4 2/2] net/virtio: add reply-ack support to Virtio-user Adrian Moreno
@ 2020-07-05 13:53   ` Xia, Chenbo
  0 siblings, 0 replies; 6+ messages in thread
From: Xia, Chenbo @ 2020-07-05 13:53 UTC (permalink / raw)
  To: Adrian Moreno, dev
  Cc: Wang, Zhihong, Wang, Xiao W, Yigit, Ferruh, maxime.coquelin


> -----Original Message-----
> From: Adrian Moreno <amorenoz@redhat.com>
> Sent: Friday, July 3, 2020 11:57 PM
> To: dev@dpdk.org
> Cc: Xia, Chenbo <chenbo.xia@intel.com>; Wang, Zhihong
> <zhihong.wang@intel.com>; Wang, Xiao W <xiao.w.wang@intel.com>; Yigit,
> Ferruh <ferruh.yigit@intel.com>; maxime.coquelin@redhat.com
> Subject: [PATCH v4 2/2] net/virtio: add reply-ack support to Virtio-user
> 
> From: Maxime Coquelin <maxime.coquelin@redhat.com>
> 
> This patch adds support reply-ack vhost-user protocol feature, which is for now
> only used to ensure VHOST_USER_SET_MEM_TABLE requests are handled by the
> slave, but later will be used for VHOST_USER_SET_STATUS.
> 
> Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
> ---
>  drivers/net/virtio/virtio_user/vhost.h        |  6 ++++-
>  drivers/net/virtio/virtio_user/vhost_user.c   | 24 ++++++++++++++++---
>  .../net/virtio/virtio_user/virtio_user_dev.c  |  3 ++-
>  3 files changed, 28 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/net/virtio/virtio_user/vhost.h
> b/drivers/net/virtio/virtio_user/vhost.h
> index 9ace1a90c..260e1c308 100644
> --- a/drivers/net/virtio/virtio_user/vhost.h
> +++ b/drivers/net/virtio/virtio_user/vhost.h
> @@ -50,7 +50,11 @@ struct vhost_vring_addr {
> 
>  /** Protocol features. */
>  #ifndef VHOST_USER_PROTOCOL_F_MQ
> -#define VHOST_USER_PROTOCOL_F_MQ	0
> +#define VHOST_USER_PROTOCOL_F_MQ 0
> +#endif
> +
> +#ifndef VHOST_USER_PROTOCOL_F_REPLY_ACK #define
> +VHOST_USER_PROTOCOL_F_REPLY_ACK 3
>  #endif
> 
>  enum vhost_user_request {
> diff --git a/drivers/net/virtio/virtio_user/vhost_user.c
> b/drivers/net/virtio/virtio_user/vhost_user.c
> index e33067561..631d0e353 100644
> --- a/drivers/net/virtio/virtio_user/vhost_user.c
> +++ b/drivers/net/virtio/virtio_user/vhost_user.c
> @@ -32,6 +32,7 @@ struct vhost_user_msg {
> 
>  #define VHOST_USER_VERSION_MASK     0x3
>  #define VHOST_USER_REPLY_MASK       (0x1 << 2)
> +#define VHOST_USER_NEED_REPLY_MASK  (0x1 << 3)
>  	uint32_t flags;
>  	uint32_t size; /* the following payload size */
>  	union {
> @@ -253,6 +254,7 @@ vhost_user_sock(struct virtio_user_dev *dev,
>  	struct vhost_user_msg msg;
>  	struct vhost_vring_file *file = 0;
>  	int need_reply = 0;
> +	int has_reply_ack;
>  	int fds[VHOST_MEMORY_MAX_NREGIONS];
>  	int fd_num = 0;
>  	int len;
> @@ -265,6 +267,9 @@ vhost_user_sock(struct virtio_user_dev *dev,
>  	if (dev->is_server && vhostfd < 0)
>  		return -1;
> 
> +	if (dev->protocol_features & (1ULL <<
> VHOST_USER_PROTOCOL_F_REPLY_ACK))
> +		has_reply_ack = 1;
> +
>  	msg.request = req;
>  	msg.flags = VHOST_USER_VERSION;
>  	msg.size = 0;
> @@ -293,6 +298,9 @@ vhost_user_sock(struct virtio_user_dev *dev,
>  		msg.size = sizeof(m.payload.memory.nregions);
>  		msg.size += sizeof(m.payload.memory.padding);
>  		msg.size += fd_num * sizeof(struct vhost_memory_region);
> +
> +		if (has_reply_ack)
> +			msg.flags |= VHOST_USER_NEED_REPLY_MASK;
>  		break;
> 
>  	case VHOST_USER_SET_LOG_FD:
> @@ -341,7 +349,7 @@ vhost_user_sock(struct virtio_user_dev *dev,
>  		return -1;
>  	}
> 
> -	if (need_reply) {
> +	if (need_reply || msg.flags & VHOST_USER_NEED_REPLY_MASK) {
>  		if (vhost_user_read(vhostfd, &msg) < 0) {
>  			PMD_DRV_LOG(ERR, "Received msg failed: %s",
>  				    strerror(errno));
> @@ -371,8 +379,18 @@ vhost_user_sock(struct virtio_user_dev *dev,
>  			       sizeof(struct vhost_vring_state));
>  			break;
>  		default:
> -			PMD_DRV_LOG(ERR, "Received unexpected msg type");
> -			return -1;
> +			/* Reply-ack handling */
> +			if (msg.size != sizeof(m.payload.u64)) {
> +				PMD_DRV_LOG(ERR, "Received bad msg size");
> +				return -1;
> +			}
> +
> +			if (msg.payload.u64 != 0) {
> +				PMD_DRV_LOG(ERR, "Slave replied NACK");
> +				return -1;
> +			}
> +
> +			break;
>  		}
>  	}
> 
> diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c
> b/drivers/net/virtio/virtio_user/virtio_user_dev.c
> index 105536d35..0a6991bcc 100644
> --- a/drivers/net/virtio/virtio_user/virtio_user_dev.c
> +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c
> @@ -423,7 +423,8 @@ virtio_user_dev_setup(struct virtio_user_dev *dev)
>  	 1ULL << VHOST_USER_F_PROTOCOL_FEATURES)
> 
>  #define VIRTIO_USER_SUPPORTED_PROTOCOL_FEATURES		\
> -	(1ULL << VHOST_USER_PROTOCOL_F_MQ)
> +	(1ULL << VHOST_USER_PROTOCOL_F_MQ |		\
> +	 1ULL << VHOST_USER_PROTOCOL_F_REPLY_ACK)
> 
>  int
>  virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues,
> --
> 2.26.2

Reviewed-by: Chenbo Xia <chenbo.xia@intel.com>

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

* Re: [dpdk-dev] [PATCH v4 0/2] net/virtio: add vhost-user protocol features support
  2020-07-03 15:57 [dpdk-dev] [PATCH v4 0/2] net/virtio: add vhost-user protocol features support Adrian Moreno
  2020-07-03 15:57 ` [dpdk-dev] [PATCH v4 1/2] " Adrian Moreno
  2020-07-03 15:57 ` [dpdk-dev] [PATCH v4 2/2] net/virtio: add reply-ack support to Virtio-user Adrian Moreno
@ 2020-07-08 11:28 ` Ferruh Yigit
  2 siblings, 0 replies; 6+ messages in thread
From: Ferruh Yigit @ 2020-07-08 11:28 UTC (permalink / raw)
  To: Adrian Moreno, dev; +Cc: chenbo.xia, zhihong.wang, xiao.w.wang, maxime.coquelin

On 7/3/2020 4:57 PM, Adrian Moreno wrote:
> This series adds Vhost-user protocol features support
> to Virtio-user PMD's Vhost-user backend.
> 
> The first patch introduces protocol features
> negotiation, and the second one reply-ack feature.
> 
> ---
> Changes since v3:
> - [Chenbo] Do not process MQ if VHOST_USER_F_PROTOCOL_FEATURES is
>   unsupported
> 
> Changes since v2:
> - Added the new vhost-user messages to vhost_msg_strings[]
> 
> Changes since v1:
> - Rebased on top of virtio-next
> - Dropped patch 3 as it depends on a new SET_STATUS request being
> merged into Qemu. Will submit independently.
> - [Chenbo] Do not send SET_PROTOCOL_FEATURES request if not supported by
>   backend
> 
> 
> Maxime Coquelin (2):
>   net/virtio: add vhost-user protocol features support
>   net/virtio: add reply-ack support to Virtio-user
> 

Reviewed-by: Chenbo Xia <chenbo.xia@intel.com>

Series applied to dpdk-next-net/master, thanks.

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

end of thread, other threads:[~2020-07-08 11:28 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-07-03 15:57 [dpdk-dev] [PATCH v4 0/2] net/virtio: add vhost-user protocol features support Adrian Moreno
2020-07-03 15:57 ` [dpdk-dev] [PATCH v4 1/2] " Adrian Moreno
2020-07-05 13:52   ` Xia, Chenbo
2020-07-03 15:57 ` [dpdk-dev] [PATCH v4 2/2] net/virtio: add reply-ack support to Virtio-user Adrian Moreno
2020-07-05 13:53   ` Xia, Chenbo
2020-07-08 11:28 ` [dpdk-dev] [PATCH v4 0/2] net/virtio: add vhost-user protocol features support Ferruh Yigit

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.