[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH v3 06/17] plat/xen/drivers/blk: Configure 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/xen/drivers/blk/blkfront.c | 51 ++++++++++++++++++++++++++++++ plat/xen/drivers/blk/blkfront.h | 2 ++ plat/xen/drivers/blk/blkfront_xb.h | 7 +++- plat/xen/drivers/blk/blkfront_xs.c | 47 +++++++++++++++++++++++++++ 4 files changed, 106 insertions(+), 1 deletion(-) diff --git a/plat/xen/drivers/blk/blkfront.c b/plat/xen/drivers/blk/blkfront.c index 09302f45..ae98a79c 100644 --- a/plat/xen/drivers/blk/blkfront.c +++ b/plat/xen/drivers/blk/blkfront.c @@ -55,6 +55,56 @@ static struct uk_alloc *drv_allocator; +static int blkfront_configure(struct uk_blkdev *blkdev, + const struct uk_blkdev_conf *conf) +{ + struct blkfront_dev *dev; + int err = 0; + + UK_ASSERT(blkdev != NULL); + UK_ASSERT(conf != NULL); + + dev = to_blkfront(blkdev); + dev->nb_queues = conf->nb_queues; + err = blkfront_xb_write_nb_queues(dev); + if (err) { + uk_pr_err("Failed to write nb of queues: %d.\n", err); + goto out; + } + + uk_pr_info(DRIVER_NAME": %"PRIu16" configured\n", dev->uid); +out: + return err; +} + +static int blkfront_unconfigure(struct uk_blkdev *blkdev) +{ + struct blkfront_dev *dev; + + UK_ASSERT(blkdev != NULL); + dev = to_blkfront(blkdev); + + return 0; +} + +static void blkfront_get_info(struct uk_blkdev *blkdev, + struct uk_blkdev_info *dev_info) +{ + struct blkfront_dev *dev = NULL; + + UK_ASSERT(blkdev); + UK_ASSERT(dev_info); + + dev = to_blkfront(blkdev); + dev_info->max_queues = dev->nb_queues; +} + +static const struct uk_blkdev_ops blkfront_ops = { + .get_info = blkfront_get_info, + .dev_configure = blkfront_configure, + .dev_unconfigure = blkfront_unconfigure, +}; + /** * Assign callbacks to uk_blkdev */ @@ -70,6 +120,7 @@ static int blkfront_add_dev(struct xenbus_device *dev) return -ENOMEM; d->xendev = dev; + d->blkdev.dev_ops = &blkfront_ops; /* Xenbus initialization */ rc = blkfront_xb_init(d); diff --git a/plat/xen/drivers/blk/blkfront.h b/plat/xen/drivers/blk/blkfront.h index f00ed41b..5833f826 100644 --- a/plat/xen/drivers/blk/blkfront.h +++ b/plat/xen/drivers/blk/blkfront.h @@ -53,6 +53,8 @@ struct blkfront_dev { struct uk_blkdev blkdev; /* Blkfront device number from Xenstore path. */ blkif_vdev_t handle; + /* Number of configured queues used for requests */ + uint16_t nb_queues; /* The blkdev identifier */ __u16 uid; }; diff --git a/plat/xen/drivers/blk/blkfront_xb.h b/plat/xen/drivers/blk/blkfront_xb.h index 7b62dbeb..668206a0 100644 --- a/plat/xen/drivers/blk/blkfront_xb.h +++ b/plat/xen/drivers/blk/blkfront_xb.h @@ -46,7 +46,7 @@ /* * Get initial info from the xenstore. - * Ex: backend path, handle. + * Ex: backend path, handle, max-queues. * * Return 0 on success, a negative errno value on error. */ @@ -57,4 +57,9 @@ int blkfront_xb_init(struct blkfront_dev *dev); */ void blkfront_xb_fini(struct blkfront_dev *dev); +/** + * Write nb of queues for further use to Xenstore. + * Return 0 on success, a negative errno value on error. + */ +int blkfront_xb_write_nb_queues(struct blkfront_dev *dev); #endif /* __BLKFRONT_XB_H__ */ diff --git a/plat/xen/drivers/blk/blkfront_xs.c b/plat/xen/drivers/blk/blkfront_xs.c index 366c069b..9f44246e 100644 --- a/plat/xen/drivers/blk/blkfront_xs.c +++ b/plat/xen/drivers/blk/blkfront_xs.c @@ -66,6 +66,25 @@ out: return err; } +static int blkfront_xb_get_nb_max_queues(struct blkfront_dev *dev) +{ + int err = 0; + struct xenbus_device *xendev; + + UK_ASSERT(dev != NULL); + xendev = dev->xendev; + + err = xs_scanf(XBT_NIL, xendev->otherend, "multi-queue-max-queues", + "%"PRIu16, + &dev->nb_queues); + if (err < 0) { + uk_pr_err("Failed to read multi-queue-max-queues: %d\n", err); + return err; + } + + return 0; +} + int blkfront_xb_init(struct blkfront_dev *dev) { struct xenbus_device *xendev; @@ -101,6 +120,11 @@ int blkfront_xb_init(struct blkfront_dev *dev) goto out; } + err = blkfront_xb_get_nb_max_queues(dev); + if (err) { + uk_pr_err("Failed to read multi-queue-max-queues: %d\n", err); + goto out; + } out: return err; } @@ -117,3 +141,26 @@ void blkfront_xb_fini(struct blkfront_dev *dev) xendev->otherend = NULL; } } + +int blkfront_xb_write_nb_queues(struct blkfront_dev *dev) +{ + int err; + struct xenbus_device *xendev; + + UK_ASSERT(dev); + + xendev = dev->xendev; + err = xs_printf(XBT_NIL, xendev->nodename, + "multi-queue-num-queues", + "%u", + dev->nb_queues); + if (err < 0) { + uk_pr_err("Failed to write multi-queue-num-queue: %d\n", err); + goto out; + } + + err = 0; + +out: + return err; +} -- 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 |