Both external domain and iommu backend domain can use pinning
interface, thus both can add pfn to dma pfn_list. By moving
the sanity_check_pfn_list to unmap_unpin_all can apply it to
all types of domain.

Fixes: a54eb55045ae ("vfio iommu type1: Add support for mediated devices")
Signed-off-by: Keqian Zhu <zhukeqi...@huawei.com>
---
 drivers/vfio/vfio_iommu_type1.c | 38 ++++++++++++++++-----------------
 1 file changed, 18 insertions(+), 20 deletions(-)

diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c
index 9776a059904d..d796be8bcbc5 100644
--- a/drivers/vfio/vfio_iommu_type1.c
+++ b/drivers/vfio/vfio_iommu_type1.c
@@ -2225,10 +2225,28 @@ static int vfio_iommu_type1_attach_group(void 
*iommu_data,
        return ret;
 }
 
+static void vfio_sanity_check_pfn_list(struct vfio_iommu *iommu)
+{
+       struct rb_node *n;
+
+       n = rb_first(&iommu->dma_list);
+       for (; n; n = rb_next(n)) {
+               struct vfio_dma *dma;
+
+               dma = rb_entry(n, struct vfio_dma, node);
+
+               if (WARN_ON(!RB_EMPTY_ROOT(&dma->pfn_list)))
+                       break;
+       }
+       /* mdev vendor driver must unregister notifier */
+       WARN_ON(iommu->notifier.head);
+}
+
 static void vfio_iommu_unmap_unpin_all(struct vfio_iommu *iommu)
 {
        struct rb_node *node;
 
+       vfio_sanity_check_pfn_list(iommu);
        while ((node = rb_first(&iommu->dma_list)))
                vfio_remove_dma(iommu, rb_entry(node, struct vfio_dma, node));
 }
@@ -2256,23 +2274,6 @@ static void vfio_iommu_unmap_unpin_reaccount(struct 
vfio_iommu *iommu)
        }
 }
 
-static void vfio_sanity_check_pfn_list(struct vfio_iommu *iommu)
-{
-       struct rb_node *n;
-
-       n = rb_first(&iommu->dma_list);
-       for (; n; n = rb_next(n)) {
-               struct vfio_dma *dma;
-
-               dma = rb_entry(n, struct vfio_dma, node);
-
-               if (WARN_ON(!RB_EMPTY_ROOT(&dma->pfn_list)))
-                       break;
-       }
-       /* mdev vendor driver must unregister notifier */
-       WARN_ON(iommu->notifier.head);
-}
-
 /*
  * Called when a domain is removed in detach. It is possible that
  * the removed domain decided the iova aperture window. Modify the
@@ -2371,8 +2372,6 @@ static void vfio_iommu_type1_detach_group(void 
*iommu_data,
                        kfree(group);
 
                        if (list_empty(&iommu->external_domain->group_list)) {
-                               vfio_sanity_check_pfn_list(iommu);
-
                                /*
                                 * During dirty page tracking, we can't remove
                                 * vfio_dma because dirty log will lose.
@@ -2503,7 +2502,6 @@ static void vfio_iommu_type1_release(void *iommu_data)
 
        if (iommu->external_domain) {
                vfio_release_domain(iommu->external_domain, true);
-               vfio_sanity_check_pfn_list(iommu);
                kfree(iommu->external_domain);
        }
 
-- 
2.19.1

Reply via email to