[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH 04/12] 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 | 7 ++++ plat/drivers/virtio/virtio_blk.c | 55 +++++++++++++++++++++++++++++++- 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/plat/drivers/include/virtio/virtio_blk.h b/plat/drivers/include/virtio/virtio_blk.h index b4b566e2..822c440d 100644 --- a/plat/drivers/include/virtio/virtio_blk.h +++ b/plat/drivers/include/virtio/virtio_blk.h @@ -28,12 +28,19 @@ #define VIRTIO_BLK_F_RO 5 /* Block size of disk is in blk_size. */ #define VIRTIO_BLK_F_BLK_SIZE 6 +/* Device supports multi-queues */ +#define VIRTIO_BLK_F_MQ 12 + struct virtio_blk_config { /* Dimension in sectors number */ __u64 capacity; /* Block size */ __u32 blk_size; + /* Number of vqs, only available when VIRTIO_BLK_F_MQ is set */ + __u16 num_queues; +}; + }; #endif /* __PLAT_DRV_VIRTIO_BLK_H */ diff --git a/plat/drivers/virtio/virtio_blk.c b/plat/drivers/virtio/virtio_blk.c index b01b39bd..bda37866 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,10 +56,28 @@ 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 void virtio_blkdev_close(struct uk_blkdev *dev) { struct virtio_blk_device *d; @@ -73,6 +92,17 @@ static void virtio_blkdev_close(struct uk_blkdev *dev) uk_pr_info(DRIVER_NAME": %"__PRIu16" closed\n", uid); } +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) { @@ -82,6 +112,7 @@ static int virtio_blkdev_feature_negotiate(struct virtio_blk_device *vbdev) int bytes_to_read; __sector sectors; __sector ssize; + __u16 num_queues; UK_ASSERT(vbdev); cap = &vbdev->blkdev.capabilities; @@ -115,12 +146,32 @@ static int virtio_blkdev_feature_negotiate(struct virtio_blk_device *vbdev) } } + /* If 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->align = 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. */ @@ -140,6 +191,8 @@ static inline void virtio_blkdev_feature_set(struct virtio_blk_device *vbdev) } static const struct uk_blkdev_ops virtio_blkdev_ops = { + .get_info = virtio_blkdev_get_info, + .dev_configure = virtio_blkdev_configure, .dev_close = virtio_blkdev_close, }; -- 2.11.0 _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |