From 7784e977bc85ded8dff2ca9a76d8f0b1eb984a3f Mon Sep 17 00:00:00 2001 From: Maxime Coquelin Date: Tue, 29 Sep 2020 18:14:02 +0200 Subject: [PATCH] net/virtio: adapt virtio-user status size Set proper payload size for set/get status message. The payload size varies according to backend types. Signed-off-by: Maxime Coquelin Signed-off-by: Patrick Fu Reviewed-by: Chenbo Xia --- .../net/virtio/virtio_user/virtio_user_dev.c | 34 +++++++++++++------ 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c b/drivers/net/virtio/virtio_user/virtio_user_dev.c index d7cd6b0346..ded44bf32b 100644 --- a/drivers/net/virtio/virtio_user/virtio_user_dev.c +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c @@ -784,11 +784,15 @@ virtio_user_send_status_update(struct virtio_user_dev *dev, uint8_t status) int ret; uint64_t arg = status; - /* Vhost-user only for now */ - if (dev->backend_type != VIRTIO_USER_BACKEND_VHOST_USER) + if (dev->backend_type == VIRTIO_USER_BACKEND_VHOST_USER) + ret = dev->ops->send_request(dev, + VHOST_USER_SET_STATUS, &arg); + else if (dev->backend_type == VIRTIO_USER_BACKEND_VHOST_VDPA) + ret = dev->ops->send_request(dev, + VHOST_USER_SET_STATUS, &status); + else return 0; - ret = dev->ops->send_request(dev, VHOST_USER_SET_STATUS, &arg); if (ret) { PMD_INIT_LOG(ERR, "VHOST_USER_SET_STATUS failed (%d): %s", ret, strerror(errno)); @@ -802,24 +806,32 @@ int virtio_user_update_status(struct virtio_user_dev *dev) { uint64_t ret; + uint8_t status; int err; - /* Vhost-user only for now */ - if (dev->backend_type != VIRTIO_USER_BACKEND_VHOST_USER) + if (dev->backend_type == VIRTIO_USER_BACKEND_VHOST_USER) { + err = dev->ops->send_request(dev, VHOST_USER_GET_STATUS, &ret); + if (!err && ret > UINT8_MAX) { + PMD_INIT_LOG(ERR, "Invalid VHOST_USER_GET_STATUS " + "response 0x%" PRIx64 "\n", ret); + return -1; + } + + status = ret; + } else if (dev->backend_type == VIRTIO_USER_BACKEND_VHOST_VDPA) { + err = dev->ops->send_request(dev, VHOST_USER_GET_STATUS, + &status); + } else { return 0; + } - err = dev->ops->send_request(dev, VHOST_USER_GET_STATUS, &ret); if (err) { PMD_INIT_LOG(ERR, "VHOST_USER_GET_STATUS failed (%d): %s", err, strerror(errno)); return -1; } - if (ret > UINT8_MAX) { - PMD_INIT_LOG(ERR, "Invalid VHOST_USER_GET_STATUS response 0x%" PRIx64 "\n", ret); - return -1; - } - dev->status = ret; + dev->status = status; PMD_INIT_LOG(DEBUG, "Updated Device Status(0x%08x):\n" "\t-RESET: %u\n" "\t-ACKNOWLEDGE: %u\n" -- 2.20.1