* [dpdk-dev] [PATCH v3 0/2] net/virtio: add vhost-user protocol features support @ 2020-07-02 7:43 Adrian Moreno 2020-07-02 7:43 ` [dpdk-dev] [PATCH v3 1/2] " Adrian Moreno 2020-07-02 7:43 ` [dpdk-dev] [PATCH v3 2/2] net/virtio: add reply-ack support to Virtio-user Adrian Moreno 0 siblings, 2 replies; 5+ messages in thread From: Adrian Moreno @ 2020-07-02 7:43 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 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 | 40 ++++++++++++++++++- .../net/virtio/virtio_user/virtio_user_dev.h | 3 ++ drivers/net/virtio/virtio_user_ethdev.c | 19 +++++++++ 5 files changed, 99 insertions(+), 5 deletions(-) -- 2.26.2 ^ permalink raw reply [flat|nested] 5+ messages in thread
* [dpdk-dev] [PATCH v3 1/2] net/virtio: add vhost-user protocol features support 2020-07-02 7:43 [dpdk-dev] [PATCH v3 0/2] net/virtio: add vhost-user protocol features support Adrian Moreno @ 2020-07-02 7:43 ` Adrian Moreno 2020-07-03 8:40 ` Xia, Chenbo 2020-07-02 7:43 ` [dpdk-dev] [PATCH v3 2/2] net/virtio: add reply-ack support to Virtio-user Adrian Moreno 1 sibling, 1 reply; 5+ messages in thread From: Adrian Moreno @ 2020-07-02 7:43 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 | 39 ++++++++++++++++++- .../net/virtio/virtio_user/virtio_user_dev.h | 3 ++ drivers/net/virtio/virtio_user_ethdev.c | 19 +++++++++ 5 files changed, 73 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..c35c11fe5 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..e45159ddd 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,26 @@ 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 +502,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..ccb5a18e2 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,24 @@ 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] 5+ messages in thread
* Re: [dpdk-dev] [PATCH v3 1/2] net/virtio: add vhost-user protocol features support 2020-07-02 7:43 ` [dpdk-dev] [PATCH v3 1/2] " Adrian Moreno @ 2020-07-03 8:40 ` Xia, Chenbo 2020-07-03 15:52 ` Adrian Moreno 0 siblings, 1 reply; 5+ messages in thread From: Xia, Chenbo @ 2020-07-03 8:40 UTC (permalink / raw) To: Adrian Moreno, dev Cc: Wang, Zhihong, Wang, Xiao W, Yigit, Ferruh, maxime.coquelin Hi Adrian, > -----Original Message----- > From: Adrian Moreno <amorenoz@redhat.com> > Sent: Thursday, July 2, 2020 3:44 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 v3 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 | 39 ++++++++++++++++++- > .../net/virtio/virtio_user/virtio_user_dev.h | 3 ++ > drivers/net/virtio/virtio_user_ethdev.c | 19 +++++++++ > 5 files changed, 73 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; > }; [snip] > @@ -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,26 @@ 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 +502,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..ccb5a18e2 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,24 @@ 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); > + Should this 'if' be put into above '{}' ? This should be under the condition that VHOST_USER_F_PROTOCOL_FEATURES is supported, right? Like the code change in 'virtio_user_dev_init'. Thanks, Chenbo > dev->device_features |= dev->frontend_features; > > /* umask vhost-user unsupported features */ > -- > 2.26.2 ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [dpdk-dev] [PATCH v3 1/2] net/virtio: add vhost-user protocol features support 2020-07-03 8:40 ` Xia, Chenbo @ 2020-07-03 15:52 ` Adrian Moreno 0 siblings, 0 replies; 5+ messages in thread From: Adrian Moreno @ 2020-07-03 15:52 UTC (permalink / raw) To: Xia, Chenbo, dev Cc: Wang, Zhihong, Wang, Xiao W, Yigit, Ferruh, maxime.coquelin On 7/3/20 10:40 AM, Xia, Chenbo wrote: > Hi Adrian, > >> -----Original Message----- >> From: Adrian Moreno <amorenoz@redhat.com> >> Sent: Thursday, July 2, 2020 3:44 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 v3 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 | 39 ++++++++++++++++++- >> .../net/virtio/virtio_user/virtio_user_dev.h | 3 ++ >> drivers/net/virtio/virtio_user_ethdev.c | 19 +++++++++ >> 5 files changed, 73 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; >> }; > > [snip] > >> @@ -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,26 @@ 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 +502,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..ccb5a18e2 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,24 @@ 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); >> + > > Should this 'if' be put into above '{}' ? This should be under the condition that > VHOST_USER_F_PROTOCOL_FEATURES is supported, right? Like the code > change in 'virtio_user_dev_init'. > You're right. I'll re-send Thanks > Thanks, > Chenbo > >> dev->device_features |= dev->frontend_features; >> >> /* umask vhost-user unsupported features */ >> -- >> 2.26.2 > -- Adrián Moreno ^ permalink raw reply [flat|nested] 5+ messages in thread
* [dpdk-dev] [PATCH v3 2/2] net/virtio: add reply-ack support to Virtio-user 2020-07-02 7:43 [dpdk-dev] [PATCH v3 0/2] net/virtio: add vhost-user protocol features support Adrian Moreno 2020-07-02 7:43 ` [dpdk-dev] [PATCH v3 1/2] " Adrian Moreno @ 2020-07-02 7:43 ` Adrian Moreno 1 sibling, 0 replies; 5+ messages in thread From: Adrian Moreno @ 2020-07-02 7:43 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 c35c11fe5..9f654f309 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 e45159ddd..e94925f9f 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] 5+ messages in thread
end of thread, other threads:[~2020-07-03 15:52 UTC | newest] Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2020-07-02 7:43 [dpdk-dev] [PATCH v3 0/2] net/virtio: add vhost-user protocol features support Adrian Moreno 2020-07-02 7:43 ` [dpdk-dev] [PATCH v3 1/2] " Adrian Moreno 2020-07-03 8:40 ` Xia, Chenbo 2020-07-03 15:52 ` Adrian Moreno 2020-07-02 7:43 ` [dpdk-dev] [PATCH v3 2/2] net/virtio: add reply-ack support to Virtio-user Adrian Moreno
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).