Pull code out to a function for re-use.

Signed-off-by: Alex Williamson <alex.william...@redhat.com>
---
 drivers/vfio/vfio_iommu_type1.c |   57 +++++++++++++++++++++++----------------
 1 file changed, 34 insertions(+), 23 deletions(-)

diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c
index 12d9905b429f..f7d35a114354 100644
--- a/drivers/vfio/vfio_iommu_type1.c
+++ b/drivers/vfio/vfio_iommu_type1.c
@@ -542,6 +542,39 @@ static int follow_fault_pfn(struct vm_area_struct *vma, 
struct mm_struct *mm,
        return ret;
 }
 
+/* Return 1 if iommu->lock dropped and notified, 0 if done */
+static int unmap_dma_pfn_list(struct vfio_iommu *iommu, struct vfio_dma *dma,
+                             struct vfio_dma **dma_last, int *retries)
+{
+       if (!RB_EMPTY_ROOT(&dma->pfn_list)) {
+               struct vfio_iommu_type1_dma_unmap nb_unmap;
+
+               if (*dma_last == dma) {
+                       BUG_ON(++(*retries) > 10);
+               } else {
+                       *dma_last = dma;
+                       *retries = 0;
+               }
+
+               nb_unmap.iova = dma->iova;
+               nb_unmap.size = dma->size;
+
+               /*
+                * Notify anyone (mdev vendor drivers) to invalidate and
+                * unmap iovas within the range we're about to unmap.
+                * Vendor drivers MUST unpin pages in response to an
+                * invalidation.
+                */
+               mutex_unlock(&iommu->lock);
+               blocking_notifier_call_chain(&iommu->notifier,
+                                            VFIO_IOMMU_NOTIFY_DMA_UNMAP,
+                                            &nb_unmap);
+               return 1;
+       }
+
+       return 0;
+}
+
 /*
  * Returns the positive number of pfns successfully obtained or a negative
  * error code.
@@ -1397,29 +1430,7 @@ static int vfio_dma_do_unmap(struct vfio_iommu *iommu,
                        continue;
                }
 
-               if (!RB_EMPTY_ROOT(&dma->pfn_list)) {
-                       struct vfio_iommu_type1_dma_unmap nb_unmap;
-
-                       if (dma_last == dma) {
-                               BUG_ON(++retries > 10);
-                       } else {
-                               dma_last = dma;
-                               retries = 0;
-                       }
-
-                       nb_unmap.iova = dma->iova;
-                       nb_unmap.size = dma->size;
-
-                       /*
-                        * Notify anyone (mdev vendor drivers) to invalidate and
-                        * unmap iovas within the range we're about to unmap.
-                        * Vendor drivers MUST unpin pages in response to an
-                        * invalidation.
-                        */
-                       mutex_unlock(&iommu->lock);
-                       blocking_notifier_call_chain(&iommu->notifier,
-                                                   VFIO_IOMMU_NOTIFY_DMA_UNMAP,
-                                                   &nb_unmap);
+               if (unmap_dma_pfn_list(iommu, dma, &dma_last, &retries)) {
                        mutex_lock(&iommu->lock);
                        goto again;
                }

Reply via email to