Lines Matching defs:fence

8 #include <linux/dma-fence.h>
49 static inline void debug_fence_init(struct i915_sw_fence *fence)
51 debug_object_init(fence, &i915_sw_fence_debug_descr);
54 static inline __maybe_unused void debug_fence_init_onstack(struct i915_sw_fence *fence)
56 debug_object_init_on_stack(fence, &i915_sw_fence_debug_descr);
59 static inline void debug_fence_activate(struct i915_sw_fence *fence)
61 debug_object_activate(fence, &i915_sw_fence_debug_descr);
64 static inline void debug_fence_set_state(struct i915_sw_fence *fence,
67 debug_object_active_state(fence, &i915_sw_fence_debug_descr, old, new);
70 static inline void debug_fence_deactivate(struct i915_sw_fence *fence)
72 debug_object_deactivate(fence, &i915_sw_fence_debug_descr);
75 static inline void debug_fence_destroy(struct i915_sw_fence *fence)
77 debug_object_destroy(fence, &i915_sw_fence_debug_descr);
80 static inline __maybe_unused void debug_fence_free(struct i915_sw_fence *fence)
82 debug_object_free(fence, &i915_sw_fence_debug_descr);
86 static inline void debug_fence_assert(struct i915_sw_fence *fence)
88 debug_object_assert_init(fence, &i915_sw_fence_debug_descr);
93 static inline void debug_fence_init(struct i915_sw_fence *fence)
97 static inline __maybe_unused void debug_fence_init_onstack(struct i915_sw_fence *fence)
101 static inline void debug_fence_activate(struct i915_sw_fence *fence)
105 static inline void debug_fence_set_state(struct i915_sw_fence *fence,
110 static inline void debug_fence_deactivate(struct i915_sw_fence *fence)
114 static inline void debug_fence_destroy(struct i915_sw_fence *fence)
118 static inline __maybe_unused void debug_fence_free(struct i915_sw_fence *fence)
122 static inline void debug_fence_assert(struct i915_sw_fence *fence)
128 static int __i915_sw_fence_notify(struct i915_sw_fence *fence,
131 return fence->fn(fence, state);
135 void i915_sw_fence_fini(struct i915_sw_fence *fence)
137 debug_fence_free(fence);
141 static void __i915_sw_fence_wake_up_all(struct i915_sw_fence *fence,
144 wait_queue_head_t *x = &fence->wait;
148 debug_fence_deactivate(fence);
149 atomic_set_release(&fence->pending, -1); /* 0 -> -1 [done] */
154 * fence, to the tail of the original fence's entry list
175 wake_flags = fence->error;
188 debug_fence_assert(fence);
191 static void __i915_sw_fence_complete(struct i915_sw_fence *fence,
194 debug_fence_assert(fence);
196 if (!atomic_dec_and_test(&fence->pending))
199 debug_fence_set_state(fence, DEBUG_FENCE_IDLE, DEBUG_FENCE_NOTIFY);
201 if (__i915_sw_fence_notify(fence, FENCE_COMPLETE) != NOTIFY_DONE)
204 debug_fence_set_state(fence, DEBUG_FENCE_NOTIFY, DEBUG_FENCE_IDLE);
206 __i915_sw_fence_wake_up_all(fence, continuation);
208 debug_fence_destroy(fence);
209 __i915_sw_fence_notify(fence, FENCE_FREE);
212 void i915_sw_fence_complete(struct i915_sw_fence *fence)
214 debug_fence_assert(fence);
216 if (WARN_ON(i915_sw_fence_done(fence)))
219 __i915_sw_fence_complete(fence, NULL);
222 bool i915_sw_fence_await(struct i915_sw_fence *fence)
227 * It is only safe to add a new await to the fence while it has
230 pending = atomic_read(&fence->pending);
234 } while (!atomic_try_cmpxchg(&fence->pending, &pending, pending + 1));
239 void __i915_sw_fence_init(struct i915_sw_fence *fence,
244 __init_waitqueue_head(&fence->wait, name, key);
245 fence->fn = fn;
247 fence->flags = 0;
250 i915_sw_fence_reinit(fence);
253 void i915_sw_fence_reinit(struct i915_sw_fence *fence)
255 debug_fence_init(fence);
257 atomic_set(&fence->pending, 1);
258 fence->error = 0;
260 I915_SW_FENCE_BUG_ON(!list_empty(&fence->wait.head));
263 void i915_sw_fence_commit(struct i915_sw_fence *fence)
265 debug_fence_activate(fence);
266 i915_sw_fence_complete(fence);
282 static bool __i915_sw_fence_check_if_after(struct i915_sw_fence *fence,
287 if (__test_and_set_bit(I915_SW_FENCE_CHECKED_BIT, &fence->flags))
290 if (fence == signaler)
293 list_for_each_entry(wq, &fence->wait.head, entry) {
304 static void __i915_sw_fence_clear_checked_bit(struct i915_sw_fence *fence)
308 if (!__test_and_clear_bit(I915_SW_FENCE_CHECKED_BIT, &fence->flags))
311 list_for_each_entry(wq, &fence->wait.head, entry) {
319 static bool i915_sw_fence_check_if_after(struct i915_sw_fence *fence,
326 err = __i915_sw_fence_check_if_after(fence, signaler);
327 __i915_sw_fence_clear_checked_bit(fence);
333 static bool i915_sw_fence_check_if_after(struct i915_sw_fence *fence,
340 static int __i915_sw_fence_await_sw_fence(struct i915_sw_fence *fence,
347 debug_fence_assert(fence);
351 i915_sw_fence_set_error_once(fence, signaler->error);
358 if (unlikely(i915_sw_fence_check_if_after(fence, signaler)))
369 i915_sw_fence_set_error_once(fence, signaler->error);
379 wq->private = fence;
381 i915_sw_fence_await(fence);
396 int i915_sw_fence_await_sw_fence(struct i915_sw_fence *fence,
400 return __i915_sw_fence_await_sw_fence(fence, signaler, wq, 0);
403 int i915_sw_fence_await_sw_fence_gfp(struct i915_sw_fence *fence,
407 return __i915_sw_fence_await_sw_fence(fence, signaler, NULL, gfp);
423 i915_sw_fence_set_error_once(cb->fence, dma->error);
424 i915_sw_fence_complete(cb->fence);
431 struct i915_sw_fence *fence;
433 fence = xchg(&cb->base.fence, NULL);
434 if (!fence)
437 pr_notice("Asynchronous wait on fence %s:%s:%llx timed out (hint:%ps)\n",
441 i915_sw_fence_debug_hint(fence));
443 i915_sw_fence_set_error_once(fence, -ETIMEDOUT);
444 i915_sw_fence_complete(fence);
452 struct i915_sw_fence *fence;
454 fence = xchg(&cb->base.fence, NULL);
455 if (fence) {
456 i915_sw_fence_set_error_once(fence, dma->error);
457 i915_sw_fence_complete(fence);
474 int i915_sw_fence_await_dma_fence(struct i915_sw_fence *fence,
483 debug_fence_assert(fence);
487 i915_sw_fence_set_error_once(fence, dma->error);
503 i915_sw_fence_set_error_once(fence, dma->error);
507 cb->fence = fence;
508 i915_sw_fence_await(fence);
535 if (ret == -ENOENT) /* fence already signaled */
547 i915_sw_fence_set_error_once(cb->fence, dma->error);
548 i915_sw_fence_complete(cb->fence);
551 int __i915_sw_fence_await_dma_fence(struct i915_sw_fence *fence,
557 debug_fence_assert(fence);
560 i915_sw_fence_set_error_once(fence, dma->error);
564 cb->fence = fence;
565 i915_sw_fence_await(fence);
569 /* fence already signaled */
577 int i915_sw_fence_await_reservation(struct i915_sw_fence *fence,
587 debug_fence_assert(fence);
592 pending = i915_sw_fence_await_dma_fence(fence, f, timeout,