[PATCH] drm/ttm: use the parent resv for ghost objects v2

Christian König ckoenig.leichtzumerken at gmail.com
Thu Oct 24 10:53:46 UTC 2019


Am 24.10.19 um 12:51 schrieb Zhou, David(ChunMing):
> 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?

Ups, good point. That is indeed a really bad typo added during the 
rebase. Going to fix that.

Thanks,
Christian.

>
>
>>>        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