lkml.org 
[lkml]   [2021]   [Dec]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 38/88] drm/syncobj: Deal with signalled fences in drm_syncobj_find_fence.
    Date
    From: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>

    commit b19926d4f3a660a8b76e5d989ffd1168e619a5c4 upstream.

    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@vger.kernel.org
    Signed-off-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
    Reviewed-by: Christian König <christian.koenig@amd.com>
    Acked-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
    Signed-off-by: Christian König <christian.koenig@amd.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20211208023935.17018-1-bas@basnieuwenhuizen.nl
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/gpu/drm/drm_syncobj.c | 11 ++++++++++-
    1 file changed, 10 insertions(+), 1 deletion(-)

    --- a/drivers/gpu/drm/drm_syncobj.c
    +++ b/drivers/gpu/drm/drm_syncobj.c
    @@ -329,8 +329,17 @@ int drm_syncobj_find_fence(struct drm_fi

    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;

    \
     
     \ /
      Last update: 2021-12-13 11:10    [W:4.689 / U:0.052 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site