Skip to content

Commit

Permalink
drm/ttm: add ttm_resource_fini v2
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Christian König committed Jan 26, 2022
1 parent 2343bcd commit de3688e
Show file tree
Hide file tree
Showing 13 changed files with 48 additions and 6 deletions.
2 changes: 2 additions & 0 deletions drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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);
}

Expand Down
1 change: 1 addition & 0 deletions drivers/gpu/drm/amd/amdgpu/amdgpu_preempt_mgr.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down
2 changes: 2 additions & 0 deletions drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
Original file line number Diff line number Diff line change
Expand Up @@ -476,6 +476,7 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man,
while (i--)
drm_mm_remove_node(&node->mm_nodes[i]);
spin_unlock(&mgr->lock);
ttm_resource_fini(man, &node->base);
kvfree(node);

error_sub:
Expand Down Expand Up @@ -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);
}

Expand Down
2 changes: 2 additions & 0 deletions drivers/gpu/drm/i915/i915_ttm_buddy_manager.c
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ static int i915_ttm_buddy_man_alloc(struct ttm_resource_manager *man,
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;
}
Expand All @@ -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);
}

Expand Down
3 changes: 2 additions & 1 deletion drivers/gpu/drm/nouveau/nouveau_mem.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down
3 changes: 2 additions & 1 deletion drivers/gpu/drm/nouveau/nouveau_mem.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 *);
Expand Down
9 changes: 5 additions & 4 deletions drivers/gpu/drm/nouveau/nouveau_ttm.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,10 @@
#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
Expand All @@ -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;
}

Expand Down Expand Up @@ -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;
}

Expand Down
2 changes: 2 additions & 0 deletions drivers/gpu/drm/ttm/ttm_range_manager.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand All @@ -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);
}

Expand Down
23 changes: 23 additions & 0 deletions drivers/gpu/drm/ttm/ttm_resource.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,14 @@
#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)
Expand All @@ -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)
Expand Down
1 change: 1 addition & 0 deletions drivers/gpu/drm/ttm/ttm_sys_manager.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down
2 changes: 2 additions & 0 deletions drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@ static int vmw_gmrid_man_get_node(struct ttm_resource_manager *man,
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;
}
Expand All @@ -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);
}

Expand Down
1 change: 1 addition & 0 deletions drivers/gpu/drm/vmwgfx/vmwgfx_system_manager.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down
3 changes: 3 additions & 0 deletions include/drm/ttm/ttm_resource.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit de3688e

Please sign in to comment.