On 2019/10/24 下午6:25, Christian König wrote: > Ping? > > Am 18.10.19 um 13:58 schrieb Christian König: >> This way the TTM is destroyed with the correct dma_resv object >> locked and we can even pipeline imported BO evictions. >> >> v2: Limit this to only cases when the parent object uses a separate >> reservation object as well. This fixes another OOM problem. >> >> Signed-off-by: Christian König <christian.koenig@xxxxxxx> >> --- >> drivers/gpu/drm/ttm/ttm_bo_util.c | 16 +++++++++------- >> 1 file changed, 9 insertions(+), 7 deletions(-) >> >> diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c >> b/drivers/gpu/drm/ttm/ttm_bo_util.c >> index e030c27f53cf..45e440f80b7b 100644 >> --- a/drivers/gpu/drm/ttm/ttm_bo_util.c >> +++ b/drivers/gpu/drm/ttm/ttm_bo_util.c >> @@ -512,7 +512,9 @@ static int ttm_buffer_object_transfer(struct >> ttm_buffer_object *bo, >> kref_init(&fbo->base.kref); >> fbo->base.destroy = &ttm_transfered_destroy; >> fbo->base.acc_size = 0; >> - fbo->base.base.resv = &fbo->base.base._resv; >> + if (bo->base.resv == &bo->base._resv) >> + fbo->base.base.resv = &fbo->base.base._resv; >> + >> dma_resv_init(fbo->base.base.resv); Doesn't this lead to issue if you force to init parent resv? Otherwise how to deal with if parent->resv is locking? >> ret = dma_resv_trylock(fbo->base.base.resv); >> WARN_ON(!ret); >> @@ -711,7 +713,7 @@ int ttm_bo_move_accel_cleanup(struct >> ttm_buffer_object *bo, >> if (ret) >> return ret; >> - dma_resv_add_excl_fence(ghost_obj->base.resv, fence); >> + dma_resv_add_excl_fence(&ghost_obj->base._resv, fence); >> /** >> * If we're not moving to fixed memory, the TTM object >> @@ -724,7 +726,7 @@ int ttm_bo_move_accel_cleanup(struct >> ttm_buffer_object *bo, >> else >> bo->ttm = NULL; >> - ttm_bo_unreserve(ghost_obj); >> + dma_resv_unlock(&ghost_obj->base._resv); fbo->base.base.resv? -David >> ttm_bo_put(ghost_obj); >> } >> @@ -767,7 +769,7 @@ int ttm_bo_pipeline_move(struct >> ttm_buffer_object *bo, >> if (ret) >> return ret; >> - dma_resv_add_excl_fence(ghost_obj->base.resv, fence); >> + dma_resv_add_excl_fence(&ghost_obj->base._resv, fence); >> /** >> * If we're not moving to fixed memory, the TTM object >> @@ -780,7 +782,7 @@ int ttm_bo_pipeline_move(struct ttm_buffer_object >> *bo, >> else >> bo->ttm = NULL; >> - ttm_bo_unreserve(ghost_obj); >> + dma_resv_unlock(&ghost_obj->base._resv); >> ttm_bo_put(ghost_obj); >> } else if (from->flags & TTM_MEMTYPE_FLAG_FIXED) { >> @@ -836,7 +838,7 @@ int ttm_bo_pipeline_gutting(struct >> ttm_buffer_object *bo) >> if (ret) >> return ret; >> - ret = dma_resv_copy_fences(ghost->base.resv, bo->base.resv); >> + ret = dma_resv_copy_fences(&ghost->base._resv, bo->base.resv); >> /* Last resort, wait for the BO to be idle when we are OOM */ >> if (ret) >> ttm_bo_wait(bo, false, false); >> @@ -845,7 +847,7 @@ int ttm_bo_pipeline_gutting(struct >> ttm_buffer_object *bo) >> bo->mem.mem_type = TTM_PL_SYSTEM; >> bo->ttm = NULL; >> - ttm_bo_unreserve(ghost); >> + dma_resv_unlock(&ghost->base._resv); >> ttm_bo_put(ghost); >> return 0; > _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel