|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH 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 | 34 +++++++++++++++++++++++++++
plat/xen/drivers/blk/blkfront.h | 2 ++
plat/xen/drivers/blk/blkfront_xb.h | 8 ++++++-
plat/xen/drivers/blk/blkfront_xs.c | 47 ++++++++++++++++++++++++++++++++++++++
4 files changed, 90 insertions(+), 1 deletion(-)
diff --git a/plat/xen/drivers/blk/blkfront.c b/plat/xen/drivers/blk/blkfront.c
index 6233ac6b..1a57d2f7 100644
--- a/plat/xen/drivers/blk/blkfront.c
+++ b/plat/xen/drivers/blk/blkfront.c
@@ -55,6 +55,26 @@
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);
+ 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 void blkfront_close(struct uk_blkdev *blkdev)
{
struct blkfront_dev *dev;
@@ -70,7 +90,21 @@ static void blkfront_close(struct uk_blkdev *blkdev)
uk_pr_info(DRIVER_NAME": %"PRIu16" closed\n", uid);
}
+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_close = blkfront_close,
};
diff --git a/plat/xen/drivers/blk/blkfront.h b/plat/xen/drivers/blk/blkfront.h
index a4550910..1368dd2e 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;
/* A specific number to the blkfront device. */
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 80e4a04b..a846fda7 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.
*/
@@ -58,4 +58,10 @@ 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 652584dc..13c25969 100644
--- a/plat/xen/drivers/blk/blkfront_xs.c
+++ b/plat/xen/drivers/blk/blkfront_xs.c
@@ -65,6 +65,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,
+ (unsigned int *)&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;
@@ -100,6 +119,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;
}
@@ -116,3 +140,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.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 |