>-----Original Message----- >From: dri-devel <dri-devel-bounces@xxxxxxxxxxxxxxxxxxxxx> On Behalf Of >Christian König >Sent: Wednesday, June 24, 2020 9:36 AM >To: dri-devel@xxxxxxxxxxxxxxxxxxxxx >Subject: [PATCH 2/2] drm/ttm: make TT creation purely optional > >We only need the page array when the BO is about to be accessed. > >So not only populate, but also create it on demand. > >Signed-off-by: Christian König <christian.koenig@xxxxxxx> >--- > drivers/gpu/drm/ttm/ttm_bo.c | 26 ++++---------------------- > drivers/gpu/drm/ttm/ttm_bo_util.c | 9 +++++++-- > drivers/gpu/drm/ttm/ttm_bo_vm.c | 5 +++++ > 3 files changed, 16 insertions(+), 24 deletions(-) > >diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c >index 15f9b19fa00d..0e0a9dadf3ed 100644 >--- a/drivers/gpu/drm/ttm/ttm_bo.c >+++ b/drivers/gpu/drm/ttm/ttm_bo.c >@@ -667,13 +667,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; >@@ -1200,13 +1195,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. >@@ -1223,14 +1213,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); Would it be reasonable to move the NULL check into ttm_tt_create()? Kind of an opposite path NULL check, but it makes the path a little more clean. Mike >+ if (ret) >+ return ret; >+ } > >+ 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..bdfed6725d6f 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 (!bo->ttm && 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; >-- >2.17.1 > >_______________________________________________ >dri-devel mailing list >dri-devel@xxxxxxxxxxxxxxxxxxxxx >https://lists.freedesktop.org/mailman/listinfo/dri-devel _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel