[PATCH v2] drm/syncobj: Deal with signalled fences in drm_syncobj_find_fence.
Christian König
christian.koenig at amd.com
Wed Dec 8 09:28:48 UTC 2021
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>
> ---
> 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