lkml.org 
[lkml]   [2023]   [Oct]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC PATCH V2 16/18] vfio/pci: Support emulated interrupts in IMS backend
    Date
    An emulated interrupt has an associated eventfd but is
    not backed by a hardware interrupt.

    Add support for emulated interrupts to the IMS backend
    that generally involves avoiding the actions involving
    hardware configuration.

    Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
    ---
    drivers/vfio/pci/vfio_pci_intrs.c | 27 +++++++++++++++++++--------
    1 file changed, 19 insertions(+), 8 deletions(-)

    diff --git a/drivers/vfio/pci/vfio_pci_intrs.c b/drivers/vfio/pci/vfio_pci_intrs.c
    index c6b213d52beb..f96d7481094a 100644
    --- a/drivers/vfio/pci/vfio_pci_intrs.c
    +++ b/drivers/vfio/pci/vfio_pci_intrs.c
    @@ -863,8 +863,8 @@ EXPORT_SYMBOL_GPL(vfio_pci_release_intr_ctx);
    /*
    * Free the IMS interrupt associated with @ctx.
    *
    - * For an IMS interrupt the interrupt is freed from the underlying
    - * PCI device's IMS domain.
    + * For an emulated interrupt there is nothing to do. For an IMS interrupt
    + * the interrupt is freed from the underlying PCI device's IMS domain.
    */
    static void vfio_pci_ims_irq_free(struct vfio_pci_intr_ctx *intr_ctx,
    struct vfio_pci_irq_ctx *ctx)
    @@ -872,6 +872,9 @@ static void vfio_pci_ims_irq_free(struct vfio_pci_intr_ctx *intr_ctx,
    struct vfio_pci_ims *ims = intr_ctx->priv;
    struct msi_map irq_map = {};

    + if (ctx->emulated)
    + return;
    +
    irq_map.index = ctx->ims_id;
    irq_map.virq = ctx->virq;
    pci_ims_free_irq(ims->pdev, irq_map);
    @@ -882,8 +885,8 @@ static void vfio_pci_ims_irq_free(struct vfio_pci_intr_ctx *intr_ctx,
    /*
    * Allocate a host IMS interrupt for @ctx.
    *
    - * For an IMS interrupt the interrupt is allocated from the underlying
    - * PCI device's IMS domain.
    + * For an emulated interrupt there is nothing to do. For an IMS interrupt
    + * the interrupt is allocated from the underlying PCI device's IMS domain.
    */
    static int vfio_pci_ims_irq_alloc(struct vfio_pci_intr_ctx *intr_ctx,
    struct vfio_pci_irq_ctx *ctx)
    @@ -891,6 +894,9 @@ static int vfio_pci_ims_irq_alloc(struct vfio_pci_intr_ctx *intr_ctx,
    struct vfio_pci_ims *ims = intr_ctx->priv;
    struct msi_map irq_map = {};

    + if (ctx->emulated)
    + return -EINVAL;
    +
    irq_map = pci_ims_alloc_irq(ims->pdev, &ctx->icookie, NULL);
    if (irq_map.index < 0)
    return irq_map.index;
    @@ -913,9 +919,11 @@ static int vfio_pci_ims_set_vector_signal(struct vfio_pci_intr_ctx *intr_ctx,
    ctx = vfio_irq_ctx_get(intr_ctx, vector);

    if (ctx && ctx->trigger) {
    - irq_bypass_unregister_producer(&ctx->producer);
    - free_irq(ctx->virq, ctx->trigger);
    - vfio_pci_ims_irq_free(intr_ctx, ctx);
    + if (!ctx->emulated) {
    + irq_bypass_unregister_producer(&ctx->producer);
    + free_irq(ctx->virq, ctx->trigger);
    + vfio_pci_ims_irq_free(intr_ctx, ctx);
    + }
    kfree(ctx->name);
    ctx->name = NULL;
    eventfd_ctx_put(ctx->trigger);
    @@ -945,6 +953,9 @@ static int vfio_pci_ims_set_vector_signal(struct vfio_pci_intr_ctx *intr_ctx,

    ctx->trigger = trigger;

    + if (ctx->emulated)
    + return 0;
    +
    ret = vfio_pci_ims_irq_alloc(intr_ctx, ctx);
    if (ret < 0)
    goto out_put_eventfd_ctx;
    @@ -1078,7 +1089,7 @@ int vfio_pci_ims_init_intr_ctx(struct vfio_device *vdev,

    intr_ctx->ops = &vfio_pci_ims_intr_ops;
    intr_ctx->priv = ims;
    - intr_ctx->supports_emulated = false;
    + intr_ctx->supports_emulated = true;
    intr_ctx->ims_backed_irq = true;

    return 0;
    --
    2.34.1
    \
     
     \ /
      Last update: 2023-10-06 18:43    [W:4.485 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site