[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