lkml.org 
[lkml]   [2023]   [Mar]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH V2 6/8] vfio/pci: Move to single error path
    Date
    Enabling and disabling of an interrupt involves several steps
    that can fail. Cleanup after failure is done when the error
    is encountered, resulting in some repetitive code.

    Support for dynamic MSI-X will introduce more steps during
    interrupt enabling and disabling.

    Transition to centralized exit path in preparation for dynamic
    MSI-X to eliminate duplicate error handling code. Ensure
    no remaining state refers to freed memory.

    Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
    ---
    Changes since RFC V1:
    - Improve changelog.

    drivers/vfio/pci/vfio_pci_intrs.c | 18 +++++++++++-------
    1 file changed, 11 insertions(+), 7 deletions(-)

    diff --git a/drivers/vfio/pci/vfio_pci_intrs.c b/drivers/vfio/pci/vfio_pci_intrs.c
    index b86dce0f384f..b3a258e58625 100644
    --- a/drivers/vfio/pci/vfio_pci_intrs.c
    +++ b/drivers/vfio/pci/vfio_pci_intrs.c
    @@ -439,8 +439,8 @@ static int vfio_msi_set_vector_signal(struct vfio_pci_core_device *vdev,

    trigger = eventfd_ctx_fdget(fd);
    if (IS_ERR(trigger)) {
    - kfree(ctx->name);
    - return PTR_ERR(trigger);
    + ret = PTR_ERR(trigger);
    + goto out_free_name;
    }

    /*
    @@ -460,11 +460,8 @@ static int vfio_msi_set_vector_signal(struct vfio_pci_core_device *vdev,

    ret = request_irq(irq, vfio_msihandler, 0, ctx->name, trigger);
    vfio_pci_memory_unlock_and_restore(vdev, cmd);
    - if (ret) {
    - kfree(ctx->name);
    - eventfd_ctx_put(trigger);
    - return ret;
    - }
    + if (ret)
    + goto out_put_eventfd_ctx;

    ctx->producer.token = trigger;
    ctx->producer.irq = irq;
    @@ -479,6 +476,13 @@ static int vfio_msi_set_vector_signal(struct vfio_pci_core_device *vdev,
    ctx->trigger = trigger;

    return 0;
    +
    +out_put_eventfd_ctx:
    + eventfd_ctx_put(trigger);
    +out_free_name:
    + kfree(ctx->name);
    + ctx->name = NULL;
    + return ret;
    }

    static int vfio_msi_set_block(struct vfio_pci_core_device *vdev, unsigned start,
    --
    2.34.1
    \
     
     \ /
      Last update: 2023-03-28 23:56    [W:4.748 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site