lkml.org 
[lkml]   [2021]   [Feb]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v12 10/13] vfio/pci: Register and allow DMA FAULT IRQ signaling
    Date
    Register the VFIO_IRQ_TYPE_NESTED/VFIO_IRQ_SUBTYPE_DMA_FAULT
    IRQ that allows to signal a nested mode DMA fault.

    Signed-off-by: Eric Auger <eric.auger@redhat.com>

    ---

    v10 -> v11:
    - the irq now is registered in vfio_pci_dma_fault_init()
    in case the domain is nested
    ---
    drivers/vfio/pci/vfio_pci.c | 21 ++++++++++++++++++++-
    1 file changed, 20 insertions(+), 1 deletion(-)

    diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c
    index e6b94bad77da..f3fa6d4318ae 100644
    --- a/drivers/vfio/pci/vfio_pci.c
    +++ b/drivers/vfio/pci/vfio_pci.c
    @@ -396,6 +396,7 @@ vfio_pci_iommu_dev_fault_handler(struct iommu_fault *fault, void *data)
    (struct vfio_region_dma_fault *)vdev->fault_pages;
    struct iommu_fault *new;
    u32 head, tail, size;
    + int ext_irq_index;
    int ret = -EINVAL;

    if (WARN_ON(!reg))
    @@ -420,7 +421,19 @@ vfio_pci_iommu_dev_fault_handler(struct iommu_fault *fault, void *data)
    ret = 0;
    unlock:
    mutex_unlock(&vdev->fault_queue_lock);
    - return ret;
    + if (ret)
    + return ret;
    +
    + ext_irq_index = vfio_pci_get_ext_irq_index(vdev, VFIO_IRQ_TYPE_NESTED,
    + VFIO_IRQ_SUBTYPE_DMA_FAULT);
    + if (ext_irq_index < 0)
    + return -EINVAL;
    +
    + mutex_lock(&vdev->igate);
    + if (vdev->ext_irqs[ext_irq_index].trigger)
    + eventfd_signal(vdev->ext_irqs[ext_irq_index].trigger, 1);
    + mutex_unlock(&vdev->igate);
    + return 0;
    }

    #define DMA_FAULT_RING_LENGTH 512
    @@ -475,6 +488,12 @@ static int vfio_pci_dma_fault_init(struct vfio_pci_device *vdev)
    if (ret) /* the dma fault region is freed in vfio_pci_disable() */
    goto out;

    + ret = vfio_pci_register_irq(vdev, VFIO_IRQ_TYPE_NESTED,
    + VFIO_IRQ_SUBTYPE_DMA_FAULT,
    + VFIO_IRQ_INFO_EVENTFD);
    + if (ret) /* the fault handler is also freed in vfio_pci_disable() */
    + goto out;
    +
    return 0;
    out:
    kfree(vdev->fault_pages);
    --
    2.26.2
    \
     
     \ /
      Last update: 2021-02-23 22:17    [W:7.076 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site