drm/etnaviv: move idle mapping reaping into separate function
authorLucas Stach <l.stach@pengutronix.de>
Thu, 14 Jul 2022 10:31:42 +0000 (12:31 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 7 Jan 2023 10:11:57 +0000 (11:11 +0100)
commit 5a40837debaa9dcc71765d32ce1a15be068b6cc2 upstream.

The same logic is already used in two different places and now
it will also be needed outside of the compilation unit, so split
it into a separate function.

Cc: stable@vger.kernel.org # 5.19
Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
Reviewed-by: Guido Günther <agx@sigxcpu.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/gpu/drm/etnaviv/etnaviv_mmu.c
drivers/gpu/drm/etnaviv/etnaviv_mmu.h

index dc1aa738c4f18ad28cf7162215fd9976e65e2a02..55479cb8b1ac3cd55e66fedc7a01f4e95ad1817a 100644 (file)
@@ -135,6 +135,19 @@ static void etnaviv_iommu_remove_mapping(struct etnaviv_iommu_context *context,
        drm_mm_remove_node(&mapping->vram_node);
 }
 
+void etnaviv_iommu_reap_mapping(struct etnaviv_vram_mapping *mapping)
+{
+       struct etnaviv_iommu_context *context = mapping->context;
+
+       lockdep_assert_held(&context->lock);
+       WARN_ON(mapping->use);
+
+       etnaviv_iommu_remove_mapping(context, mapping);
+       etnaviv_iommu_context_put(mapping->context);
+       mapping->context = NULL;
+       list_del_init(&mapping->mmu_node);
+}
+
 static int etnaviv_iommu_find_iova(struct etnaviv_iommu_context *context,
                                   struct drm_mm_node *node, size_t size)
 {
@@ -202,10 +215,7 @@ static int etnaviv_iommu_find_iova(struct etnaviv_iommu_context *context,
                 * this mapping.
                 */
                list_for_each_entry_safe(m, n, &list, scan_node) {
-                       etnaviv_iommu_remove_mapping(context, m);
-                       etnaviv_iommu_context_put(m->context);
-                       m->context = NULL;
-                       list_del_init(&m->mmu_node);
+                       etnaviv_iommu_reap_mapping(m);
                        list_del_init(&m->scan_node);
                }
 
@@ -257,10 +267,7 @@ static int etnaviv_iommu_insert_exact(struct etnaviv_iommu_context *context,
        }
 
        list_for_each_entry_safe(m, n, &scan_list, scan_node) {
-               etnaviv_iommu_remove_mapping(context, m);
-               etnaviv_iommu_context_put(m->context);
-               m->context = NULL;
-               list_del_init(&m->mmu_node);
+               etnaviv_iommu_reap_mapping(m);
                list_del_init(&m->scan_node);
        }
 
index e4a0b7d09c2eab6f39498d03123e575b60cd4198..c01a147f0dfddfbc2809b7d99ce85b23cd558983 100644 (file)
@@ -91,6 +91,7 @@ int etnaviv_iommu_map_gem(struct etnaviv_iommu_context *context,
        struct etnaviv_vram_mapping *mapping, u64 va);
 void etnaviv_iommu_unmap_gem(struct etnaviv_iommu_context *context,
        struct etnaviv_vram_mapping *mapping);
+void etnaviv_iommu_reap_mapping(struct etnaviv_vram_mapping *mapping);
 
 int etnaviv_iommu_get_suballoc_va(struct etnaviv_iommu_context *ctx,
                                  struct etnaviv_vram_mapping *mapping,