[PATCH 1/2] sw-fence-completion
Chris Wilson
chris at chris-wilson.co.uk
Wed Jun 7 22:11:35 UTC 2017
---
drivers/gpu/drm/i915/i915_sw_fence.c | 41 ++++++++++++++++++++++++++++++++++++
drivers/gpu/drm/i915/i915_sw_fence.h | 3 +++
2 files changed, 44 insertions(+)
diff --git a/drivers/gpu/drm/i915/i915_sw_fence.c b/drivers/gpu/drm/i915/i915_sw_fence.c
index 474d23c0c0ce..dd709f0a00ec 100644
--- a/drivers/gpu/drm/i915/i915_sw_fence.c
+++ b/drivers/gpu/drm/i915/i915_sw_fence.c
@@ -7,6 +7,7 @@
* of the License.
*/
+#include <linux/completion.h>
#include <linux/slab.h>
#include <linux/dma-fence.h>
#include <linux/reservation.h>
@@ -492,6 +493,46 @@ int i915_sw_fence_await_reservation(struct i915_sw_fence *fence,
return ret;
}
+int i915_sw_fence_await_completion(struct i915_sw_fence *fence,
+ struct completion *x,
+ gfp_t gfp)
+{
+ wait_queue_t *wq;
+ unsigned long flags;
+ int pending;
+
+ if (completion_done(x))
+ return 0;
+
+ wq = kmalloc(sizeof(*wq), gfp);
+ if (unlikely(!wq)) {
+ if (!gfpflags_allow_blocking(gfp))
+ return -ENOMEM;
+
+ wait_for_completion(x);
+ return 0;
+ }
+
+ INIT_LIST_HEAD(&wq->task_list);
+ wq->flags = 0;
+ wq->func = i915_sw_fence_wake;
+ wq->private = fence;
+
+ i915_sw_fence_await(fence);
+
+ spin_lock_irqsave(&x->wait.lock, flags);
+ if (likely(!READ_ONCE(x->done))) {
+ __add_wait_queue_tail(&x->wait, wq);
+ pending = 1;
+ } else {
+ i915_sw_fence_wake(wq, 0, 0, NULL);
+ pending = 0;
+ }
+ spin_unlock_irqrestore(&x->wait.lock, flags);
+
+ return pending;
+}
+
#if IS_ENABLED(CONFIG_DRM_I915_SELFTEST)
#include "selftests/i915_sw_fence.c"
#endif
diff --git a/drivers/gpu/drm/i915/i915_sw_fence.h b/drivers/gpu/drm/i915/i915_sw_fence.h
index 1d3b6051daaf..92832a07b8ee 100644
--- a/drivers/gpu/drm/i915/i915_sw_fence.h
+++ b/drivers/gpu/drm/i915/i915_sw_fence.h
@@ -69,6 +69,9 @@ int i915_sw_fence_await_sw_fence(struct i915_sw_fence *fence,
int i915_sw_fence_await_sw_fence_gfp(struct i915_sw_fence *fence,
struct i915_sw_fence *after,
gfp_t gfp);
+int i915_sw_fence_await_completion(struct i915_sw_fence *fence,
+ struct completion *x,
+ gfp_t gfp);
int i915_sw_fence_await_dma_fence(struct i915_sw_fence *fence,
struct dma_fence *dma,
unsigned long timeout,
--
2.11.0
More information about the Intel-gfx-trybot
mailing list