-----Original Message----- From: dri-devel dri-devel-bounces@lists.freedesktop.org On Behalf Of Christian König Sent: Monday, June 29, 2020 8:22 AM To: dri-devel@lists.freedesktop.org Subject: [PATCH 2/2] drm/ttm: make TT creation purely optional v2
We only need the page array when the BO is about to be accessed.
So not only populate, but also create it on demand.
v2: move NULL check into ttm_tt_create()
Signed-off-by: Christian König christian.koenig@amd.com
drivers/gpu/drm/ttm/ttm_bo.c | 37 ++++++++----------------------- drivers/gpu/drm/ttm/ttm_bo_util.c | 9 ++++++-- drivers/gpu/drm/ttm/ttm_bo_vm.c | 5 +++++ drivers/gpu/drm/ttm/ttm_tt.c | 4 +++- 4 files changed, 24 insertions(+), 31 deletions(-)
diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c index 06b8bc0d8f23..c8c25e45751a 100644 --- a/drivers/gpu/drm/ttm/ttm_bo.c +++ b/drivers/gpu/drm/ttm/ttm_bo.c @@ -292,12 +292,11 @@ static int ttm_bo_handle_move_mem(struct ttm_buffer_object *bo, */
if (!(new_man->flags & TTM_MEMTYPE_FLAG_FIXED)) {
if (bo->ttm == NULL) {
bool zero = !(old_man->flags &
TTM_MEMTYPE_FLAG_FIXED);
ret = ttm_tt_create(bo, zero);
if (ret)
goto out_err;
}
bool zero = !(old_man->flags &
TTM_MEMTYPE_FLAG_FIXED);
ret = ttm_tt_create(bo, zero);
if (ret)
goto out_err;
ret = ttm_tt_set_placement_caching(bo->ttm, mem-
placement);
if (ret)
@@ -660,13 +659,8 @@ static int ttm_bo_evict(struct ttm_buffer_object *bo, placement.num_busy_placement = 0; bdev->driver->evict_flags(bo, &placement);
- if (!placement.num_placement &&
!placement.num_busy_placement) {
ret = ttm_bo_pipeline_gutting(bo);
if (ret)
return ret;
return ttm_tt_create(bo, false);
- }
- if (!placement.num_placement &&
!placement.num_busy_placement)
return ttm_bo_pipeline_gutting(bo);
evict_mem = bo->mem; evict_mem.mm_node = NULL;
@@ -1194,13 +1188,8 @@ int ttm_bo_validate(struct ttm_buffer_object *bo, /* * Remove the backing store if no placement is given. */
- if (!placement->num_placement && !placement-
num_busy_placement) {
ret = ttm_bo_pipeline_gutting(bo);
if (ret)
return ret;
return ttm_tt_create(bo, false);
- }
- if (!placement->num_placement && !placement-
num_busy_placement)
return ttm_bo_pipeline_gutting(bo);
/*
- Check whether we need to move buffer.
@@ -1217,14 +1206,6 @@ int ttm_bo_validate(struct ttm_buffer_object *bo, ttm_flag_masked(&bo->mem.placement, new_flags, ~TTM_PL_MASK_MEMTYPE); }
- /*
* We might need to add a TTM.
*/
- if (bo->mem.mem_type == TTM_PL_SYSTEM && bo->ttm == NULL) {
ret = ttm_tt_create(bo, true);
if (ret)
return ret;
- } return 0;
} EXPORT_SYMBOL(ttm_bo_validate); diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c index 52d2b71f1588..f8414f820350 100644 --- a/drivers/gpu/drm/ttm/ttm_bo_util.c +++ b/drivers/gpu/drm/ttm/ttm_bo_util.c @@ -580,12 +580,17 @@ static int ttm_bo_kmap_ttm(struct ttm_buffer_object *bo, .interruptible = false, .no_wait_gpu = false };
- struct ttm_tt *ttm = bo->ttm;
- struct ttm_tt *ttm; pgprot_t prot; int ret;
- BUG_ON(!ttm);
- if (!bo->ttm) {
ret = ttm_tt_create(bo, true);
if (ret)
return ret;
- }
I think that this chunk can be reduced to:
ret = ttm_tt_create(bo, true); if (ret) return ret; ?
With that change (unless I missed something here?):
Reviewed-by: Michael J. Ruhl michael.j.ruhl@intel.com
Mike
- ttm = bo->ttm; ret = ttm_tt_populate(ttm, &ctx); if (ret) return ret;
diff --git a/drivers/gpu/drm/ttm/ttm_bo_vm.c b/drivers/gpu/drm/ttm/ttm_bo_vm.c index 0ad30b112982..0586870ab642 100644 --- a/drivers/gpu/drm/ttm/ttm_bo_vm.c +++ b/drivers/gpu/drm/ttm/ttm_bo_vm.c @@ -349,6 +349,11 @@ vm_fault_t ttm_bo_vm_fault_reserved(struct vm_fault *vmf,
};
if (ttm_tt_create(bo, true)) {
ret = VM_FAULT_OOM;
goto out_io_unlock;
}
- ttm = bo->ttm; if (ttm_tt_populate(bo->ttm, &ctx)) { ret = VM_FAULT_OOM;
diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c index 2ec448e1d663..e25d4097aa16 100644 --- a/drivers/gpu/drm/ttm/ttm_tt.c +++ b/drivers/gpu/drm/ttm/ttm_tt.c @@ -50,6 +50,9 @@ int ttm_tt_create(struct ttm_buffer_object *bo, bool zero_alloc)
dma_resv_assert_held(bo->base.resv);
- if (bo->ttm)
return 0;
- if (bdev->need_dma32) page_flags |= TTM_PAGE_FLAG_DMA32;
@@ -67,7 +70,6 @@ int ttm_tt_create(struct ttm_buffer_object *bo, bool zero_alloc) page_flags |= TTM_PAGE_FLAG_SG; break; default:
pr_err("Illegal buffer object type\n"); return -EINVAL; }bo->ttm = NULL;
-- 2.17.1
dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel