[PATCH 7/7] drm/syncobj: use the timeline point in drm_syncobj_find_fence

zhoucm1 zhoucm1 at amd.com
Fri Nov 23 02:36:34 UTC 2018



On 2018年11月22日 19:30, Christian König wrote:
> Am 22.11.18 um 07:52 schrieb zhoucm1:
>>
>>
>> On 2018年11月15日 19:12, Christian König wrote:
>>> Implement finding the right timeline point in drm_syncobj_find_fence.
>>>
>>> Signed-off-by: Christian König <christian.koenig at amd.com>
>>> ---
>>>   drivers/gpu/drm/drm_syncobj.c | 10 +++++++++-
>>>   1 file changed, 9 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/drivers/gpu/drm/drm_syncobj.c 
>>> b/drivers/gpu/drm/drm_syncobj.c
>>> index 589d884ccd58..d42c51520da4 100644
>>> --- a/drivers/gpu/drm/drm_syncobj.c
>>> +++ b/drivers/gpu/drm/drm_syncobj.c
>>> @@ -307,9 +307,17 @@ int drm_syncobj_find_fence(struct drm_file 
>>> *file_private,
>>>           return -ENOENT;
>>>         *fence = drm_syncobj_fence_get(syncobj);
>>> -    if (!*fence) {
>>> +    if (!*fence)
>>>           ret = -EINVAL;
>>> +
>>> +    if (!ret && point) {
>>> +        dma_fence_chain_for_each(*fence) {
>>> +            if (!to_dma_fence_chain(*fence) ||
>>> +                (*fence)->seqno <= point)
>>> +                break;
>> This condition isn't enough to find proper point.
>> For two examples:
>> a. No garbage collection happens, the points in chain are 
>> 1----3----6----9----12---18---20, if user wants to get point17, then 
>> we should return node 18.
>
> And that is exactly what's wrong in the original logic. In this case 
> we need to return 12, not 18 because point 17 could have already been 
> garbage collected.
I don't think so, the 'a' case I already assume there isn't garbage 
collection. If user wants to get point17, then we should return node 18.
timeline means point[N]  must be signaled later than point[N-1].
Point[12] just can make sure point[1] ~point[12] are signaled.
Point[18] signal can make sure point[17] is signaled.
So this case we need to return 18, not 12, which is key timeline concept.

-David
>
>> b. garbage collection happens on point6, chain would be updated to 
>> 1---3---9---12---18---20, if user wants to get point5, then we should 
>> return node 3, but if user wants to get point 7, then we should 
>> return node 9.
>
> Why? That doesn't seem to make any sense to me.
>
>> I still have no idea how to satisfy all these requirements with your 
>> current chain-fence. All these logic just are same we encountered 
>> before, we're walking them again. After solving these problems, I 
>> guess all design is similar as before.
>>
>> In fact, I don't know what problem previous design has, maybe there 
>> are some bugs, can't we fix these bugs by time going? Who can make 
>> sure his implementation never have bugs?
>
> Well there where numerous problems with the original design. For 
> example we need to reject the requirement that timeline fences are in 
> order because that doesn't make sense in the kernel.
>
> When userspace does something like submitting fences in the order 1, 
> 5, 3 then it is broken and can keep the pieces. In other words the 
> kernel should not care about that, but rather make sure that it never 
> looses any synchronization no matter what.
>
> Regards,
> Christian.
>
>>
>>
>> -David
>>> +        }
>>>       }
>>> +
>>>       drm_syncobj_put(syncobj);
>>>       return ret;
>>>   }
>>
>



More information about the dri-devel mailing list