[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH v3 06/14] plat/drivers: Configure virtio block device
This patch introduces the configuration of block device consisting of: -> finding multi-queue-max-queue number provided by Backend; -> setting the number of queues to be used (between 1 and max) Signed-off-by: Roxana Nicolescu <nicolescu.roxana1996@xxxxxxxxx> --- plat/drivers/include/virtio/virtio_blk.h | 5 ++ plat/drivers/virtio/virtio_blk.c | 67 +++++++++++++++++++++++- 2 files changed, 71 insertions(+), 1 deletion(-) diff --git a/plat/drivers/include/virtio/virtio_blk.h b/plat/drivers/include/virtio/virtio_blk.h index 48625258..0efb5ba9 100644 --- a/plat/drivers/include/virtio/virtio_blk.h +++ b/plat/drivers/include/virtio/virtio_blk.h @@ -41,12 +41,17 @@ /* Feature bits */ #define VIRTIO_BLK_F_RO 5 /* Disk is read-only */ #define VIRTIO_BLK_F_BLK_SIZE 6 /* Block size of disk is available*/ +#define VIRTIO_BLK_F_MQ 12 /* support more than one vq */ struct virtio_blk_config { /* The capacity (in 512-byte sectors). */ __u64 capacity; + /* block size of device (if VIRTIO_BLK_F_BLK_SIZE) */ __u32 blk_size; + + /* number of vqs, only available when VIRTIO_BLK_F_MQ is set */ + __u16 num_queues; } __packed; #endif /* __PLAT_DRV_VIRTIO_BLK_H */ diff --git a/plat/drivers/virtio/virtio_blk.c b/plat/drivers/virtio/virtio_blk.c index 2dfe8f27..b7a31121 100644 --- a/plat/drivers/virtio/virtio_blk.c +++ b/plat/drivers/virtio/virtio_blk.c @@ -40,10 +40,11 @@ /* Features are: * Access Mode * Sector_size; + * Multi-queue, **/ #define VIRTIO_BLK_DRV_FEATURES(features) \ (VIRTIO_FEATURES_UPDATE(features, VIRTIO_BLK_F_RO | \ - VIRTIO_BLK_F_BLK_SIZE)) + VIRTIO_BLK_F_BLK_SIZE | VIRTIO_BLK_F_MQ)) static struct uk_alloc *a; static const char *drv_name = DRIVER_NAME; @@ -55,8 +56,45 @@ struct virtio_blk_device { __u16 uid; /* Virtio Device */ struct virtio_dev *vdev; + /* Nb of max_queues supported by device */ + __u16 max_vqueue_pairs; }; + +static int virtio_blkdev_configure(struct uk_blkdev *dev, + const struct uk_blkdev_conf *conf) +{ + int rc = 0; + struct virtio_blk_device *vbdev = NULL; + + UK_ASSERT(dev != NULL); + UK_ASSERT(conf != NULL); + + vbdev = to_virtioblkdev(dev); + + uk_pr_info(DRIVER_NAME": %"__PRIu16" configured\n", vbdev->uid); + return rc; +} + +static int virtio_blkdev_unconfigure(struct uk_blkdev *dev) +{ + UK_ASSERT(dev != NULL); + + return 0; +} + +static void virtio_blkdev_get_info(struct uk_blkdev *dev, + struct uk_blkdev_info *dev_info) +{ + struct virtio_blk_device *vbdev = NULL; + + UK_ASSERT(dev != NULL); + UK_ASSERT(dev_info != NULL); + + vbdev = to_virtioblkdev(dev); + dev_info->max_queues = vbdev->max_vqueue_pairs; +} + static int virtio_blkdev_feature_negotiate(struct virtio_blk_device *vbdev) { struct uk_blkdev_cap *cap; @@ -64,6 +102,7 @@ static int virtio_blkdev_feature_negotiate(struct virtio_blk_device *vbdev) int bytes_to_read; __sector sectors; __sector ssize; + __u16 num_queues; int rc = 0; UK_ASSERT(vbdev); @@ -98,12 +137,31 @@ static int virtio_blkdev_feature_negotiate(struct virtio_blk_device *vbdev) } } + /* If the device does not support multi-queues, + * we will use only one queue. + */ + if (virtio_has_features(host_features, VIRTIO_BLK_F_MQ)) { + bytes_to_read = virtio_config_get(vbdev->vdev, + __offsetof(struct virtio_blk_config, + num_queues), + &num_queues, + sizeof(num_queues), + 1); + if (bytes_to_read != sizeof(num_queues)) { + uk_pr_err("Failed to read max-queues\n"); + rc = -EAGAIN; + goto exit; + } + } else + num_queues = 1; cap->ssize = ssize; cap->sectors = sectors; cap->ioalign = sizeof(void *); cap->mode = (virtio_has_features( host_features, VIRTIO_BLK_F_RO)) ? O_RDONLY : O_RDWR; + vbdev->max_vqueue_pairs = num_queues; + /** * Mask out features supported by both driver and device. */ @@ -122,6 +180,12 @@ static inline void virtio_blkdev_feature_set(struct virtio_blk_device *vbdev) VIRTIO_BLK_DRV_FEATURES(vbdev->vdev->features); } +static const struct uk_blkdev_ops virtio_blkdev_ops = { + .get_info = virtio_blkdev_get_info, + .dev_configure = virtio_blkdev_configure, + .dev_unconfigure = virtio_blkdev_unconfigure, +}; + static int virtio_blk_add_dev(struct virtio_dev *vdev) { struct virtio_blk_device *vbdev; @@ -134,6 +198,7 @@ static int virtio_blk_add_dev(struct virtio_dev *vdev) return -ENOMEM; vbdev->vdev = vdev; + vbdev->blkdev.dev_ops = &virtio_blkdev_ops; rc = uk_blkdev_drv_register(&vbdev->blkdev, a, drv_name); if (rc < 0) { -- 2.17.1 _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |