[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH v3 09/14] plat/drivers: Enable/disable interrupts on virtio block queues
This patch introduces support for the user to enable/disable interrupts on queues. Signed-off-by: Roxana Nicolescu <nicolescu.roxana1996@xxxxxxxxx> --- plat/drivers/virtio/virtio_blk.c | 49 ++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/plat/drivers/virtio/virtio_blk.c b/plat/drivers/virtio/virtio_blk.c index 46d3236f..cb732135 100644 --- a/plat/drivers/virtio/virtio_blk.c +++ b/plat/drivers/virtio/virtio_blk.c @@ -35,6 +35,11 @@ #define DRIVER_NAME "virtio-blk" #define DEFAULT_SECTOR_SIZE 512 +#define VTBLK_INTR_EN (1 << 0) +#define VTBLK_INTR_EN_MASK (1) +#define VTBLK_INTR_USR_EN (1 << 1) +#define VTBLK_INTR_USR_EN_MASK (2) + #define to_virtioblkdev(bdev) \ __containerof(bdev, struct virtio_blk_device, blkdev) @@ -86,6 +91,8 @@ struct uk_blkdev_queue { uint16_t max_nb_desc; /* The nr. of descriptor user configured */ uint16_t nb_desc; + /* The flag to interrupt on the queue */ + uint8_t intr_enabled; /* Reference to virtio_blk_device */ struct virtio_blk_device *vbd; /* The scatter list and its associated fragments */ @@ -102,11 +109,51 @@ static int virtio_blkdev_recv_done(struct virtqueue *vq, void *priv) queue = (struct uk_blkdev_queue *) priv; + /* Disable the interrupt for the ring */ + virtqueue_intr_disable(vq); + queue->intr_enabled &= ~(VTBLK_INTR_EN); + uk_blkdev_drv_queue_event(&queue->vbd->blkdev, queue->lqueue_id); return 1; } +static int virtio_blkdev_queue_intr_enable(struct uk_blkdev *dev, + struct uk_blkdev_queue *queue) +{ + int rc = 0; + + UK_ASSERT(dev); + + /* If the interrupt is enabled */ + if (queue->intr_enabled & VTBLK_INTR_EN) + return 0; + + /** + * Enable the user configuration bit. This would cause the interrupt to + * be enabled automatically, if the interrupt could not be enabled now + * due to data in the queue. + */ + queue->intr_enabled = VTBLK_INTR_USR_EN; + rc = virtqueue_intr_enable(queue->vq); + if (!rc) + queue->intr_enabled |= VTBLK_INTR_EN; + + return rc; +} + +static int virtio_blkdev_queue_intr_disable(struct uk_blkdev *dev, + struct uk_blkdev_queue *queue) +{ + UK_ASSERT(dev); + UK_ASSERT(queue); + + virtqueue_intr_disable(queue->vq); + queue->intr_enabled &= ~(VTBLK_INTR_USR_EN | VTBLK_INTR_EN); + + return 0; +} + /** * This function setup the vring infrastructure. */ @@ -459,6 +506,8 @@ static const struct uk_blkdev_ops virtio_blkdev_ops = { .dev_configure = virtio_blkdev_configure, .queue_get_info = virtio_blkdev_queue_info_get, .queue_setup = virtio_blkdev_queue_setup, + .queue_intr_enable = virtio_blkdev_queue_intr_enable, + .queue_intr_disable = virtio_blkdev_queue_intr_disable, .queue_release = virtio_blkdev_queue_release, .dev_unconfigure = virtio_blkdev_unconfigure, }; -- 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 |