|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH v2 05/12] plat/drivers: Create virtio-block queues
This patch allocates the queues used for communication with the device.
One queue is responsible for handling both requests and responses
to/from device.
Signed-off-by: Roxana Nicolescu <nicolescu.roxana1996@xxxxxxxxx>
---
plat/drivers/virtio/virtio_blk.c | 74 ++++++++++++++++++++++++++++++++
1 file changed, 74 insertions(+)
diff --git a/plat/drivers/virtio/virtio_blk.c b/plat/drivers/virtio/virtio_blk.c
index 0fbd89cf..4346104f 100644
--- a/plat/drivers/virtio/virtio_blk.c
+++ b/plat/drivers/virtio/virtio_blk.c
@@ -56,10 +56,74 @@ struct virtio_blk_device {
__u16 uid;
/* Virtio Device */
struct virtio_dev *vdev;
+ /* List of all the virtqueue in the pci device */
+ struct virtqueue *vq;
/* Nb of max_queues supported by device */
__u16 max_vqueue_pairs;
+ /* This is used when the user has decided the nb_queues to use */
+ __u16 nb_queues;
+ /* List of queues */
+ struct uk_blkdev_queue *qs;
};
+struct uk_blkdev_queue {
+ /* The virtqueue reference */
+ struct virtqueue *vq;
+ /* The libukblkdev queue identifier */
+ /* It is also the virtqueue identifier */
+ uint16_t lqueue_id;
+ /* Allocator */
+ struct uk_alloc *a;
+ /* The nr. of descriptor limit */
+ uint16_t max_nb_desc;
+ /* Reference to virtio_blk_device */
+ struct virtio_blk_device *vbd;
+};
+
+
+static int virtio_blkdev_queues_alloc(struct virtio_blk_device *vbdev,
+ const struct uk_blkdev_conf *conf)
+{
+ int rc = 0;
+ uint16_t i = 0;
+ int vq_avail = 0;
+ __u16 qdesc_size[conf->nb_queues];
+
+ if (conf->nb_queues > vbdev->max_vqueue_pairs) {
+ uk_pr_err("Queue number not supported: %"__PRIu16"\n",
+ conf->nb_queues);
+ return -ENOTSUP;
+ }
+
+ vbdev->nb_queues = conf->nb_queues;
+ vq_avail = virtio_find_vqs(vbdev->vdev, conf->nb_queues, qdesc_size);
+ if (unlikely(vq_avail != conf->nb_queues)) {
+ uk_pr_err("Expected: %d queues, Found: %d queues\n",
+ conf->nb_queues, vq_avail);
+ rc = -ENOMEM;
+ goto exit;
+ }
+
+ /**
+ * TODO:
+ * The virtio device management data structure are allocated using the
+ * allocator from the blkdev configuration. In the future it might be
+ * wiser to move it to the allocator of each individual queue. This
+ * would better considering NUMA support.
+ */
+ vbdev->qs = uk_calloc(a, conf->nb_queues, sizeof(*vbdev->qs));
+ if (unlikely(vbdev->qs == NULL)) {
+ uk_pr_err("Failed to allocate memory for queue management\n");
+ rc = -ENOMEM;
+ goto exit;
+ }
+
+ for (i = 0; i < conf->nb_queues; ++i)
+ vbdev->qs[i].max_nb_desc = qdesc_size[i];
+
+exit:
+ return rc;
+}
static int virtio_blkdev_configure(struct uk_blkdev *dev,
const struct uk_blkdev_conf *conf)
@@ -71,14 +135,24 @@ static int virtio_blkdev_configure(struct uk_blkdev *dev,
UK_ASSERT(conf != NULL);
vbdev = to_virtioblkdev(dev);
+ rc = virtio_blkdev_queues_alloc(vbdev, conf);
+ if (rc) {
+ uk_pr_err("Failed to allocate the queues %d\n", rc);
+ goto exit;
+ }
uk_pr_info(DRIVER_NAME": %"__PRIu16" configured\n", vbdev->uid);
+exit:
return rc;
}
static int virtio_blkdev_unconfigure(struct uk_blkdev *dev)
{
+ struct virtio_blk_device *d;
+
UK_ASSERT(dev != NULL);
+ d = to_virtioblkdev(dev);
+ uk_free(a, d->qs);
return 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 |