diff -drupN a/drivers/dma-buf/fence.c b/drivers/dma-buf/fence.c --- a/drivers/dma-buf/fence.c 2018-08-06 17:23:04.000000000 +0300 +++ b/drivers/dma-buf/fence.c 2022-06-12 05:28:14.000000000 +0300 @@ -68,6 +68,8 @@ int fence_signal_locked(struct fence *fe struct fence_cb *cur, *tmp; int ret = 0; + lockdep_assert_held(fence->lock); + if (WARN_ON(!fence)) return -EINVAL; @@ -159,9 +161,6 @@ fence_wait_timeout(struct fence *fence, if (WARN_ON(timeout < 0)) return -EINVAL; - if (timeout == 0) - return fence_is_signaled(fence); - trace_fence_wait_start(fence); ret = fence->ops->wait(fence, intr, timeout); trace_fence_wait_end(fence); @@ -329,8 +328,12 @@ fence_remove_callback(struct fence *fenc spin_lock_irqsave(fence->lock, flags); ret = !list_empty(&cb->node); - if (ret) + if (ret) { list_del_init(&cb->node); + if (list_empty(&fence->cb_list)) + if (fence->ops->disable_signaling) + fence->ops->disable_signaling(fence); + } spin_unlock_irqrestore(fence->lock, flags);