Lines Matching refs:fence
113 static const char *dma_fence_stub_get_name(struct dma_fence *fence) in dma_fence_stub_get_name() argument
332 int dma_fence_signal_timestamp_locked(struct dma_fence *fence, in dma_fence_signal_timestamp_locked() argument
338 lockdep_assert_held(fence->lock); in dma_fence_signal_timestamp_locked()
341 &fence->flags))) in dma_fence_signal_timestamp_locked()
345 list_replace(&fence->cb_list, &cb_list); in dma_fence_signal_timestamp_locked()
347 fence->timestamp = timestamp; in dma_fence_signal_timestamp_locked()
348 set_bit(DMA_FENCE_FLAG_TIMESTAMP_BIT, &fence->flags); in dma_fence_signal_timestamp_locked()
349 trace_dma_fence_signaled(fence); in dma_fence_signal_timestamp_locked()
353 cur->func(fence, cur); in dma_fence_signal_timestamp_locked()
375 int dma_fence_signal_timestamp(struct dma_fence *fence, ktime_t timestamp) in dma_fence_signal_timestamp() argument
380 if (!fence) in dma_fence_signal_timestamp()
383 spin_lock_irqsave(fence->lock, flags); in dma_fence_signal_timestamp()
384 ret = dma_fence_signal_timestamp_locked(fence, timestamp); in dma_fence_signal_timestamp()
385 spin_unlock_irqrestore(fence->lock, flags); in dma_fence_signal_timestamp()
407 int dma_fence_signal_locked(struct dma_fence *fence) in dma_fence_signal_locked() argument
409 return dma_fence_signal_timestamp_locked(fence, ktime_get()); in dma_fence_signal_locked()
426 int dma_fence_signal(struct dma_fence *fence) in dma_fence_signal() argument
432 if (!fence) in dma_fence_signal()
437 spin_lock_irqsave(fence->lock, flags); in dma_fence_signal()
438 ret = dma_fence_signal_timestamp_locked(fence, ktime_get()); in dma_fence_signal()
439 spin_unlock_irqrestore(fence->lock, flags); in dma_fence_signal()
466 dma_fence_wait_timeout(struct dma_fence *fence, bool intr, signed long timeout) in dma_fence_wait_timeout() argument
477 trace_dma_fence_wait_start(fence); in dma_fence_wait_timeout()
478 if (fence->ops->wait) in dma_fence_wait_timeout()
479 ret = fence->ops->wait(fence, intr, timeout); in dma_fence_wait_timeout()
481 ret = dma_fence_default_wait(fence, intr, timeout); in dma_fence_wait_timeout()
482 trace_dma_fence_wait_end(fence); in dma_fence_wait_timeout()
496 struct dma_fence *fence = in dma_fence_release() local
499 trace_dma_fence_destroy(fence); in dma_fence_release()
501 if (WARN(!list_empty(&fence->cb_list) && in dma_fence_release()
502 !test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags), in dma_fence_release()
504 fence->ops->get_driver_name(fence), in dma_fence_release()
505 fence->ops->get_timeline_name(fence), in dma_fence_release()
506 fence->context, fence->seqno)) { in dma_fence_release()
516 spin_lock_irqsave(fence->lock, flags); in dma_fence_release()
517 fence->error = -EDEADLK; in dma_fence_release()
518 dma_fence_signal_locked(fence); in dma_fence_release()
519 spin_unlock_irqrestore(fence->lock, flags); in dma_fence_release()
522 if (fence->ops->release) in dma_fence_release()
523 fence->ops->release(fence); in dma_fence_release()
525 dma_fence_free(fence); in dma_fence_release()
536 void dma_fence_free(struct dma_fence *fence) in dma_fence_free() argument
538 kfree_rcu(fence, rcu); in dma_fence_free()
542 static bool __dma_fence_enable_signaling(struct dma_fence *fence) in __dma_fence_enable_signaling() argument
546 lockdep_assert_held(fence->lock); in __dma_fence_enable_signaling()
549 &fence->flags); in __dma_fence_enable_signaling()
551 if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags)) in __dma_fence_enable_signaling()
554 if (!was_set && fence->ops->enable_signaling) { in __dma_fence_enable_signaling()
555 trace_dma_fence_enable_signal(fence); in __dma_fence_enable_signaling()
557 if (!fence->ops->enable_signaling(fence)) { in __dma_fence_enable_signaling()
558 dma_fence_signal_locked(fence); in __dma_fence_enable_signaling()
574 void dma_fence_enable_sw_signaling(struct dma_fence *fence) in dma_fence_enable_sw_signaling() argument
578 if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags)) in dma_fence_enable_sw_signaling()
581 spin_lock_irqsave(fence->lock, flags); in dma_fence_enable_sw_signaling()
582 __dma_fence_enable_signaling(fence); in dma_fence_enable_sw_signaling()
583 spin_unlock_irqrestore(fence->lock, flags); in dma_fence_enable_sw_signaling()
612 int dma_fence_add_callback(struct dma_fence *fence, struct dma_fence_cb *cb, in dma_fence_add_callback() argument
618 if (WARN_ON(!fence || !func)) in dma_fence_add_callback()
621 if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags)) { in dma_fence_add_callback()
626 spin_lock_irqsave(fence->lock, flags); in dma_fence_add_callback()
628 if (__dma_fence_enable_signaling(fence)) { in dma_fence_add_callback()
630 list_add_tail(&cb->node, &fence->cb_list); in dma_fence_add_callback()
636 spin_unlock_irqrestore(fence->lock, flags); in dma_fence_add_callback()
654 int dma_fence_get_status(struct dma_fence *fence) in dma_fence_get_status() argument
659 spin_lock_irqsave(fence->lock, flags); in dma_fence_get_status()
660 status = dma_fence_get_status_locked(fence); in dma_fence_get_status()
661 spin_unlock_irqrestore(fence->lock, flags); in dma_fence_get_status()
686 dma_fence_remove_callback(struct dma_fence *fence, struct dma_fence_cb *cb) in dma_fence_remove_callback() argument
691 spin_lock_irqsave(fence->lock, flags); in dma_fence_remove_callback()
697 spin_unlock_irqrestore(fence->lock, flags); in dma_fence_remove_callback()
709 dma_fence_default_wait_cb(struct dma_fence *fence, struct dma_fence_cb *cb) in dma_fence_default_wait_cb() argument
730 dma_fence_default_wait(struct dma_fence *fence, bool intr, signed long timeout) in dma_fence_default_wait() argument
736 if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags)) in dma_fence_default_wait()
739 spin_lock_irqsave(fence->lock, flags); in dma_fence_default_wait()
746 if (!__dma_fence_enable_signaling(fence)) in dma_fence_default_wait()
756 list_add(&cb.base.node, &fence->cb_list); in dma_fence_default_wait()
758 while (!test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags) && ret > 0) { in dma_fence_default_wait()
763 spin_unlock_irqrestore(fence->lock, flags); in dma_fence_default_wait()
767 spin_lock_irqsave(fence->lock, flags); in dma_fence_default_wait()
777 spin_unlock_irqrestore(fence->lock, flags); in dma_fence_default_wait()
789 struct dma_fence *fence = fences[i]; in dma_fence_test_signaled_any() local
790 if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags)) { in dma_fence_test_signaled_any()
848 struct dma_fence *fence = fences[i]; in dma_fence_wait_any_timeout() local
851 if (dma_fence_add_callback(fence, &cb[i].base, in dma_fence_wait_any_timeout()
904 dma_fence_init(struct dma_fence *fence, const struct dma_fence_ops *ops, in dma_fence_init() argument
910 kref_init(&fence->refcount); in dma_fence_init()
911 fence->ops = ops; in dma_fence_init()
912 INIT_LIST_HEAD(&fence->cb_list); in dma_fence_init()
913 fence->lock = lock; in dma_fence_init()
914 fence->context = context; in dma_fence_init()
915 fence->seqno = seqno; in dma_fence_init()
916 fence->flags = 0UL; in dma_fence_init()
917 fence->error = 0; in dma_fence_init()
919 trace_dma_fence_init(fence); in dma_fence_init()