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