diff --git a/lib/bdev/virtio/rte_virtio/virtio_user.c b/lib/bdev/virtio/rte_virtio/virtio_user.c index 93f333ba8..ea810d8be 100644 --- a/lib/bdev/virtio/rte_virtio/virtio_user.c +++ b/lib/bdev/virtio/rte_virtio/virtio_user.c @@ -70,10 +70,10 @@ virtio_user_set_status(struct virtio_dev *vdev, uint8_t status) struct virtio_user_dev *dev = virtio_dev_get_user_dev(vdev); if (status & VIRTIO_CONFIG_S_DRIVER_OK) { - virtio_user_start_device(dev); + virtio_user_start_device(vdev); } else if (status == VIRTIO_CONFIG_S_RESET && (dev->status & VIRTIO_CONFIG_S_DRIVER_OK)) { - virtio_user_stop_device(dev); + virtio_user_stop_device(vdev); } dev->status = status; } diff --git a/lib/bdev/virtio/rte_virtio/virtio_user/virtio_user_dev.c b/lib/bdev/virtio/rte_virtio/virtio_user/virtio_user_dev.c index 826715269..42f7be3d0 100644 --- a/lib/bdev/virtio/rte_virtio/virtio_user/virtio_user_dev.c +++ b/lib/bdev/virtio/rte_virtio/virtio_user/virtio_user_dev.c @@ -40,9 +40,14 @@ #include "spdk/string.h" #include "spdk/util.h" +#define virtio_dev_get_user_dev(dev) \ + ((struct virtio_user_dev *)((uintptr_t)(dev) - offsetof(struct virtio_user_dev, vdev))) + static int -virtio_user_create_queue(struct virtio_user_dev *dev, uint32_t queue_sel) +virtio_user_create_queue(struct virtio_dev *vdev, uint32_t queue_sel) { + struct virtio_user_dev *dev = virtio_dev_get_user_dev(vdev); + /* Of all per virtqueue MSGs, make sure VHOST_SET_VRING_CALL come * firstly because vhost depends on this msg to allocate virtqueue * pair. @@ -57,8 +62,9 @@ virtio_user_create_queue(struct virtio_user_dev *dev, uint32_t queue_sel) } static int -virtio_user_kick_queue(struct virtio_user_dev *dev, uint32_t queue_sel) +virtio_user_kick_queue(struct virtio_dev *vdev, uint32_t queue_sel) { + struct virtio_user_dev *dev = virtio_dev_get_user_dev(vdev); struct vhost_vring_file file; struct vhost_vring_state state; struct vring *vring = &dev->vrings[queue_sel]; @@ -93,8 +99,9 @@ virtio_user_kick_queue(struct virtio_user_dev *dev, uint32_t queue_sel) } static int -virtio_user_stop_queue(struct virtio_user_dev *dev, uint32_t queue_sel) +virtio_user_stop_queue(struct virtio_dev *vdev, uint32_t queue_sel) { + struct virtio_user_dev *dev = virtio_dev_get_user_dev(vdev); struct vhost_vring_state state; state.index = queue_sel; @@ -105,13 +112,13 @@ virtio_user_stop_queue(struct virtio_user_dev *dev, uint32_t queue_sel) } static int -virtio_user_queue_setup(struct virtio_user_dev *dev, - int (*fn)(struct virtio_user_dev *, uint32_t)) +virtio_user_queue_setup(struct virtio_dev *vdev, + int (*fn)(struct virtio_dev *, uint32_t)) { uint32_t i; - for (i = 0; i < dev->vdev.max_queues; ++i) { - if (fn(dev, i) < 0) { + for (i = 0; i < vdev->max_queues; ++i) { + if (fn(vdev, i) < 0) { SPDK_ERRLOG("setup tx vq fails: %"PRIu32".\n", i); return -1; } @@ -121,12 +128,13 @@ virtio_user_queue_setup(struct virtio_user_dev *dev, } int -virtio_user_start_device(struct virtio_user_dev *dev) +virtio_user_start_device(struct virtio_dev *vdev) { + struct virtio_user_dev *dev = virtio_dev_get_user_dev(vdev); int ret; /* tell vhost to create queues */ - if (virtio_user_queue_setup(dev, virtio_user_create_queue) < 0) + if (virtio_user_queue_setup(vdev, virtio_user_create_queue) < 0) return -1; /* share memory regions */ @@ -135,20 +143,21 @@ virtio_user_start_device(struct virtio_user_dev *dev) return -1; /* kick queues */ - if (virtio_user_queue_setup(dev, virtio_user_kick_queue) < 0) + if (virtio_user_queue_setup(vdev, virtio_user_kick_queue) < 0) return -1; return 0; } -int virtio_user_stop_device(struct virtio_user_dev *dev) +int virtio_user_stop_device(struct virtio_dev *vdev) { - return virtio_user_queue_setup(dev, virtio_user_stop_queue); + return virtio_user_queue_setup(vdev, virtio_user_stop_queue); } static int -virtio_user_dev_setup(struct virtio_user_dev *dev) +virtio_user_dev_setup(struct virtio_dev *vdev) { + struct virtio_user_dev *dev = virtio_dev_get_user_dev(vdev); uint16_t i; dev->vhostfd = -1; @@ -205,7 +214,7 @@ virtio_user_dev_init(const char *name, const char *path, uint16_t requested_queu snprintf(dev->path, PATH_MAX, "%s", path); dev->queue_size = queue_size; - if (virtio_user_dev_setup(dev) < 0) { + if (virtio_user_dev_setup(vdev) < 0) { SPDK_ERRLOG("backend set up fails\n"); goto err; } diff --git a/lib/bdev/virtio/rte_virtio/virtio_user/virtio_user_dev.h b/lib/bdev/virtio/rte_virtio/virtio_user/virtio_user_dev.h index 3038508ce..32cd7a666 100644 --- a/lib/bdev/virtio/rte_virtio/virtio_user/virtio_user_dev.h +++ b/lib/bdev/virtio/rte_virtio/virtio_user/virtio_user_dev.h @@ -61,8 +61,8 @@ struct virtio_user_dev { struct virtio_user_backend_ops *ops; }; -int virtio_user_start_device(struct virtio_user_dev *dev); -int virtio_user_stop_device(struct virtio_user_dev *dev); +int virtio_user_start_device(struct virtio_dev *vdev); +int virtio_user_stop_device(struct virtio_dev *vdev); /** * Connect to a vhost-user device and create corresponding virtio_dev.