OSDN Git Service

drm/ttm: add ttm_resource_fini v2
authorChristian König <christian.koenig@amd.com>
Fri, 9 Jul 2021 13:18:39 +0000 (15:18 +0200)
committerChristian König <christian.koenig@amd.com>
Wed, 26 Jan 2022 14:23:51 +0000 (15:23 +0100)
Make sure we call the common cleanup function in all
implementations of the resource manager.

v2: fix missing case in i915, rudimentary kerneldoc, should be
    filled in more when we add more functionality

Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Link: https://patchwork.freedesktop.org/patch/msgid/20220124122514.1832-2-christian.koenig@amd.com
13 files changed:
drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c
drivers/gpu/drm/amd/amdgpu/amdgpu_preempt_mgr.c
drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
drivers/gpu/drm/i915/i915_ttm_buddy_manager.c
drivers/gpu/drm/nouveau/nouveau_mem.c
drivers/gpu/drm/nouveau/nouveau_mem.h
drivers/gpu/drm/nouveau/nouveau_ttm.c
drivers/gpu/drm/ttm/ttm_range_manager.c
drivers/gpu/drm/ttm/ttm_resource.c
drivers/gpu/drm/ttm/ttm_sys_manager.c
drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c
drivers/gpu/drm/vmwgfx/vmwgfx_system_manager.c
include/drm/ttm/ttm_resource.h

index 675a72e..ea5470c 100644 (file)
@@ -169,6 +169,7 @@ static int amdgpu_gtt_mgr_new(struct ttm_resource_manager *man,
        return 0;
 
 err_free:
+       ttm_resource_fini(man, &node->base.base);
        kfree(node);
 
 err_out:
@@ -200,6 +201,7 @@ static void amdgpu_gtt_mgr_del(struct ttm_resource_manager *man,
        if (!(res->placement & TTM_PL_FLAG_TEMPORARY))
                atomic64_sub(res->num_pages, &mgr->used);
 
+       ttm_resource_fini(man, res);
        kfree(node);
 }
 
index d02c863..ffddec0 100644 (file)
@@ -95,6 +95,7 @@ static void amdgpu_preempt_mgr_del(struct ttm_resource_manager *man,
        struct amdgpu_preempt_mgr *mgr = to_preempt_mgr(man);
 
        atomic64_sub(res->num_pages, &mgr->used);
+       ttm_resource_fini(man, res);
        kfree(res);
 }
 
index 7b2b098..55d6840 100644 (file)
@@ -476,6 +476,7 @@ error_free:
        while (i--)
                drm_mm_remove_node(&node->mm_nodes[i]);
        spin_unlock(&mgr->lock);
+       ttm_resource_fini(man, &node->base);
        kvfree(node);
 
 error_sub:
@@ -515,6 +516,7 @@ static void amdgpu_vram_mgr_del(struct ttm_resource_manager *man,
        atomic64_sub(usage, &mgr->usage);
        atomic64_sub(vis_usage, &mgr->vis_usage);
 
+       ttm_resource_fini(man, res);
        kvfree(node);
 }
 
index 6ba314f..e275b38 100644 (file)
@@ -110,6 +110,7 @@ err_free_blocks:
        drm_buddy_free_list(mm, &bman_res->blocks);
        mutex_unlock(&bman->lock);
 err_free_res:
+       ttm_resource_fini(man, &bman_res->base);
        kfree(bman_res);
        return err;
 }
@@ -124,6 +125,7 @@ static void i915_ttm_buddy_man_free(struct ttm_resource_manager *man,
        drm_buddy_free_list(&bman->mm, &bman_res->blocks);
        mutex_unlock(&bman->lock);
 
+       ttm_resource_fini(man, res);
        kfree(bman_res);
 }
 
index 2ca3207..2e517cd 100644 (file)
@@ -162,11 +162,12 @@ nouveau_mem_vram(struct ttm_resource *reg, bool contig, u8 page)
 }
 
 void
-nouveau_mem_del(struct ttm_resource *reg)
+nouveau_mem_del(struct ttm_resource_manager *man, struct ttm_resource *reg)
 {
        struct nouveau_mem *mem = nouveau_mem(reg);
 
        nouveau_mem_fini(mem);
+       ttm_resource_fini(man, reg);
        kfree(mem);
 }
 
index 2c01166..325551e 100644 (file)
@@ -23,7 +23,8 @@ nouveau_mem(struct ttm_resource *reg)
 
 int nouveau_mem_new(struct nouveau_cli *, u8 kind, u8 comp,
                    struct ttm_resource **);
-void nouveau_mem_del(struct ttm_resource *);
+void nouveau_mem_del(struct ttm_resource_manager *man,
+                    struct ttm_resource *);
 int nouveau_mem_vram(struct ttm_resource *, bool contig, u8 page);
 int nouveau_mem_host(struct ttm_resource *, struct ttm_tt *);
 void nouveau_mem_fini(struct nouveau_mem *);
index 2ca9d9a..91ef33f 100644 (file)
 #include <core/tegra.h>
 
 static void
-nouveau_manager_del(struct ttm_resource_manager *man, struct ttm_resource *reg)
+nouveau_manager_del(struct ttm_resource_manager *man,
+                   struct ttm_resource *reg)
 {
-       nouveau_mem_del(reg);
+       nouveau_mem_del(man, reg);
 }
 
 static int
@@ -62,7 +63,7 @@ nouveau_vram_manager_new(struct ttm_resource_manager *man,
 
        ret = nouveau_mem_vram(*res, nvbo->contig, nvbo->page);
        if (ret) {
-               nouveau_mem_del(*res);
+               nouveau_mem_del(man, *res);
                return ret;
        }
 
@@ -118,7 +119,7 @@ nv04_gart_manager_new(struct ttm_resource_manager *man,
        ret = nvif_vmm_get(&mem->cli->vmm.vmm, PTES, false, 12, 0,
                           (long)(*res)->num_pages << PAGE_SHIFT, &mem->vma[0]);
        if (ret) {
-               nouveau_mem_del(*res);
+               nouveau_mem_del(man, *res);
                return ret;
        }
 
index 072e0ba..55a4135 100644 (file)
@@ -89,6 +89,7 @@ static int ttm_range_man_alloc(struct ttm_resource_manager *man,
        spin_unlock(&rman->lock);
 
        if (unlikely(ret)) {
+               ttm_resource_fini(man, *res);
                kfree(node);
                return ret;
        }
@@ -108,6 +109,7 @@ static void ttm_range_man_free(struct ttm_resource_manager *man,
        drm_mm_remove_node(&node->mm_nodes[0]);
        spin_unlock(&rman->lock);
 
+       ttm_resource_fini(man, res);
        kfree(node);
 }
 
index 035d713..7e5e32d 100644 (file)
 #include <drm/ttm/ttm_resource.h>
 #include <drm/ttm/ttm_bo_driver.h>
 
+/**
+ * ttm_resource_init - resource object constructure
+ * @bo: buffer object this resources is allocated for
+ * @place: placement of the resource
+ * @res: the resource object to inistilize
+ *
+ * Initialize a new resource object. Counterpart of &ttm_resource_fini.
+ */
 void ttm_resource_init(struct ttm_buffer_object *bo,
                        const struct ttm_place *place,
                        struct ttm_resource *res)
@@ -44,6 +52,21 @@ void ttm_resource_init(struct ttm_buffer_object *bo,
 }
 EXPORT_SYMBOL(ttm_resource_init);
 
+/**
+ * ttm_resource_fini - resource destructor
+ * @man: the resource manager this resource belongs to
+ * @res: the resource to clean up
+ *
+ * Should be used by resource manager backends to clean up the TTM resource
+ * objects before freeing the underlying structure. Counterpart of
+ * &ttm_resource_init
+ */
+void ttm_resource_fini(struct ttm_resource_manager *man,
+                      struct ttm_resource *res)
+{
+}
+EXPORT_SYMBOL(ttm_resource_fini);
+
 int ttm_resource_alloc(struct ttm_buffer_object *bo,
                       const struct ttm_place *place,
                       struct ttm_resource **res_ptr)
index 63aca52..135394d 100644 (file)
@@ -23,6 +23,7 @@ static int ttm_sys_man_alloc(struct ttm_resource_manager *man,
 static void ttm_sys_man_free(struct ttm_resource_manager *man,
                             struct ttm_resource *res)
 {
+       ttm_resource_fini(man, res);
        kfree(res);
 }
 
index ebb4505..99ccf69 100644 (file)
@@ -117,6 +117,7 @@ nospace:
        gman->used_gmr_pages -= (*res)->num_pages;
        spin_unlock(&gman->lock);
        ida_free(&gman->gmr_ida, id);
+       ttm_resource_fini(man, *res);
        kfree(*res);
        return -ENOSPC;
 }
@@ -130,6 +131,7 @@ static void vmw_gmrid_man_put_node(struct ttm_resource_manager *man,
        spin_lock(&gman->lock);
        gman->used_gmr_pages -= res->num_pages;
        spin_unlock(&gman->lock);
+       ttm_resource_fini(man, res);
        kfree(res);
 }
 
index b0005b0..a64188c 100644 (file)
@@ -49,6 +49,7 @@ static int vmw_sys_man_alloc(struct ttm_resource_manager *man,
 static void vmw_sys_man_free(struct ttm_resource_manager *man,
                             struct ttm_resource *res)
 {
+       ttm_resource_fini(man, res);
        kfree(res);
 }
 
index 5952051..df1f06b 100644 (file)
@@ -261,6 +261,9 @@ ttm_resource_manager_cleanup(struct ttm_resource_manager *man)
 void ttm_resource_init(struct ttm_buffer_object *bo,
                        const struct ttm_place *place,
                        struct ttm_resource *res);
+void ttm_resource_fini(struct ttm_resource_manager *man,
+                      struct ttm_resource *res);
+
 int ttm_resource_alloc(struct ttm_buffer_object *bo,
                       const struct ttm_place *place,
                       struct ttm_resource **res);