Intel-GFX Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
To: intel-gfx@lists.freedesktop.org
Cc: "Thomas Hellström" <thomas.hellstrom@linux.intel.com>
Subject: [Intel-gfx] [PATCH v5 18/63] drm/i915: Populate logical context during first pin.
Date: Wed, 25 Nov 2020 11:39:26 +0100	[thread overview]
Message-ID: <20201125104011.606641-19-maarten.lankhorst@linux.intel.com> (raw)
In-Reply-To: <20201125104011.606641-1-maarten.lankhorst@linux.intel.com>

This allows us to remove pin_map from state allocation, which saves
us a few retry loops. We won't need this until first pin, anyway.

Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Reviewed-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
---
 drivers/gpu/drm/i915/gt/intel_context_types.h |  13 ++-
 drivers/gpu/drm/i915/gt/intel_lrc.c           | 107 +++++++++---------
 2 files changed, 62 insertions(+), 58 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/intel_context_types.h b/drivers/gpu/drm/i915/gt/intel_context_types.h
index 552cb57a2e8c..bebf52868563 100644
--- a/drivers/gpu/drm/i915/gt/intel_context_types.h
+++ b/drivers/gpu/drm/i915/gt/intel_context_types.h
@@ -64,12 +64,13 @@ struct intel_context {
 	unsigned long flags;
 #define CONTEXT_BARRIER_BIT		0
 #define CONTEXT_ALLOC_BIT		1
-#define CONTEXT_VALID_BIT		2
-#define CONTEXT_CLOSED_BIT		3
-#define CONTEXT_USE_SEMAPHORES		4
-#define CONTEXT_BANNED			5
-#define CONTEXT_FORCE_SINGLE_SUBMISSION	6
-#define CONTEXT_NOPREEMPT		7
+#define CONTEXT_INIT_BIT		2
+#define CONTEXT_VALID_BIT		3
+#define CONTEXT_CLOSED_BIT		4
+#define CONTEXT_USE_SEMAPHORES		5
+#define CONTEXT_BANNED			6
+#define CONTEXT_FORCE_SINGLE_SUBMISSION	7
+#define CONTEXT_NOPREEMPT		8
 
 	u32 *lrc_reg_state;
 	union {
diff --git a/drivers/gpu/drm/i915/gt/intel_lrc.c b/drivers/gpu/drm/i915/gt/intel_lrc.c
index c5c50ee835dd..821f419d3108 100644
--- a/drivers/gpu/drm/i915/gt/intel_lrc.c
+++ b/drivers/gpu/drm/i915/gt/intel_lrc.c
@@ -3524,9 +3524,39 @@ __execlists_update_reg_state(const struct intel_context *ce,
 	}
 }
 
+static void populate_lr_context(struct intel_context *ce,
+				struct intel_engine_cs *engine,
+				void *vaddr)
+{
+	bool inhibit = true;
+	struct drm_i915_gem_object *ctx_obj = ce->state->obj;
+
+	set_redzone(vaddr, engine);
+
+	if (engine->default_state) {
+		shmem_read(engine->default_state, 0,
+			   vaddr, engine->context_size);
+		__set_bit(CONTEXT_VALID_BIT, &ce->flags);
+		inhibit = false;
+	}
+
+	/* Clear the ppHWSP (inc. per-context counters) */
+	memset(vaddr, 0, PAGE_SIZE);
+
+	/*
+	 * The second page of the context object contains some registers which
+	 * must be set up prior to the first execution.
+	 */
+	execlists_init_reg_state(vaddr + LRC_STATE_OFFSET,
+				 ce, engine, ce->ring, inhibit);
+
+	__i915_gem_object_flush_map(ctx_obj, 0, engine->context_size);
+}
+
 static int
-execlists_context_pre_pin(struct intel_context *ce,
-			  struct i915_gem_ww_ctx *ww, void **vaddr)
+__execlists_context_pre_pin(struct intel_context *ce,
+			    struct intel_engine_cs *engine,
+			    struct i915_gem_ww_ctx *ww, void **vaddr)
 {
 	GEM_BUG_ON(!ce->state);
 	GEM_BUG_ON(!i915_vma_is_pinned(ce->state));
@@ -3534,8 +3564,20 @@ execlists_context_pre_pin(struct intel_context *ce,
 	*vaddr = i915_gem_object_pin_map(ce->state->obj,
 					i915_coherent_map_type(ce->engine->i915) |
 					I915_MAP_OVERRIDE);
+	if (IS_ERR(*vaddr))
+		return PTR_ERR(*vaddr);
+
+	if (!__test_and_set_bit(CONTEXT_INIT_BIT, &ce->flags))
+		populate_lr_context(ce, engine, *vaddr);
+
+	return 0;
+}
 
-	return PTR_ERR_OR_ZERO(*vaddr);
+static int
+execlists_context_pre_pin(struct intel_context *ce,
+			  struct i915_gem_ww_ctx *ww, void **vaddr)
+{
+	return __execlists_context_pre_pin(ce, ce->engine, ww, vaddr);
 }
 
 static int
@@ -5343,45 +5385,6 @@ static void execlists_init_reg_state(u32 *regs,
 	__reset_stop_ring(regs, engine);
 }
 
-static int
-populate_lr_context(struct intel_context *ce,
-		    struct drm_i915_gem_object *ctx_obj,
-		    struct intel_engine_cs *engine,
-		    struct intel_ring *ring)
-{
-	bool inhibit = true;
-	void *vaddr;
-
-	vaddr = i915_gem_object_pin_map(ctx_obj, I915_MAP_WB);
-	if (IS_ERR(vaddr)) {
-		drm_dbg(&engine->i915->drm, "Could not map object pages!\n");
-		return PTR_ERR(vaddr);
-	}
-
-	set_redzone(vaddr, engine);
-
-	if (engine->default_state) {
-		shmem_read(engine->default_state, 0,
-			   vaddr, engine->context_size);
-		__set_bit(CONTEXT_VALID_BIT, &ce->flags);
-		inhibit = false;
-	}
-
-	/* Clear the ppHWSP (inc. per-context counters) */
-	memset(vaddr, 0, PAGE_SIZE);
-
-	/*
-	 * The second page of the context object contains some registers which
-	 * must be set up prior to the first execution.
-	 */
-	execlists_init_reg_state(vaddr + LRC_STATE_OFFSET,
-				 ce, engine, ring, inhibit);
-
-	__i915_gem_object_flush_map(ctx_obj, 0, engine->context_size);
-	i915_gem_object_unpin_map(ctx_obj);
-	return 0;
-}
-
 static struct intel_timeline *pinned_timeline(struct intel_context *ce)
 {
 	struct intel_timeline *tl = fetch_and_zero(&ce->timeline);
@@ -5445,20 +5448,11 @@ static int __execlists_context_alloc(struct intel_context *ce,
 		goto error_deref_obj;
 	}
 
-	ret = populate_lr_context(ce, ctx_obj, engine, ring);
-	if (ret) {
-		drm_dbg(&engine->i915->drm,
-			"Failed to populate LRC: %d\n", ret);
-		goto error_ring_free;
-	}
-
 	ce->ring = ring;
 	ce->state = vma;
 
 	return 0;
 
-error_ring_free:
-	intel_ring_put(ring);
 error_deref_obj:
 	i915_gem_object_put(ctx_obj);
 	return ret;
@@ -5582,6 +5576,15 @@ static int virtual_context_alloc(struct intel_context *ce)
 	return __execlists_context_alloc(ce, ve->siblings[0]);
 }
 
+static int
+virtual_context_pre_pin(struct intel_context *ce,
+			  struct i915_gem_ww_ctx *ww, void **vaddr)
+{
+	struct virtual_engine *ve = container_of(ce, typeof(*ve), context);
+
+	return __execlists_context_pre_pin(ce, ve->siblings[0], ww, vaddr);
+}
+
 static int virtual_context_pin(struct intel_context *ce, void *vaddr)
 {
 	struct virtual_engine *ve = container_of(ce, typeof(*ve), context);
@@ -5615,7 +5618,7 @@ static void virtual_context_exit(struct intel_context *ce)
 static const struct intel_context_ops virtual_context_ops = {
 	.alloc = virtual_context_alloc,
 
-	.pre_pin = execlists_context_pre_pin,
+	.pre_pin = virtual_context_pre_pin,
 	.pin = virtual_context_pin,
 	.unpin = execlists_context_unpin,
 	.post_unpin = execlists_context_post_unpin,
-- 
2.29.2.222.g5d2a92d10f8

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

  parent reply	other threads:[~2020-11-25 10:40 UTC|newest]

Thread overview: 71+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-11-25 10:39 [Intel-gfx] [PATCH v5 00/63] drm/i915: Remove obj->mm.lock! Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 01/63] drm/i915: Do not share hwsp across contexts any more, v6 Maarten Lankhorst
2020-11-25 10:44   ` Chris Wilson
2020-11-27 10:06     ` Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 02/63] drm/i915: Pin timeline map after first timeline pin, v3 Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 03/63] drm/i915: Move cmd parser pinning to execbuffer Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 04/63] drm/i915: Add missing -EDEADLK handling to execbuf pinning, v2 Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 05/63] drm/i915: Ensure we hold the object mutex in pin correctly Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 06/63] drm/i915: Add gem object locking to madvise Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 07/63] drm/i915: Move HAS_STRUCT_PAGE to obj->flags Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 08/63] drm/i915: Rework struct phys attachment handling Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 09/63] drm/i915: Convert i915_gem_object_attach_phys() to ww locking, v2 Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 10/63] drm/i915: make lockdep slightly happier about execbuf Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 11/63] drm/i915: Disable userptr pread/pwrite support Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 12/63] drm/i915: No longer allow exporting userptr through dma-buf Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 13/63] drm/i915: Reject more ioctls for userptr Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 14/63] drm/i915: Reject UNSYNCHRONIZED for userptr, v2 Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 15/63] drm/i915: Make compilation of userptr code depend on MMU_NOTIFIER Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 16/63] drm/i915: Fix userptr so we do not have to worry about obj->mm.lock, v5 Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 17/63] drm/i915: Flatten obj->mm.lock Maarten Lankhorst
2020-11-25 10:39 ` Maarten Lankhorst [this message]
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 19/63] drm/i915: Make ring submission compatible with obj->mm.lock removal, v2 Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 20/63] drm/i915: Handle ww locking in init_status_page Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 21/63] drm/i915: Rework clflush to work correctly without obj->mm.lock Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 22/63] drm/i915: Pass ww ctx to intel_pin_to_display_plane Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 23/63] drm/i915: Add object locking to vm_fault_cpu Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 24/63] drm/i915: Move pinning to inside engine_wa_list_verify() Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 25/63] drm/i915: Take reservation lock around i915_vma_pin Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 26/63] drm/i915: Make intel_init_workaround_bb more compatible with ww locking Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 27/63] drm/i915: Make __engine_unpark() " Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 28/63] drm/i915: Take obj lock around set_domain ioctl Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 29/63] drm/i915: Defer pin calls in buffer pool until first use by caller Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 30/63] drm/i915: Fix pread/pwrite to work with new locking rules Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 31/63] drm/i915: Fix workarounds selftest, part 1 Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 32/63] drm/i915: Prepare for obj->mm.lock removal Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 33/63] drm/i915: Add igt_spinner_pin() to allow for ww locking around spinner Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 34/63] drm/i915: Add ww locking around vm_access() Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 35/63] drm/i915: Increase ww locking for perf Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 36/63] drm/i915: Lock ww in ucode objects correctly Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 37/63] drm/i915: Add ww locking to dma-buf ops Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 38/63] drm/i915: Add missing ww lock in intel_dsb_prepare Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 39/63] drm/i915: Fix ww locking in shmem_create_from_object Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 40/63] drm/i915: Use a single page table lock for each gtt Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 41/63] drm/i915/selftests: Prepare huge_pages testcases for obj->mm.lock removal Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 42/63] drm/i915/selftests: Prepare client blit " Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 43/63] drm/i915/selftests: Prepare coherency tests " Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 44/63] drm/i915/selftests: Prepare context " Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 45/63] drm/i915/selftests: Prepare dma-buf " Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 46/63] drm/i915/selftests: Prepare execbuf " Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 47/63] drm/i915/selftests: Prepare mman testcases " Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 48/63] drm/i915/selftests: Prepare object tests " Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 49/63] drm/i915/selftests: Prepare object blit " Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 50/63] drm/i915/selftests: Prepare igt_gem_utils " Maarten Lankhorst
2020-11-25 10:39 ` [Intel-gfx] [PATCH v5 51/63] drm/i915/selftests: Prepare context selftest " Maarten Lankhorst
2020-11-25 10:40 ` [Intel-gfx] [PATCH v5 52/63] drm/i915/selftests: Prepare hangcheck " Maarten Lankhorst
2020-11-25 10:40 ` [Intel-gfx] [PATCH v5 53/63] drm/i915/selftests: Prepare execlists " Maarten Lankhorst
2020-11-25 10:40 ` [Intel-gfx] [PATCH v5 54/63] drm/i915/selftests: Prepare mocs tests " Maarten Lankhorst
2020-11-25 10:40 ` [Intel-gfx] [PATCH v5 55/63] drm/i915/selftests: Prepare ring submission " Maarten Lankhorst
2020-11-25 10:40 ` [Intel-gfx] [PATCH v5 56/63] drm/i915/selftests: Prepare timeline tests " Maarten Lankhorst
2020-11-25 10:40 ` [Intel-gfx] [PATCH v5 57/63] drm/i915/selftests: Prepare i915_request " Maarten Lankhorst
2020-11-25 10:40 ` [Intel-gfx] [PATCH v5 58/63] drm/i915/selftests: Prepare memory region " Maarten Lankhorst
2020-11-25 10:40 ` [Intel-gfx] [PATCH v5 59/63] drm/i915/selftests: Prepare cs engine " Maarten Lankhorst
2020-11-25 10:40 ` [Intel-gfx] [PATCH v5 60/63] drm/i915/selftests: Prepare gtt " Maarten Lankhorst
2020-11-25 10:40 ` [Intel-gfx] [PATCH v5 61/63] drm/i915: Finally remove obj->mm.lock Maarten Lankhorst
2020-11-25 10:40 ` [Intel-gfx] [PATCH v5 62/63] drm/i915: Keep userpointer bindings if seqcount is unchanged, v2 Maarten Lankhorst
2020-11-25 10:40 ` [Intel-gfx] [PATCH v5 63/63] drm/i915: Move gt_revoke() slightly Maarten Lankhorst
2020-11-25 12:30 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for drm/i915: Remove obj->mm.lock! (rev11) Patchwork
2020-11-25 12:31 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork
2020-11-25 12:34 ` [Intel-gfx] ✗ Fi.CI.DOCS: " Patchwork
2020-11-25 13:00 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork
2020-11-25 14:49 ` [Intel-gfx] ✗ Fi.CI.IGT: failure " Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20201125104011.606641-19-maarten.lankhorst@linux.intel.com \
    --to=maarten.lankhorst@linux.intel.com \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=thomas.hellstrom@linux.intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox