From c60208dd638477c2ab5340aaaec8eee291c2985b Mon Sep 17 00:00:00 2001 From: Maxime Coquelin Date: Fri, 3 Jul 2020 17:57:27 +0200 Subject: [PATCH] net/virtio-user: support reply-ack 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 Reviewed-by: Chenbo Xia --- 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 9ace1a90c3..260e1c3081 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 e330675619..631d0e3539 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 105536d350..0a6991bcc8 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.20.1