[PATCH] drm/ttm: use the parent resv for ghost objects v2
Zhou, David(ChunMing)
David1.Zhou at amd.com
Thu Oct 24 10:51:55 UTC 2019
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 at amd.com>
>> ---
>> 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;
>
More information about the dri-devel
mailing list