All of lore.kernel.org
 help / color / mirror / Atom feed
* [Intel-gfx] [PATCH 0/4] drm/i915: Propagate ww parameter to get_pages().
@ 2021-04-29 10:10 Maarten Lankhorst
  2021-04-29 10:10 ` [Intel-gfx] [PATCH 1/4] drm/i915: Add ww parameter to get_pages() callback Maarten Lankhorst
                   ` (5 more replies)
  0 siblings, 6 replies; 15+ messages in thread
From: Maarten Lankhorst @ 2021-04-29 10:10 UTC (permalink / raw)
  To: intel-gfx

For TTM eviction we may need to retrieve the ww parameter, to ensure we
can lock extra objects while evicting. Pass along the
struct i915_gem_ww_ctx, so this can be done.

Maarten Lankhorst (4):
  drm/i915: Add ww parameter to get_pages() callback
  drm/i915: Add ww context to prepare_(read/write)
  drm/i915: Pass ww ctx to pin_map, v2.
  drm/i915: Pass ww ctx to i915_gem_object_pin_pages, v2.

 drivers/gpu/drm/i915/display/intel_display.c  |  2 +-
 drivers/gpu/drm/i915/gem/i915_gem_clflush.c   |  2 +-
 drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c    | 11 ++--
 drivers/gpu/drm/i915/gem/i915_gem_domain.c    | 50 ++++++++++++-------
 .../gpu/drm/i915/gem/i915_gem_execbuffer.c    | 18 ++++---
 drivers/gpu/drm/i915/gem/i915_gem_internal.c  |  3 +-
 drivers/gpu/drm/i915/gem/i915_gem_mman.c      | 21 +++++---
 drivers/gpu/drm/i915/gem/i915_gem_object.h    | 23 ++++++---
 .../gpu/drm/i915/gem/i915_gem_object_blt.c    |  4 +-
 .../gpu/drm/i915/gem/i915_gem_object_types.h  |  3 +-
 drivers/gpu/drm/i915/gem/i915_gem_pages.c     | 38 ++++++++++----
 drivers/gpu/drm/i915/gem/i915_gem_region.c    |  3 +-
 drivers/gpu/drm/i915/gem/i915_gem_region.h    |  4 +-
 drivers/gpu/drm/i915/gem/i915_gem_shmem.c     |  3 +-
 drivers/gpu/drm/i915/gem/i915_gem_stolen.c    |  5 +-
 drivers/gpu/drm/i915/gem/i915_gem_userptr.c   |  7 +--
 .../drm/i915/gem/selftests/huge_gem_object.c  |  3 +-
 .../gpu/drm/i915/gem/selftests/huge_pages.c   | 13 +++--
 .../i915/gem/selftests/i915_gem_client_blt.c  |  2 +-
 .../i915/gem/selftests/i915_gem_coherency.c   | 14 +++---
 .../drm/i915/gem/selftests/i915_gem_context.c | 16 +++---
 .../drm/i915/gem/selftests/i915_gem_dmabuf.c  |  2 +-
 .../drm/i915/gem/selftests/i915_gem_mman.c    |  4 +-
 .../drm/i915/gem/selftests/i915_gem_phys.c    |  2 +-
 drivers/gpu/drm/i915/gt/gen7_renderclear.c    |  2 +-
 drivers/gpu/drm/i915/gt/intel_engine_cs.c     |  2 +-
 drivers/gpu/drm/i915/gt/intel_engine_pm.c     |  2 +-
 drivers/gpu/drm/i915/gt/intel_gtt.c           |  2 +-
 drivers/gpu/drm/i915/gt/intel_lrc.c           |  4 +-
 drivers/gpu/drm/i915/gt/intel_renderstate.c   |  2 +-
 drivers/gpu/drm/i915/gt/intel_ring.c          |  2 +-
 .../gpu/drm/i915/gt/intel_ring_submission.c   |  2 +-
 drivers/gpu/drm/i915/gt/intel_timeline.c      |  7 +--
 drivers/gpu/drm/i915/gt/intel_timeline.h      |  3 +-
 drivers/gpu/drm/i915/gt/intel_workarounds.c   |  2 +-
 drivers/gpu/drm/i915/gt/mock_engine.c         |  2 +-
 drivers/gpu/drm/i915/gt/selftest_lrc.c        |  2 +-
 drivers/gpu/drm/i915/gt/selftest_rps.c        | 10 ++--
 .../gpu/drm/i915/gt/selftest_workarounds.c    |  8 +--
 drivers/gpu/drm/i915/gvt/cmd_parser.c         |  6 +--
 drivers/gpu/drm/i915/gvt/dmabuf.c             |  3 +-
 drivers/gpu/drm/i915/i915_gem.c               | 12 ++---
 drivers/gpu/drm/i915/i915_perf.c              |  4 +-
 drivers/gpu/drm/i915/i915_vma.c               |  7 +--
 drivers/gpu/drm/i915/selftests/i915_gem_gtt.c |  3 +-
 drivers/gpu/drm/i915/selftests/i915_vma.c     |  2 +-
 drivers/gpu/drm/i915/selftests/igt_spinner.c  |  2 +-
 .../drm/i915/selftests/intel_memory_region.c  |  2 +-
 48 files changed, 205 insertions(+), 141 deletions(-)

-- 
2.31.0

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

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [Intel-gfx] [PATCH 1/4] drm/i915: Add ww parameter to get_pages() callback
  2021-04-29 10:10 [Intel-gfx] [PATCH 0/4] drm/i915: Propagate ww parameter to get_pages() Maarten Lankhorst
@ 2021-04-29 10:10 ` Maarten Lankhorst
  2021-04-29 13:21   ` Matthew Auld
  2021-04-29 10:10 ` [Intel-gfx] [PATCH 2/4] drm/i915: Add ww context to prepare_(read/write) Maarten Lankhorst
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 15+ messages in thread
From: Maarten Lankhorst @ 2021-04-29 10:10 UTC (permalink / raw)
  To: intel-gfx

We will need this to support eviction with lmem, so
explicitly pass ww as a parameter.

Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
---
 drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c           | 3 ++-
 drivers/gpu/drm/i915/gem/i915_gem_internal.c         | 3 ++-
 drivers/gpu/drm/i915/gem/i915_gem_object_types.h     | 3 ++-
 drivers/gpu/drm/i915/gem/i915_gem_pages.c            | 2 +-
 drivers/gpu/drm/i915/gem/i915_gem_region.c           | 3 ++-
 drivers/gpu/drm/i915/gem/i915_gem_region.h           | 4 +++-
 drivers/gpu/drm/i915/gem/i915_gem_shmem.c            | 3 ++-
 drivers/gpu/drm/i915/gem/i915_gem_stolen.c           | 3 ++-
 drivers/gpu/drm/i915/gem/i915_gem_userptr.c          | 3 ++-
 drivers/gpu/drm/i915/gem/selftests/huge_gem_object.c | 3 ++-
 drivers/gpu/drm/i915/gem/selftests/huge_pages.c      | 9 ++++++---
 drivers/gpu/drm/i915/gvt/dmabuf.c                    | 3 ++-
 drivers/gpu/drm/i915/selftests/i915_gem_gtt.c        | 3 ++-
 13 files changed, 30 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c b/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c
index ccede73c6465..f6b8437efc39 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c
@@ -199,7 +199,8 @@ struct dma_buf *i915_gem_prime_export(struct drm_gem_object *gem_obj, int flags)
 	return drm_gem_dmabuf_export(gem_obj->dev, &exp_info);
 }
 
-static int i915_gem_object_get_pages_dmabuf(struct drm_i915_gem_object *obj)
+static int i915_gem_object_get_pages_dmabuf(struct drm_i915_gem_object *obj,
+					    struct i915_gem_ww_ctx *ww)
 {
 	struct sg_table *pages;
 	unsigned int sg_page_sizes;
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_internal.c b/drivers/gpu/drm/i915/gem/i915_gem_internal.c
index 21cc40897ca8..90777fb5f5e0 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_internal.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_internal.c
@@ -30,7 +30,8 @@ static void internal_free_pages(struct sg_table *st)
 	kfree(st);
 }
 
-static int i915_gem_object_get_pages_internal(struct drm_i915_gem_object *obj)
+static int i915_gem_object_get_pages_internal(struct drm_i915_gem_object *obj,
+					      struct i915_gem_ww_ctx *ww)
 {
 	struct drm_i915_private *i915 = to_i915(obj->base.dev);
 	struct sg_table *st;
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object_types.h b/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
index 8e485cb3343c..0b5c84931006 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
+++ b/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
@@ -50,7 +50,8 @@ struct drm_i915_gem_object_ops {
 	 * being released or under memory pressure (where we attempt to
 	 * reap pages for the shrinker).
 	 */
-	int (*get_pages)(struct drm_i915_gem_object *obj);
+	int (*get_pages)(struct drm_i915_gem_object *obj,
+			 struct i915_gem_ww_ctx *ww);
 	void (*put_pages)(struct drm_i915_gem_object *obj,
 			  struct sg_table *pages);
 	void (*truncate)(struct drm_i915_gem_object *obj);
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_pages.c b/drivers/gpu/drm/i915/gem/i915_gem_pages.c
index aed8a37ccdc9..58e222030e10 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_pages.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_pages.c
@@ -100,7 +100,7 @@ int ____i915_gem_object_get_pages(struct drm_i915_gem_object *obj)
 		return -EFAULT;
 	}
 
-	err = obj->ops->get_pages(obj);
+	err = obj->ops->get_pages(obj, NULL);
 	GEM_BUG_ON(!err && !i915_gem_object_has_pages(obj));
 
 	return err;
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_region.c b/drivers/gpu/drm/i915/gem/i915_gem_region.c
index 6a84fb6dde24..6cb8b70c19bf 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_region.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_region.c
@@ -20,7 +20,8 @@ i915_gem_object_put_pages_buddy(struct drm_i915_gem_object *obj,
 }
 
 int
-i915_gem_object_get_pages_buddy(struct drm_i915_gem_object *obj)
+i915_gem_object_get_pages_buddy(struct drm_i915_gem_object *obj,
+				struct i915_gem_ww_ctx *ww)
 {
 	const u64 max_segment = i915_sg_segment_size();
 	struct intel_memory_region *mem = obj->mm.region;
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_region.h b/drivers/gpu/drm/i915/gem/i915_gem_region.h
index ebddc86d78f7..c6f250aac925 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_region.h
+++ b/drivers/gpu/drm/i915/gem/i915_gem_region.h
@@ -9,10 +9,12 @@
 #include <linux/types.h>
 
 struct intel_memory_region;
+struct i915_gem_ww_ctx;
 struct drm_i915_gem_object;
 struct sg_table;
 
-int i915_gem_object_get_pages_buddy(struct drm_i915_gem_object *obj);
+int i915_gem_object_get_pages_buddy(struct drm_i915_gem_object *obj,
+				    struct i915_gem_ww_ctx *ww);
 void i915_gem_object_put_pages_buddy(struct drm_i915_gem_object *obj,
 				     struct sg_table *pages);
 
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_shmem.c b/drivers/gpu/drm/i915/gem/i915_gem_shmem.c
index a9bfa66c8da1..3f80a017959a 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_shmem.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_shmem.c
@@ -25,7 +25,8 @@ static void check_release_pagevec(struct pagevec *pvec)
 	cond_resched();
 }
 
-static int shmem_get_pages(struct drm_i915_gem_object *obj)
+static int shmem_get_pages(struct drm_i915_gem_object *obj,
+			   struct i915_gem_ww_ctx *ww)
 {
 	struct drm_i915_private *i915 = to_i915(obj->base.dev);
 	struct intel_memory_region *mem = obj->mm.region;
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_stolen.c b/drivers/gpu/drm/i915/gem/i915_gem_stolen.c
index e1a32672bbe8..4d2b65001eba 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_stolen.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_stolen.c
@@ -578,7 +578,8 @@ i915_pages_create_for_stolen(struct drm_device *dev,
 	return st;
 }
 
-static int i915_gem_object_get_pages_stolen(struct drm_i915_gem_object *obj)
+static int i915_gem_object_get_pages_stolen(struct drm_i915_gem_object *obj,
+					    struct i915_gem_ww_ctx *ww)
 {
 	struct sg_table *pages =
 		i915_pages_create_for_stolen(obj->base.dev,
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_userptr.c b/drivers/gpu/drm/i915/gem/i915_gem_userptr.c
index a657b99ec760..8fd22b4a3c3e 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_userptr.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_userptr.c
@@ -126,7 +126,8 @@ static void i915_gem_object_userptr_drop_ref(struct drm_i915_gem_object *obj)
 	}
 }
 
-static int i915_gem_userptr_get_pages(struct drm_i915_gem_object *obj)
+static int i915_gem_userptr_get_pages(struct drm_i915_gem_object *obj,
+				      struct i915_gem_ww_ctx *ww)
 {
 	struct drm_i915_private *i915 = to_i915(obj->base.dev);
 	const unsigned long num_pages = obj->base.size >> PAGE_SHIFT;
diff --git a/drivers/gpu/drm/i915/gem/selftests/huge_gem_object.c b/drivers/gpu/drm/i915/gem/selftests/huge_gem_object.c
index 0c8ecfdf5405..6ce237a5e38d 100644
--- a/drivers/gpu/drm/i915/gem/selftests/huge_gem_object.c
+++ b/drivers/gpu/drm/i915/gem/selftests/huge_gem_object.c
@@ -25,7 +25,8 @@ static void huge_free_pages(struct drm_i915_gem_object *obj,
 	kfree(pages);
 }
 
-static int huge_get_pages(struct drm_i915_gem_object *obj)
+static int huge_get_pages(struct drm_i915_gem_object *obj,
+			  struct i915_gem_ww_ctx *ww)
 {
 #define GFP (GFP_KERNEL | __GFP_NOWARN | __GFP_RETRY_MAYFAIL)
 	const unsigned long nreal = obj->scratch / PAGE_SIZE;
diff --git a/drivers/gpu/drm/i915/gem/selftests/huge_pages.c b/drivers/gpu/drm/i915/gem/selftests/huge_pages.c
index dadd485bc52f..b5b115005bb1 100644
--- a/drivers/gpu/drm/i915/gem/selftests/huge_pages.c
+++ b/drivers/gpu/drm/i915/gem/selftests/huge_pages.c
@@ -56,7 +56,8 @@ static void huge_pages_free_pages(struct sg_table *st)
 	kfree(st);
 }
 
-static int get_huge_pages(struct drm_i915_gem_object *obj)
+static int get_huge_pages(struct drm_i915_gem_object *obj,
+			  struct i915_gem_ww_ctx *ww)
 {
 #define GFP (GFP_KERNEL | __GFP_NOWARN | __GFP_NORETRY)
 	unsigned int page_mask = obj->mm.page_mask;
@@ -181,7 +182,8 @@ huge_pages_object(struct drm_i915_private *i915,
 	return obj;
 }
 
-static int fake_get_huge_pages(struct drm_i915_gem_object *obj)
+static int fake_get_huge_pages(struct drm_i915_gem_object *obj,
+			       struct i915_gem_ww_ctx *ww)
 {
 	struct drm_i915_private *i915 = to_i915(obj->base.dev);
 	const u64 max_len = rounddown_pow_of_two(UINT_MAX);
@@ -236,7 +238,8 @@ static int fake_get_huge_pages(struct drm_i915_gem_object *obj)
 	return 0;
 }
 
-static int fake_get_huge_pages_single(struct drm_i915_gem_object *obj)
+static int fake_get_huge_pages_single(struct drm_i915_gem_object *obj,
+				      struct i915_gem_ww_ctx *ww)
 {
 	struct drm_i915_private *i915 = to_i915(obj->base.dev);
 	struct sg_table *st;
diff --git a/drivers/gpu/drm/i915/gvt/dmabuf.c b/drivers/gpu/drm/i915/gvt/dmabuf.c
index d4f883f35b95..609257aaf711 100644
--- a/drivers/gpu/drm/i915/gvt/dmabuf.c
+++ b/drivers/gpu/drm/i915/gvt/dmabuf.c
@@ -55,7 +55,8 @@ static void vgpu_unpin_dma_address(struct intel_vgpu *vgpu,
 }
 
 static int vgpu_gem_get_pages(
-		struct drm_i915_gem_object *obj)
+		struct drm_i915_gem_object *obj,
+		struct i915_gem_ww_ctx *ww)
 {
 	struct drm_i915_private *dev_priv = to_i915(obj->base.dev);
 	struct intel_vgpu *vgpu;
diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c b/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c
index e060e455e9f6..4fe2816d0b51 100644
--- a/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c
+++ b/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c
@@ -50,7 +50,8 @@ static void fake_free_pages(struct drm_i915_gem_object *obj,
 	kfree(pages);
 }
 
-static int fake_get_pages(struct drm_i915_gem_object *obj)
+static int fake_get_pages(struct drm_i915_gem_object *obj,
+			  struct i915_gem_ww_ctx *ww)
 {
 #define GFP (GFP_KERNEL | __GFP_NOWARN | __GFP_NORETRY)
 #define PFN_BIAS 0x1000
-- 
2.31.0

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

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [Intel-gfx] [PATCH 2/4] drm/i915: Add ww context to prepare_(read/write)
  2021-04-29 10:10 [Intel-gfx] [PATCH 0/4] drm/i915: Propagate ww parameter to get_pages() Maarten Lankhorst
  2021-04-29 10:10 ` [Intel-gfx] [PATCH 1/4] drm/i915: Add ww parameter to get_pages() callback Maarten Lankhorst
@ 2021-04-29 10:10 ` Maarten Lankhorst
  2021-04-29 13:23   ` Matthew Auld
  2021-04-29 10:10 ` [Intel-gfx] [PATCH 3/4] drm/i915: Pass ww ctx to pin_map, v2 Maarten Lankhorst
                   ` (3 subsequent siblings)
  5 siblings, 1 reply; 15+ messages in thread
From: Maarten Lankhorst @ 2021-04-29 10:10 UTC (permalink / raw)
  To: intel-gfx

This will allow us to explicitly pass the ww to pin_pages, when it starts taking it.

Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
---
 drivers/gpu/drm/i915/gem/i915_gem_domain.c              | 2 ++
 drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c          | 7 ++++---
 drivers/gpu/drm/i915/gem/i915_gem_object.h              | 2 ++
 drivers/gpu/drm/i915/gem/selftests/huge_pages.c         | 2 +-
 drivers/gpu/drm/i915/gem/selftests/i915_gem_coherency.c | 4 ++--
 drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c   | 4 ++--
 drivers/gpu/drm/i915/i915_gem.c                         | 4 ++--
 7 files changed, 15 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_domain.c b/drivers/gpu/drm/i915/gem/i915_gem_domain.c
index 073822100da7..6c7d9efb319c 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_domain.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_domain.c
@@ -598,6 +598,7 @@ i915_gem_set_domain_ioctl(struct drm_device *dev, void *data,
  * flush the object from the CPU cache.
  */
 int i915_gem_object_prepare_read(struct drm_i915_gem_object *obj,
+				 struct i915_gem_ww_ctx *ww,
 				 unsigned int *needs_clflush)
 {
 	int ret;
@@ -648,6 +649,7 @@ int i915_gem_object_prepare_read(struct drm_i915_gem_object *obj,
 }
 
 int i915_gem_object_prepare_write(struct drm_i915_gem_object *obj,
+				  struct i915_gem_ww_ctx *ww,
 				  unsigned int *needs_clflush)
 {
 	int ret;
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
index 297143511f99..17a87d176a67 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
@@ -1154,9 +1154,10 @@ static void reloc_cache_reset(struct reloc_cache *cache, struct i915_execbuffer
 }
 
 static void *reloc_kmap(struct drm_i915_gem_object *obj,
-			struct reloc_cache *cache,
+			struct i915_execbuffer *eb,
 			unsigned long pageno)
 {
+	struct reloc_cache *cache = &eb->reloc_cache;
 	void *vaddr;
 	struct page *page;
 
@@ -1166,7 +1167,7 @@ static void *reloc_kmap(struct drm_i915_gem_object *obj,
 		unsigned int flushes;
 		int err;
 
-		err = i915_gem_object_prepare_write(obj, &flushes);
+		err = i915_gem_object_prepare_write(obj, &eb->ww, &flushes);
 		if (err)
 			return ERR_PTR(err);
 
@@ -1271,7 +1272,7 @@ static void *reloc_vaddr(struct drm_i915_gem_object *obj,
 		if ((cache->vaddr & KMAP) == 0)
 			vaddr = reloc_iomap(obj, eb, page);
 		if (!vaddr)
-			vaddr = reloc_kmap(obj, cache, page);
+			vaddr = reloc_kmap(obj, eb, page);
 	}
 
 	return vaddr;
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.h b/drivers/gpu/drm/i915/gem/i915_gem_object.h
index 2ebd79537aea..f7a0cf1a8f24 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_object.h
+++ b/drivers/gpu/drm/i915/gem/i915_gem_object.h
@@ -480,8 +480,10 @@ static inline void i915_gem_object_unpin_map(struct drm_i915_gem_object *obj)
 void __i915_gem_object_release_map(struct drm_i915_gem_object *obj);
 
 int i915_gem_object_prepare_read(struct drm_i915_gem_object *obj,
+				 struct i915_gem_ww_ctx *ww,
 				 unsigned int *needs_clflush);
 int i915_gem_object_prepare_write(struct drm_i915_gem_object *obj,
+				  struct i915_gem_ww_ctx *ww,
 				  unsigned int *needs_clflush);
 #define CLFLUSH_BEFORE	BIT(0)
 #define CLFLUSH_AFTER	BIT(1)
diff --git a/drivers/gpu/drm/i915/gem/selftests/huge_pages.c b/drivers/gpu/drm/i915/gem/selftests/huge_pages.c
index b5b115005bb1..67be3cf77f71 100644
--- a/drivers/gpu/drm/i915/gem/selftests/huge_pages.c
+++ b/drivers/gpu/drm/i915/gem/selftests/huge_pages.c
@@ -999,7 +999,7 @@ __cpu_check_shmem(struct drm_i915_gem_object *obj, u32 dword, u32 val)
 	int err;
 
 	i915_gem_object_lock(obj, NULL);
-	err = i915_gem_object_prepare_read(obj, &needs_flush);
+	err = i915_gem_object_prepare_read(obj, NULL, &needs_flush);
 	if (err)
 		goto err_unlock;
 
diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_coherency.c b/drivers/gpu/drm/i915/gem/selftests/i915_gem_coherency.c
index e937b6629019..ced2454cebb0 100644
--- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_coherency.c
+++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_coherency.c
@@ -29,7 +29,7 @@ static int cpu_set(struct context *ctx, unsigned long offset, u32 v)
 	int err;
 
 	i915_gem_object_lock(ctx->obj, NULL);
-	err = i915_gem_object_prepare_write(ctx->obj, &needs_clflush);
+	err = i915_gem_object_prepare_write(ctx->obj, NULL, &needs_clflush);
 	if (err)
 		goto out;
 
@@ -62,7 +62,7 @@ static int cpu_get(struct context *ctx, unsigned long offset, u32 *v)
 	int err;
 
 	i915_gem_object_lock(ctx->obj, NULL);
-	err = i915_gem_object_prepare_read(ctx->obj, &needs_clflush);
+	err = i915_gem_object_prepare_read(ctx->obj, NULL, &needs_clflush);
 	if (err)
 		goto out;
 
diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c b/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
index ce70d0a3afb2..fa1ae414348b 100644
--- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
@@ -462,7 +462,7 @@ static int cpu_fill(struct drm_i915_gem_object *obj, u32 value)
 	int err;
 
 	i915_gem_object_lock(obj, NULL);
-	err = i915_gem_object_prepare_write(obj, &need_flush);
+	err = i915_gem_object_prepare_write(obj, NULL, &need_flush);
 	if (err)
 		goto out;
 
@@ -492,7 +492,7 @@ static noinline int cpu_check(struct drm_i915_gem_object *obj,
 	int err;
 
 	i915_gem_object_lock(obj, NULL);
-	err = i915_gem_object_prepare_read(obj, &needs_flush);
+	err = i915_gem_object_prepare_read(obj, NULL, &needs_flush);
 	if (err)
 		goto out_unlock;
 
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 07da6a9342e3..3ab9a79baf34 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -227,7 +227,7 @@ i915_gem_shmem_pread(struct drm_i915_gem_object *obj,
 	if (ret)
 		goto err_unlock;
 
-	ret = i915_gem_object_prepare_read(obj, &needs_clflush);
+	ret = i915_gem_object_prepare_read(obj, NULL, &needs_clflush);
 	if (ret)
 		goto err_unpin;
 
@@ -658,7 +658,7 @@ i915_gem_shmem_pwrite(struct drm_i915_gem_object *obj,
 	if (ret)
 		goto err_unlock;
 
-	ret = i915_gem_object_prepare_write(obj, &needs_clflush);
+	ret = i915_gem_object_prepare_write(obj, NULL, &needs_clflush);
 	if (ret)
 		goto err_unpin;
 
-- 
2.31.0

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

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [Intel-gfx] [PATCH 3/4] drm/i915: Pass ww ctx to pin_map, v2.
  2021-04-29 10:10 [Intel-gfx] [PATCH 0/4] drm/i915: Propagate ww parameter to get_pages() Maarten Lankhorst
  2021-04-29 10:10 ` [Intel-gfx] [PATCH 1/4] drm/i915: Add ww parameter to get_pages() callback Maarten Lankhorst
  2021-04-29 10:10 ` [Intel-gfx] [PATCH 2/4] drm/i915: Add ww context to prepare_(read/write) Maarten Lankhorst
@ 2021-04-29 10:10 ` Maarten Lankhorst
  2021-04-29 13:28   ` Matthew Auld
  2021-04-29 14:55   ` Matthew Auld
  2021-04-29 10:10 ` [Intel-gfx] [PATCH 4/4] drm/i915: Pass ww ctx to i915_gem_object_pin_pages, v2 Maarten Lankhorst
                   ` (2 subsequent siblings)
  5 siblings, 2 replies; 15+ messages in thread
From: Maarten Lankhorst @ 2021-04-29 10:10 UTC (permalink / raw)
  To: intel-gfx

This will allow us to explicitly pass the ww to pin_pages,
when it starts taking it.

This allows us to finally kill off the explicit passing of ww
by retrieving it from the obj.

Changes since v1:
- Rename 'ret' to ptr, fix error handling of return ptr.

Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
---
 .../gpu/drm/i915/gem/i915_gem_execbuffer.c    |  7 +++---
 drivers/gpu/drm/i915/gem/i915_gem_mman.c      |  2 +-
 drivers/gpu/drm/i915/gem/i915_gem_object.h    |  1 +
 .../gpu/drm/i915/gem/i915_gem_object_blt.c    |  4 ++--
 drivers/gpu/drm/i915/gem/i915_gem_pages.c     | 24 +++++++++++++++----
 .../drm/i915/gem/selftests/i915_gem_context.c |  8 ++++---
 .../drm/i915/gem/selftests/i915_gem_dmabuf.c  |  2 +-
 drivers/gpu/drm/i915/gt/gen7_renderclear.c    |  2 +-
 drivers/gpu/drm/i915/gt/intel_engine_cs.c     |  2 +-
 drivers/gpu/drm/i915/gt/intel_engine_pm.c     |  2 +-
 drivers/gpu/drm/i915/gt/intel_gtt.c           |  2 +-
 drivers/gpu/drm/i915/gt/intel_lrc.c           |  4 ++--
 drivers/gpu/drm/i915/gt/intel_renderstate.c   |  2 +-
 drivers/gpu/drm/i915/gt/intel_ring.c          |  2 +-
 .../gpu/drm/i915/gt/intel_ring_submission.c   |  2 +-
 drivers/gpu/drm/i915/gt/intel_timeline.c      |  7 +++---
 drivers/gpu/drm/i915/gt/intel_timeline.h      |  3 ++-
 drivers/gpu/drm/i915/gt/intel_workarounds.c   |  2 +-
 drivers/gpu/drm/i915/gt/mock_engine.c         |  2 +-
 drivers/gpu/drm/i915/gt/selftest_lrc.c        |  2 +-
 drivers/gpu/drm/i915/gt/selftest_rps.c        | 10 ++++----
 .../gpu/drm/i915/gt/selftest_workarounds.c    |  6 ++---
 drivers/gpu/drm/i915/gvt/cmd_parser.c         |  4 ++--
 drivers/gpu/drm/i915/i915_perf.c              |  4 ++--
 drivers/gpu/drm/i915/selftests/igt_spinner.c  |  2 +-
 25 files changed, 63 insertions(+), 45 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
index 17a87d176a67..66d24dfbd805 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
@@ -1345,7 +1345,7 @@ static int __reloc_gpu_alloc(struct i915_execbuffer *eb,
 	if (err)
 		goto err_pool;
 
-	cmd = i915_gem_object_pin_map(pool->obj, pool->type);
+	cmd = i915_gem_object_pin_map(pool->obj, &eb->ww, pool->type);
 	if (IS_ERR(cmd)) {
 		err = PTR_ERR(cmd);
 		goto err_pool;
@@ -2494,7 +2494,8 @@ static int eb_parse_pipeline(struct i915_execbuffer *eb,
 			goto err_shadow;
 	}
 
-	pw->shadow_map = i915_gem_object_pin_map(shadow->obj, I915_MAP_WB);
+	pw->shadow_map = i915_gem_object_pin_map(shadow->obj, &eb->ww,
+						 I915_MAP_WB);
 	if (IS_ERR(pw->shadow_map)) {
 		err = PTR_ERR(pw->shadow_map);
 		goto err_trampoline;
@@ -2505,7 +2506,7 @@ static int eb_parse_pipeline(struct i915_execbuffer *eb,
 
 	pw->batch_map = ERR_PTR(-ENODEV);
 	if (needs_clflush && i915_has_memcpy_from_wc())
-		pw->batch_map = i915_gem_object_pin_map(batch, I915_MAP_WC);
+		pw->batch_map = i915_gem_object_pin_map(batch, &eb->ww, I915_MAP_WC);
 
 	if (IS_ERR(pw->batch_map)) {
 		err = i915_gem_object_pin_pages(batch);
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_mman.c b/drivers/gpu/drm/i915/gem/i915_gem_mman.c
index 8598a1c78a4c..ae2d71d76889 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_mman.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_mman.c
@@ -439,7 +439,7 @@ vm_access(struct vm_area_struct *area, unsigned long addr,
 		goto out;
 
 	/* As this is primarily for debugging, let's focus on simplicity */
-	vaddr = i915_gem_object_pin_map(obj, I915_MAP_FORCE_WC);
+	vaddr = i915_gem_object_pin_map(obj, &ww, I915_MAP_FORCE_WC);
 	if (IS_ERR(vaddr)) {
 		err = PTR_ERR(vaddr);
 		goto out;
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.h b/drivers/gpu/drm/i915/gem/i915_gem_object.h
index f7a0cf1a8f24..ed6c7421af4f 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_object.h
+++ b/drivers/gpu/drm/i915/gem/i915_gem_object.h
@@ -450,6 +450,7 @@ void i915_gem_object_writeback(struct drm_i915_gem_object *obj);
  * ERR_PTR() on error.
  */
 void *__must_check i915_gem_object_pin_map(struct drm_i915_gem_object *obj,
+					   struct i915_gem_ww_ctx *ww,
 					   enum i915_map_type type);
 
 void *__must_check i915_gem_object_pin_map_unlocked(struct drm_i915_gem_object *obj,
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object_blt.c b/drivers/gpu/drm/i915/gem/i915_gem_object_blt.c
index df8e8c18c6c9..fae18622d2da 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_object_blt.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_object_blt.c
@@ -58,7 +58,7 @@ struct i915_vma *intel_emit_vma_fill_blt(struct intel_context *ce,
 	/* we pinned the pool, mark it as such */
 	intel_gt_buffer_pool_mark_used(pool);
 
-	cmd = i915_gem_object_pin_map(pool->obj, pool->type);
+	cmd = i915_gem_object_pin_map(pool->obj, ww, pool->type);
 	if (IS_ERR(cmd)) {
 		err = PTR_ERR(cmd);
 		goto out_unpin;
@@ -283,7 +283,7 @@ struct i915_vma *intel_emit_vma_copy_blt(struct intel_context *ce,
 	/* we pinned the pool, mark it as such */
 	intel_gt_buffer_pool_mark_used(pool);
 
-	cmd = i915_gem_object_pin_map(pool->obj, pool->type);
+	cmd = i915_gem_object_pin_map(pool->obj, ww, pool->type);
 	if (IS_ERR(cmd)) {
 		err = PTR_ERR(cmd);
 		goto out_unpin;
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_pages.c b/drivers/gpu/drm/i915/gem/i915_gem_pages.c
index 58e222030e10..42e867134481 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_pages.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_pages.c
@@ -341,6 +341,7 @@ static void *i915_gem_object_map_pfn(struct drm_i915_gem_object *obj,
 
 /* get, pin, and map the pages of the object into kernel space */
 void *i915_gem_object_pin_map(struct drm_i915_gem_object *obj,
+			      struct i915_gem_ww_ctx *ww,
 			      enum i915_map_type type)
 {
 	enum i915_map_type has_type;
@@ -408,13 +409,26 @@ void *i915_gem_object_pin_map(struct drm_i915_gem_object *obj,
 void *i915_gem_object_pin_map_unlocked(struct drm_i915_gem_object *obj,
 				       enum i915_map_type type)
 {
-	void *ret;
+	struct i915_gem_ww_ctx ww;
+	void *ptr;
+	int err;
 
-	i915_gem_object_lock(obj, NULL);
-	ret = i915_gem_object_pin_map(obj, type);
-	i915_gem_object_unlock(obj);
+	i915_gem_ww_ctx_init(&ww, true);
+retry:
+	err = i915_gem_object_lock(obj, &ww);
+	if (!err) {
+		ptr = i915_gem_object_pin_map(obj, &ww, type);
+		if (IS_ERR(ptr))
+			err = PTR_ERR(ptr);
+	}
+	if (err == -EDEADLK) {
+		err = i915_gem_ww_ctx_backoff(&ww);
+		if (!err)
+			goto retry;
+	}
+	i915_gem_ww_ctx_fini(&ww);
 
-	return ret;
+	return err ? ERR_PTR(err) : ptr;
 }
 
 void __i915_gem_object_flush_map(struct drm_i915_gem_object *obj,
diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c b/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
index fa1ae414348b..86b3489aba33 100644
--- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
@@ -893,13 +893,15 @@ static int igt_shared_ctx_exec(void *arg)
 	return err;
 }
 
-static int rpcs_query_batch(struct drm_i915_gem_object *rpcs, struct i915_vma *vma)
+static int rpcs_query_batch(struct drm_i915_gem_object *rpcs,
+			    struct i915_gem_ww_ctx *ww,
+			    struct i915_vma *vma)
 {
 	u32 *cmd;
 
 	GEM_BUG_ON(INTEL_GEN(vma->vm->i915) < 8);
 
-	cmd = i915_gem_object_pin_map(rpcs, I915_MAP_WB);
+	cmd = i915_gem_object_pin_map(rpcs, ww, I915_MAP_WB);
 	if (IS_ERR(cmd))
 		return PTR_ERR(cmd);
 
@@ -965,7 +967,7 @@ emit_rpcs_query(struct drm_i915_gem_object *obj,
 	if (err)
 		goto err_vma;
 
-	err = rpcs_query_batch(rpcs, vma);
+	err = rpcs_query_batch(rpcs, &ww, vma);
 	if (err)
 		goto err_batch;
 
diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_dmabuf.c b/drivers/gpu/drm/i915/gem/selftests/i915_gem_dmabuf.c
index dd74bc09ec88..3edf5a1cc0c0 100644
--- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_dmabuf.c
+++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_dmabuf.c
@@ -120,7 +120,7 @@ static int igt_dmabuf_import(void *arg)
 	}
 
 	if (0) { /* Can not yet map dmabuf */
-		obj_map = i915_gem_object_pin_map(obj, I915_MAP_WB);
+		obj_map = i915_gem_object_pin_map(obj, NULL, I915_MAP_WB);
 		if (IS_ERR(obj_map)) {
 			err = PTR_ERR(obj_map);
 			pr_err("i915_gem_object_pin_map failed with err=%d\n", err);
diff --git a/drivers/gpu/drm/i915/gt/gen7_renderclear.c b/drivers/gpu/drm/i915/gt/gen7_renderclear.c
index de575fdb033f..c0b0044cb52a 100644
--- a/drivers/gpu/drm/i915/gt/gen7_renderclear.c
+++ b/drivers/gpu/drm/i915/gt/gen7_renderclear.c
@@ -436,7 +436,7 @@ int gen7_setup_clear_gpr_bb(struct intel_engine_cs * const engine,
 
 	GEM_BUG_ON(vma->obj->base.size < bv.size);
 
-	batch = i915_gem_object_pin_map(vma->obj, I915_MAP_WC);
+	batch = i915_gem_object_pin_map(vma->obj, NULL, I915_MAP_WC);
 	if (IS_ERR(batch))
 		return PTR_ERR(batch);
 
diff --git a/drivers/gpu/drm/i915/gt/intel_engine_cs.c b/drivers/gpu/drm/i915/gt/intel_engine_cs.c
index 6dbdbde00f14..5a4afbbf91b2 100644
--- a/drivers/gpu/drm/i915/gt/intel_engine_cs.c
+++ b/drivers/gpu/drm/i915/gt/intel_engine_cs.c
@@ -664,7 +664,7 @@ static int init_status_page(struct intel_engine_cs *engine)
 	if (ret)
 		goto err;
 
-	vaddr = i915_gem_object_pin_map(obj, I915_MAP_WB);
+	vaddr = i915_gem_object_pin_map(obj, &ww, I915_MAP_WB);
 	if (IS_ERR(vaddr)) {
 		ret = PTR_ERR(vaddr);
 		goto err_unpin;
diff --git a/drivers/gpu/drm/i915/gt/intel_engine_pm.c b/drivers/gpu/drm/i915/gt/intel_engine_pm.c
index 47f4397095e5..49add43bd4e1 100644
--- a/drivers/gpu/drm/i915/gt/intel_engine_pm.c
+++ b/drivers/gpu/drm/i915/gt/intel_engine_pm.c
@@ -29,7 +29,7 @@ static void dbg_poison_ce(struct intel_context *ce)
 		if (!i915_gem_object_trylock(obj))
 			return;
 
-		map = i915_gem_object_pin_map(obj, type);
+		map = i915_gem_object_pin_map(obj, NULL, type);
 		if (!IS_ERR(map)) {
 			memset(map, CONTEXT_REDZONE, obj->base.size);
 			i915_gem_object_flush_map(obj);
diff --git a/drivers/gpu/drm/i915/gt/intel_gtt.c b/drivers/gpu/drm/i915/gt/intel_gtt.c
index 9b98f9d9faa3..9c2d0a01c11f 100644
--- a/drivers/gpu/drm/i915/gt/intel_gtt.c
+++ b/drivers/gpu/drm/i915/gt/intel_gtt.c
@@ -65,7 +65,7 @@ int map_pt_dma_locked(struct i915_address_space *vm, struct drm_i915_gem_object
 	void *vaddr;
 
 	type = i915_coherent_map_type(vm->i915, obj, true);
-	vaddr = i915_gem_object_pin_map(obj, type);
+	vaddr = i915_gem_object_pin_map(obj, NULL, type);
 	if (IS_ERR(vaddr))
 		return PTR_ERR(vaddr);
 
diff --git a/drivers/gpu/drm/i915/gt/intel_lrc.c b/drivers/gpu/drm/i915/gt/intel_lrc.c
index aafe2a4df496..aa0e2c40e53a 100644
--- a/drivers/gpu/drm/i915/gt/intel_lrc.c
+++ b/drivers/gpu/drm/i915/gt/intel_lrc.c
@@ -902,7 +902,7 @@ lrc_pre_pin(struct intel_context *ce,
 	GEM_BUG_ON(!ce->state);
 	GEM_BUG_ON(!i915_vma_is_pinned(ce->state));
 
-	*vaddr = i915_gem_object_pin_map(ce->state->obj,
+	*vaddr = i915_gem_object_pin_map(ce->state->obj, ww,
 					 i915_coherent_map_type(ce->engine->i915,
 								ce->state->obj,
 								false) |
@@ -1514,7 +1514,7 @@ void lrc_init_wa_ctx(struct intel_engine_cs *engine)
 	if (err)
 		goto err;
 
-	batch = i915_gem_object_pin_map(wa_ctx->vma->obj, I915_MAP_WB);
+	batch = i915_gem_object_pin_map(wa_ctx->vma->obj, &ww, I915_MAP_WB);
 	if (IS_ERR(batch)) {
 		err = PTR_ERR(batch);
 		goto err_unpin;
diff --git a/drivers/gpu/drm/i915/gt/intel_renderstate.c b/drivers/gpu/drm/i915/gt/intel_renderstate.c
index b03e197b1d99..69d4856a2b11 100644
--- a/drivers/gpu/drm/i915/gt/intel_renderstate.c
+++ b/drivers/gpu/drm/i915/gt/intel_renderstate.c
@@ -53,7 +53,7 @@ static int render_state_setup(struct intel_renderstate *so,
 	int ret = -EINVAL;
 	u32 *d;
 
-	d = i915_gem_object_pin_map(so->vma->obj, I915_MAP_WB);
+	d = i915_gem_object_pin_map(so->vma->obj, &so->ww, I915_MAP_WB);
 	if (IS_ERR(d))
 		return PTR_ERR(d);
 
diff --git a/drivers/gpu/drm/i915/gt/intel_ring.c b/drivers/gpu/drm/i915/gt/intel_ring.c
index 7c4d5158e03b..619f6d54e06d 100644
--- a/drivers/gpu/drm/i915/gt/intel_ring.c
+++ b/drivers/gpu/drm/i915/gt/intel_ring.c
@@ -56,7 +56,7 @@ int intel_ring_pin(struct intel_ring *ring, struct i915_gem_ww_ctx *ww)
 	} else {
 		int type = i915_coherent_map_type(vma->vm->i915, vma->obj, false);
 
-		addr = i915_gem_object_pin_map(vma->obj, type);
+		addr = i915_gem_object_pin_map(vma->obj, ww, type);
 	}
 
 	if (IS_ERR(addr)) {
diff --git a/drivers/gpu/drm/i915/gt/intel_ring_submission.c b/drivers/gpu/drm/i915/gt/intel_ring_submission.c
index 9585546556ee..e3903cae2d7d 100644
--- a/drivers/gpu/drm/i915/gt/intel_ring_submission.c
+++ b/drivers/gpu/drm/i915/gt/intel_ring_submission.c
@@ -452,7 +452,7 @@ static int ring_context_init_default_state(struct intel_context *ce,
 	struct drm_i915_gem_object *obj = ce->state->obj;
 	void *vaddr;
 
-	vaddr = i915_gem_object_pin_map(obj, I915_MAP_WB);
+	vaddr = i915_gem_object_pin_map(obj, ww, I915_MAP_WB);
 	if (IS_ERR(vaddr))
 		return PTR_ERR(vaddr);
 
diff --git a/drivers/gpu/drm/i915/gt/intel_timeline.c b/drivers/gpu/drm/i915/gt/intel_timeline.c
index f19cf6d2fa85..a9a1960f7f36 100644
--- a/drivers/gpu/drm/i915/gt/intel_timeline.c
+++ b/drivers/gpu/drm/i915/gt/intel_timeline.c
@@ -53,13 +53,14 @@ static int __timeline_active(struct i915_active *active)
 }
 
 I915_SELFTEST_EXPORT int
-intel_timeline_pin_map(struct intel_timeline *timeline)
+intel_timeline_pin_map(struct intel_timeline *timeline,
+		       struct i915_gem_ww_ctx *ww)
 {
 	struct drm_i915_gem_object *obj = timeline->hwsp_ggtt->obj;
 	u32 ofs = offset_in_page(timeline->hwsp_offset);
 	void *vaddr;
 
-	vaddr = i915_gem_object_pin_map(obj, I915_MAP_WB);
+	vaddr = i915_gem_object_pin_map(obj, ww, I915_MAP_WB);
 	if (IS_ERR(vaddr))
 		return PTR_ERR(vaddr);
 
@@ -184,7 +185,7 @@ int intel_timeline_pin(struct intel_timeline *tl, struct i915_gem_ww_ctx *ww)
 		return 0;
 
 	if (!tl->hwsp_map) {
-		err = intel_timeline_pin_map(tl);
+		err = intel_timeline_pin_map(tl, ww);
 		if (err)
 			return err;
 	}
diff --git a/drivers/gpu/drm/i915/gt/intel_timeline.h b/drivers/gpu/drm/i915/gt/intel_timeline.h
index 57308c4d664a..dad5a60e556b 100644
--- a/drivers/gpu/drm/i915/gt/intel_timeline.h
+++ b/drivers/gpu/drm/i915/gt/intel_timeline.h
@@ -98,6 +98,7 @@ intel_timeline_is_last(const struct intel_timeline *tl,
 	return list_is_last_rcu(&rq->link, &tl->requests);
 }
 
-I915_SELFTEST_DECLARE(int intel_timeline_pin_map(struct intel_timeline *tl));
+I915_SELFTEST_DECLARE(int intel_timeline_pin_map(struct intel_timeline *tl,
+						 struct i915_gem_ww_ctx *ww));
 
 #endif
diff --git a/drivers/gpu/drm/i915/gt/intel_workarounds.c b/drivers/gpu/drm/i915/gt/intel_workarounds.c
index 5a03a76bb9e2..df342b18f5ae 100644
--- a/drivers/gpu/drm/i915/gt/intel_workarounds.c
+++ b/drivers/gpu/drm/i915/gt/intel_workarounds.c
@@ -2233,7 +2233,7 @@ static int engine_wa_list_verify(struct intel_context *ce,
 		goto err_rq;
 	}
 
-	results = i915_gem_object_pin_map(vma->obj, I915_MAP_WB);
+	results = i915_gem_object_pin_map(vma->obj, NULL, I915_MAP_WB);
 	if (IS_ERR(results)) {
 		err = PTR_ERR(results);
 		goto err_rq;
diff --git a/drivers/gpu/drm/i915/gt/mock_engine.c b/drivers/gpu/drm/i915/gt/mock_engine.c
index e1ba03b93ffa..b5f48e8bb38f 100644
--- a/drivers/gpu/drm/i915/gt/mock_engine.c
+++ b/drivers/gpu/drm/i915/gt/mock_engine.c
@@ -20,7 +20,7 @@ static int mock_timeline_pin(struct intel_timeline *tl)
 	if (WARN_ON(!i915_gem_object_trylock(tl->hwsp_ggtt->obj)))
 		return -EBUSY;
 
-	err = intel_timeline_pin_map(tl);
+	err = intel_timeline_pin_map(tl, NULL);
 	i915_gem_object_unlock(tl->hwsp_ggtt->obj);
 	if (err)
 		return err;
diff --git a/drivers/gpu/drm/i915/gt/selftest_lrc.c b/drivers/gpu/drm/i915/gt/selftest_lrc.c
index d8f6623524e8..84378dd775b5 100644
--- a/drivers/gpu/drm/i915/gt/selftest_lrc.c
+++ b/drivers/gpu/drm/i915/gt/selftest_lrc.c
@@ -425,7 +425,7 @@ static int __live_lrc_state(struct intel_engine_cs *engine,
 		goto err_rq;
 	}
 
-	cs = i915_gem_object_pin_map(scratch->obj, I915_MAP_WB);
+	cs = i915_gem_object_pin_map(scratch->obj, NULL, I915_MAP_WB);
 	if (IS_ERR(cs)) {
 		err = PTR_ERR(cs);
 		goto err_rq;
diff --git a/drivers/gpu/drm/i915/gt/selftest_rps.c b/drivers/gpu/drm/i915/gt/selftest_rps.c
index adf7fdbc00f7..687b94028de5 100644
--- a/drivers/gpu/drm/i915/gt/selftest_rps.c
+++ b/drivers/gpu/drm/i915/gt/selftest_rps.c
@@ -83,17 +83,17 @@ create_spin_counter(struct intel_engine_cs *engine,
 
 	err = i915_vma_pin(vma, 0, 0, PIN_USER);
 	if (err)
-		goto err_unlock;
-
-	i915_vma_lock(vma);
+		goto err_put;
 
-	base = i915_gem_object_pin_map(obj, I915_MAP_WC);
+	base = i915_gem_object_pin_map_unlocked(obj, I915_MAP_WC);
 	if (IS_ERR(base)) {
 		err = PTR_ERR(base);
 		goto err_unpin;
 	}
 	cs = base;
 
+	i915_vma_lock(vma);
+
 	*cs++ = MI_LOAD_REGISTER_IMM(__NGPR__ * 2);
 	for (i = 0; i < __NGPR__; i++) {
 		*cs++ = i915_mmio_reg_offset(CS_GPR(i));
@@ -137,8 +137,6 @@ create_spin_counter(struct intel_engine_cs *engine,
 
 err_unpin:
 	i915_vma_unpin(vma);
-err_unlock:
-	i915_vma_unlock(vma);
 err_put:
 	i915_gem_object_put(obj);
 	return ERR_PTR(err);
diff --git a/drivers/gpu/drm/i915/gt/selftest_workarounds.c b/drivers/gpu/drm/i915/gt/selftest_workarounds.c
index 64937ec3f2dc..1bf8e2826d7b 100644
--- a/drivers/gpu/drm/i915/gt/selftest_workarounds.c
+++ b/drivers/gpu/drm/i915/gt/selftest_workarounds.c
@@ -223,7 +223,7 @@ static int check_whitelist(struct intel_context *ce)
 	if (err)
 		goto out_put;
 
-	vaddr = i915_gem_object_pin_map(results, I915_MAP_WB);
+	vaddr = i915_gem_object_pin_map(results, NULL, I915_MAP_WB);
 	if (IS_ERR(vaddr)) {
 		err = PTR_ERR(vaddr);
 		goto out_put;
@@ -529,13 +529,13 @@ static int check_dirty_whitelist(struct intel_context *ce)
 		if (err)
 			goto out;
 
-		cs = i915_gem_object_pin_map(batch->obj, I915_MAP_WC);
+		cs = i915_gem_object_pin_map(batch->obj, &ww, I915_MAP_WC);
 		if (IS_ERR(cs)) {
 			err = PTR_ERR(cs);
 			goto out_ctx;
 		}
 
-		results = i915_gem_object_pin_map(scratch->obj, I915_MAP_WB);
+		results = i915_gem_object_pin_map(scratch->obj, &ww, I915_MAP_WB);
 		if (IS_ERR(results)) {
 			err = PTR_ERR(results);
 			goto out_unmap_batch;
diff --git a/drivers/gpu/drm/i915/gvt/cmd_parser.c b/drivers/gpu/drm/i915/gvt/cmd_parser.c
index ca9c9e27a43d..eb804e4267d2 100644
--- a/drivers/gpu/drm/i915/gvt/cmd_parser.c
+++ b/drivers/gpu/drm/i915/gvt/cmd_parser.c
@@ -1935,7 +1935,7 @@ static int perform_bb_shadow(struct parser_exec_state *s)
 		goto err_free_bb;
 	}
 
-	bb->va = i915_gem_object_pin_map(bb->obj, I915_MAP_WB);
+	bb->va = i915_gem_object_pin_map_unlocked(bb->obj, I915_MAP_WB);
 	if (IS_ERR(bb->va)) {
 		ret = PTR_ERR(bb->va);
 		goto err_free_obj;
@@ -3008,7 +3008,7 @@ static int shadow_indirect_ctx(struct intel_shadow_wa_ctx *wa_ctx)
 		return PTR_ERR(obj);
 
 	/* get the va of the shadow batch buffer */
-	map = i915_gem_object_pin_map(obj, I915_MAP_WB);
+	map = i915_gem_object_pin_map_unlocked(obj, I915_MAP_WB);
 	if (IS_ERR(map)) {
 		gvt_vgpu_err("failed to vmap shadow indirect ctx\n");
 		ret = PTR_ERR(map);
diff --git a/drivers/gpu/drm/i915/i915_perf.c b/drivers/gpu/drm/i915/i915_perf.c
index 85ad62dbabfa..62259c46d302 100644
--- a/drivers/gpu/drm/i915/i915_perf.c
+++ b/drivers/gpu/drm/i915/i915_perf.c
@@ -1662,7 +1662,7 @@ static int alloc_noa_wait(struct i915_perf_stream *stream)
 		goto out_ww;
 	}
 
-	batch = cs = i915_gem_object_pin_map(bo, I915_MAP_WB);
+	batch = cs = i915_gem_object_pin_map(bo, &ww, I915_MAP_WB);
 	if (IS_ERR(batch)) {
 		ret = PTR_ERR(batch);
 		goto err_unpin;
@@ -1875,7 +1875,7 @@ alloc_oa_config_buffer(struct i915_perf_stream *stream,
 	if (err)
 		goto out_ww;
 
-	cs = i915_gem_object_pin_map(obj, I915_MAP_WB);
+	cs = i915_gem_object_pin_map(obj, &ww, I915_MAP_WB);
 	if (IS_ERR(cs)) {
 		err = PTR_ERR(cs);
 		goto out_ww;
diff --git a/drivers/gpu/drm/i915/selftests/igt_spinner.c b/drivers/gpu/drm/i915/selftests/igt_spinner.c
index 5fe397b7d1d9..b80d0089923a 100644
--- a/drivers/gpu/drm/i915/selftests/igt_spinner.c
+++ b/drivers/gpu/drm/i915/selftests/igt_spinner.c
@@ -54,7 +54,7 @@ static void *igt_spinner_pin_obj(struct intel_context *ce,
 	if (ret)
 		return ERR_PTR(ret);
 
-	vaddr = i915_gem_object_pin_map(obj, mode);
+	vaddr = i915_gem_object_pin_map(obj, ww, mode);
 
 	if (!ww)
 		i915_gem_object_unlock(obj);
-- 
2.31.0

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

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [Intel-gfx] [PATCH 4/4] drm/i915: Pass ww ctx to i915_gem_object_pin_pages, v2.
  2021-04-29 10:10 [Intel-gfx] [PATCH 0/4] drm/i915: Propagate ww parameter to get_pages() Maarten Lankhorst
                   ` (2 preceding siblings ...)
  2021-04-29 10:10 ` [Intel-gfx] [PATCH 3/4] drm/i915: Pass ww ctx to pin_map, v2 Maarten Lankhorst
@ 2021-04-29 10:10 ` Maarten Lankhorst
  2021-04-29 13:46   ` Matthew Auld
  2021-04-29 15:47 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for drm/i915: Propagate ww parameter to get_pages() Patchwork
  2021-04-29 16:17 ` [Intel-gfx] ✗ Fi.CI.BAT: failure " Patchwork
  5 siblings, 1 reply; 15+ messages in thread
From: Maarten Lankhorst @ 2021-04-29 10:10 UTC (permalink / raw)
  To: intel-gfx

This is the final part of passing ww ctx to the get_pages() callbacks.
Now we no longer have to implicitly get ww ctx by using get_ww_ctx.

Changes since v1:
- Fix error handling in pin_map_unlocked().

Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
---
 drivers/gpu/drm/i915/display/intel_display.c  |  2 +-
 drivers/gpu/drm/i915/gem/i915_gem_clflush.c   |  2 +-
 drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c    |  8 ++--
 drivers/gpu/drm/i915/gem/i915_gem_domain.c    | 48 +++++++++++--------
 .../gpu/drm/i915/gem/i915_gem_execbuffer.c    |  4 +-
 drivers/gpu/drm/i915/gem/i915_gem_mman.c      | 19 +++++---
 drivers/gpu/drm/i915/gem/i915_gem_object.h    | 20 +++++---
 drivers/gpu/drm/i915/gem/i915_gem_pages.c     | 14 +++---
 drivers/gpu/drm/i915/gem/i915_gem_stolen.c    |  2 +-
 drivers/gpu/drm/i915/gem/i915_gem_userptr.c   |  4 +-
 .../gpu/drm/i915/gem/selftests/huge_pages.c   |  2 +-
 .../i915/gem/selftests/i915_gem_client_blt.c  |  2 +-
 .../i915/gem/selftests/i915_gem_coherency.c   | 10 ++--
 .../drm/i915/gem/selftests/i915_gem_context.c |  4 +-
 .../drm/i915/gem/selftests/i915_gem_mman.c    |  4 +-
 .../drm/i915/gem/selftests/i915_gem_phys.c    |  2 +-
 .../gpu/drm/i915/gt/selftest_workarounds.c    |  2 +-
 drivers/gpu/drm/i915/gvt/cmd_parser.c         |  2 +-
 drivers/gpu/drm/i915/i915_gem.c               |  8 ++--
 drivers/gpu/drm/i915/i915_vma.c               |  7 +--
 drivers/gpu/drm/i915/selftests/i915_vma.c     |  2 +-
 .../drm/i915/selftests/intel_memory_region.c  |  2 +-
 22 files changed, 98 insertions(+), 72 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index 6280ba7f4c17..80a1e241a18e 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -1090,7 +1090,7 @@ intel_pin_and_fence_fb_obj(struct drm_framebuffer *fb,
 	if (!ret && phys_cursor)
 		ret = i915_gem_object_attach_phys(obj, alignment);
 	if (!ret)
-		ret = i915_gem_object_pin_pages(obj);
+		ret = i915_gem_object_pin_pages(obj, &ww);
 	if (ret)
 		goto err;
 
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_clflush.c b/drivers/gpu/drm/i915/gem/i915_gem_clflush.c
index daf9284ef1f5..e29629b2a8f8 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_clflush.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_clflush.c
@@ -57,7 +57,7 @@ static struct clflush *clflush_work_create(struct drm_i915_gem_object *obj)
 	if (!clflush)
 		return NULL;
 
-	if (__i915_gem_object_get_pages(obj) < 0) {
+	if (__i915_gem_object_get_pages(obj, NULL) < 0) {
 		kfree(clflush);
 		return NULL;
 	}
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c b/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c
index f6b8437efc39..300a983582b9 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c
@@ -130,9 +130,9 @@ static int i915_gem_begin_cpu_access(struct dma_buf *dma_buf, enum dma_data_dire
 retry:
 	err = i915_gem_object_lock(obj, &ww);
 	if (!err)
-		err = i915_gem_object_pin_pages(obj);
+		err = i915_gem_object_pin_pages(obj, &ww);
 	if (!err) {
-		err = i915_gem_object_set_to_cpu_domain(obj, write);
+		err = i915_gem_object_set_to_cpu_domain(obj, &ww, write);
 		i915_gem_object_unpin_pages(obj);
 	}
 	if (err == -EDEADLK) {
@@ -154,9 +154,9 @@ static int i915_gem_end_cpu_access(struct dma_buf *dma_buf, enum dma_data_direct
 retry:
 	err = i915_gem_object_lock(obj, &ww);
 	if (!err)
-		err = i915_gem_object_pin_pages(obj);
+		err = i915_gem_object_pin_pages(obj, &ww);
 	if (!err) {
-		err = i915_gem_object_set_to_gtt_domain(obj, false);
+		err = i915_gem_object_set_to_gtt_domain(obj, &ww, false);
 		i915_gem_object_unpin_pages(obj);
 	}
 	if (err == -EDEADLK) {
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_domain.c b/drivers/gpu/drm/i915/gem/i915_gem_domain.c
index 6c7d9efb319c..7beffc2fe9f1 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_domain.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_domain.c
@@ -98,7 +98,8 @@ void i915_gem_object_flush_if_display_locked(struct drm_i915_gem_object *obj)
  * flushes to occur.
  */
 int
-i915_gem_object_set_to_wc_domain(struct drm_i915_gem_object *obj, bool write)
+i915_gem_object_set_to_wc_domain(struct drm_i915_gem_object *obj,
+				 struct i915_gem_ww_ctx *ww, bool write)
 {
 	int ret;
 
@@ -122,7 +123,7 @@ i915_gem_object_set_to_wc_domain(struct drm_i915_gem_object *obj, bool write)
 	 * continue to assume that the obj remained out of the CPU cached
 	 * domain.
 	 */
-	ret = i915_gem_object_pin_pages(obj);
+	ret = i915_gem_object_pin_pages(obj, ww);
 	if (ret)
 		return ret;
 
@@ -159,7 +160,8 @@ i915_gem_object_set_to_wc_domain(struct drm_i915_gem_object *obj, bool write)
  * flushes to occur.
  */
 int
-i915_gem_object_set_to_gtt_domain(struct drm_i915_gem_object *obj, bool write)
+i915_gem_object_set_to_gtt_domain(struct drm_i915_gem_object *obj,
+				  struct i915_gem_ww_ctx *ww, bool write)
 {
 	int ret;
 
@@ -183,7 +185,7 @@ i915_gem_object_set_to_gtt_domain(struct drm_i915_gem_object *obj, bool write)
 	 * continue to assume that the obj remained out of the CPU cached
 	 * domain.
 	 */
-	ret = i915_gem_object_pin_pages(obj);
+	ret = i915_gem_object_pin_pages(obj, ww);
 	if (ret)
 		return ret;
 
@@ -432,7 +434,8 @@ i915_gem_object_pin_to_display_plane(struct drm_i915_gem_object *obj,
  * flushes to occur.
  */
 int
-i915_gem_object_set_to_cpu_domain(struct drm_i915_gem_object *obj, bool write)
+i915_gem_object_set_to_cpu_domain(struct drm_i915_gem_object *obj, 
+				  struct i915_gem_ww_ctx *ww, bool write)
 {
 	int ret;
 
@@ -482,6 +485,7 @@ i915_gem_set_domain_ioctl(struct drm_device *dev, void *data,
 	struct drm_i915_gem_object *obj;
 	u32 read_domains = args->read_domains;
 	u32 write_domain = args->write_domain;
+	struct i915_gem_ww_ctx ww;
 	int err;
 
 	/* Only handle setting domains to types used by the CPU. */
@@ -541,9 +545,11 @@ i915_gem_set_domain_ioctl(struct drm_device *dev, void *data,
 		goto out;
 	}
 
-	err = i915_gem_object_lock_interruptible(obj, NULL);
+	i915_gem_ww_ctx_init(&ww, true);
+retry:
+	err = i915_gem_object_lock_interruptible(obj, &ww);
 	if (err)
-		goto out;
+		goto out_ww;
 
 	/*
 	 * Flush and acquire obj->pages so that we are coherent through
@@ -554,9 +560,9 @@ i915_gem_set_domain_ioctl(struct drm_device *dev, void *data,
 	 * continue to assume that the obj remained out of the CPU cached
 	 * domain.
 	 */
-	err = i915_gem_object_pin_pages(obj);
+	err = i915_gem_object_pin_pages(obj, &ww);
 	if (err)
-		goto out_unlock;
+		goto out_ww;
 
 	/*
 	 * Already in the desired write domain? Nothing for us to do!
@@ -572,21 +578,25 @@ i915_gem_set_domain_ioctl(struct drm_device *dev, void *data,
 		goto out_unpin;
 
 	if (read_domains & I915_GEM_DOMAIN_WC)
-		err = i915_gem_object_set_to_wc_domain(obj, write_domain);
+		err = i915_gem_object_set_to_wc_domain(obj, &ww, write_domain);
 	else if (read_domains & I915_GEM_DOMAIN_GTT)
-		err = i915_gem_object_set_to_gtt_domain(obj, write_domain);
+		err = i915_gem_object_set_to_gtt_domain(obj, &ww, write_domain);
 	else
-		err = i915_gem_object_set_to_cpu_domain(obj, write_domain);
+		err = i915_gem_object_set_to_cpu_domain(obj, &ww, write_domain);
 
 out_unpin:
 	i915_gem_object_unpin_pages(obj);
 
-out_unlock:
-	i915_gem_object_unlock(obj);
-
 	if (!err && write_domain)
 		i915_gem_object_invalidate_frontbuffer(obj, ORIGIN_CPU);
 
+out_ww:
+	if (err == -EDEADLK) {
+		err = i915_gem_ww_ctx_backoff(&ww);
+		if (!err)
+			goto retry;
+	}
+	i915_gem_ww_ctx_fini(&ww);
 out:
 	i915_gem_object_put(obj);
 	return err;
@@ -615,13 +625,13 @@ int i915_gem_object_prepare_read(struct drm_i915_gem_object *obj,
 	if (ret)
 		return ret;
 
-	ret = i915_gem_object_pin_pages(obj);
+	ret = i915_gem_object_pin_pages(obj, ww);
 	if (ret)
 		return ret;
 
 	if (obj->cache_coherent & I915_BO_CACHE_COHERENT_FOR_READ ||
 	    !static_cpu_has(X86_FEATURE_CLFLUSH)) {
-		ret = i915_gem_object_set_to_cpu_domain(obj, false);
+		ret = i915_gem_object_set_to_cpu_domain(obj, ww, false);
 		if (ret)
 			goto err_unpin;
 		else
@@ -667,13 +677,13 @@ int i915_gem_object_prepare_write(struct drm_i915_gem_object *obj,
 	if (ret)
 		return ret;
 
-	ret = i915_gem_object_pin_pages(obj);
+	ret = i915_gem_object_pin_pages(obj, ww);
 	if (ret)
 		return ret;
 
 	if (obj->cache_coherent & I915_BO_CACHE_COHERENT_FOR_WRITE ||
 	    !static_cpu_has(X86_FEATURE_CLFLUSH)) {
-		ret = i915_gem_object_set_to_cpu_domain(obj, true);
+		ret = i915_gem_object_set_to_cpu_domain(obj, ww, true);
 		if (ret)
 			goto err_unpin;
 		else
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
index 66d24dfbd805..447271932512 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
@@ -1213,7 +1213,7 @@ static void *reloc_iomap(struct drm_i915_gem_object *obj,
 		if (use_cpu_reloc(cache, obj))
 			return NULL;
 
-		err = i915_gem_object_set_to_gtt_domain(obj, true);
+		err = i915_gem_object_set_to_gtt_domain(obj, &eb->ww, true);
 		if (err)
 			return ERR_PTR(err);
 
@@ -2509,7 +2509,7 @@ static int eb_parse_pipeline(struct i915_execbuffer *eb,
 		pw->batch_map = i915_gem_object_pin_map(batch, &eb->ww, I915_MAP_WC);
 
 	if (IS_ERR(pw->batch_map)) {
-		err = i915_gem_object_pin_pages(batch);
+		err = i915_gem_object_pin_pages(batch, &eb->ww);
 		if (err)
 			goto err_unmap_shadow;
 		pw->batch_map = NULL;
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_mman.c b/drivers/gpu/drm/i915/gem/i915_gem_mman.c
index ae2d71d76889..47da32edba03 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_mman.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_mman.c
@@ -239,6 +239,7 @@ static vm_fault_t vm_fault_cpu(struct vm_fault *vmf)
 	struct i915_mmap_offset *mmo = area->vm_private_data;
 	struct drm_i915_gem_object *obj = mmo->obj;
 	resource_size_t iomap;
+	struct i915_gem_ww_ctx ww;
 	int err;
 
 	/* Sanity check that we allow writing into this object */
@@ -246,10 +247,11 @@ static vm_fault_t vm_fault_cpu(struct vm_fault *vmf)
 		     area->vm_flags & VM_WRITE))
 		return VM_FAULT_SIGBUS;
 
-	if (i915_gem_object_lock_interruptible(obj, NULL))
-		return VM_FAULT_NOPAGE;
-
-	err = i915_gem_object_pin_pages(obj);
+	i915_gem_ww_ctx_init(&ww, true);
+retry:
+	err = i915_gem_object_lock(obj, &ww);
+	if (!err)
+		err = i915_gem_object_pin_pages(obj, &ww);
 	if (err)
 		goto out;
 
@@ -272,7 +274,12 @@ static vm_fault_t vm_fault_cpu(struct vm_fault *vmf)
 	i915_gem_object_unpin_pages(obj);
 
 out:
-	i915_gem_object_unlock(obj);
+	if (err == -EDEADLK) {
+		err = i915_gem_ww_ctx_backoff(&ww);
+		if (!err)
+			goto retry;
+	}
+	i915_gem_ww_ctx_fini(&ww);
 	return i915_error_to_vmf_fault(err);
 }
 
@@ -313,7 +320,7 @@ static vm_fault_t vm_fault_gtt(struct vm_fault *vmf)
 		goto err_rpm;
 	}
 
-	ret = i915_gem_object_pin_pages(obj);
+	ret = i915_gem_object_pin_pages(obj, &ww);
 	if (ret)
 		goto err_rpm;
 
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.h b/drivers/gpu/drm/i915/gem/i915_gem_object.h
index ed6c7421af4f..900fc8f8df2a 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_object.h
+++ b/drivers/gpu/drm/i915/gem/i915_gem_object.h
@@ -378,18 +378,21 @@ void __i915_gem_object_set_pages(struct drm_i915_gem_object *obj,
 				 struct sg_table *pages,
 				 unsigned int sg_page_sizes);
 
-int ____i915_gem_object_get_pages(struct drm_i915_gem_object *obj);
-int __i915_gem_object_get_pages(struct drm_i915_gem_object *obj);
+int ____i915_gem_object_get_pages(struct drm_i915_gem_object *obj,
+				  struct i915_gem_ww_ctx *ww);
+int __i915_gem_object_get_pages(struct drm_i915_gem_object *obj,
+				struct i915_gem_ww_ctx *ww);
 
 static inline int __must_check
-i915_gem_object_pin_pages(struct drm_i915_gem_object *obj)
+i915_gem_object_pin_pages(struct drm_i915_gem_object *obj,
+			  struct i915_gem_ww_ctx *ww)
 {
 	assert_object_held(obj);
 
 	if (atomic_inc_not_zero(&obj->mm.pages_pin_count))
 		return 0;
 
-	return __i915_gem_object_get_pages(obj);
+	return __i915_gem_object_get_pages(obj, ww);
 }
 
 int i915_gem_object_pin_pages_unlocked(struct drm_i915_gem_object *obj);
@@ -519,11 +522,14 @@ void i915_gem_object_flush_if_display(struct drm_i915_gem_object *obj);
 void i915_gem_object_flush_if_display_locked(struct drm_i915_gem_object *obj);
 
 int __must_check
-i915_gem_object_set_to_wc_domain(struct drm_i915_gem_object *obj, bool write);
+i915_gem_object_set_to_wc_domain(struct drm_i915_gem_object *obj,
+				 struct i915_gem_ww_ctx *ww, bool write);
 int __must_check
-i915_gem_object_set_to_gtt_domain(struct drm_i915_gem_object *obj, bool write);
+i915_gem_object_set_to_gtt_domain(struct drm_i915_gem_object *obj, 
+				  struct i915_gem_ww_ctx *ww, bool write);
 int __must_check
-i915_gem_object_set_to_cpu_domain(struct drm_i915_gem_object *obj, bool write);
+i915_gem_object_set_to_cpu_domain(struct drm_i915_gem_object *obj,
+				  struct i915_gem_ww_ctx *ww, bool write);
 struct i915_vma * __must_check
 i915_gem_object_pin_to_display_plane(struct drm_i915_gem_object *obj,
 				     struct i915_gem_ww_ctx *ww,
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_pages.c b/drivers/gpu/drm/i915/gem/i915_gem_pages.c
index 42e867134481..5e8dd7a67c71 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_pages.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_pages.c
@@ -87,7 +87,8 @@ void __i915_gem_object_set_pages(struct drm_i915_gem_object *obj,
 	}
 }
 
-int ____i915_gem_object_get_pages(struct drm_i915_gem_object *obj)
+int ____i915_gem_object_get_pages(struct drm_i915_gem_object *obj,
+				  struct i915_gem_ww_ctx *ww)
 {
 	struct drm_i915_private *i915 = to_i915(obj->base.dev);
 	int err;
@@ -100,7 +101,7 @@ int ____i915_gem_object_get_pages(struct drm_i915_gem_object *obj)
 		return -EFAULT;
 	}
 
-	err = obj->ops->get_pages(obj, NULL);
+	err = obj->ops->get_pages(obj, ww);
 	GEM_BUG_ON(!err && !i915_gem_object_has_pages(obj));
 
 	return err;
@@ -113,7 +114,8 @@ int ____i915_gem_object_get_pages(struct drm_i915_gem_object *obj)
  * either as a result of memory pressure (reaping pages under the shrinker)
  * or as the object is itself released.
  */
-int __i915_gem_object_get_pages(struct drm_i915_gem_object *obj)
+int __i915_gem_object_get_pages(struct drm_i915_gem_object *obj,
+				struct i915_gem_ww_ctx *ww)
 {
 	int err;
 
@@ -124,7 +126,7 @@ int __i915_gem_object_get_pages(struct drm_i915_gem_object *obj)
 	if (unlikely(!i915_gem_object_has_pages(obj))) {
 		GEM_BUG_ON(i915_gem_object_has_pinned_pages(obj));
 
-		err = ____i915_gem_object_get_pages(obj);
+		err = ____i915_gem_object_get_pages(obj, ww);
 		if (err)
 			return err;
 
@@ -144,7 +146,7 @@ int i915_gem_object_pin_pages_unlocked(struct drm_i915_gem_object *obj)
 retry:
 	err = i915_gem_object_lock(obj, &ww);
 	if (!err)
-		err = i915_gem_object_pin_pages(obj);
+		err = i915_gem_object_pin_pages(obj, &ww);
 
 	if (err == -EDEADLK) {
 		err = i915_gem_ww_ctx_backoff(&ww);
@@ -362,7 +364,7 @@ void *i915_gem_object_pin_map(struct drm_i915_gem_object *obj,
 		if (unlikely(!i915_gem_object_has_pages(obj))) {
 			GEM_BUG_ON(i915_gem_object_has_pinned_pages(obj));
 
-			err = ____i915_gem_object_get_pages(obj);
+			err = ____i915_gem_object_get_pages(obj, ww);
 			if (err)
 				return ERR_PTR(err);
 
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_stolen.c b/drivers/gpu/drm/i915/gem/i915_gem_stolen.c
index 4d2b65001eba..7347631aeb6b 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_stolen.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_stolen.c
@@ -658,7 +658,7 @@ static int __i915_gem_object_create_stolen(struct intel_memory_region *mem,
 	if (WARN_ON(!i915_gem_object_trylock(obj)))
 		return -EBUSY;
 
-	err = i915_gem_object_pin_pages(obj);
+	err = i915_gem_object_pin_pages(obj, NULL);
 	if (!err)
 		i915_gem_object_init_memory_region(obj, mem);
 	i915_gem_object_unlock(obj);
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_userptr.c b/drivers/gpu/drm/i915/gem/i915_gem_userptr.c
index 8fd22b4a3c3e..f1752f488306 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_userptr.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_userptr.c
@@ -261,7 +261,7 @@ static int i915_gem_object_userptr_unbind(struct drm_i915_gem_object *obj, bool
 		i915_gem_userptr_put_pages(obj, pages);
 
 	if (get_pages)
-		err = ____i915_gem_object_get_pages(obj);
+		err = ____i915_gem_object_get_pages(obj, NULL);
 
 	return err;
 }
@@ -390,7 +390,7 @@ int i915_gem_object_userptr_validate(struct drm_i915_gem_object *obj)
 		 * it doesn't matter if we collide with the mmu notifier,
 		 * and -EAGAIN handling is not required.
 		 */
-		err = i915_gem_object_pin_pages(obj);
+		err = i915_gem_object_pin_pages(obj, NULL);
 		if (!err)
 			i915_gem_object_unpin_pages(obj);
 
diff --git a/drivers/gpu/drm/i915/gem/selftests/huge_pages.c b/drivers/gpu/drm/i915/gem/selftests/huge_pages.c
index 67be3cf77f71..0cc922a38103 100644
--- a/drivers/gpu/drm/i915/gem/selftests/huge_pages.c
+++ b/drivers/gpu/drm/i915/gem/selftests/huge_pages.c
@@ -982,7 +982,7 @@ static int gpu_write(struct intel_context *ce,
 	int err;
 
 	i915_gem_object_lock(vma->obj, NULL);
-	err = i915_gem_object_set_to_gtt_domain(vma->obj, true);
+	err = i915_gem_object_set_to_gtt_domain(vma->obj, NULL, true);
 	i915_gem_object_unlock(vma->obj);
 	if (err)
 		return err;
diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_client_blt.c b/drivers/gpu/drm/i915/gem/selftests/i915_gem_client_blt.c
index d36873885cc1..16096f7db1a7 100644
--- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_client_blt.c
+++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_client_blt.c
@@ -74,7 +74,7 @@ static int __igt_client_fill(struct intel_engine_cs *engine)
 			goto err_unpin;
 
 		i915_gem_object_lock(obj, NULL);
-		err = i915_gem_object_set_to_cpu_domain(obj, false);
+		err = i915_gem_object_set_to_cpu_domain(obj, NULL, false);
 		i915_gem_object_unlock(obj);
 		if (err)
 			goto err_unpin;
diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_coherency.c b/drivers/gpu/drm/i915/gem/selftests/i915_gem_coherency.c
index ced2454cebb0..87e97650fc3f 100644
--- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_coherency.c
+++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_coherency.c
@@ -90,7 +90,7 @@ static int gtt_set(struct context *ctx, unsigned long offset, u32 v)
 	int err = 0;
 
 	i915_gem_object_lock(ctx->obj, NULL);
-	err = i915_gem_object_set_to_gtt_domain(ctx->obj, true);
+	err = i915_gem_object_set_to_gtt_domain(ctx->obj, NULL, true);
 	i915_gem_object_unlock(ctx->obj);
 	if (err)
 		return err;
@@ -123,7 +123,7 @@ static int gtt_get(struct context *ctx, unsigned long offset, u32 *v)
 	int err = 0;
 
 	i915_gem_object_lock(ctx->obj, NULL);
-	err = i915_gem_object_set_to_gtt_domain(ctx->obj, false);
+	err = i915_gem_object_set_to_gtt_domain(ctx->obj, NULL, false);
 	i915_gem_object_unlock(ctx->obj);
 	if (err)
 		return err;
@@ -155,7 +155,7 @@ static int wc_set(struct context *ctx, unsigned long offset, u32 v)
 	int err;
 
 	i915_gem_object_lock(ctx->obj, NULL);
-	err = i915_gem_object_set_to_wc_domain(ctx->obj, true);
+	err = i915_gem_object_set_to_wc_domain(ctx->obj, NULL, true);
 	i915_gem_object_unlock(ctx->obj);
 	if (err)
 		return err;
@@ -178,7 +178,7 @@ static int wc_get(struct context *ctx, unsigned long offset, u32 *v)
 	int err;
 
 	i915_gem_object_lock(ctx->obj, NULL);
-	err = i915_gem_object_set_to_wc_domain(ctx->obj, false);
+	err = i915_gem_object_set_to_wc_domain(ctx->obj, NULL, false);
 	i915_gem_object_unlock(ctx->obj);
 	if (err)
 		return err;
@@ -205,7 +205,7 @@ static int gpu_set(struct context *ctx, unsigned long offset, u32 v)
 		return PTR_ERR(vma);
 
 	i915_gem_object_lock(ctx->obj, NULL);
-	err = i915_gem_object_set_to_gtt_domain(ctx->obj, true);
+	err = i915_gem_object_set_to_gtt_domain(ctx->obj, NULL, true);
 	if (err)
 		goto out_unlock;
 
diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c b/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
index 86b3489aba33..c918a02c72a5 100644
--- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
@@ -957,7 +957,7 @@ emit_rpcs_query(struct drm_i915_gem_object *obj,
 	if (!err)
 		err = i915_gem_object_lock(rpcs, &ww);
 	if (!err)
-		err = i915_gem_object_set_to_gtt_domain(obj, false);
+		err = i915_gem_object_set_to_gtt_domain(obj, &ww, false);
 	if (!err)
 		err = i915_vma_pin_ww(vma, &ww, 0, 0, PIN_USER);
 	if (err)
@@ -1712,7 +1712,7 @@ static int read_from_scratch(struct i915_gem_context *ctx,
 	i915_request_add(rq);
 
 	i915_gem_object_lock(obj, NULL);
-	err = i915_gem_object_set_to_cpu_domain(obj, false);
+	err = i915_gem_object_set_to_cpu_domain(obj, NULL, false);
 	i915_gem_object_unlock(obj);
 	if (err)
 		goto out_vm;
diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_mman.c b/drivers/gpu/drm/i915/gem/selftests/i915_gem_mman.c
index 5cf6df49c333..3fe7d6e8715e 100644
--- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_mman.c
+++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_mman.c
@@ -105,7 +105,7 @@ static int check_partial_mapping(struct drm_i915_gem_object *obj,
 	GEM_BUG_ON(i915_gem_object_get_stride(obj) != tile->stride);
 
 	i915_gem_object_lock(obj, NULL);
-	err = i915_gem_object_set_to_gtt_domain(obj, true);
+	err = i915_gem_object_set_to_gtt_domain(obj, NULL, true);
 	i915_gem_object_unlock(obj);
 	if (err) {
 		pr_err("Failed to flush to GTT write domain; err=%d\n", err);
@@ -190,7 +190,7 @@ static int check_partial_mappings(struct drm_i915_gem_object *obj,
 	GEM_BUG_ON(i915_gem_object_get_stride(obj) != tile->stride);
 
 	i915_gem_object_lock(obj, NULL);
-	err = i915_gem_object_set_to_gtt_domain(obj, true);
+	err = i915_gem_object_set_to_gtt_domain(obj, NULL, true);
 	i915_gem_object_unlock(obj);
 	if (err) {
 		pr_err("Failed to flush to GTT write domain; err=%d\n", err);
diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_phys.c b/drivers/gpu/drm/i915/gem/selftests/i915_gem_phys.c
index 3a6ce87f8b52..4e0a5fc00040 100644
--- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_phys.c
+++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_phys.c
@@ -53,7 +53,7 @@ static int mock_phys_object(void *arg)
 
 	/* Make the object dirty so that put_pages must do copy back the data */
 	i915_gem_object_lock(obj, NULL);
-	err = i915_gem_object_set_to_gtt_domain(obj, true);
+	err = i915_gem_object_set_to_gtt_domain(obj, NULL, true);
 	i915_gem_object_unlock(obj);
 	if (err) {
 		pr_err("i915_gem_object_set_to_gtt_domain failed with err=%d\n",
diff --git a/drivers/gpu/drm/i915/gt/selftest_workarounds.c b/drivers/gpu/drm/i915/gt/selftest_workarounds.c
index 1bf8e2826d7b..c60034d127d7 100644
--- a/drivers/gpu/drm/i915/gt/selftest_workarounds.c
+++ b/drivers/gpu/drm/i915/gt/selftest_workarounds.c
@@ -216,7 +216,7 @@ static int check_whitelist(struct intel_context *ce)
 	err = 0;
 	i915_gem_object_lock(results, NULL);
 	intel_wedge_on_timeout(&wedge, engine->gt, HZ / 5) /* safety net! */
-		err = i915_gem_object_set_to_cpu_domain(results, false);
+		err = i915_gem_object_set_to_cpu_domain(results, NULL, false);
 
 	if (intel_gt_is_wedged(engine->gt))
 		err = -EIO;
diff --git a/drivers/gpu/drm/i915/gvt/cmd_parser.c b/drivers/gpu/drm/i915/gvt/cmd_parser.c
index eb804e4267d2..413de96fb9b6 100644
--- a/drivers/gpu/drm/i915/gvt/cmd_parser.c
+++ b/drivers/gpu/drm/i915/gvt/cmd_parser.c
@@ -3016,7 +3016,7 @@ static int shadow_indirect_ctx(struct intel_shadow_wa_ctx *wa_ctx)
 	}
 
 	i915_gem_object_lock(obj, NULL);
-	ret = i915_gem_object_set_to_cpu_domain(obj, false);
+	ret = i915_gem_object_set_to_cpu_domain(obj, NULL, false);
 	i915_gem_object_unlock(obj);
 	if (ret) {
 		gvt_vgpu_err("failed to set shadow indirect ctx to CPU\n");
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 3ab9a79baf34..83d4471c28bb 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -223,7 +223,7 @@ i915_gem_shmem_pread(struct drm_i915_gem_object *obj,
 	if (ret)
 		return ret;
 
-	ret = i915_gem_object_pin_pages(obj);
+	ret = i915_gem_object_pin_pages(obj, NULL);
 	if (ret)
 		goto err_unlock;
 
@@ -302,7 +302,7 @@ static struct i915_vma *i915_gem_gtt_prepare(struct drm_i915_gem_object *obj,
 	if (ret)
 		goto err_ww;
 
-	ret = i915_gem_object_set_to_gtt_domain(obj, write);
+	ret = i915_gem_object_set_to_gtt_domain(obj, &ww, write);
 	if (ret)
 		goto err_ww;
 
@@ -325,7 +325,7 @@ static struct i915_vma *i915_gem_gtt_prepare(struct drm_i915_gem_object *obj,
 		vma = NULL;
 	}
 
-	ret = i915_gem_object_pin_pages(obj);
+	ret = i915_gem_object_pin_pages(obj, &ww);
 	if (ret) {
 		if (drm_mm_node_allocated(node)) {
 			ggtt->vm.clear_range(&ggtt->vm, node->start, node->size);
@@ -654,7 +654,7 @@ i915_gem_shmem_pwrite(struct drm_i915_gem_object *obj,
 	if (ret)
 		return ret;
 
-	ret = i915_gem_object_pin_pages(obj);
+	ret = i915_gem_object_pin_pages(obj, NULL);
 	if (ret)
 		goto err_unlock;
 
diff --git a/drivers/gpu/drm/i915/i915_vma.c b/drivers/gpu/drm/i915/i915_vma.c
index 468317e3b477..08e56d0af6e0 100644
--- a/drivers/gpu/drm/i915/i915_vma.c
+++ b/drivers/gpu/drm/i915/i915_vma.c
@@ -798,7 +798,8 @@ static bool try_qad_pin(struct i915_vma *vma, unsigned int flags)
 	return pinned;
 }
 
-static int vma_get_pages(struct i915_vma *vma)
+static int vma_get_pages(struct i915_vma *vma,
+			 struct i915_gem_ww_ctx *ww)
 {
 	int err = 0;
 
@@ -811,7 +812,7 @@ static int vma_get_pages(struct i915_vma *vma)
 
 	if (!atomic_read(&vma->pages_count)) {
 		if (vma->obj) {
-			err = i915_gem_object_pin_pages(vma->obj);
+			err = i915_gem_object_pin_pages(vma->obj, ww);
 			if (err)
 				goto unlock;
 		}
@@ -889,7 +890,7 @@ int i915_vma_pin_ww(struct i915_vma *vma, struct i915_gem_ww_ctx *ww,
 	if (try_qad_pin(vma, flags & I915_VMA_BIND_MASK))
 		return 0;
 
-	err = vma_get_pages(vma);
+	err = vma_get_pages(vma, ww);
 	if (err)
 		return err;
 
diff --git a/drivers/gpu/drm/i915/selftests/i915_vma.c b/drivers/gpu/drm/i915/selftests/i915_vma.c
index dd0607254a95..918fce57aabe 100644
--- a/drivers/gpu/drm/i915/selftests/i915_vma.c
+++ b/drivers/gpu/drm/i915/selftests/i915_vma.c
@@ -988,7 +988,7 @@ static int igt_vma_remapped_gtt(void *arg)
 			unsigned int x, y;
 
 			i915_gem_object_lock(obj, NULL);
-			err = i915_gem_object_set_to_gtt_domain(obj, true);
+			err = i915_gem_object_set_to_gtt_domain(obj, NULL, true);
 			i915_gem_object_unlock(obj);
 			if (err)
 				goto out;
diff --git a/drivers/gpu/drm/i915/selftests/intel_memory_region.c b/drivers/gpu/drm/i915/selftests/intel_memory_region.c
index a5fc0bf3feb9..f806876786f5 100644
--- a/drivers/gpu/drm/i915/selftests/intel_memory_region.c
+++ b/drivers/gpu/drm/i915/selftests/intel_memory_region.c
@@ -743,7 +743,7 @@ static int igt_lmem_write_cpu(void *arg)
 		goto out_unpin;
 
 	i915_gem_object_lock(obj, NULL);
-	err = i915_gem_object_set_to_wc_domain(obj, true);
+	err = i915_gem_object_set_to_wc_domain(obj, NULL, true);
 	i915_gem_object_unlock(obj);
 	if (err)
 		goto out_unpin;
-- 
2.31.0

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

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* Re: [Intel-gfx] [PATCH 1/4] drm/i915: Add ww parameter to get_pages() callback
  2021-04-29 10:10 ` [Intel-gfx] [PATCH 1/4] drm/i915: Add ww parameter to get_pages() callback Maarten Lankhorst
@ 2021-04-29 13:21   ` Matthew Auld
  0 siblings, 0 replies; 15+ messages in thread
From: Matthew Auld @ 2021-04-29 13:21 UTC (permalink / raw)
  To: Maarten Lankhorst; +Cc: Intel Graphics Development

On Thu, 29 Apr 2021 at 11:10, Maarten Lankhorst
<maarten.lankhorst@linux.intel.com> wrote:
>
> We will need this to support eviction with lmem, so
> explicitly pass ww as a parameter.
>
> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Reviewed-by: Matthew Auld <matthew.auld@intel.com>

Should be Cc: dri-devel
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [Intel-gfx] [PATCH 2/4] drm/i915: Add ww context to prepare_(read/write)
  2021-04-29 10:10 ` [Intel-gfx] [PATCH 2/4] drm/i915: Add ww context to prepare_(read/write) Maarten Lankhorst
@ 2021-04-29 13:23   ` Matthew Auld
  0 siblings, 0 replies; 15+ messages in thread
From: Matthew Auld @ 2021-04-29 13:23 UTC (permalink / raw)
  To: Maarten Lankhorst; +Cc: Intel Graphics Development

On Thu, 29 Apr 2021 at 11:10, Maarten Lankhorst
<maarten.lankhorst@linux.intel.com> wrote:
>
> This will allow us to explicitly pass the ww to pin_pages, when it starts taking it.
>
> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [Intel-gfx] [PATCH 3/4] drm/i915: Pass ww ctx to pin_map, v2.
  2021-04-29 10:10 ` [Intel-gfx] [PATCH 3/4] drm/i915: Pass ww ctx to pin_map, v2 Maarten Lankhorst
@ 2021-04-29 13:28   ` Matthew Auld
  2021-04-29 14:23       ` Maarten Lankhorst
  2021-04-29 14:55   ` Matthew Auld
  1 sibling, 1 reply; 15+ messages in thread
From: Matthew Auld @ 2021-04-29 13:28 UTC (permalink / raw)
  To: Maarten Lankhorst; +Cc: Intel Graphics Development

On Thu, 29 Apr 2021 at 11:10, Maarten Lankhorst
<maarten.lankhorst@linux.intel.com> wrote:
>
> This will allow us to explicitly pass the ww to pin_pages,
> when it starts taking it.
>
> This allows us to finally kill off the explicit passing of ww
> by retrieving it from the obj.

This seems to contradict the first sentence?


>
> Changes since v1:
> - Rename 'ret' to ptr, fix error handling of return ptr.
>
> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
> ---
>  .../gpu/drm/i915/gem/i915_gem_execbuffer.c    |  7 +++---
>  drivers/gpu/drm/i915/gem/i915_gem_mman.c      |  2 +-
>  drivers/gpu/drm/i915/gem/i915_gem_object.h    |  1 +
>  .../gpu/drm/i915/gem/i915_gem_object_blt.c    |  4 ++--
>  drivers/gpu/drm/i915/gem/i915_gem_pages.c     | 24 +++++++++++++++----
>  .../drm/i915/gem/selftests/i915_gem_context.c |  8 ++++---
>  .../drm/i915/gem/selftests/i915_gem_dmabuf.c  |  2 +-
>  drivers/gpu/drm/i915/gt/gen7_renderclear.c    |  2 +-
>  drivers/gpu/drm/i915/gt/intel_engine_cs.c     |  2 +-
>  drivers/gpu/drm/i915/gt/intel_engine_pm.c     |  2 +-
>  drivers/gpu/drm/i915/gt/intel_gtt.c           |  2 +-
>  drivers/gpu/drm/i915/gt/intel_lrc.c           |  4 ++--
>  drivers/gpu/drm/i915/gt/intel_renderstate.c   |  2 +-
>  drivers/gpu/drm/i915/gt/intel_ring.c          |  2 +-
>  .../gpu/drm/i915/gt/intel_ring_submission.c   |  2 +-
>  drivers/gpu/drm/i915/gt/intel_timeline.c      |  7 +++---
>  drivers/gpu/drm/i915/gt/intel_timeline.h      |  3 ++-
>  drivers/gpu/drm/i915/gt/intel_workarounds.c   |  2 +-
>  drivers/gpu/drm/i915/gt/mock_engine.c         |  2 +-
>  drivers/gpu/drm/i915/gt/selftest_lrc.c        |  2 +-
>  drivers/gpu/drm/i915/gt/selftest_rps.c        | 10 ++++----
>  .../gpu/drm/i915/gt/selftest_workarounds.c    |  6 ++---
>  drivers/gpu/drm/i915/gvt/cmd_parser.c         |  4 ++--
>  drivers/gpu/drm/i915/i915_perf.c              |  4 ++--
>  drivers/gpu/drm/i915/selftests/igt_spinner.c  |  2 +-
>  25 files changed, 63 insertions(+), 45 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
> index 17a87d176a67..66d24dfbd805 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
> @@ -1345,7 +1345,7 @@ static int __reloc_gpu_alloc(struct i915_execbuffer *eb,
>         if (err)
>                 goto err_pool;
>
> -       cmd = i915_gem_object_pin_map(pool->obj, pool->type);
> +       cmd = i915_gem_object_pin_map(pool->obj, &eb->ww, pool->type);
>         if (IS_ERR(cmd)) {
>                 err = PTR_ERR(cmd);
>                 goto err_pool;
> @@ -2494,7 +2494,8 @@ static int eb_parse_pipeline(struct i915_execbuffer *eb,
>                         goto err_shadow;
>         }
>
> -       pw->shadow_map = i915_gem_object_pin_map(shadow->obj, I915_MAP_WB);
> +       pw->shadow_map = i915_gem_object_pin_map(shadow->obj, &eb->ww,
> +                                                I915_MAP_WB);
>         if (IS_ERR(pw->shadow_map)) {
>                 err = PTR_ERR(pw->shadow_map);
>                 goto err_trampoline;
> @@ -2505,7 +2506,7 @@ static int eb_parse_pipeline(struct i915_execbuffer *eb,
>
>         pw->batch_map = ERR_PTR(-ENODEV);
>         if (needs_clflush && i915_has_memcpy_from_wc())
> -               pw->batch_map = i915_gem_object_pin_map(batch, I915_MAP_WC);
> +               pw->batch_map = i915_gem_object_pin_map(batch, &eb->ww, I915_MAP_WC);
>
>         if (IS_ERR(pw->batch_map)) {
>                 err = i915_gem_object_pin_pages(batch);
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_mman.c b/drivers/gpu/drm/i915/gem/i915_gem_mman.c
> index 8598a1c78a4c..ae2d71d76889 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_mman.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_mman.c
> @@ -439,7 +439,7 @@ vm_access(struct vm_area_struct *area, unsigned long addr,
>                 goto out;
>
>         /* As this is primarily for debugging, let's focus on simplicity */
> -       vaddr = i915_gem_object_pin_map(obj, I915_MAP_FORCE_WC);
> +       vaddr = i915_gem_object_pin_map(obj, &ww, I915_MAP_FORCE_WC);
>         if (IS_ERR(vaddr)) {
>                 err = PTR_ERR(vaddr);
>                 goto out;
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.h b/drivers/gpu/drm/i915/gem/i915_gem_object.h
> index f7a0cf1a8f24..ed6c7421af4f 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_object.h
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_object.h
> @@ -450,6 +450,7 @@ void i915_gem_object_writeback(struct drm_i915_gem_object *obj);
>   * ERR_PTR() on error.
>   */
>  void *__must_check i915_gem_object_pin_map(struct drm_i915_gem_object *obj,
> +                                          struct i915_gem_ww_ctx *ww,
>                                            enum i915_map_type type);
>
>  void *__must_check i915_gem_object_pin_map_unlocked(struct drm_i915_gem_object *obj,
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object_blt.c b/drivers/gpu/drm/i915/gem/i915_gem_object_blt.c
> index df8e8c18c6c9..fae18622d2da 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_object_blt.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_object_blt.c
> @@ -58,7 +58,7 @@ struct i915_vma *intel_emit_vma_fill_blt(struct intel_context *ce,
>         /* we pinned the pool, mark it as such */
>         intel_gt_buffer_pool_mark_used(pool);
>
> -       cmd = i915_gem_object_pin_map(pool->obj, pool->type);
> +       cmd = i915_gem_object_pin_map(pool->obj, ww, pool->type);
>         if (IS_ERR(cmd)) {
>                 err = PTR_ERR(cmd);
>                 goto out_unpin;
> @@ -283,7 +283,7 @@ struct i915_vma *intel_emit_vma_copy_blt(struct intel_context *ce,
>         /* we pinned the pool, mark it as such */
>         intel_gt_buffer_pool_mark_used(pool);
>
> -       cmd = i915_gem_object_pin_map(pool->obj, pool->type);
> +       cmd = i915_gem_object_pin_map(pool->obj, ww, pool->type);
>         if (IS_ERR(cmd)) {
>                 err = PTR_ERR(cmd);
>                 goto out_unpin;
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_pages.c b/drivers/gpu/drm/i915/gem/i915_gem_pages.c
> index 58e222030e10..42e867134481 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_pages.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_pages.c
> @@ -341,6 +341,7 @@ static void *i915_gem_object_map_pfn(struct drm_i915_gem_object *obj,
>
>  /* get, pin, and map the pages of the object into kernel space */
>  void *i915_gem_object_pin_map(struct drm_i915_gem_object *obj,
> +                             struct i915_gem_ww_ctx *ww,
>                               enum i915_map_type type)
>  {
>         enum i915_map_type has_type;
> @@ -408,13 +409,26 @@ void *i915_gem_object_pin_map(struct drm_i915_gem_object *obj,
>  void *i915_gem_object_pin_map_unlocked(struct drm_i915_gem_object *obj,
>                                        enum i915_map_type type)
>  {
> -       void *ret;
> +       struct i915_gem_ww_ctx ww;
> +       void *ptr;
> +       int err;
>
> -       i915_gem_object_lock(obj, NULL);
> -       ret = i915_gem_object_pin_map(obj, type);
> -       i915_gem_object_unlock(obj);
> +       i915_gem_ww_ctx_init(&ww, true);
> +retry:
> +       err = i915_gem_object_lock(obj, &ww);
> +       if (!err) {
> +               ptr = i915_gem_object_pin_map(obj, &ww, type);
> +               if (IS_ERR(ptr))
> +                       err = PTR_ERR(ptr);
> +       }
> +       if (err == -EDEADLK) {
> +               err = i915_gem_ww_ctx_backoff(&ww);
> +               if (!err)
> +                       goto retry;
> +       }
> +       i915_gem_ww_ctx_fini(&ww);
>
> -       return ret;
> +       return err ? ERR_PTR(err) : ptr;
>  }
>
>  void __i915_gem_object_flush_map(struct drm_i915_gem_object *obj,
> diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c b/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
> index fa1ae414348b..86b3489aba33 100644
> --- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
> +++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
> @@ -893,13 +893,15 @@ static int igt_shared_ctx_exec(void *arg)
>         return err;
>  }
>
> -static int rpcs_query_batch(struct drm_i915_gem_object *rpcs, struct i915_vma *vma)
> +static int rpcs_query_batch(struct drm_i915_gem_object *rpcs,
> +                           struct i915_gem_ww_ctx *ww,
> +                           struct i915_vma *vma)
>  {
>         u32 *cmd;
>
>         GEM_BUG_ON(INTEL_GEN(vma->vm->i915) < 8);
>
> -       cmd = i915_gem_object_pin_map(rpcs, I915_MAP_WB);
> +       cmd = i915_gem_object_pin_map(rpcs, ww, I915_MAP_WB);
>         if (IS_ERR(cmd))
>                 return PTR_ERR(cmd);
>
> @@ -965,7 +967,7 @@ emit_rpcs_query(struct drm_i915_gem_object *obj,
>         if (err)
>                 goto err_vma;
>
> -       err = rpcs_query_batch(rpcs, vma);
> +       err = rpcs_query_batch(rpcs, &ww, vma);
>         if (err)
>                 goto err_batch;
>
> diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_dmabuf.c b/drivers/gpu/drm/i915/gem/selftests/i915_gem_dmabuf.c
> index dd74bc09ec88..3edf5a1cc0c0 100644
> --- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_dmabuf.c
> +++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_dmabuf.c
> @@ -120,7 +120,7 @@ static int igt_dmabuf_import(void *arg)
>         }
>
>         if (0) { /* Can not yet map dmabuf */
> -               obj_map = i915_gem_object_pin_map(obj, I915_MAP_WB);
> +               obj_map = i915_gem_object_pin_map(obj, NULL, I915_MAP_WB);
>                 if (IS_ERR(obj_map)) {
>                         err = PTR_ERR(obj_map);
>                         pr_err("i915_gem_object_pin_map failed with err=%d\n", err);
> diff --git a/drivers/gpu/drm/i915/gt/gen7_renderclear.c b/drivers/gpu/drm/i915/gt/gen7_renderclear.c
> index de575fdb033f..c0b0044cb52a 100644
> --- a/drivers/gpu/drm/i915/gt/gen7_renderclear.c
> +++ b/drivers/gpu/drm/i915/gt/gen7_renderclear.c
> @@ -436,7 +436,7 @@ int gen7_setup_clear_gpr_bb(struct intel_engine_cs * const engine,
>
>         GEM_BUG_ON(vma->obj->base.size < bv.size);
>
> -       batch = i915_gem_object_pin_map(vma->obj, I915_MAP_WC);
> +       batch = i915_gem_object_pin_map(vma->obj, NULL, I915_MAP_WC);
>         if (IS_ERR(batch))
>                 return PTR_ERR(batch);
>
> diff --git a/drivers/gpu/drm/i915/gt/intel_engine_cs.c b/drivers/gpu/drm/i915/gt/intel_engine_cs.c
> index 6dbdbde00f14..5a4afbbf91b2 100644
> --- a/drivers/gpu/drm/i915/gt/intel_engine_cs.c
> +++ b/drivers/gpu/drm/i915/gt/intel_engine_cs.c
> @@ -664,7 +664,7 @@ static int init_status_page(struct intel_engine_cs *engine)
>         if (ret)
>                 goto err;
>
> -       vaddr = i915_gem_object_pin_map(obj, I915_MAP_WB);
> +       vaddr = i915_gem_object_pin_map(obj, &ww, I915_MAP_WB);
>         if (IS_ERR(vaddr)) {
>                 ret = PTR_ERR(vaddr);
>                 goto err_unpin;
> diff --git a/drivers/gpu/drm/i915/gt/intel_engine_pm.c b/drivers/gpu/drm/i915/gt/intel_engine_pm.c
> index 47f4397095e5..49add43bd4e1 100644
> --- a/drivers/gpu/drm/i915/gt/intel_engine_pm.c
> +++ b/drivers/gpu/drm/i915/gt/intel_engine_pm.c
> @@ -29,7 +29,7 @@ static void dbg_poison_ce(struct intel_context *ce)
>                 if (!i915_gem_object_trylock(obj))
>                         return;
>
> -               map = i915_gem_object_pin_map(obj, type);
> +               map = i915_gem_object_pin_map(obj, NULL, type);
>                 if (!IS_ERR(map)) {
>                         memset(map, CONTEXT_REDZONE, obj->base.size);
>                         i915_gem_object_flush_map(obj);
> diff --git a/drivers/gpu/drm/i915/gt/intel_gtt.c b/drivers/gpu/drm/i915/gt/intel_gtt.c
> index 9b98f9d9faa3..9c2d0a01c11f 100644
> --- a/drivers/gpu/drm/i915/gt/intel_gtt.c
> +++ b/drivers/gpu/drm/i915/gt/intel_gtt.c
> @@ -65,7 +65,7 @@ int map_pt_dma_locked(struct i915_address_space *vm, struct drm_i915_gem_object
>         void *vaddr;
>
>         type = i915_coherent_map_type(vm->i915, obj, true);
> -       vaddr = i915_gem_object_pin_map(obj, type);
> +       vaddr = i915_gem_object_pin_map(obj, NULL, type);
>         if (IS_ERR(vaddr))
>                 return PTR_ERR(vaddr);
>
> diff --git a/drivers/gpu/drm/i915/gt/intel_lrc.c b/drivers/gpu/drm/i915/gt/intel_lrc.c
> index aafe2a4df496..aa0e2c40e53a 100644
> --- a/drivers/gpu/drm/i915/gt/intel_lrc.c
> +++ b/drivers/gpu/drm/i915/gt/intel_lrc.c
> @@ -902,7 +902,7 @@ lrc_pre_pin(struct intel_context *ce,
>         GEM_BUG_ON(!ce->state);
>         GEM_BUG_ON(!i915_vma_is_pinned(ce->state));
>
> -       *vaddr = i915_gem_object_pin_map(ce->state->obj,
> +       *vaddr = i915_gem_object_pin_map(ce->state->obj, ww,
>                                          i915_coherent_map_type(ce->engine->i915,
>                                                                 ce->state->obj,
>                                                                 false) |
> @@ -1514,7 +1514,7 @@ void lrc_init_wa_ctx(struct intel_engine_cs *engine)
>         if (err)
>                 goto err;
>
> -       batch = i915_gem_object_pin_map(wa_ctx->vma->obj, I915_MAP_WB);
> +       batch = i915_gem_object_pin_map(wa_ctx->vma->obj, &ww, I915_MAP_WB);
>         if (IS_ERR(batch)) {
>                 err = PTR_ERR(batch);
>                 goto err_unpin;
> diff --git a/drivers/gpu/drm/i915/gt/intel_renderstate.c b/drivers/gpu/drm/i915/gt/intel_renderstate.c
> index b03e197b1d99..69d4856a2b11 100644
> --- a/drivers/gpu/drm/i915/gt/intel_renderstate.c
> +++ b/drivers/gpu/drm/i915/gt/intel_renderstate.c
> @@ -53,7 +53,7 @@ static int render_state_setup(struct intel_renderstate *so,
>         int ret = -EINVAL;
>         u32 *d;
>
> -       d = i915_gem_object_pin_map(so->vma->obj, I915_MAP_WB);
> +       d = i915_gem_object_pin_map(so->vma->obj, &so->ww, I915_MAP_WB);
>         if (IS_ERR(d))
>                 return PTR_ERR(d);
>
> diff --git a/drivers/gpu/drm/i915/gt/intel_ring.c b/drivers/gpu/drm/i915/gt/intel_ring.c
> index 7c4d5158e03b..619f6d54e06d 100644
> --- a/drivers/gpu/drm/i915/gt/intel_ring.c
> +++ b/drivers/gpu/drm/i915/gt/intel_ring.c
> @@ -56,7 +56,7 @@ int intel_ring_pin(struct intel_ring *ring, struct i915_gem_ww_ctx *ww)
>         } else {
>                 int type = i915_coherent_map_type(vma->vm->i915, vma->obj, false);
>
> -               addr = i915_gem_object_pin_map(vma->obj, type);
> +               addr = i915_gem_object_pin_map(vma->obj, ww, type);
>         }
>
>         if (IS_ERR(addr)) {
> diff --git a/drivers/gpu/drm/i915/gt/intel_ring_submission.c b/drivers/gpu/drm/i915/gt/intel_ring_submission.c
> index 9585546556ee..e3903cae2d7d 100644
> --- a/drivers/gpu/drm/i915/gt/intel_ring_submission.c
> +++ b/drivers/gpu/drm/i915/gt/intel_ring_submission.c
> @@ -452,7 +452,7 @@ static int ring_context_init_default_state(struct intel_context *ce,
>         struct drm_i915_gem_object *obj = ce->state->obj;
>         void *vaddr;
>
> -       vaddr = i915_gem_object_pin_map(obj, I915_MAP_WB);
> +       vaddr = i915_gem_object_pin_map(obj, ww, I915_MAP_WB);
>         if (IS_ERR(vaddr))
>                 return PTR_ERR(vaddr);
>
> diff --git a/drivers/gpu/drm/i915/gt/intel_timeline.c b/drivers/gpu/drm/i915/gt/intel_timeline.c
> index f19cf6d2fa85..a9a1960f7f36 100644
> --- a/drivers/gpu/drm/i915/gt/intel_timeline.c
> +++ b/drivers/gpu/drm/i915/gt/intel_timeline.c
> @@ -53,13 +53,14 @@ static int __timeline_active(struct i915_active *active)
>  }
>
>  I915_SELFTEST_EXPORT int
> -intel_timeline_pin_map(struct intel_timeline *timeline)
> +intel_timeline_pin_map(struct intel_timeline *timeline,
> +                      struct i915_gem_ww_ctx *ww)
>  {
>         struct drm_i915_gem_object *obj = timeline->hwsp_ggtt->obj;
>         u32 ofs = offset_in_page(timeline->hwsp_offset);
>         void *vaddr;
>
> -       vaddr = i915_gem_object_pin_map(obj, I915_MAP_WB);
> +       vaddr = i915_gem_object_pin_map(obj, ww, I915_MAP_WB);
>         if (IS_ERR(vaddr))
>                 return PTR_ERR(vaddr);
>
> @@ -184,7 +185,7 @@ int intel_timeline_pin(struct intel_timeline *tl, struct i915_gem_ww_ctx *ww)
>                 return 0;
>
>         if (!tl->hwsp_map) {
> -               err = intel_timeline_pin_map(tl);
> +               err = intel_timeline_pin_map(tl, ww);
>                 if (err)
>                         return err;
>         }
> diff --git a/drivers/gpu/drm/i915/gt/intel_timeline.h b/drivers/gpu/drm/i915/gt/intel_timeline.h
> index 57308c4d664a..dad5a60e556b 100644
> --- a/drivers/gpu/drm/i915/gt/intel_timeline.h
> +++ b/drivers/gpu/drm/i915/gt/intel_timeline.h
> @@ -98,6 +98,7 @@ intel_timeline_is_last(const struct intel_timeline *tl,
>         return list_is_last_rcu(&rq->link, &tl->requests);
>  }
>
> -I915_SELFTEST_DECLARE(int intel_timeline_pin_map(struct intel_timeline *tl));
> +I915_SELFTEST_DECLARE(int intel_timeline_pin_map(struct intel_timeline *tl,
> +                                                struct i915_gem_ww_ctx *ww));
>
>  #endif
> diff --git a/drivers/gpu/drm/i915/gt/intel_workarounds.c b/drivers/gpu/drm/i915/gt/intel_workarounds.c
> index 5a03a76bb9e2..df342b18f5ae 100644
> --- a/drivers/gpu/drm/i915/gt/intel_workarounds.c
> +++ b/drivers/gpu/drm/i915/gt/intel_workarounds.c
> @@ -2233,7 +2233,7 @@ static int engine_wa_list_verify(struct intel_context *ce,
>                 goto err_rq;
>         }
>
> -       results = i915_gem_object_pin_map(vma->obj, I915_MAP_WB);
> +       results = i915_gem_object_pin_map(vma->obj, NULL, I915_MAP_WB);
>         if (IS_ERR(results)) {
>                 err = PTR_ERR(results);
>                 goto err_rq;
> diff --git a/drivers/gpu/drm/i915/gt/mock_engine.c b/drivers/gpu/drm/i915/gt/mock_engine.c
> index e1ba03b93ffa..b5f48e8bb38f 100644
> --- a/drivers/gpu/drm/i915/gt/mock_engine.c
> +++ b/drivers/gpu/drm/i915/gt/mock_engine.c
> @@ -20,7 +20,7 @@ static int mock_timeline_pin(struct intel_timeline *tl)
>         if (WARN_ON(!i915_gem_object_trylock(tl->hwsp_ggtt->obj)))
>                 return -EBUSY;
>
> -       err = intel_timeline_pin_map(tl);
> +       err = intel_timeline_pin_map(tl, NULL);
>         i915_gem_object_unlock(tl->hwsp_ggtt->obj);
>         if (err)
>                 return err;
> diff --git a/drivers/gpu/drm/i915/gt/selftest_lrc.c b/drivers/gpu/drm/i915/gt/selftest_lrc.c
> index d8f6623524e8..84378dd775b5 100644
> --- a/drivers/gpu/drm/i915/gt/selftest_lrc.c
> +++ b/drivers/gpu/drm/i915/gt/selftest_lrc.c
> @@ -425,7 +425,7 @@ static int __live_lrc_state(struct intel_engine_cs *engine,
>                 goto err_rq;
>         }
>
> -       cs = i915_gem_object_pin_map(scratch->obj, I915_MAP_WB);
> +       cs = i915_gem_object_pin_map(scratch->obj, NULL, I915_MAP_WB);
>         if (IS_ERR(cs)) {
>                 err = PTR_ERR(cs);
>                 goto err_rq;
> diff --git a/drivers/gpu/drm/i915/gt/selftest_rps.c b/drivers/gpu/drm/i915/gt/selftest_rps.c
> index adf7fdbc00f7..687b94028de5 100644
> --- a/drivers/gpu/drm/i915/gt/selftest_rps.c
> +++ b/drivers/gpu/drm/i915/gt/selftest_rps.c
> @@ -83,17 +83,17 @@ create_spin_counter(struct intel_engine_cs *engine,
>
>         err = i915_vma_pin(vma, 0, 0, PIN_USER);
>         if (err)
> -               goto err_unlock;
> -
> -       i915_vma_lock(vma);
> +               goto err_put;
>
> -       base = i915_gem_object_pin_map(obj, I915_MAP_WC);
> +       base = i915_gem_object_pin_map_unlocked(obj, I915_MAP_WC);
>         if (IS_ERR(base)) {
>                 err = PTR_ERR(base);
>                 goto err_unpin;
>         }
>         cs = base;
>
> +       i915_vma_lock(vma);
> +
>         *cs++ = MI_LOAD_REGISTER_IMM(__NGPR__ * 2);
>         for (i = 0; i < __NGPR__; i++) {
>                 *cs++ = i915_mmio_reg_offset(CS_GPR(i));
> @@ -137,8 +137,6 @@ create_spin_counter(struct intel_engine_cs *engine,
>
>  err_unpin:
>         i915_vma_unpin(vma);
> -err_unlock:
> -       i915_vma_unlock(vma);
>  err_put:
>         i915_gem_object_put(obj);
>         return ERR_PTR(err);
> diff --git a/drivers/gpu/drm/i915/gt/selftest_workarounds.c b/drivers/gpu/drm/i915/gt/selftest_workarounds.c
> index 64937ec3f2dc..1bf8e2826d7b 100644
> --- a/drivers/gpu/drm/i915/gt/selftest_workarounds.c
> +++ b/drivers/gpu/drm/i915/gt/selftest_workarounds.c
> @@ -223,7 +223,7 @@ static int check_whitelist(struct intel_context *ce)
>         if (err)
>                 goto out_put;
>
> -       vaddr = i915_gem_object_pin_map(results, I915_MAP_WB);
> +       vaddr = i915_gem_object_pin_map(results, NULL, I915_MAP_WB);
>         if (IS_ERR(vaddr)) {
>                 err = PTR_ERR(vaddr);
>                 goto out_put;
> @@ -529,13 +529,13 @@ static int check_dirty_whitelist(struct intel_context *ce)
>                 if (err)
>                         goto out;
>
> -               cs = i915_gem_object_pin_map(batch->obj, I915_MAP_WC);
> +               cs = i915_gem_object_pin_map(batch->obj, &ww, I915_MAP_WC);
>                 if (IS_ERR(cs)) {
>                         err = PTR_ERR(cs);
>                         goto out_ctx;
>                 }
>
> -               results = i915_gem_object_pin_map(scratch->obj, I915_MAP_WB);
> +               results = i915_gem_object_pin_map(scratch->obj, &ww, I915_MAP_WB);
>                 if (IS_ERR(results)) {
>                         err = PTR_ERR(results);
>                         goto out_unmap_batch;
> diff --git a/drivers/gpu/drm/i915/gvt/cmd_parser.c b/drivers/gpu/drm/i915/gvt/cmd_parser.c
> index ca9c9e27a43d..eb804e4267d2 100644
> --- a/drivers/gpu/drm/i915/gvt/cmd_parser.c
> +++ b/drivers/gpu/drm/i915/gvt/cmd_parser.c
> @@ -1935,7 +1935,7 @@ static int perform_bb_shadow(struct parser_exec_state *s)
>                 goto err_free_bb;
>         }
>
> -       bb->va = i915_gem_object_pin_map(bb->obj, I915_MAP_WB);
> +       bb->va = i915_gem_object_pin_map_unlocked(bb->obj, I915_MAP_WB);
>         if (IS_ERR(bb->va)) {
>                 ret = PTR_ERR(bb->va);
>                 goto err_free_obj;
> @@ -3008,7 +3008,7 @@ static int shadow_indirect_ctx(struct intel_shadow_wa_ctx *wa_ctx)
>                 return PTR_ERR(obj);
>
>         /* get the va of the shadow batch buffer */
> -       map = i915_gem_object_pin_map(obj, I915_MAP_WB);
> +       map = i915_gem_object_pin_map_unlocked(obj, I915_MAP_WB);
>         if (IS_ERR(map)) {
>                 gvt_vgpu_err("failed to vmap shadow indirect ctx\n");
>                 ret = PTR_ERR(map);
> diff --git a/drivers/gpu/drm/i915/i915_perf.c b/drivers/gpu/drm/i915/i915_perf.c
> index 85ad62dbabfa..62259c46d302 100644
> --- a/drivers/gpu/drm/i915/i915_perf.c
> +++ b/drivers/gpu/drm/i915/i915_perf.c
> @@ -1662,7 +1662,7 @@ static int alloc_noa_wait(struct i915_perf_stream *stream)
>                 goto out_ww;
>         }
>
> -       batch = cs = i915_gem_object_pin_map(bo, I915_MAP_WB);
> +       batch = cs = i915_gem_object_pin_map(bo, &ww, I915_MAP_WB);
>         if (IS_ERR(batch)) {
>                 ret = PTR_ERR(batch);
>                 goto err_unpin;
> @@ -1875,7 +1875,7 @@ alloc_oa_config_buffer(struct i915_perf_stream *stream,
>         if (err)
>                 goto out_ww;
>
> -       cs = i915_gem_object_pin_map(obj, I915_MAP_WB);
> +       cs = i915_gem_object_pin_map(obj, &ww, I915_MAP_WB);
>         if (IS_ERR(cs)) {
>                 err = PTR_ERR(cs);
>                 goto out_ww;
> diff --git a/drivers/gpu/drm/i915/selftests/igt_spinner.c b/drivers/gpu/drm/i915/selftests/igt_spinner.c
> index 5fe397b7d1d9..b80d0089923a 100644
> --- a/drivers/gpu/drm/i915/selftests/igt_spinner.c
> +++ b/drivers/gpu/drm/i915/selftests/igt_spinner.c
> @@ -54,7 +54,7 @@ static void *igt_spinner_pin_obj(struct intel_context *ce,
>         if (ret)
>                 return ERR_PTR(ret);
>
> -       vaddr = i915_gem_object_pin_map(obj, mode);
> +       vaddr = i915_gem_object_pin_map(obj, ww, mode);
>
>         if (!ww)
>                 i915_gem_object_unlock(obj);
> --
> 2.31.0
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [Intel-gfx] [PATCH 4/4] drm/i915: Pass ww ctx to i915_gem_object_pin_pages, v2.
  2021-04-29 10:10 ` [Intel-gfx] [PATCH 4/4] drm/i915: Pass ww ctx to i915_gem_object_pin_pages, v2 Maarten Lankhorst
@ 2021-04-29 13:46   ` Matthew Auld
  0 siblings, 0 replies; 15+ messages in thread
From: Matthew Auld @ 2021-04-29 13:46 UTC (permalink / raw)
  To: Maarten Lankhorst; +Cc: Intel Graphics Development

On Thu, 29 Apr 2021 at 11:10, Maarten Lankhorst
<maarten.lankhorst@linux.intel.com> wrote:
>
> This is the final part of passing ww ctx to the get_pages() callbacks.
> Now we no longer have to implicitly get ww ctx by using get_ww_ctx.
>
> Changes since v1:
> - Fix error handling in pin_map_unlocked().
>
> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [Intel-gfx] [PATCH 3/4] drm/i915: Pass ww ctx to pin_map, v2.
  2021-04-29 13:28   ` Matthew Auld
@ 2021-04-29 14:23       ` Maarten Lankhorst
  0 siblings, 0 replies; 15+ messages in thread
From: Maarten Lankhorst @ 2021-04-29 14:23 UTC (permalink / raw)
  To: Matthew Auld; +Cc: Intel Graphics Development, dri-devel

Op 29-04-2021 om 15:28 schreef Matthew Auld:
> On Thu, 29 Apr 2021 at 11:10, Maarten Lankhorst
> <maarten.lankhorst@linux.intel.com> wrote:
>> This will allow us to explicitly pass the ww to pin_pages,
>> when it starts taking it.
>>
>> This allows us to finally kill off the explicit passing of ww
>> by retrieving it from the obj.
> This seems to contradict the first sentence?

Correct, this was based on a version of eviction where ww was implicitly passed.

I meant 'implicit' here; the whole line can be removed.

>
>
>> Changes since v1:
>> - Rename 'ret' to ptr, fix error handling of return ptr.
>>
>> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
>> ---
>>  .../gpu/drm/i915/gem/i915_gem_execbuffer.c    |  7 +++---
>>  drivers/gpu/drm/i915/gem/i915_gem_mman.c      |  2 +-
>>  drivers/gpu/drm/i915/gem/i915_gem_object.h    |  1 +
>>  .../gpu/drm/i915/gem/i915_gem_object_blt.c    |  4 ++--
>>  drivers/gpu/drm/i915/gem/i915_gem_pages.c     | 24 +++++++++++++++----
>>  .../drm/i915/gem/selftests/i915_gem_context.c |  8 ++++---
>>  .../drm/i915/gem/selftests/i915_gem_dmabuf.c  |  2 +-
>>  drivers/gpu/drm/i915/gt/gen7_renderclear.c    |  2 +-
>>  drivers/gpu/drm/i915/gt/intel_engine_cs.c     |  2 +-
>>  drivers/gpu/drm/i915/gt/intel_engine_pm.c     |  2 +-
>>  drivers/gpu/drm/i915/gt/intel_gtt.c           |  2 +-
>>  drivers/gpu/drm/i915/gt/intel_lrc.c           |  4 ++--
>>  drivers/gpu/drm/i915/gt/intel_renderstate.c   |  2 +-
>>  drivers/gpu/drm/i915/gt/intel_ring.c          |  2 +-
>>  .../gpu/drm/i915/gt/intel_ring_submission.c   |  2 +-
>>  drivers/gpu/drm/i915/gt/intel_timeline.c      |  7 +++---
>>  drivers/gpu/drm/i915/gt/intel_timeline.h      |  3 ++-
>>  drivers/gpu/drm/i915/gt/intel_workarounds.c   |  2 +-
>>  drivers/gpu/drm/i915/gt/mock_engine.c         |  2 +-
>>  drivers/gpu/drm/i915/gt/selftest_lrc.c        |  2 +-
>>  drivers/gpu/drm/i915/gt/selftest_rps.c        | 10 ++++----
>>  .../gpu/drm/i915/gt/selftest_workarounds.c    |  6 ++---
>>  drivers/gpu/drm/i915/gvt/cmd_parser.c         |  4 ++--
>>  drivers/gpu/drm/i915/i915_perf.c              |  4 ++--
>>  drivers/gpu/drm/i915/selftests/igt_spinner.c  |  2 +-
>>  25 files changed, 63 insertions(+), 45 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
>> index 17a87d176a67..66d24dfbd805 100644
>> --- a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
>> +++ b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
>> @@ -1345,7 +1345,7 @@ static int __reloc_gpu_alloc(struct i915_execbuffer *eb,
>>         if (err)
>>                 goto err_pool;
>>
>> -       cmd = i915_gem_object_pin_map(pool->obj, pool->type);
>> +       cmd = i915_gem_object_pin_map(pool->obj, &eb->ww, pool->type);
>>         if (IS_ERR(cmd)) {
>>                 err = PTR_ERR(cmd);
>>                 goto err_pool;
>> @@ -2494,7 +2494,8 @@ static int eb_parse_pipeline(struct i915_execbuffer *eb,
>>                         goto err_shadow;
>>         }
>>
>> -       pw->shadow_map = i915_gem_object_pin_map(shadow->obj, I915_MAP_WB);
>> +       pw->shadow_map = i915_gem_object_pin_map(shadow->obj, &eb->ww,
>> +                                                I915_MAP_WB);
>>         if (IS_ERR(pw->shadow_map)) {
>>                 err = PTR_ERR(pw->shadow_map);
>>                 goto err_trampoline;
>> @@ -2505,7 +2506,7 @@ static int eb_parse_pipeline(struct i915_execbuffer *eb,
>>
>>         pw->batch_map = ERR_PTR(-ENODEV);
>>         if (needs_clflush && i915_has_memcpy_from_wc())
>> -               pw->batch_map = i915_gem_object_pin_map(batch, I915_MAP_WC);
>> +               pw->batch_map = i915_gem_object_pin_map(batch, &eb->ww, I915_MAP_WC);
>>
>>         if (IS_ERR(pw->batch_map)) {
>>                 err = i915_gem_object_pin_pages(batch);
>> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_mman.c b/drivers/gpu/drm/i915/gem/i915_gem_mman.c
>> index 8598a1c78a4c..ae2d71d76889 100644
>> --- a/drivers/gpu/drm/i915/gem/i915_gem_mman.c
>> +++ b/drivers/gpu/drm/i915/gem/i915_gem_mman.c
>> @@ -439,7 +439,7 @@ vm_access(struct vm_area_struct *area, unsigned long addr,
>>                 goto out;
>>
>>         /* As this is primarily for debugging, let's focus on simplicity */
>> -       vaddr = i915_gem_object_pin_map(obj, I915_MAP_FORCE_WC);
>> +       vaddr = i915_gem_object_pin_map(obj, &ww, I915_MAP_FORCE_WC);
>>         if (IS_ERR(vaddr)) {
>>                 err = PTR_ERR(vaddr);
>>                 goto out;
>> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.h b/drivers/gpu/drm/i915/gem/i915_gem_object.h
>> index f7a0cf1a8f24..ed6c7421af4f 100644
>> --- a/drivers/gpu/drm/i915/gem/i915_gem_object.h
>> +++ b/drivers/gpu/drm/i915/gem/i915_gem_object.h
>> @@ -450,6 +450,7 @@ void i915_gem_object_writeback(struct drm_i915_gem_object *obj);
>>   * ERR_PTR() on error.
>>   */
>>  void *__must_check i915_gem_object_pin_map(struct drm_i915_gem_object *obj,
>> +                                          struct i915_gem_ww_ctx *ww,
>>                                            enum i915_map_type type);
>>
>>  void *__must_check i915_gem_object_pin_map_unlocked(struct drm_i915_gem_object *obj,
>> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object_blt.c b/drivers/gpu/drm/i915/gem/i915_gem_object_blt.c
>> index df8e8c18c6c9..fae18622d2da 100644
>> --- a/drivers/gpu/drm/i915/gem/i915_gem_object_blt.c
>> +++ b/drivers/gpu/drm/i915/gem/i915_gem_object_blt.c
>> @@ -58,7 +58,7 @@ struct i915_vma *intel_emit_vma_fill_blt(struct intel_context *ce,
>>         /* we pinned the pool, mark it as such */
>>         intel_gt_buffer_pool_mark_used(pool);
>>
>> -       cmd = i915_gem_object_pin_map(pool->obj, pool->type);
>> +       cmd = i915_gem_object_pin_map(pool->obj, ww, pool->type);
>>         if (IS_ERR(cmd)) {
>>                 err = PTR_ERR(cmd);
>>                 goto out_unpin;
>> @@ -283,7 +283,7 @@ struct i915_vma *intel_emit_vma_copy_blt(struct intel_context *ce,
>>         /* we pinned the pool, mark it as such */
>>         intel_gt_buffer_pool_mark_used(pool);
>>
>> -       cmd = i915_gem_object_pin_map(pool->obj, pool->type);
>> +       cmd = i915_gem_object_pin_map(pool->obj, ww, pool->type);
>>         if (IS_ERR(cmd)) {
>>                 err = PTR_ERR(cmd);
>>                 goto out_unpin;
>> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_pages.c b/drivers/gpu/drm/i915/gem/i915_gem_pages.c
>> index 58e222030e10..42e867134481 100644
>> --- a/drivers/gpu/drm/i915/gem/i915_gem_pages.c
>> +++ b/drivers/gpu/drm/i915/gem/i915_gem_pages.c
>> @@ -341,6 +341,7 @@ static void *i915_gem_object_map_pfn(struct drm_i915_gem_object *obj,
>>
>>  /* get, pin, and map the pages of the object into kernel space */
>>  void *i915_gem_object_pin_map(struct drm_i915_gem_object *obj,
>> +                             struct i915_gem_ww_ctx *ww,
>>                               enum i915_map_type type)
>>  {
>>         enum i915_map_type has_type;
>> @@ -408,13 +409,26 @@ void *i915_gem_object_pin_map(struct drm_i915_gem_object *obj,
>>  void *i915_gem_object_pin_map_unlocked(struct drm_i915_gem_object *obj,
>>                                        enum i915_map_type type)
>>  {
>> -       void *ret;
>> +       struct i915_gem_ww_ctx ww;
>> +       void *ptr;
>> +       int err;
>>
>> -       i915_gem_object_lock(obj, NULL);
>> -       ret = i915_gem_object_pin_map(obj, type);
>> -       i915_gem_object_unlock(obj);
>> +       i915_gem_ww_ctx_init(&ww, true);
>> +retry:
>> +       err = i915_gem_object_lock(obj, &ww);
>> +       if (!err) {
>> +               ptr = i915_gem_object_pin_map(obj, &ww, type);
>> +               if (IS_ERR(ptr))
>> +                       err = PTR_ERR(ptr);
>> +       }
>> +       if (err == -EDEADLK) {
>> +               err = i915_gem_ww_ctx_backoff(&ww);
>> +               if (!err)
>> +                       goto retry;
>> +       }
>> +       i915_gem_ww_ctx_fini(&ww);
>>
>> -       return ret;
>> +       return err ? ERR_PTR(err) : ptr;
>>  }
>>
>>  void __i915_gem_object_flush_map(struct drm_i915_gem_object *obj,
>> diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c b/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
>> index fa1ae414348b..86b3489aba33 100644
>> --- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
>> +++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
>> @@ -893,13 +893,15 @@ static int igt_shared_ctx_exec(void *arg)
>>         return err;
>>  }
>>
>> -static int rpcs_query_batch(struct drm_i915_gem_object *rpcs, struct i915_vma *vma)
>> +static int rpcs_query_batch(struct drm_i915_gem_object *rpcs,
>> +                           struct i915_gem_ww_ctx *ww,
>> +                           struct i915_vma *vma)
>>  {
>>         u32 *cmd;
>>
>>         GEM_BUG_ON(INTEL_GEN(vma->vm->i915) < 8);
>>
>> -       cmd = i915_gem_object_pin_map(rpcs, I915_MAP_WB);
>> +       cmd = i915_gem_object_pin_map(rpcs, ww, I915_MAP_WB);
>>         if (IS_ERR(cmd))
>>                 return PTR_ERR(cmd);
>>
>> @@ -965,7 +967,7 @@ emit_rpcs_query(struct drm_i915_gem_object *obj,
>>         if (err)
>>                 goto err_vma;
>>
>> -       err = rpcs_query_batch(rpcs, vma);
>> +       err = rpcs_query_batch(rpcs, &ww, vma);
>>         if (err)
>>                 goto err_batch;
>>
>> diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_dmabuf.c b/drivers/gpu/drm/i915/gem/selftests/i915_gem_dmabuf.c
>> index dd74bc09ec88..3edf5a1cc0c0 100644
>> --- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_dmabuf.c
>> +++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_dmabuf.c
>> @@ -120,7 +120,7 @@ static int igt_dmabuf_import(void *arg)
>>         }
>>
>>         if (0) { /* Can not yet map dmabuf */
>> -               obj_map = i915_gem_object_pin_map(obj, I915_MAP_WB);
>> +               obj_map = i915_gem_object_pin_map(obj, NULL, I915_MAP_WB);
>>                 if (IS_ERR(obj_map)) {
>>                         err = PTR_ERR(obj_map);
>>                         pr_err("i915_gem_object_pin_map failed with err=%d\n", err);
>> diff --git a/drivers/gpu/drm/i915/gt/gen7_renderclear.c b/drivers/gpu/drm/i915/gt/gen7_renderclear.c
>> index de575fdb033f..c0b0044cb52a 100644
>> --- a/drivers/gpu/drm/i915/gt/gen7_renderclear.c
>> +++ b/drivers/gpu/drm/i915/gt/gen7_renderclear.c
>> @@ -436,7 +436,7 @@ int gen7_setup_clear_gpr_bb(struct intel_engine_cs * const engine,
>>
>>         GEM_BUG_ON(vma->obj->base.size < bv.size);
>>
>> -       batch = i915_gem_object_pin_map(vma->obj, I915_MAP_WC);
>> +       batch = i915_gem_object_pin_map(vma->obj, NULL, I915_MAP_WC);
>>         if (IS_ERR(batch))
>>                 return PTR_ERR(batch);
>>
>> diff --git a/drivers/gpu/drm/i915/gt/intel_engine_cs.c b/drivers/gpu/drm/i915/gt/intel_engine_cs.c
>> index 6dbdbde00f14..5a4afbbf91b2 100644
>> --- a/drivers/gpu/drm/i915/gt/intel_engine_cs.c
>> +++ b/drivers/gpu/drm/i915/gt/intel_engine_cs.c
>> @@ -664,7 +664,7 @@ static int init_status_page(struct intel_engine_cs *engine)
>>         if (ret)
>>                 goto err;
>>
>> -       vaddr = i915_gem_object_pin_map(obj, I915_MAP_WB);
>> +       vaddr = i915_gem_object_pin_map(obj, &ww, I915_MAP_WB);
>>         if (IS_ERR(vaddr)) {
>>                 ret = PTR_ERR(vaddr);
>>                 goto err_unpin;
>> diff --git a/drivers/gpu/drm/i915/gt/intel_engine_pm.c b/drivers/gpu/drm/i915/gt/intel_engine_pm.c
>> index 47f4397095e5..49add43bd4e1 100644
>> --- a/drivers/gpu/drm/i915/gt/intel_engine_pm.c
>> +++ b/drivers/gpu/drm/i915/gt/intel_engine_pm.c
>> @@ -29,7 +29,7 @@ static void dbg_poison_ce(struct intel_context *ce)
>>                 if (!i915_gem_object_trylock(obj))
>>                         return;
>>
>> -               map = i915_gem_object_pin_map(obj, type);
>> +               map = i915_gem_object_pin_map(obj, NULL, type);
>>                 if (!IS_ERR(map)) {
>>                         memset(map, CONTEXT_REDZONE, obj->base.size);
>>                         i915_gem_object_flush_map(obj);
>> diff --git a/drivers/gpu/drm/i915/gt/intel_gtt.c b/drivers/gpu/drm/i915/gt/intel_gtt.c
>> index 9b98f9d9faa3..9c2d0a01c11f 100644
>> --- a/drivers/gpu/drm/i915/gt/intel_gtt.c
>> +++ b/drivers/gpu/drm/i915/gt/intel_gtt.c
>> @@ -65,7 +65,7 @@ int map_pt_dma_locked(struct i915_address_space *vm, struct drm_i915_gem_object
>>         void *vaddr;
>>
>>         type = i915_coherent_map_type(vm->i915, obj, true);
>> -       vaddr = i915_gem_object_pin_map(obj, type);
>> +       vaddr = i915_gem_object_pin_map(obj, NULL, type);
>>         if (IS_ERR(vaddr))
>>                 return PTR_ERR(vaddr);
>>
>> diff --git a/drivers/gpu/drm/i915/gt/intel_lrc.c b/drivers/gpu/drm/i915/gt/intel_lrc.c
>> index aafe2a4df496..aa0e2c40e53a 100644
>> --- a/drivers/gpu/drm/i915/gt/intel_lrc.c
>> +++ b/drivers/gpu/drm/i915/gt/intel_lrc.c
>> @@ -902,7 +902,7 @@ lrc_pre_pin(struct intel_context *ce,
>>         GEM_BUG_ON(!ce->state);
>>         GEM_BUG_ON(!i915_vma_is_pinned(ce->state));
>>
>> -       *vaddr = i915_gem_object_pin_map(ce->state->obj,
>> +       *vaddr = i915_gem_object_pin_map(ce->state->obj, ww,
>>                                          i915_coherent_map_type(ce->engine->i915,
>>                                                                 ce->state->obj,
>>                                                                 false) |
>> @@ -1514,7 +1514,7 @@ void lrc_init_wa_ctx(struct intel_engine_cs *engine)
>>         if (err)
>>                 goto err;
>>
>> -       batch = i915_gem_object_pin_map(wa_ctx->vma->obj, I915_MAP_WB);
>> +       batch = i915_gem_object_pin_map(wa_ctx->vma->obj, &ww, I915_MAP_WB);
>>         if (IS_ERR(batch)) {
>>                 err = PTR_ERR(batch);
>>                 goto err_unpin;
>> diff --git a/drivers/gpu/drm/i915/gt/intel_renderstate.c b/drivers/gpu/drm/i915/gt/intel_renderstate.c
>> index b03e197b1d99..69d4856a2b11 100644
>> --- a/drivers/gpu/drm/i915/gt/intel_renderstate.c
>> +++ b/drivers/gpu/drm/i915/gt/intel_renderstate.c
>> @@ -53,7 +53,7 @@ static int render_state_setup(struct intel_renderstate *so,
>>         int ret = -EINVAL;
>>         u32 *d;
>>
>> -       d = i915_gem_object_pin_map(so->vma->obj, I915_MAP_WB);
>> +       d = i915_gem_object_pin_map(so->vma->obj, &so->ww, I915_MAP_WB);
>>         if (IS_ERR(d))
>>                 return PTR_ERR(d);
>>
>> diff --git a/drivers/gpu/drm/i915/gt/intel_ring.c b/drivers/gpu/drm/i915/gt/intel_ring.c
>> index 7c4d5158e03b..619f6d54e06d 100644
>> --- a/drivers/gpu/drm/i915/gt/intel_ring.c
>> +++ b/drivers/gpu/drm/i915/gt/intel_ring.c
>> @@ -56,7 +56,7 @@ int intel_ring_pin(struct intel_ring *ring, struct i915_gem_ww_ctx *ww)
>>         } else {
>>                 int type = i915_coherent_map_type(vma->vm->i915, vma->obj, false);
>>
>> -               addr = i915_gem_object_pin_map(vma->obj, type);
>> +               addr = i915_gem_object_pin_map(vma->obj, ww, type);
>>         }
>>
>>         if (IS_ERR(addr)) {
>> diff --git a/drivers/gpu/drm/i915/gt/intel_ring_submission.c b/drivers/gpu/drm/i915/gt/intel_ring_submission.c
>> index 9585546556ee..e3903cae2d7d 100644
>> --- a/drivers/gpu/drm/i915/gt/intel_ring_submission.c
>> +++ b/drivers/gpu/drm/i915/gt/intel_ring_submission.c
>> @@ -452,7 +452,7 @@ static int ring_context_init_default_state(struct intel_context *ce,
>>         struct drm_i915_gem_object *obj = ce->state->obj;
>>         void *vaddr;
>>
>> -       vaddr = i915_gem_object_pin_map(obj, I915_MAP_WB);
>> +       vaddr = i915_gem_object_pin_map(obj, ww, I915_MAP_WB);
>>         if (IS_ERR(vaddr))
>>                 return PTR_ERR(vaddr);
>>
>> diff --git a/drivers/gpu/drm/i915/gt/intel_timeline.c b/drivers/gpu/drm/i915/gt/intel_timeline.c
>> index f19cf6d2fa85..a9a1960f7f36 100644
>> --- a/drivers/gpu/drm/i915/gt/intel_timeline.c
>> +++ b/drivers/gpu/drm/i915/gt/intel_timeline.c
>> @@ -53,13 +53,14 @@ static int __timeline_active(struct i915_active *active)
>>  }
>>
>>  I915_SELFTEST_EXPORT int
>> -intel_timeline_pin_map(struct intel_timeline *timeline)
>> +intel_timeline_pin_map(struct intel_timeline *timeline,
>> +                      struct i915_gem_ww_ctx *ww)
>>  {
>>         struct drm_i915_gem_object *obj = timeline->hwsp_ggtt->obj;
>>         u32 ofs = offset_in_page(timeline->hwsp_offset);
>>         void *vaddr;
>>
>> -       vaddr = i915_gem_object_pin_map(obj, I915_MAP_WB);
>> +       vaddr = i915_gem_object_pin_map(obj, ww, I915_MAP_WB);
>>         if (IS_ERR(vaddr))
>>                 return PTR_ERR(vaddr);
>>
>> @@ -184,7 +185,7 @@ int intel_timeline_pin(struct intel_timeline *tl, struct i915_gem_ww_ctx *ww)
>>                 return 0;
>>
>>         if (!tl->hwsp_map) {
>> -               err = intel_timeline_pin_map(tl);
>> +               err = intel_timeline_pin_map(tl, ww);
>>                 if (err)
>>                         return err;
>>         }
>> diff --git a/drivers/gpu/drm/i915/gt/intel_timeline.h b/drivers/gpu/drm/i915/gt/intel_timeline.h
>> index 57308c4d664a..dad5a60e556b 100644
>> --- a/drivers/gpu/drm/i915/gt/intel_timeline.h
>> +++ b/drivers/gpu/drm/i915/gt/intel_timeline.h
>> @@ -98,6 +98,7 @@ intel_timeline_is_last(const struct intel_timeline *tl,
>>         return list_is_last_rcu(&rq->link, &tl->requests);
>>  }
>>
>> -I915_SELFTEST_DECLARE(int intel_timeline_pin_map(struct intel_timeline *tl));
>> +I915_SELFTEST_DECLARE(int intel_timeline_pin_map(struct intel_timeline *tl,
>> +                                                struct i915_gem_ww_ctx *ww));
>>
>>  #endif
>> diff --git a/drivers/gpu/drm/i915/gt/intel_workarounds.c b/drivers/gpu/drm/i915/gt/intel_workarounds.c
>> index 5a03a76bb9e2..df342b18f5ae 100644
>> --- a/drivers/gpu/drm/i915/gt/intel_workarounds.c
>> +++ b/drivers/gpu/drm/i915/gt/intel_workarounds.c
>> @@ -2233,7 +2233,7 @@ static int engine_wa_list_verify(struct intel_context *ce,
>>                 goto err_rq;
>>         }
>>
>> -       results = i915_gem_object_pin_map(vma->obj, I915_MAP_WB);
>> +       results = i915_gem_object_pin_map(vma->obj, NULL, I915_MAP_WB);
>>         if (IS_ERR(results)) {
>>                 err = PTR_ERR(results);
>>                 goto err_rq;
>> diff --git a/drivers/gpu/drm/i915/gt/mock_engine.c b/drivers/gpu/drm/i915/gt/mock_engine.c
>> index e1ba03b93ffa..b5f48e8bb38f 100644
>> --- a/drivers/gpu/drm/i915/gt/mock_engine.c
>> +++ b/drivers/gpu/drm/i915/gt/mock_engine.c
>> @@ -20,7 +20,7 @@ static int mock_timeline_pin(struct intel_timeline *tl)
>>         if (WARN_ON(!i915_gem_object_trylock(tl->hwsp_ggtt->obj)))
>>                 return -EBUSY;
>>
>> -       err = intel_timeline_pin_map(tl);
>> +       err = intel_timeline_pin_map(tl, NULL);
>>         i915_gem_object_unlock(tl->hwsp_ggtt->obj);
>>         if (err)
>>                 return err;
>> diff --git a/drivers/gpu/drm/i915/gt/selftest_lrc.c b/drivers/gpu/drm/i915/gt/selftest_lrc.c
>> index d8f6623524e8..84378dd775b5 100644
>> --- a/drivers/gpu/drm/i915/gt/selftest_lrc.c
>> +++ b/drivers/gpu/drm/i915/gt/selftest_lrc.c
>> @@ -425,7 +425,7 @@ static int __live_lrc_state(struct intel_engine_cs *engine,
>>                 goto err_rq;
>>         }
>>
>> -       cs = i915_gem_object_pin_map(scratch->obj, I915_MAP_WB);
>> +       cs = i915_gem_object_pin_map(scratch->obj, NULL, I915_MAP_WB);
>>         if (IS_ERR(cs)) {
>>                 err = PTR_ERR(cs);
>>                 goto err_rq;
>> diff --git a/drivers/gpu/drm/i915/gt/selftest_rps.c b/drivers/gpu/drm/i915/gt/selftest_rps.c
>> index adf7fdbc00f7..687b94028de5 100644
>> --- a/drivers/gpu/drm/i915/gt/selftest_rps.c
>> +++ b/drivers/gpu/drm/i915/gt/selftest_rps.c
>> @@ -83,17 +83,17 @@ create_spin_counter(struct intel_engine_cs *engine,
>>
>>         err = i915_vma_pin(vma, 0, 0, PIN_USER);
>>         if (err)
>> -               goto err_unlock;
>> -
>> -       i915_vma_lock(vma);
>> +               goto err_put;
>>
>> -       base = i915_gem_object_pin_map(obj, I915_MAP_WC);
>> +       base = i915_gem_object_pin_map_unlocked(obj, I915_MAP_WC);
>>         if (IS_ERR(base)) {
>>                 err = PTR_ERR(base);
>>                 goto err_unpin;
>>         }
>>         cs = base;
>>
>> +       i915_vma_lock(vma);
>> +
>>         *cs++ = MI_LOAD_REGISTER_IMM(__NGPR__ * 2);
>>         for (i = 0; i < __NGPR__; i++) {
>>                 *cs++ = i915_mmio_reg_offset(CS_GPR(i));
>> @@ -137,8 +137,6 @@ create_spin_counter(struct intel_engine_cs *engine,
>>
>>  err_unpin:
>>         i915_vma_unpin(vma);
>> -err_unlock:
>> -       i915_vma_unlock(vma);
>>  err_put:
>>         i915_gem_object_put(obj);
>>         return ERR_PTR(err);
>> diff --git a/drivers/gpu/drm/i915/gt/selftest_workarounds.c b/drivers/gpu/drm/i915/gt/selftest_workarounds.c
>> index 64937ec3f2dc..1bf8e2826d7b 100644
>> --- a/drivers/gpu/drm/i915/gt/selftest_workarounds.c
>> +++ b/drivers/gpu/drm/i915/gt/selftest_workarounds.c
>> @@ -223,7 +223,7 @@ static int check_whitelist(struct intel_context *ce)
>>         if (err)
>>                 goto out_put;
>>
>> -       vaddr = i915_gem_object_pin_map(results, I915_MAP_WB);
>> +       vaddr = i915_gem_object_pin_map(results, NULL, I915_MAP_WB);
>>         if (IS_ERR(vaddr)) {
>>                 err = PTR_ERR(vaddr);
>>                 goto out_put;
>> @@ -529,13 +529,13 @@ static int check_dirty_whitelist(struct intel_context *ce)
>>                 if (err)
>>                         goto out;
>>
>> -               cs = i915_gem_object_pin_map(batch->obj, I915_MAP_WC);
>> +               cs = i915_gem_object_pin_map(batch->obj, &ww, I915_MAP_WC);
>>                 if (IS_ERR(cs)) {
>>                         err = PTR_ERR(cs);
>>                         goto out_ctx;
>>                 }
>>
>> -               results = i915_gem_object_pin_map(scratch->obj, I915_MAP_WB);
>> +               results = i915_gem_object_pin_map(scratch->obj, &ww, I915_MAP_WB);
>>                 if (IS_ERR(results)) {
>>                         err = PTR_ERR(results);
>>                         goto out_unmap_batch;
>> diff --git a/drivers/gpu/drm/i915/gvt/cmd_parser.c b/drivers/gpu/drm/i915/gvt/cmd_parser.c
>> index ca9c9e27a43d..eb804e4267d2 100644
>> --- a/drivers/gpu/drm/i915/gvt/cmd_parser.c
>> +++ b/drivers/gpu/drm/i915/gvt/cmd_parser.c
>> @@ -1935,7 +1935,7 @@ static int perform_bb_shadow(struct parser_exec_state *s)
>>                 goto err_free_bb;
>>         }
>>
>> -       bb->va = i915_gem_object_pin_map(bb->obj, I915_MAP_WB);
>> +       bb->va = i915_gem_object_pin_map_unlocked(bb->obj, I915_MAP_WB);
>>         if (IS_ERR(bb->va)) {
>>                 ret = PTR_ERR(bb->va);
>>                 goto err_free_obj;
>> @@ -3008,7 +3008,7 @@ static int shadow_indirect_ctx(struct intel_shadow_wa_ctx *wa_ctx)
>>                 return PTR_ERR(obj);
>>
>>         /* get the va of the shadow batch buffer */
>> -       map = i915_gem_object_pin_map(obj, I915_MAP_WB);
>> +       map = i915_gem_object_pin_map_unlocked(obj, I915_MAP_WB);
>>         if (IS_ERR(map)) {
>>                 gvt_vgpu_err("failed to vmap shadow indirect ctx\n");
>>                 ret = PTR_ERR(map);
>> diff --git a/drivers/gpu/drm/i915/i915_perf.c b/drivers/gpu/drm/i915/i915_perf.c
>> index 85ad62dbabfa..62259c46d302 100644
>> --- a/drivers/gpu/drm/i915/i915_perf.c
>> +++ b/drivers/gpu/drm/i915/i915_perf.c
>> @@ -1662,7 +1662,7 @@ static int alloc_noa_wait(struct i915_perf_stream *stream)
>>                 goto out_ww;
>>         }
>>
>> -       batch = cs = i915_gem_object_pin_map(bo, I915_MAP_WB);
>> +       batch = cs = i915_gem_object_pin_map(bo, &ww, I915_MAP_WB);
>>         if (IS_ERR(batch)) {
>>                 ret = PTR_ERR(batch);
>>                 goto err_unpin;
>> @@ -1875,7 +1875,7 @@ alloc_oa_config_buffer(struct i915_perf_stream *stream,
>>         if (err)
>>                 goto out_ww;
>>
>> -       cs = i915_gem_object_pin_map(obj, I915_MAP_WB);
>> +       cs = i915_gem_object_pin_map(obj, &ww, I915_MAP_WB);
>>         if (IS_ERR(cs)) {
>>                 err = PTR_ERR(cs);
>>                 goto out_ww;
>> diff --git a/drivers/gpu/drm/i915/selftests/igt_spinner.c b/drivers/gpu/drm/i915/selftests/igt_spinner.c
>> index 5fe397b7d1d9..b80d0089923a 100644
>> --- a/drivers/gpu/drm/i915/selftests/igt_spinner.c
>> +++ b/drivers/gpu/drm/i915/selftests/igt_spinner.c
>> @@ -54,7 +54,7 @@ static void *igt_spinner_pin_obj(struct intel_context *ce,
>>         if (ret)
>>                 return ERR_PTR(ret);
>>
>> -       vaddr = i915_gem_object_pin_map(obj, mode);
>> +       vaddr = i915_gem_object_pin_map(obj, ww, mode);
>>
>>         if (!ww)
>>                 i915_gem_object_unlock(obj);
>> --
>> 2.31.0
>>
>> _______________________________________________
>> Intel-gfx mailing list
>> Intel-gfx@lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/intel-gfx


_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [Intel-gfx] [PATCH 3/4] drm/i915: Pass ww ctx to pin_map, v2.
@ 2021-04-29 14:23       ` Maarten Lankhorst
  0 siblings, 0 replies; 15+ messages in thread
From: Maarten Lankhorst @ 2021-04-29 14:23 UTC (permalink / raw)
  To: Matthew Auld; +Cc: Intel Graphics Development, dri-devel

Op 29-04-2021 om 15:28 schreef Matthew Auld:
> On Thu, 29 Apr 2021 at 11:10, Maarten Lankhorst
> <maarten.lankhorst@linux.intel.com> wrote:
>> This will allow us to explicitly pass the ww to pin_pages,
>> when it starts taking it.
>>
>> This allows us to finally kill off the explicit passing of ww
>> by retrieving it from the obj.
> This seems to contradict the first sentence?

Correct, this was based on a version of eviction where ww was implicitly passed.

I meant 'implicit' here; the whole line can be removed.

>
>
>> Changes since v1:
>> - Rename 'ret' to ptr, fix error handling of return ptr.
>>
>> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
>> ---
>>  .../gpu/drm/i915/gem/i915_gem_execbuffer.c    |  7 +++---
>>  drivers/gpu/drm/i915/gem/i915_gem_mman.c      |  2 +-
>>  drivers/gpu/drm/i915/gem/i915_gem_object.h    |  1 +
>>  .../gpu/drm/i915/gem/i915_gem_object_blt.c    |  4 ++--
>>  drivers/gpu/drm/i915/gem/i915_gem_pages.c     | 24 +++++++++++++++----
>>  .../drm/i915/gem/selftests/i915_gem_context.c |  8 ++++---
>>  .../drm/i915/gem/selftests/i915_gem_dmabuf.c  |  2 +-
>>  drivers/gpu/drm/i915/gt/gen7_renderclear.c    |  2 +-
>>  drivers/gpu/drm/i915/gt/intel_engine_cs.c     |  2 +-
>>  drivers/gpu/drm/i915/gt/intel_engine_pm.c     |  2 +-
>>  drivers/gpu/drm/i915/gt/intel_gtt.c           |  2 +-
>>  drivers/gpu/drm/i915/gt/intel_lrc.c           |  4 ++--
>>  drivers/gpu/drm/i915/gt/intel_renderstate.c   |  2 +-
>>  drivers/gpu/drm/i915/gt/intel_ring.c          |  2 +-
>>  .../gpu/drm/i915/gt/intel_ring_submission.c   |  2 +-
>>  drivers/gpu/drm/i915/gt/intel_timeline.c      |  7 +++---
>>  drivers/gpu/drm/i915/gt/intel_timeline.h      |  3 ++-
>>  drivers/gpu/drm/i915/gt/intel_workarounds.c   |  2 +-
>>  drivers/gpu/drm/i915/gt/mock_engine.c         |  2 +-
>>  drivers/gpu/drm/i915/gt/selftest_lrc.c        |  2 +-
>>  drivers/gpu/drm/i915/gt/selftest_rps.c        | 10 ++++----
>>  .../gpu/drm/i915/gt/selftest_workarounds.c    |  6 ++---
>>  drivers/gpu/drm/i915/gvt/cmd_parser.c         |  4 ++--
>>  drivers/gpu/drm/i915/i915_perf.c              |  4 ++--
>>  drivers/gpu/drm/i915/selftests/igt_spinner.c  |  2 +-
>>  25 files changed, 63 insertions(+), 45 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
>> index 17a87d176a67..66d24dfbd805 100644
>> --- a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
>> +++ b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
>> @@ -1345,7 +1345,7 @@ static int __reloc_gpu_alloc(struct i915_execbuffer *eb,
>>         if (err)
>>                 goto err_pool;
>>
>> -       cmd = i915_gem_object_pin_map(pool->obj, pool->type);
>> +       cmd = i915_gem_object_pin_map(pool->obj, &eb->ww, pool->type);
>>         if (IS_ERR(cmd)) {
>>                 err = PTR_ERR(cmd);
>>                 goto err_pool;
>> @@ -2494,7 +2494,8 @@ static int eb_parse_pipeline(struct i915_execbuffer *eb,
>>                         goto err_shadow;
>>         }
>>
>> -       pw->shadow_map = i915_gem_object_pin_map(shadow->obj, I915_MAP_WB);
>> +       pw->shadow_map = i915_gem_object_pin_map(shadow->obj, &eb->ww,
>> +                                                I915_MAP_WB);
>>         if (IS_ERR(pw->shadow_map)) {
>>                 err = PTR_ERR(pw->shadow_map);
>>                 goto err_trampoline;
>> @@ -2505,7 +2506,7 @@ static int eb_parse_pipeline(struct i915_execbuffer *eb,
>>
>>         pw->batch_map = ERR_PTR(-ENODEV);
>>         if (needs_clflush && i915_has_memcpy_from_wc())
>> -               pw->batch_map = i915_gem_object_pin_map(batch, I915_MAP_WC);
>> +               pw->batch_map = i915_gem_object_pin_map(batch, &eb->ww, I915_MAP_WC);
>>
>>         if (IS_ERR(pw->batch_map)) {
>>                 err = i915_gem_object_pin_pages(batch);
>> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_mman.c b/drivers/gpu/drm/i915/gem/i915_gem_mman.c
>> index 8598a1c78a4c..ae2d71d76889 100644
>> --- a/drivers/gpu/drm/i915/gem/i915_gem_mman.c
>> +++ b/drivers/gpu/drm/i915/gem/i915_gem_mman.c
>> @@ -439,7 +439,7 @@ vm_access(struct vm_area_struct *area, unsigned long addr,
>>                 goto out;
>>
>>         /* As this is primarily for debugging, let's focus on simplicity */
>> -       vaddr = i915_gem_object_pin_map(obj, I915_MAP_FORCE_WC);
>> +       vaddr = i915_gem_object_pin_map(obj, &ww, I915_MAP_FORCE_WC);
>>         if (IS_ERR(vaddr)) {
>>                 err = PTR_ERR(vaddr);
>>                 goto out;
>> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.h b/drivers/gpu/drm/i915/gem/i915_gem_object.h
>> index f7a0cf1a8f24..ed6c7421af4f 100644
>> --- a/drivers/gpu/drm/i915/gem/i915_gem_object.h
>> +++ b/drivers/gpu/drm/i915/gem/i915_gem_object.h
>> @@ -450,6 +450,7 @@ void i915_gem_object_writeback(struct drm_i915_gem_object *obj);
>>   * ERR_PTR() on error.
>>   */
>>  void *__must_check i915_gem_object_pin_map(struct drm_i915_gem_object *obj,
>> +                                          struct i915_gem_ww_ctx *ww,
>>                                            enum i915_map_type type);
>>
>>  void *__must_check i915_gem_object_pin_map_unlocked(struct drm_i915_gem_object *obj,
>> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object_blt.c b/drivers/gpu/drm/i915/gem/i915_gem_object_blt.c
>> index df8e8c18c6c9..fae18622d2da 100644
>> --- a/drivers/gpu/drm/i915/gem/i915_gem_object_blt.c
>> +++ b/drivers/gpu/drm/i915/gem/i915_gem_object_blt.c
>> @@ -58,7 +58,7 @@ struct i915_vma *intel_emit_vma_fill_blt(struct intel_context *ce,
>>         /* we pinned the pool, mark it as such */
>>         intel_gt_buffer_pool_mark_used(pool);
>>
>> -       cmd = i915_gem_object_pin_map(pool->obj, pool->type);
>> +       cmd = i915_gem_object_pin_map(pool->obj, ww, pool->type);
>>         if (IS_ERR(cmd)) {
>>                 err = PTR_ERR(cmd);
>>                 goto out_unpin;
>> @@ -283,7 +283,7 @@ struct i915_vma *intel_emit_vma_copy_blt(struct intel_context *ce,
>>         /* we pinned the pool, mark it as such */
>>         intel_gt_buffer_pool_mark_used(pool);
>>
>> -       cmd = i915_gem_object_pin_map(pool->obj, pool->type);
>> +       cmd = i915_gem_object_pin_map(pool->obj, ww, pool->type);
>>         if (IS_ERR(cmd)) {
>>                 err = PTR_ERR(cmd);
>>                 goto out_unpin;
>> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_pages.c b/drivers/gpu/drm/i915/gem/i915_gem_pages.c
>> index 58e222030e10..42e867134481 100644
>> --- a/drivers/gpu/drm/i915/gem/i915_gem_pages.c
>> +++ b/drivers/gpu/drm/i915/gem/i915_gem_pages.c
>> @@ -341,6 +341,7 @@ static void *i915_gem_object_map_pfn(struct drm_i915_gem_object *obj,
>>
>>  /* get, pin, and map the pages of the object into kernel space */
>>  void *i915_gem_object_pin_map(struct drm_i915_gem_object *obj,
>> +                             struct i915_gem_ww_ctx *ww,
>>                               enum i915_map_type type)
>>  {
>>         enum i915_map_type has_type;
>> @@ -408,13 +409,26 @@ void *i915_gem_object_pin_map(struct drm_i915_gem_object *obj,
>>  void *i915_gem_object_pin_map_unlocked(struct drm_i915_gem_object *obj,
>>                                        enum i915_map_type type)
>>  {
>> -       void *ret;
>> +       struct i915_gem_ww_ctx ww;
>> +       void *ptr;
>> +       int err;
>>
>> -       i915_gem_object_lock(obj, NULL);
>> -       ret = i915_gem_object_pin_map(obj, type);
>> -       i915_gem_object_unlock(obj);
>> +       i915_gem_ww_ctx_init(&ww, true);
>> +retry:
>> +       err = i915_gem_object_lock(obj, &ww);
>> +       if (!err) {
>> +               ptr = i915_gem_object_pin_map(obj, &ww, type);
>> +               if (IS_ERR(ptr))
>> +                       err = PTR_ERR(ptr);
>> +       }
>> +       if (err == -EDEADLK) {
>> +               err = i915_gem_ww_ctx_backoff(&ww);
>> +               if (!err)
>> +                       goto retry;
>> +       }
>> +       i915_gem_ww_ctx_fini(&ww);
>>
>> -       return ret;
>> +       return err ? ERR_PTR(err) : ptr;
>>  }
>>
>>  void __i915_gem_object_flush_map(struct drm_i915_gem_object *obj,
>> diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c b/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
>> index fa1ae414348b..86b3489aba33 100644
>> --- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
>> +++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
>> @@ -893,13 +893,15 @@ static int igt_shared_ctx_exec(void *arg)
>>         return err;
>>  }
>>
>> -static int rpcs_query_batch(struct drm_i915_gem_object *rpcs, struct i915_vma *vma)
>> +static int rpcs_query_batch(struct drm_i915_gem_object *rpcs,
>> +                           struct i915_gem_ww_ctx *ww,
>> +                           struct i915_vma *vma)
>>  {
>>         u32 *cmd;
>>
>>         GEM_BUG_ON(INTEL_GEN(vma->vm->i915) < 8);
>>
>> -       cmd = i915_gem_object_pin_map(rpcs, I915_MAP_WB);
>> +       cmd = i915_gem_object_pin_map(rpcs, ww, I915_MAP_WB);
>>         if (IS_ERR(cmd))
>>                 return PTR_ERR(cmd);
>>
>> @@ -965,7 +967,7 @@ emit_rpcs_query(struct drm_i915_gem_object *obj,
>>         if (err)
>>                 goto err_vma;
>>
>> -       err = rpcs_query_batch(rpcs, vma);
>> +       err = rpcs_query_batch(rpcs, &ww, vma);
>>         if (err)
>>                 goto err_batch;
>>
>> diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_dmabuf.c b/drivers/gpu/drm/i915/gem/selftests/i915_gem_dmabuf.c
>> index dd74bc09ec88..3edf5a1cc0c0 100644
>> --- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_dmabuf.c
>> +++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_dmabuf.c
>> @@ -120,7 +120,7 @@ static int igt_dmabuf_import(void *arg)
>>         }
>>
>>         if (0) { /* Can not yet map dmabuf */
>> -               obj_map = i915_gem_object_pin_map(obj, I915_MAP_WB);
>> +               obj_map = i915_gem_object_pin_map(obj, NULL, I915_MAP_WB);
>>                 if (IS_ERR(obj_map)) {
>>                         err = PTR_ERR(obj_map);
>>                         pr_err("i915_gem_object_pin_map failed with err=%d\n", err);
>> diff --git a/drivers/gpu/drm/i915/gt/gen7_renderclear.c b/drivers/gpu/drm/i915/gt/gen7_renderclear.c
>> index de575fdb033f..c0b0044cb52a 100644
>> --- a/drivers/gpu/drm/i915/gt/gen7_renderclear.c
>> +++ b/drivers/gpu/drm/i915/gt/gen7_renderclear.c
>> @@ -436,7 +436,7 @@ int gen7_setup_clear_gpr_bb(struct intel_engine_cs * const engine,
>>
>>         GEM_BUG_ON(vma->obj->base.size < bv.size);
>>
>> -       batch = i915_gem_object_pin_map(vma->obj, I915_MAP_WC);
>> +       batch = i915_gem_object_pin_map(vma->obj, NULL, I915_MAP_WC);
>>         if (IS_ERR(batch))
>>                 return PTR_ERR(batch);
>>
>> diff --git a/drivers/gpu/drm/i915/gt/intel_engine_cs.c b/drivers/gpu/drm/i915/gt/intel_engine_cs.c
>> index 6dbdbde00f14..5a4afbbf91b2 100644
>> --- a/drivers/gpu/drm/i915/gt/intel_engine_cs.c
>> +++ b/drivers/gpu/drm/i915/gt/intel_engine_cs.c
>> @@ -664,7 +664,7 @@ static int init_status_page(struct intel_engine_cs *engine)
>>         if (ret)
>>                 goto err;
>>
>> -       vaddr = i915_gem_object_pin_map(obj, I915_MAP_WB);
>> +       vaddr = i915_gem_object_pin_map(obj, &ww, I915_MAP_WB);
>>         if (IS_ERR(vaddr)) {
>>                 ret = PTR_ERR(vaddr);
>>                 goto err_unpin;
>> diff --git a/drivers/gpu/drm/i915/gt/intel_engine_pm.c b/drivers/gpu/drm/i915/gt/intel_engine_pm.c
>> index 47f4397095e5..49add43bd4e1 100644
>> --- a/drivers/gpu/drm/i915/gt/intel_engine_pm.c
>> +++ b/drivers/gpu/drm/i915/gt/intel_engine_pm.c
>> @@ -29,7 +29,7 @@ static void dbg_poison_ce(struct intel_context *ce)
>>                 if (!i915_gem_object_trylock(obj))
>>                         return;
>>
>> -               map = i915_gem_object_pin_map(obj, type);
>> +               map = i915_gem_object_pin_map(obj, NULL, type);
>>                 if (!IS_ERR(map)) {
>>                         memset(map, CONTEXT_REDZONE, obj->base.size);
>>                         i915_gem_object_flush_map(obj);
>> diff --git a/drivers/gpu/drm/i915/gt/intel_gtt.c b/drivers/gpu/drm/i915/gt/intel_gtt.c
>> index 9b98f9d9faa3..9c2d0a01c11f 100644
>> --- a/drivers/gpu/drm/i915/gt/intel_gtt.c
>> +++ b/drivers/gpu/drm/i915/gt/intel_gtt.c
>> @@ -65,7 +65,7 @@ int map_pt_dma_locked(struct i915_address_space *vm, struct drm_i915_gem_object
>>         void *vaddr;
>>
>>         type = i915_coherent_map_type(vm->i915, obj, true);
>> -       vaddr = i915_gem_object_pin_map(obj, type);
>> +       vaddr = i915_gem_object_pin_map(obj, NULL, type);
>>         if (IS_ERR(vaddr))
>>                 return PTR_ERR(vaddr);
>>
>> diff --git a/drivers/gpu/drm/i915/gt/intel_lrc.c b/drivers/gpu/drm/i915/gt/intel_lrc.c
>> index aafe2a4df496..aa0e2c40e53a 100644
>> --- a/drivers/gpu/drm/i915/gt/intel_lrc.c
>> +++ b/drivers/gpu/drm/i915/gt/intel_lrc.c
>> @@ -902,7 +902,7 @@ lrc_pre_pin(struct intel_context *ce,
>>         GEM_BUG_ON(!ce->state);
>>         GEM_BUG_ON(!i915_vma_is_pinned(ce->state));
>>
>> -       *vaddr = i915_gem_object_pin_map(ce->state->obj,
>> +       *vaddr = i915_gem_object_pin_map(ce->state->obj, ww,
>>                                          i915_coherent_map_type(ce->engine->i915,
>>                                                                 ce->state->obj,
>>                                                                 false) |
>> @@ -1514,7 +1514,7 @@ void lrc_init_wa_ctx(struct intel_engine_cs *engine)
>>         if (err)
>>                 goto err;
>>
>> -       batch = i915_gem_object_pin_map(wa_ctx->vma->obj, I915_MAP_WB);
>> +       batch = i915_gem_object_pin_map(wa_ctx->vma->obj, &ww, I915_MAP_WB);
>>         if (IS_ERR(batch)) {
>>                 err = PTR_ERR(batch);
>>                 goto err_unpin;
>> diff --git a/drivers/gpu/drm/i915/gt/intel_renderstate.c b/drivers/gpu/drm/i915/gt/intel_renderstate.c
>> index b03e197b1d99..69d4856a2b11 100644
>> --- a/drivers/gpu/drm/i915/gt/intel_renderstate.c
>> +++ b/drivers/gpu/drm/i915/gt/intel_renderstate.c
>> @@ -53,7 +53,7 @@ static int render_state_setup(struct intel_renderstate *so,
>>         int ret = -EINVAL;
>>         u32 *d;
>>
>> -       d = i915_gem_object_pin_map(so->vma->obj, I915_MAP_WB);
>> +       d = i915_gem_object_pin_map(so->vma->obj, &so->ww, I915_MAP_WB);
>>         if (IS_ERR(d))
>>                 return PTR_ERR(d);
>>
>> diff --git a/drivers/gpu/drm/i915/gt/intel_ring.c b/drivers/gpu/drm/i915/gt/intel_ring.c
>> index 7c4d5158e03b..619f6d54e06d 100644
>> --- a/drivers/gpu/drm/i915/gt/intel_ring.c
>> +++ b/drivers/gpu/drm/i915/gt/intel_ring.c
>> @@ -56,7 +56,7 @@ int intel_ring_pin(struct intel_ring *ring, struct i915_gem_ww_ctx *ww)
>>         } else {
>>                 int type = i915_coherent_map_type(vma->vm->i915, vma->obj, false);
>>
>> -               addr = i915_gem_object_pin_map(vma->obj, type);
>> +               addr = i915_gem_object_pin_map(vma->obj, ww, type);
>>         }
>>
>>         if (IS_ERR(addr)) {
>> diff --git a/drivers/gpu/drm/i915/gt/intel_ring_submission.c b/drivers/gpu/drm/i915/gt/intel_ring_submission.c
>> index 9585546556ee..e3903cae2d7d 100644
>> --- a/drivers/gpu/drm/i915/gt/intel_ring_submission.c
>> +++ b/drivers/gpu/drm/i915/gt/intel_ring_submission.c
>> @@ -452,7 +452,7 @@ static int ring_context_init_default_state(struct intel_context *ce,
>>         struct drm_i915_gem_object *obj = ce->state->obj;
>>         void *vaddr;
>>
>> -       vaddr = i915_gem_object_pin_map(obj, I915_MAP_WB);
>> +       vaddr = i915_gem_object_pin_map(obj, ww, I915_MAP_WB);
>>         if (IS_ERR(vaddr))
>>                 return PTR_ERR(vaddr);
>>
>> diff --git a/drivers/gpu/drm/i915/gt/intel_timeline.c b/drivers/gpu/drm/i915/gt/intel_timeline.c
>> index f19cf6d2fa85..a9a1960f7f36 100644
>> --- a/drivers/gpu/drm/i915/gt/intel_timeline.c
>> +++ b/drivers/gpu/drm/i915/gt/intel_timeline.c
>> @@ -53,13 +53,14 @@ static int __timeline_active(struct i915_active *active)
>>  }
>>
>>  I915_SELFTEST_EXPORT int
>> -intel_timeline_pin_map(struct intel_timeline *timeline)
>> +intel_timeline_pin_map(struct intel_timeline *timeline,
>> +                      struct i915_gem_ww_ctx *ww)
>>  {
>>         struct drm_i915_gem_object *obj = timeline->hwsp_ggtt->obj;
>>         u32 ofs = offset_in_page(timeline->hwsp_offset);
>>         void *vaddr;
>>
>> -       vaddr = i915_gem_object_pin_map(obj, I915_MAP_WB);
>> +       vaddr = i915_gem_object_pin_map(obj, ww, I915_MAP_WB);
>>         if (IS_ERR(vaddr))
>>                 return PTR_ERR(vaddr);
>>
>> @@ -184,7 +185,7 @@ int intel_timeline_pin(struct intel_timeline *tl, struct i915_gem_ww_ctx *ww)
>>                 return 0;
>>
>>         if (!tl->hwsp_map) {
>> -               err = intel_timeline_pin_map(tl);
>> +               err = intel_timeline_pin_map(tl, ww);
>>                 if (err)
>>                         return err;
>>         }
>> diff --git a/drivers/gpu/drm/i915/gt/intel_timeline.h b/drivers/gpu/drm/i915/gt/intel_timeline.h
>> index 57308c4d664a..dad5a60e556b 100644
>> --- a/drivers/gpu/drm/i915/gt/intel_timeline.h
>> +++ b/drivers/gpu/drm/i915/gt/intel_timeline.h
>> @@ -98,6 +98,7 @@ intel_timeline_is_last(const struct intel_timeline *tl,
>>         return list_is_last_rcu(&rq->link, &tl->requests);
>>  }
>>
>> -I915_SELFTEST_DECLARE(int intel_timeline_pin_map(struct intel_timeline *tl));
>> +I915_SELFTEST_DECLARE(int intel_timeline_pin_map(struct intel_timeline *tl,
>> +                                                struct i915_gem_ww_ctx *ww));
>>
>>  #endif
>> diff --git a/drivers/gpu/drm/i915/gt/intel_workarounds.c b/drivers/gpu/drm/i915/gt/intel_workarounds.c
>> index 5a03a76bb9e2..df342b18f5ae 100644
>> --- a/drivers/gpu/drm/i915/gt/intel_workarounds.c
>> +++ b/drivers/gpu/drm/i915/gt/intel_workarounds.c
>> @@ -2233,7 +2233,7 @@ static int engine_wa_list_verify(struct intel_context *ce,
>>                 goto err_rq;
>>         }
>>
>> -       results = i915_gem_object_pin_map(vma->obj, I915_MAP_WB);
>> +       results = i915_gem_object_pin_map(vma->obj, NULL, I915_MAP_WB);
>>         if (IS_ERR(results)) {
>>                 err = PTR_ERR(results);
>>                 goto err_rq;
>> diff --git a/drivers/gpu/drm/i915/gt/mock_engine.c b/drivers/gpu/drm/i915/gt/mock_engine.c
>> index e1ba03b93ffa..b5f48e8bb38f 100644
>> --- a/drivers/gpu/drm/i915/gt/mock_engine.c
>> +++ b/drivers/gpu/drm/i915/gt/mock_engine.c
>> @@ -20,7 +20,7 @@ static int mock_timeline_pin(struct intel_timeline *tl)
>>         if (WARN_ON(!i915_gem_object_trylock(tl->hwsp_ggtt->obj)))
>>                 return -EBUSY;
>>
>> -       err = intel_timeline_pin_map(tl);
>> +       err = intel_timeline_pin_map(tl, NULL);
>>         i915_gem_object_unlock(tl->hwsp_ggtt->obj);
>>         if (err)
>>                 return err;
>> diff --git a/drivers/gpu/drm/i915/gt/selftest_lrc.c b/drivers/gpu/drm/i915/gt/selftest_lrc.c
>> index d8f6623524e8..84378dd775b5 100644
>> --- a/drivers/gpu/drm/i915/gt/selftest_lrc.c
>> +++ b/drivers/gpu/drm/i915/gt/selftest_lrc.c
>> @@ -425,7 +425,7 @@ static int __live_lrc_state(struct intel_engine_cs *engine,
>>                 goto err_rq;
>>         }
>>
>> -       cs = i915_gem_object_pin_map(scratch->obj, I915_MAP_WB);
>> +       cs = i915_gem_object_pin_map(scratch->obj, NULL, I915_MAP_WB);
>>         if (IS_ERR(cs)) {
>>                 err = PTR_ERR(cs);
>>                 goto err_rq;
>> diff --git a/drivers/gpu/drm/i915/gt/selftest_rps.c b/drivers/gpu/drm/i915/gt/selftest_rps.c
>> index adf7fdbc00f7..687b94028de5 100644
>> --- a/drivers/gpu/drm/i915/gt/selftest_rps.c
>> +++ b/drivers/gpu/drm/i915/gt/selftest_rps.c
>> @@ -83,17 +83,17 @@ create_spin_counter(struct intel_engine_cs *engine,
>>
>>         err = i915_vma_pin(vma, 0, 0, PIN_USER);
>>         if (err)
>> -               goto err_unlock;
>> -
>> -       i915_vma_lock(vma);
>> +               goto err_put;
>>
>> -       base = i915_gem_object_pin_map(obj, I915_MAP_WC);
>> +       base = i915_gem_object_pin_map_unlocked(obj, I915_MAP_WC);
>>         if (IS_ERR(base)) {
>>                 err = PTR_ERR(base);
>>                 goto err_unpin;
>>         }
>>         cs = base;
>>
>> +       i915_vma_lock(vma);
>> +
>>         *cs++ = MI_LOAD_REGISTER_IMM(__NGPR__ * 2);
>>         for (i = 0; i < __NGPR__; i++) {
>>                 *cs++ = i915_mmio_reg_offset(CS_GPR(i));
>> @@ -137,8 +137,6 @@ create_spin_counter(struct intel_engine_cs *engine,
>>
>>  err_unpin:
>>         i915_vma_unpin(vma);
>> -err_unlock:
>> -       i915_vma_unlock(vma);
>>  err_put:
>>         i915_gem_object_put(obj);
>>         return ERR_PTR(err);
>> diff --git a/drivers/gpu/drm/i915/gt/selftest_workarounds.c b/drivers/gpu/drm/i915/gt/selftest_workarounds.c
>> index 64937ec3f2dc..1bf8e2826d7b 100644
>> --- a/drivers/gpu/drm/i915/gt/selftest_workarounds.c
>> +++ b/drivers/gpu/drm/i915/gt/selftest_workarounds.c
>> @@ -223,7 +223,7 @@ static int check_whitelist(struct intel_context *ce)
>>         if (err)
>>                 goto out_put;
>>
>> -       vaddr = i915_gem_object_pin_map(results, I915_MAP_WB);
>> +       vaddr = i915_gem_object_pin_map(results, NULL, I915_MAP_WB);
>>         if (IS_ERR(vaddr)) {
>>                 err = PTR_ERR(vaddr);
>>                 goto out_put;
>> @@ -529,13 +529,13 @@ static int check_dirty_whitelist(struct intel_context *ce)
>>                 if (err)
>>                         goto out;
>>
>> -               cs = i915_gem_object_pin_map(batch->obj, I915_MAP_WC);
>> +               cs = i915_gem_object_pin_map(batch->obj, &ww, I915_MAP_WC);
>>                 if (IS_ERR(cs)) {
>>                         err = PTR_ERR(cs);
>>                         goto out_ctx;
>>                 }
>>
>> -               results = i915_gem_object_pin_map(scratch->obj, I915_MAP_WB);
>> +               results = i915_gem_object_pin_map(scratch->obj, &ww, I915_MAP_WB);
>>                 if (IS_ERR(results)) {
>>                         err = PTR_ERR(results);
>>                         goto out_unmap_batch;
>> diff --git a/drivers/gpu/drm/i915/gvt/cmd_parser.c b/drivers/gpu/drm/i915/gvt/cmd_parser.c
>> index ca9c9e27a43d..eb804e4267d2 100644
>> --- a/drivers/gpu/drm/i915/gvt/cmd_parser.c
>> +++ b/drivers/gpu/drm/i915/gvt/cmd_parser.c
>> @@ -1935,7 +1935,7 @@ static int perform_bb_shadow(struct parser_exec_state *s)
>>                 goto err_free_bb;
>>         }
>>
>> -       bb->va = i915_gem_object_pin_map(bb->obj, I915_MAP_WB);
>> +       bb->va = i915_gem_object_pin_map_unlocked(bb->obj, I915_MAP_WB);
>>         if (IS_ERR(bb->va)) {
>>                 ret = PTR_ERR(bb->va);
>>                 goto err_free_obj;
>> @@ -3008,7 +3008,7 @@ static int shadow_indirect_ctx(struct intel_shadow_wa_ctx *wa_ctx)
>>                 return PTR_ERR(obj);
>>
>>         /* get the va of the shadow batch buffer */
>> -       map = i915_gem_object_pin_map(obj, I915_MAP_WB);
>> +       map = i915_gem_object_pin_map_unlocked(obj, I915_MAP_WB);
>>         if (IS_ERR(map)) {
>>                 gvt_vgpu_err("failed to vmap shadow indirect ctx\n");
>>                 ret = PTR_ERR(map);
>> diff --git a/drivers/gpu/drm/i915/i915_perf.c b/drivers/gpu/drm/i915/i915_perf.c
>> index 85ad62dbabfa..62259c46d302 100644
>> --- a/drivers/gpu/drm/i915/i915_perf.c
>> +++ b/drivers/gpu/drm/i915/i915_perf.c
>> @@ -1662,7 +1662,7 @@ static int alloc_noa_wait(struct i915_perf_stream *stream)
>>                 goto out_ww;
>>         }
>>
>> -       batch = cs = i915_gem_object_pin_map(bo, I915_MAP_WB);
>> +       batch = cs = i915_gem_object_pin_map(bo, &ww, I915_MAP_WB);
>>         if (IS_ERR(batch)) {
>>                 ret = PTR_ERR(batch);
>>                 goto err_unpin;
>> @@ -1875,7 +1875,7 @@ alloc_oa_config_buffer(struct i915_perf_stream *stream,
>>         if (err)
>>                 goto out_ww;
>>
>> -       cs = i915_gem_object_pin_map(obj, I915_MAP_WB);
>> +       cs = i915_gem_object_pin_map(obj, &ww, I915_MAP_WB);
>>         if (IS_ERR(cs)) {
>>                 err = PTR_ERR(cs);
>>                 goto out_ww;
>> diff --git a/drivers/gpu/drm/i915/selftests/igt_spinner.c b/drivers/gpu/drm/i915/selftests/igt_spinner.c
>> index 5fe397b7d1d9..b80d0089923a 100644
>> --- a/drivers/gpu/drm/i915/selftests/igt_spinner.c
>> +++ b/drivers/gpu/drm/i915/selftests/igt_spinner.c
>> @@ -54,7 +54,7 @@ static void *igt_spinner_pin_obj(struct intel_context *ce,
>>         if (ret)
>>                 return ERR_PTR(ret);
>>
>> -       vaddr = i915_gem_object_pin_map(obj, mode);
>> +       vaddr = i915_gem_object_pin_map(obj, ww, mode);
>>
>>         if (!ww)
>>                 i915_gem_object_unlock(obj);
>> --
>> 2.31.0
>>
>> _______________________________________________
>> Intel-gfx mailing list
>> Intel-gfx@lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/intel-gfx


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

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [Intel-gfx] [PATCH 3/4] drm/i915: Pass ww ctx to pin_map, v2.
  2021-04-29 10:10 ` [Intel-gfx] [PATCH 3/4] drm/i915: Pass ww ctx to pin_map, v2 Maarten Lankhorst
  2021-04-29 13:28   ` Matthew Auld
@ 2021-04-29 14:55   ` Matthew Auld
  2021-04-29 14:58     ` Maarten Lankhorst
  1 sibling, 1 reply; 15+ messages in thread
From: Matthew Auld @ 2021-04-29 14:55 UTC (permalink / raw)
  To: Maarten Lankhorst; +Cc: Intel Graphics Development

On Thu, 29 Apr 2021 at 11:10, Maarten Lankhorst
<maarten.lankhorst@linux.intel.com> wrote:
>
> This will allow us to explicitly pass the ww to pin_pages,
> when it starts taking it.
>
> This allows us to finally kill off the explicit passing of ww
> by retrieving it from the obj.
>
> Changes since v1:
> - Rename 'ret' to ptr, fix error handling of return ptr.
>
> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>

<snip>

> --- a/drivers/gpu/drm/i915/gt/intel_gtt.c
> +++ b/drivers/gpu/drm/i915/gt/intel_gtt.c
> @@ -65,7 +65,7 @@ int map_pt_dma_locked(struct i915_address_space *vm, struct drm_i915_gem_object
>         void *vaddr;
>
>         type = i915_coherent_map_type(vm->i915, obj, true);
> -       vaddr = i915_gem_object_pin_map(obj, type);
> +       vaddr = i915_gem_object_pin_map(obj, NULL, type);

Don't we need to pass the ww here? For all our page-tables this is
both our allocate and map for the backing page(lmem or smem), so at
least for the locked variant here would it not make sense to pass the
ww from the vma_pin() etc, in case we need to evict stuff?

>         if (IS_ERR(vaddr))
>                 return PTR_ERR(vaddr);
>
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [Intel-gfx] [PATCH 3/4] drm/i915: Pass ww ctx to pin_map, v2.
  2021-04-29 14:55   ` Matthew Auld
@ 2021-04-29 14:58     ` Maarten Lankhorst
  0 siblings, 0 replies; 15+ messages in thread
From: Maarten Lankhorst @ 2021-04-29 14:58 UTC (permalink / raw)
  To: Matthew Auld; +Cc: Intel Graphics Development

Op 29-04-2021 om 16:55 schreef Matthew Auld:
> On Thu, 29 Apr 2021 at 11:10, Maarten Lankhorst
> <maarten.lankhorst@linux.intel.com> wrote:
>> This will allow us to explicitly pass the ww to pin_pages,
>> when it starts taking it.
>>
>> This allows us to finally kill off the explicit passing of ww
>> by retrieving it from the obj.
>>
>> Changes since v1:
>> - Rename 'ret' to ptr, fix error handling of return ptr.
>>
>> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
> <snip>
>
>> --- a/drivers/gpu/drm/i915/gt/intel_gtt.c
>> +++ b/drivers/gpu/drm/i915/gt/intel_gtt.c
>> @@ -65,7 +65,7 @@ int map_pt_dma_locked(struct i915_address_space *vm, struct drm_i915_gem_object
>>         void *vaddr;
>>
>>         type = i915_coherent_map_type(vm->i915, obj, true);
>> -       vaddr = i915_gem_object_pin_map(obj, type);
>> +       vaddr = i915_gem_object_pin_map(obj, NULL, type);
> Don't we need to pass the ww here? For all our page-tables this is
> both our allocate and map for the backing page(lmem or smem), so at
> least for the locked variant here would it not make sense to pass the
> ww from the vma_pin() etc, in case we need to evict stuff?


Actually yeah, seems to be called from i915_vma_pin_ww, so should pass ww along for sure.. I'll respin.

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

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for drm/i915: Propagate ww parameter to get_pages().
  2021-04-29 10:10 [Intel-gfx] [PATCH 0/4] drm/i915: Propagate ww parameter to get_pages() Maarten Lankhorst
                   ` (3 preceding siblings ...)
  2021-04-29 10:10 ` [Intel-gfx] [PATCH 4/4] drm/i915: Pass ww ctx to i915_gem_object_pin_pages, v2 Maarten Lankhorst
@ 2021-04-29 15:47 ` Patchwork
  2021-04-29 16:17 ` [Intel-gfx] ✗ Fi.CI.BAT: failure " Patchwork
  5 siblings, 0 replies; 15+ messages in thread
From: Patchwork @ 2021-04-29 15:47 UTC (permalink / raw)
  To: Maarten Lankhorst; +Cc: intel-gfx

== Series Details ==

Series: drm/i915: Propagate ww parameter to get_pages().
URL   : https://patchwork.freedesktop.org/series/89646/
State : warning

== Summary ==

$ dim checkpatch origin/drm-tip
5b47c2a18575 drm/i915: Add ww parameter to get_pages() callback
d88153c9c5d0 drm/i915: Add ww context to prepare_(read/write)
-:6: WARNING:COMMIT_LOG_LONG_LINE: Possible unwrapped commit description (prefer a maximum 75 chars per line)
#6: 
This will allow us to explicitly pass the ww to pin_pages, when it starts taking it.

total: 0 errors, 1 warnings, 0 checks, 107 lines checked
ae10553d2b39 drm/i915: Pass ww ctx to pin_map, v2.
-:474: CHECK:MULTIPLE_ASSIGNMENTS: multiple assignments should be avoided
#474: FILE: drivers/gpu/drm/i915/i915_perf.c:1665:
+	batch = cs = i915_gem_object_pin_map(bo, &ww, I915_MAP_WB);

total: 0 errors, 0 warnings, 1 checks, 347 lines checked
c5ee6dea821d drm/i915: Pass ww ctx to i915_gem_object_pin_pages, v2.
-:116: ERROR:TRAILING_WHITESPACE: trailing whitespace
#116: FILE: drivers/gpu/drm/i915/gem/i915_gem_domain.c:437:
+i915_gem_object_set_to_cpu_domain(struct drm_i915_gem_object *obj, $

-:331: ERROR:TRAILING_WHITESPACE: trailing whitespace
#331: FILE: drivers/gpu/drm/i915/gem/i915_gem_object.h:528:
+i915_gem_object_set_to_gtt_domain(struct drm_i915_gem_object *obj, $

total: 2 errors, 0 warnings, 0 checks, 533 lines checked


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

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [Intel-gfx] ✗ Fi.CI.BAT: failure for drm/i915: Propagate ww parameter to get_pages().
  2021-04-29 10:10 [Intel-gfx] [PATCH 0/4] drm/i915: Propagate ww parameter to get_pages() Maarten Lankhorst
                   ` (4 preceding siblings ...)
  2021-04-29 15:47 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for drm/i915: Propagate ww parameter to get_pages() Patchwork
@ 2021-04-29 16:17 ` Patchwork
  5 siblings, 0 replies; 15+ messages in thread
From: Patchwork @ 2021-04-29 16:17 UTC (permalink / raw)
  To: Maarten Lankhorst; +Cc: intel-gfx


[-- Attachment #1.1: Type: text/plain, Size: 5789 bytes --]

== Series Details ==

Series: drm/i915: Propagate ww parameter to get_pages().
URL   : https://patchwork.freedesktop.org/series/89646/
State : failure

== Summary ==

CI Bug Log - changes from CI_DRM_10027 -> Patchwork_20033
====================================================

Summary
-------

  **FAILURE**

  Serious unknown changes coming with Patchwork_20033 absolutely need to be
  verified manually.
  
  If you think the reported changes have nothing to do with the changes
  introduced in Patchwork_20033, please notify your bug team to allow them
  to document this new failure mode, which will reduce false positives in CI.

  External URL: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_20033/index.html

Possible new issues
-------------------

  Here are the unknown changes that may have been introduced in Patchwork_20033:

### IGT changes ###

#### Possible regressions ####

  * igt@runner@aborted:
    - fi-skl-6700k2:      NOTRUN -> [FAIL][1]
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_20033/fi-skl-6700k2/igt@runner@aborted.html

  
Known issues
------------

  Here are the changes found in Patchwork_20033 that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@amdgpu/amd_prime@amd-to-i915:
    - fi-tgl-y:           NOTRUN -> [SKIP][2] ([fdo#109315] / [i915#2575])
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_20033/fi-tgl-y/igt@amdgpu/amd_prime@amd-to-i915.html

  * igt@gem_exec_suspend@basic-s0:
    - fi-skl-6700k2:      [PASS][3] -> [DMESG-WARN][4] ([i915#1602])
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_10027/fi-skl-6700k2/igt@gem_exec_suspend@basic-s0.html
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_20033/fi-skl-6700k2/igt@gem_exec_suspend@basic-s0.html

  * igt@gem_huc_copy@huc-copy:
    - fi-skl-guc:         NOTRUN -> [SKIP][5] ([fdo#109271] / [i915#2190])
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_20033/fi-skl-guc/igt@gem_huc_copy@huc-copy.html

  * igt@i915_selftest@live@gt_heartbeat:
    - fi-cfl-guc:         [PASS][6] -> [DMESG-FAIL][7] ([i915#2291] / [i915#541])
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_10027/fi-cfl-guc/igt@i915_selftest@live@gt_heartbeat.html
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_20033/fi-cfl-guc/igt@i915_selftest@live@gt_heartbeat.html

  * igt@kms_chamelium@dp-crc-fast:
    - fi-skl-guc:         NOTRUN -> [SKIP][8] ([fdo#109271] / [fdo#111827]) +8 similar issues
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_20033/fi-skl-guc/igt@kms_chamelium@dp-crc-fast.html

  * igt@kms_pipe_crc_basic@compare-crc-sanitycheck-pipe-d:
    - fi-skl-guc:         NOTRUN -> [SKIP][9] ([fdo#109271] / [i915#533])
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_20033/fi-skl-guc/igt@kms_pipe_crc_basic@compare-crc-sanitycheck-pipe-d.html

  * igt@kms_psr@primary_mmap_gtt:
    - fi-skl-guc:         NOTRUN -> [SKIP][10] ([fdo#109271]) +26 similar issues
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_20033/fi-skl-guc/igt@kms_psr@primary_mmap_gtt.html

  
#### Possible fixes ####

  * igt@gem_exec_suspend@basic-s3:
    - fi-tgl-u2:          [FAIL][11] ([i915#1888]) -> [PASS][12]
   [11]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_10027/fi-tgl-u2/igt@gem_exec_suspend@basic-s3.html
   [12]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_20033/fi-tgl-u2/igt@gem_exec_suspend@basic-s3.html

  * igt@kms_frontbuffer_tracking@basic:
    - {fi-rkl-11500t}:    [SKIP][13] ([i915#1849] / [i915#3180]) -> [PASS][14]
   [13]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_10027/fi-rkl-11500t/igt@kms_frontbuffer_tracking@basic.html
   [14]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_20033/fi-rkl-11500t/igt@kms_frontbuffer_tracking@basic.html

  
  {name}: This element is suppressed. This means it is ignored when computing
          the status of the difference (SUCCESS, WARNING, or FAILURE).

  [fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271
  [fdo#109315]: https://bugs.freedesktop.org/show_bug.cgi?id=109315
  [fdo#111827]: https://bugs.freedesktop.org/show_bug.cgi?id=111827
  [i915#1602]: https://gitlab.freedesktop.org/drm/intel/issues/1602
  [i915#1849]: https://gitlab.freedesktop.org/drm/intel/issues/1849
  [i915#1888]: https://gitlab.freedesktop.org/drm/intel/issues/1888
  [i915#2190]: https://gitlab.freedesktop.org/drm/intel/issues/2190
  [i915#2291]: https://gitlab.freedesktop.org/drm/intel/issues/2291
  [i915#2575]: https://gitlab.freedesktop.org/drm/intel/issues/2575
  [i915#3180]: https://gitlab.freedesktop.org/drm/intel/issues/3180
  [i915#3303]: https://gitlab.freedesktop.org/drm/intel/issues/3303
  [i915#533]: https://gitlab.freedesktop.org/drm/intel/issues/533
  [i915#541]: https://gitlab.freedesktop.org/drm/intel/issues/541


Participating hosts (44 -> 40)
------------------------------

  Additional (1): fi-skl-guc 
  Missing    (5): fi-ilk-m540 fi-hsw-4200u fi-bsw-n3050 fi-bsw-cyan fi-bdw-samus 


Build changes
-------------

  * Linux: CI_DRM_10027 -> Patchwork_20033

  CI-20190529: 20190529
  CI_DRM_10027: 1748cb1e8bdf543570b86f39487b171ad4c1f896 @ git://anongit.freedesktop.org/gfx-ci/linux
  IGT_6077: 126a3f6fc0e97786e2819085efc84e741093aed5 @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools
  Patchwork_20033: c5ee6dea821d97472e25226e8124fd00291d2ef2 @ git://anongit.freedesktop.org/gfx-ci/linux


== Linux commits ==

c5ee6dea821d drm/i915: Pass ww ctx to i915_gem_object_pin_pages, v2.
ae10553d2b39 drm/i915: Pass ww ctx to pin_map, v2.
d88153c9c5d0 drm/i915: Add ww context to prepare_(read/write)
5b47c2a18575 drm/i915: Add ww parameter to get_pages() callback

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_20033/index.html

[-- Attachment #1.2: Type: text/html, Size: 6801 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

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

^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2021-04-29 16:17 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-04-29 10:10 [Intel-gfx] [PATCH 0/4] drm/i915: Propagate ww parameter to get_pages() Maarten Lankhorst
2021-04-29 10:10 ` [Intel-gfx] [PATCH 1/4] drm/i915: Add ww parameter to get_pages() callback Maarten Lankhorst
2021-04-29 13:21   ` Matthew Auld
2021-04-29 10:10 ` [Intel-gfx] [PATCH 2/4] drm/i915: Add ww context to prepare_(read/write) Maarten Lankhorst
2021-04-29 13:23   ` Matthew Auld
2021-04-29 10:10 ` [Intel-gfx] [PATCH 3/4] drm/i915: Pass ww ctx to pin_map, v2 Maarten Lankhorst
2021-04-29 13:28   ` Matthew Auld
2021-04-29 14:23     ` Maarten Lankhorst
2021-04-29 14:23       ` Maarten Lankhorst
2021-04-29 14:55   ` Matthew Auld
2021-04-29 14:58     ` Maarten Lankhorst
2021-04-29 10:10 ` [Intel-gfx] [PATCH 4/4] drm/i915: Pass ww ctx to i915_gem_object_pin_pages, v2 Maarten Lankhorst
2021-04-29 13:46   ` Matthew Auld
2021-04-29 15:47 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for drm/i915: Propagate ww parameter to get_pages() Patchwork
2021-04-29 16:17 ` [Intel-gfx] ✗ Fi.CI.BAT: failure " Patchwork

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.