|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Minios-devel] [UNIKRAFT PATCH v3 09/17] plat/xen/drivers/blk: Enable/disable interrupts for queues
Reviewed-by: Costin Lupu <costin.lupu@xxxxxxxxx>
On 10/30/19 5:54 PM, Roxana Nicolescu wrote:
> This patch introduces support for the user to enable/disable interrupts
> on queues.
>
> Signed-off-by: Roxana Nicolescu <nicolescu.roxana1996@xxxxxxxxx>
> ---
> plat/xen/drivers/blk/blkfront.c | 66 +++++++++++++++++++++++++++++++++
> plat/xen/drivers/blk/blkfront.h | 2 +
> 2 files changed, 68 insertions(+)
>
> diff --git a/plat/xen/drivers/blk/blkfront.c b/plat/xen/drivers/blk/blkfront.c
> index 62b14f4c..63b1e778 100644
> --- a/plat/xen/drivers/blk/blkfront.c
> +++ b/plat/xen/drivers/blk/blkfront.c
> @@ -41,6 +41,8 @@
> #include <uk/essentials.h>
> #include <uk/arch/limits.h>
> #include <uk/blkdev_driver.h>
> +#include <xen-x86/mm.h>
> +#include <xen-x86/mm_pv.h>
> #include <xenbus/xenbus.h>
> #include "blkfront.h"
> #include "blkfront_xb.h"
> @@ -48,12 +50,34 @@
> #define DRIVER_NAME "xen-blkfront"
>
>
> +/* TODO Same interrupt macros we use in virtio-blk */
> +#define BLKFRONT_INTR_EN (1 << 0)
> +#define BLKFRONT_INTR_EN_MASK (1)
> +#define BLKFRONT_INTR_USR_EN (1 << 1)
> +#define BLKFRONT_INTR_USR_EN_MASK (2)
> +
> /* Get blkfront_dev* which contains blkdev */
> #define to_blkfront(blkdev) \
> __containerof(blkdev, struct blkfront_dev, blkdev)
>
> static struct uk_alloc *drv_allocator;
>
> +
> +/* Returns 1 if more responses available */
> +static int blkfront_xen_ring_intr_enable(struct uk_blkdev_queue *queue)
> +{
> + int more;
> +
> + /* Check if there are no more responses enabled */
> + RING_FINAL_CHECK_FOR_RESPONSES(&queue->ring, more);
> + if (!more) {
> + /* No more responses, we can enable interrupts */
> + queue->intr_enabled |= BLKFRONT_INTR_EN;
> + unmask_evtchn(queue->evtchn);
> + }
> +
> + return (more > 0);
> +}
> static int blkfront_ring_init(struct uk_blkdev_queue *queue)
> {
> struct blkif_sring *sring = NULL;
> @@ -98,6 +122,10 @@ static void blkfront_handler(evtchn_port_t port __unused,
> UK_ASSERT(arg);
> queue = (struct uk_blkdev_queue *)arg;
>
> + /* Disable the interrupt for the ring */
> + queue->intr_enabled &= ~(BLKFRONT_INTR_EN);
> + mask_evtchn(queue->evtchn);
> +
> uk_blkdev_drv_queue_event(&queue->dev->blkdev, queue->queue_id);
> }
>
> @@ -122,6 +150,7 @@ static struct uk_blkdev_queue
> *blkfront_queue_setup(struct uk_blkdev *blkdev,
> queue->a = queue_conf->a;
> queue->queue_id = queue_id;
> queue->dev = dev;
> + queue->intr_enabled = 0;
> err = blkfront_ring_init(queue);
> if (err) {
> uk_pr_err("Failed to init ring: %d.\n", err);
> @@ -154,6 +183,41 @@ static int blkfront_queue_release(struct uk_blkdev
> *blkdev,
> unbind_evtchn(queue->evtchn);
> blkfront_ring_fini(queue);
>
> +
> +static int blkfront_queue_intr_enable(struct uk_blkdev *blkdev,
> + struct uk_blkdev_queue *queue)
> +{
> + int rc = 0;
> +
> + UK_ASSERT(blkdev != NULL);
> + UK_ASSERT(queue != NULL);
> +
> + /* If the interrupt is enabled */
> + if (queue->intr_enabled & BLKFRONT_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 = BLKFRONT_INTR_USR_EN;
> + rc = blkfront_xen_ring_intr_enable(queue);
> + if (!rc)
> + queue->intr_enabled |= BLKFRONT_INTR_EN;
> +
> + return rc;
> +}
> +
> +static int blkfront_queue_intr_disable(struct uk_blkdev *blkdev,
> + struct uk_blkdev_queue *queue)
> +{
> + UK_ASSERT(blkdev);
> + UK_ASSERT(queue);
> +
> + queue->intr_enabled &= ~(BLKFRONT_INTR_USR_EN | BLKFRONT_INTR_EN);
> + mask_evtchn(queue->evtchn);
> +
> return 0;
> }
>
> @@ -239,6 +303,8 @@ static const struct uk_blkdev_ops blkfront_ops = {
> .queue_setup = blkfront_queue_setup,
> .queue_release = blkfront_queue_release,
> .dev_unconfigure = blkfront_unconfigure,
> + .queue_intr_enable = blkfront_queue_intr_enable,
> + .queue_intr_disable = blkfront_queue_intr_disable,
> };
>
> /**
> diff --git a/plat/xen/drivers/blk/blkfront.h b/plat/xen/drivers/blk/blkfront.h
> index a8b0ca85..037c627a 100644
> --- a/plat/xen/drivers/blk/blkfront.h
> +++ b/plat/xen/drivers/blk/blkfront.h
> @@ -60,6 +60,8 @@ struct uk_blkdev_queue {
> struct uk_alloc *a;
> /* The libukblkdev queue identifier */
> uint16_t queue_id;
> + /* The flag to interrupt on the queue */
> + int intr_enabled;
> /* Reference to the Blkfront Device */
> struct blkfront_dev *dev;
> };
>
_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |