|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Minios-devel] [UNIKRAFT PATCH v3 06/17] plat/xen/drivers/blk: Configure block device
Reviewed-by: Costin Lupu <costin.lupu@xxxxxxxxx>
On 10/30/19 5:54 PM, Roxana Nicolescu wrote:
> 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;
> +}
>
_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |