diff --git a/drivers/dma-buf/dma-fence.c b/drivers/dma-buf/dma-fence.c index ce0f5eff575d..011cb99afdfb 100644 --- a/drivers/dma-buf/dma-fence.c +++ b/drivers/dma-buf/dma-fence.c @@ -459,9 +459,21 @@ int dma_fence_signal(struct dma_fence *fence) tmp = dma_fence_begin_signalling(); - spin_lock_irqsave(fence->lock, flags); - ret = dma_fence_signal_timestamp_locked(fence, ktime_get()); - spin_unlock_irqrestore(fence->lock, flags); + if (unlikely(test_and_set_bit(DMA_FENCE_FLAG_SIGNALED_BIT, + &fence->flags))) + return -EINVAL; + + trace_dma_fence_signaled(fence); + + lock(&fence->lock); + while(!list_empty(&fence->cb_list)) { + dma_fence_cb cur = list_first_entry(&&fence->cb_list, struct dma_fence_cb, node); + list_del_init(&cur->node); + unlock(&fence->lock); + cur->func(fence, cur); + lock(&fence->lock); + } + unlock(&fence->lock); dma_fence_end_signalling(tmp);