[PATCH 26/27] ctx-acq
Chris Wilson
chris at chris-wilson.co.uk
Tue Jul 7 23:56:16 UTC 2020
---
drivers/gpu/drm/i915/gt/intel_context.c | 112 +++++++++++++++++++++--
drivers/gpu/drm/i915/gt/intel_ring.c | 7 +-
drivers/gpu/drm/i915/gt/intel_timeline.c | 2 +-
3 files changed, 110 insertions(+), 11 deletions(-)
diff --git a/drivers/gpu/drm/i915/gt/intel_context.c b/drivers/gpu/drm/i915/gt/intel_context.c
index 52db2bde44a3..0fcac75c3126 100644
--- a/drivers/gpu/drm/i915/gt/intel_context.c
+++ b/drivers/gpu/drm/i915/gt/intel_context.c
@@ -6,6 +6,7 @@
#include "gem/i915_gem_context.h"
#include "gem/i915_gem_pm.h"
+#include "mm/i915_acquire_ctx.h"
#include "i915_drv.h"
#include "i915_globals.h"
@@ -93,6 +94,27 @@ static void intel_context_active_release(struct intel_context *ce)
i915_active_release(&ce->active);
}
+static int __intel_context_sync(struct intel_context *ce)
+{
+ int err;
+
+ err = i915_vma_wait_for_bind(ce->ring->vma);
+ if (err)
+ return err;
+
+ err = i915_vma_wait_for_bind(ce->timeline->hwsp_ggtt);
+ if (err)
+ return err;
+
+ if (ce->state) {
+ err = i915_vma_wait_for_bind(ce->state);
+ if (err)
+ return err;
+ }
+
+ return 0;
+}
+
int __intel_context_do_pin(struct intel_context *ce)
{
int err;
@@ -118,6 +140,10 @@ int __intel_context_do_pin(struct intel_context *ce)
}
if (likely(!atomic_add_unless(&ce->pin_count, 1, 0))) {
+ err = __intel_context_sync(ce);
+ if (unlikely(err))
+ goto out_unlock;
+
err = intel_context_active_acquire(ce);
if (unlikely(err))
goto out_unlock;
@@ -171,7 +197,7 @@ static int __context_pin_state(struct i915_vma *vma)
unsigned int bias = i915_ggtt_pin_bias(vma) | PIN_OFFSET_BIAS;
int err;
- err = i915_ggtt_pin(vma, 0, bias | PIN_HIGH);
+ err = i915_ggtt_pin_locked(vma, 0, bias | PIN_HIGH);
if (err)
return err;
@@ -244,18 +270,58 @@ static void __intel_context_retire(struct i915_active *active)
intel_context_put(ce);
}
-static int __intel_context_active(struct i915_active *active)
+static int
+__intel_ring_acquire_lock(struct intel_ring *ring,
+ struct i915_acquire_ctx *ctx)
+{
+ return i915_acquire_ctx_lock(ctx, ring->vma->obj);
+}
+
+static int
+__intel_timeline_acquire_lock(struct intel_timeline *tl,
+ struct i915_acquire_ctx *ctx)
+{
+ return i915_acquire_ctx_lock(ctx, tl->hwsp_ggtt->obj);
+}
+
+static int
+__intel_context_acquire_lock(struct intel_context *ce,
+ struct i915_acquire_ctx *ctx)
+{
+ return i915_acquire_ctx_lock(ctx, ce->state->obj);
+}
+
+static int
+intel_context_acquire_lock(struct intel_context *ce,
+ struct i915_acquire_ctx *ctx)
{
- struct intel_context *ce = container_of(active, typeof(*ce), active);
int err;
- CE_TRACE(ce, "active\n");
+ err = __intel_ring_acquire_lock(ce->ring, ctx);
+ if (err)
+ return err;
- intel_context_get(ce);
+ if (ce->state) {
+ err = __intel_context_acquire_lock(ce, ctx);
+ if (err)
+ return err;
+ }
+
+ /* Note that the timeline will migrate as the seqno wrap around */
+ err = __intel_timeline_acquire_lock(ce->timeline, ctx);
+ if (err)
+ return err;
+
+ return 0;
+}
+
+static int intel_context_active_locked(struct intel_context *ce)
+{
+ int err;
err = __ring_active(ce->ring);
if (err)
- goto err_put;
+ return err;
err = intel_timeline_pin(ce->timeline);
if (err)
@@ -274,7 +340,39 @@ static int __intel_context_active(struct i915_active *active)
intel_timeline_unpin(ce->timeline);
err_ring:
__ring_retire(ce->ring);
-err_put:
+ return err;
+}
+
+static int __intel_context_active(struct i915_active *active)
+{
+ struct intel_context *ce = container_of(active, typeof(*ce), active);
+ struct i915_acquire_ctx acquire;
+ int err;
+
+ CE_TRACE(ce, "active\n");
+
+ intel_context_get(ce);
+ i915_acquire_ctx_init(&acquire);
+
+ err = intel_context_acquire_lock(ce, &acquire);
+ if (err)
+ goto err;
+
+ err = i915_acquire_mm(&acquire);
+ if (err)
+ goto err;
+
+ i915_acquire_ctx_done(&acquire);
+
+ err = intel_context_active_locked(ce);
+ if (err)
+ goto err;
+
+ i915_acquire_ctx_fini(&acquire);
+ return 0;
+
+err:
+ i915_acquire_ctx_fini(&acquire);
intel_context_put(ce);
return err;
}
diff --git a/drivers/gpu/drm/i915/gt/intel_ring.c b/drivers/gpu/drm/i915/gt/intel_ring.c
index bdb324167ef3..9f4aa2a98fdc 100644
--- a/drivers/gpu/drm/i915/gt/intel_ring.c
+++ b/drivers/gpu/drm/i915/gt/intel_ring.c
@@ -24,6 +24,7 @@ unsigned int intel_ring_update_space(struct intel_ring *ring)
int intel_ring_pin(struct intel_ring *ring)
{
struct i915_vma *vma = ring->vma;
+ enum i915_map_type type;
unsigned int flags;
void *addr;
int ret;
@@ -39,15 +40,15 @@ int intel_ring_pin(struct intel_ring *ring)
else
flags |= PIN_HIGH;
- ret = i915_ggtt_pin(vma, 0, flags);
+ ret = i915_ggtt_pin_locked(vma, 0, flags);
if (unlikely(ret))
goto err_unpin;
+ type = i915_coherent_map_type(vma->vm->i915);
if (i915_vma_is_map_and_fenceable(vma))
addr = (void __force *)i915_vma_pin_iomap(vma);
else
- addr = i915_gem_object_pin_map(vma->obj,
- i915_coherent_map_type(vma->vm->i915));
+ addr = __i915_gem_object_pin_map_locked(vma->obj, type);
if (IS_ERR(addr)) {
ret = PTR_ERR(addr);
goto err_ring;
diff --git a/drivers/gpu/drm/i915/gt/intel_timeline.c b/drivers/gpu/drm/i915/gt/intel_timeline.c
index e4a5326633b8..44976025c4b3 100644
--- a/drivers/gpu/drm/i915/gt/intel_timeline.c
+++ b/drivers/gpu/drm/i915/gt/intel_timeline.c
@@ -320,7 +320,7 @@ int intel_timeline_pin(struct intel_timeline *tl)
if (atomic_add_unless(&tl->pin_count, 1, 0))
return 0;
- err = i915_ggtt_pin(tl->hwsp_ggtt, 0, PIN_HIGH);
+ err = i915_ggtt_pin_locked(tl->hwsp_ggtt, 0, PIN_HIGH);
if (err)
return err;
--
2.20.1
More information about the Intel-gfx-trybot
mailing list