[PATCH v2] drm/syncobj: Deal with signalled fences in drm_syncobj_find_fence.
Christian König
christian.koenig at amd.com
Wed Dec 8 16:21:31 UTC 2021
Am 08.12.21 um 11:08 schrieb Lionel Landwerlin:
> On 08/12/2021 11:28, Christian König wrote:
>> Am 08.12.21 um 03:39 schrieb Bas Nieuwenhuizen:
>>> dma_fence_chain_find_seqno only ever returns the top fence in the
>>> chain or an unsignalled fence. Hence if we request a seqno that
>>> is already signalled it returns a NULL fence. Some callers are
>>> not prepared to handle this, like the syncobj transfer functions
>>> for example.
>>>
>>> This behavior is "new" with timeline syncobj and it looks like
>>> not all callers were updated. To fix this behavior make sure
>>> that a successful drm_sync_find_fence always returns a non-NULL
>>> fence.
>>>
>>> v2: Move the fix to drm_syncobj_find_fence from the transfer
>>> functions.
>>>
>>> Fixes: ea569910cbab ("drm/syncobj: add transition iotcls between
>>> binary and timeline v2")
>>> Cc: stable at vger.kernel.org
>>> Signed-off-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
>>
>> Reviewed-by: Christian König <christian.koenig at amd.com>
>
>
> Thanks!
>
>
> Acked-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
And pushed to drm-misc-fixes.
Thanks,
Christian.
>
>
>>
>>> ---
>>> drivers/gpu/drm/drm_syncobj.c | 11 ++++++++++-
>>> 1 file changed, 10 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/drivers/gpu/drm/drm_syncobj.c
>>> b/drivers/gpu/drm/drm_syncobj.c
>>> index fdd2ec87cdd1..11be91b5709b 100644
>>> --- a/drivers/gpu/drm/drm_syncobj.c
>>> +++ b/drivers/gpu/drm/drm_syncobj.c
>>> @@ -404,8 +404,17 @@ int drm_syncobj_find_fence(struct drm_file
>>> *file_private,
>>> if (*fence) {
>>> ret = dma_fence_chain_find_seqno(fence, point);
>>> - if (!ret)
>>> + if (!ret) {
>>> + /* If the requested seqno is already signaled
>>> + * drm_syncobj_find_fence may return a NULL
>>> + * fence. To make sure the recipient gets
>>> + * signalled, use a new fence instead.
>>> + */
>>> + if (!*fence)
>>> + *fence = dma_fence_get_stub();
>>> +
>>> goto out;
>>> + }
>>> dma_fence_put(*fence);
>>> } else {
>>> ret = -EINVAL;
>>
>
More information about the dri-devel
mailing list