Intel-GFX Archive on lore.kernel.org
 help / color / mirror / Atom feed
* Rework TTMs busy handling
@ 2024-01-26 14:09 Christian König
  2024-01-26 14:09 ` [PATCH 1/2] drm/ttm: improve idle/busy handling v4 Christian König
                   ` (5 more replies)
  0 siblings, 6 replies; 13+ messages in thread
From: Christian König @ 2024-01-26 14:09 UTC (permalink / raw)
  To: thomas.hellstrom, dri-devel, intel-gfx, nouveau

Hi guys,

so pushed the first few patches from this series. I hope that I
correctly managed to resolve the silent Xe merge conflict in drm-tip,
but would be nice if somebody could double check.

Then for the two remaining patches I've implemented most of what
Thomas suggest, e.g. the existing functionality sticks around for
eviction and hobs, but ttm_bo_validate will now try to always move
things into the non-fallback placements on validation first.

What I haven't done yet is to split up the preferred placement since
I couldn't immediately see an use case for this, but it's really
something we might do in the future as well.

Please review and comment,
Christian.



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

* [PATCH 1/2] drm/ttm: improve idle/busy handling v4
  2024-01-26 14:09 Rework TTMs busy handling Christian König
@ 2024-01-26 14:09 ` Christian König
  2024-02-06 12:53   ` Thomas Hellström
  2024-01-26 14:09 ` [PATCH 2/2] drm/amdgpu: use GTT only as fallback for VRAM|GTT Christian König
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 13+ messages in thread
From: Christian König @ 2024-01-26 14:09 UTC (permalink / raw)
  To: thomas.hellstrom, dri-devel, intel-gfx, nouveau

Previously we would never try to move a BO into the preferred placements
when it ever landed in a busy placement since those were considered
compatible.

Rework the whole handling and finally unify the idle and busy handling.
ttm_bo_validate() is now responsible to try idle placement first and then
use the busy placement if that didn't worked.

Drawback is that we now always try the idle placement first for each
validation which might cause some additional CPU overhead on overcommit.

v2: fix kerneldoc warning and coding style
v3: take care of XE as well
v4: keep the ttm_bo_mem_space functionality as it is for now, only add
    new handling for ttm_bo_validate as suggested by Thomas

Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Zack Rusin <zack.rusin@broadcom.com> v3
---
 drivers/gpu/drm/ttm/ttm_bo.c       | 231 +++++++++++++----------------
 drivers/gpu/drm/ttm/ttm_resource.c |  16 +-
 include/drm/ttm/ttm_resource.h     |   3 +-
 3 files changed, 121 insertions(+), 129 deletions(-)

diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
index ba3f09e2d7e6..b12f435542a9 100644
--- a/drivers/gpu/drm/ttm/ttm_bo.c
+++ b/drivers/gpu/drm/ttm/ttm_bo.c
@@ -724,64 +724,36 @@ static int ttm_bo_add_move_fence(struct ttm_buffer_object *bo,
 	return ret;
 }
 
-/*
- * Repeatedly evict memory from the LRU for @mem_type until we create enough
- * space, or we've evicted everything and there isn't enough space.
- */
-static int ttm_bo_mem_force_space(struct ttm_buffer_object *bo,
-				  const struct ttm_place *place,
-				  struct ttm_resource **mem,
-				  struct ttm_operation_ctx *ctx)
-{
-	struct ttm_device *bdev = bo->bdev;
-	struct ttm_resource_manager *man;
-	struct ww_acquire_ctx *ticket;
-	int ret;
-
-	man = ttm_manager_type(bdev, place->mem_type);
-	ticket = dma_resv_locking_ctx(bo->base.resv);
-	do {
-		ret = ttm_resource_alloc(bo, place, mem);
-		if (likely(!ret))
-			break;
-		if (unlikely(ret != -ENOSPC))
-			return ret;
-		ret = ttm_mem_evict_first(bdev, man, place, ctx,
-					  ticket);
-		if (unlikely(ret != 0))
-			return ret;
-	} while (1);
-
-	return ttm_bo_add_move_fence(bo, man, *mem, ctx->no_wait_gpu);
-}
-
 /**
- * ttm_bo_mem_space
+ * ttm_bo_alloc_resource - Allocate backing store for a BO
  *
- * @bo: Pointer to a struct ttm_buffer_object. the data of which
- * we want to allocate space for.
- * @placement: Proposed new placement for the buffer object.
- * @mem: A struct ttm_resource.
+ * @bo: Pointer to a struct ttm_buffer_object of which we want a resource for
+ * @placement: Proposed new placement for the buffer object
  * @ctx: if and how to sleep, lock buffers and alloc memory
+ * @force_space: If we should evict buffers to force space
+ * @res: The resulting struct ttm_resource.
  *
- * Allocate memory space for the buffer object pointed to by @bo, using
- * the placement flags in @placement, potentially evicting other idle buffer objects.
- * This function may sleep while waiting for space to become available.
+ * Allocates a resource for the buffer object pointed to by @bo, using the
+ * placement flags in @placement, potentially evicting other buffer objects when
+ * @force_space is true.
+ * This function may sleep while waiting for resources to become available.
  * Returns:
- * -EBUSY: No space available (only if no_wait == 1).
+ * -EBUSY: No space available (only if no_wait == true).
  * -ENOSPC: Could not allocate space for the buffer object, either due to
  * fragmentation or concurrent allocators.
  * -ERESTARTSYS: An interruptible sleep was interrupted by a signal.
  */
-int ttm_bo_mem_space(struct ttm_buffer_object *bo,
-			struct ttm_placement *placement,
-			struct ttm_resource **mem,
-			struct ttm_operation_ctx *ctx)
+static int ttm_bo_alloc_resource(struct ttm_buffer_object *bo,
+				 struct ttm_placement *placement,
+				 struct ttm_operation_ctx *ctx,
+				 bool force_space,
+				 struct ttm_resource **res)
 {
 	struct ttm_device *bdev = bo->bdev;
-	bool type_found = false;
+	struct ww_acquire_ctx *ticket;
 	int i, ret;
 
+	ticket = dma_resv_locking_ctx(bo->base.resv);
 	ret = dma_resv_reserve_fences(bo->base.resv, 1);
 	if (unlikely(ret))
 		return ret;
@@ -790,98 +762,73 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo,
 		const struct ttm_place *place = &placement->placement[i];
 		struct ttm_resource_manager *man;
 
-		if (place->flags & TTM_PL_FLAG_FALLBACK)
-			continue;
-
 		man = ttm_manager_type(bdev, place->mem_type);
 		if (!man || !ttm_resource_manager_used(man))
 			continue;
 
-		type_found = true;
-		ret = ttm_resource_alloc(bo, place, mem);
-		if (ret == -ENOSPC)
+		if (place->flags & (force_space ? TTM_PL_FLAG_DESIRED :
+				    TTM_PL_FLAG_FALLBACK))
+			continue;
+
+		do {
+			ret = ttm_resource_alloc(bo, place, res);
+			if (unlikely(ret != -ENOSPC))
+				return ret;
+			if (likely(!ret) || !force_space)
+				break;
+
+			ret = ttm_mem_evict_first(bdev, man, place, ctx,
+						  ticket);
+			if (unlikely(ret == -EBUSY))
+				break;
+			if (unlikely(ret))
+				return ret;
+		} while (1);
+		if (ret)
 			continue;
-		if (unlikely(ret))
-			goto error;
 
-		ret = ttm_bo_add_move_fence(bo, man, *mem, ctx->no_wait_gpu);
+		ret = ttm_bo_add_move_fence(bo, man, *res, ctx->no_wait_gpu);
 		if (unlikely(ret)) {
-			ttm_resource_free(bo, mem);
+			ttm_resource_free(bo, res);
 			if (ret == -EBUSY)
 				continue;
 
-			goto error;
+			return ret;
 		}
 		return 0;
 	}
 
-	for (i = 0; i < placement->num_placement; ++i) {
-		const struct ttm_place *place = &placement->placement[i];
-		struct ttm_resource_manager *man;
-
-		if (place->flags & TTM_PL_FLAG_DESIRED)
-			continue;
-
-		man = ttm_manager_type(bdev, place->mem_type);
-		if (!man || !ttm_resource_manager_used(man))
-			continue;
-
-		type_found = true;
-		ret = ttm_bo_mem_force_space(bo, place, mem, ctx);
-		if (likely(!ret))
-			return 0;
-
-		if (ret && ret != -EBUSY)
-			goto error;
-	}
-
-	ret = -ENOSPC;
-	if (!type_found) {
-		pr_err(TTM_PFX "No compatible memory type found\n");
-		ret = -EINVAL;
-	}
-
-error:
-	return ret;
+	return -ENOSPC;
 }
-EXPORT_SYMBOL(ttm_bo_mem_space);
 
-static int ttm_bo_move_buffer(struct ttm_buffer_object *bo,
-			      struct ttm_placement *placement,
-			      struct ttm_operation_ctx *ctx)
+/*
+ * ttm_bo_mem_space - Wrapper around ttm_bo_alloc_resource
+ *
+ * @bo: Pointer to a struct ttm_buffer_object of which we want a resource for
+ * @placement: Proposed new placement for the buffer object
+ * @res: The resulting struct ttm_resource.
+ * @ctx: if and how to sleep, lock buffers and alloc memory
+ *
+ * Tries both idle allocation and forcefully eviction of buffers. See
+ * ttm_bo_alloc_resource for details.
+ */
+int ttm_bo_mem_space(struct ttm_buffer_object *bo,
+		     struct ttm_placement *placement,
+		     struct ttm_resource **res,
+		     struct ttm_operation_ctx *ctx)
 {
-	struct ttm_resource *mem;
-	struct ttm_place hop;
+	bool force_space = false;
 	int ret;
 
-	dma_resv_assert_held(bo->base.resv);
+	do {
+		ret = ttm_bo_alloc_resource(bo, placement, ctx,
+					    force_space, res);
+		force_space = !force_space;
+	} while (ret == -ENOSPC && force_space);
 
-	/*
-	 * Determine where to move the buffer.
-	 *
-	 * If driver determines move is going to need
-	 * an extra step then it will return -EMULTIHOP
-	 * and the buffer will be moved to the temporary
-	 * stop and the driver will be called to make
-	 * the second hop.
-	 */
-	ret = ttm_bo_mem_space(bo, placement, &mem, ctx);
-	if (ret)
-		return ret;
-bounce:
-	ret = ttm_bo_handle_move_mem(bo, mem, false, ctx, &hop);
-	if (ret == -EMULTIHOP) {
-		ret = ttm_bo_bounce_temp_buffer(bo, &mem, ctx, &hop);
-		if (ret)
-			goto out;
-		/* try and move to final place now. */
-		goto bounce;
-	}
-out:
-	if (ret)
-		ttm_resource_free(bo, &mem);
 	return ret;
 }
+EXPORT_SYMBOL(ttm_bo_mem_space);
 
 /**
  * ttm_bo_validate
@@ -902,6 +849,9 @@ int ttm_bo_validate(struct ttm_buffer_object *bo,
 		    struct ttm_placement *placement,
 		    struct ttm_operation_ctx *ctx)
 {
+	struct ttm_resource *res;
+	struct ttm_place hop;
+	bool force_space;
 	int ret;
 
 	dma_resv_assert_held(bo->base.resv);
@@ -912,20 +862,53 @@ int ttm_bo_validate(struct ttm_buffer_object *bo,
 	if (!placement->num_placement)
 		return ttm_bo_pipeline_gutting(bo);
 
-	/* Check whether we need to move buffer. */
-	if (bo->resource && ttm_resource_compatible(bo->resource, placement))
-		return 0;
+	force_space = false;
+	do {
+		/* Check whether we need to move buffer. */
+		if (bo->resource &&
+		    ttm_resource_compatible(bo->resource, placement,
+					    force_space))
+			return 0;
 
-	/* Moving of pinned BOs is forbidden */
-	if (bo->pin_count)
-		return -EINVAL;
+		/* Moving of pinned BOs is forbidden */
+		if (bo->pin_count)
+			return -EINVAL;
+
+		/*
+		 * Determine where to move the buffer.
+		 *
+		 * If driver determines move is going to need
+		 * an extra step then it will return -EMULTIHOP
+		 * and the buffer will be moved to the temporary
+		 * stop and the driver will be called to make
+		 * the second hop.
+		 */
+		ret = ttm_bo_alloc_resource(bo, placement, ctx, force_space,
+					    &res);
+		force_space = !force_space;
+		if (ret == -ENOSPC)
+			continue;
+		if (ret)
+			return ret;
+
+bounce:
+		ret = ttm_bo_handle_move_mem(bo, res, false, ctx, &hop);
+		if (ret == -EMULTIHOP) {
+			ret = ttm_bo_bounce_temp_buffer(bo, &res, ctx, &hop);
+			/* try and move to final place now. */
+			if (!ret)
+				goto bounce;
+		}
+		if (ret) {
+			ttm_resource_free(bo, &res);
+			return ret;
+		}
+
+	} while (ret && force_space);
 
-	ret = ttm_bo_move_buffer(bo, placement, ctx);
 	/* For backward compatibility with userspace */
 	if (ret == -ENOSPC)
 		return -ENOMEM;
-	if (ret)
-		return ret;
 
 	/*
 	 * We might need to add a TTM.
diff --git a/drivers/gpu/drm/ttm/ttm_resource.c b/drivers/gpu/drm/ttm/ttm_resource.c
index fb14f7716cf8..65155f2013ca 100644
--- a/drivers/gpu/drm/ttm/ttm_resource.c
+++ b/drivers/gpu/drm/ttm/ttm_resource.c
@@ -295,11 +295,13 @@ bool ttm_resource_intersects(struct ttm_device *bdev,
  *
  * @res: the resource to check
  * @placement: the placement to check against
+ * @evicting: true if the caller is doing evictions
  *
  * Returns true if the placement is compatible.
  */
 bool ttm_resource_compatible(struct ttm_resource *res,
-			     struct ttm_placement *placement)
+			     struct ttm_placement *placement,
+			     bool evicting)
 {
 	struct ttm_buffer_object *bo = res->bo;
 	struct ttm_device *bdev = bo->bdev;
@@ -315,14 +317,20 @@ bool ttm_resource_compatible(struct ttm_resource *res,
 		if (res->mem_type != place->mem_type)
 			continue;
 
+		if (place->flags & (evicting ? TTM_PL_FLAG_DESIRED :
+				    TTM_PL_FLAG_FALLBACK))
+			continue;
+
+		if (place->flags & TTM_PL_FLAG_CONTIGUOUS &&
+		    !(res->placement & TTM_PL_FLAG_CONTIGUOUS))
+			continue;
+
 		man = ttm_manager_type(bdev, res->mem_type);
 		if (man->func->compatible &&
 		    !man->func->compatible(man, res, place, bo->base.size))
 			continue;
 
-		if ((!(place->flags & TTM_PL_FLAG_CONTIGUOUS) ||
-		     (res->placement & TTM_PL_FLAG_CONTIGUOUS)))
-			return true;
+		return true;
 	}
 	return false;
 }
diff --git a/include/drm/ttm/ttm_resource.h b/include/drm/ttm/ttm_resource.h
index 1afa13f0c22b..7561023db43d 100644
--- a/include/drm/ttm/ttm_resource.h
+++ b/include/drm/ttm/ttm_resource.h
@@ -366,7 +366,8 @@ bool ttm_resource_intersects(struct ttm_device *bdev,
 			     const struct ttm_place *place,
 			     size_t size);
 bool ttm_resource_compatible(struct ttm_resource *res,
-			     struct ttm_placement *placement);
+			     struct ttm_placement *placement,
+			     bool evicting);
 void ttm_resource_set_bo(struct ttm_resource *res,
 			 struct ttm_buffer_object *bo);
 
-- 
2.34.1


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

* [PATCH 2/2] drm/amdgpu: use GTT only as fallback for VRAM|GTT
  2024-01-26 14:09 Rework TTMs busy handling Christian König
  2024-01-26 14:09 ` [PATCH 1/2] drm/ttm: improve idle/busy handling v4 Christian König
@ 2024-01-26 14:09 ` Christian König
  2024-01-26 14:38 ` ✗ Fi.CI.CHECKPATCH: warning for series starting with [1/2] drm/ttm: improve idle/busy handling v4 Patchwork
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 13+ messages in thread
From: Christian König @ 2024-01-26 14:09 UTC (permalink / raw)
  To: thomas.hellstrom, dri-devel, intel-gfx, nouveau

Try to fill up VRAM as well by setting the busy flag on GTT allocations.

This fixes the issue that when VRAM was evacuated for suspend it's never
filled up again unless the application is restarted.

Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Zack Rusin <zack.rusin@broadcom.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
index b671b0665492..0eac179a387c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
@@ -173,6 +173,12 @@ void amdgpu_bo_placement_from_domain(struct amdgpu_bo *abo, u32 domain)
 			abo->flags & AMDGPU_GEM_CREATE_PREEMPTIBLE ?
 			AMDGPU_PL_PREEMPT : TTM_PL_TT;
 		places[c].flags = 0;
+		/*
+		 * When GTT is just an alternative to VRAM make sure that we
+		 * only use it as fallback and still try to fill up VRAM first.
+		 */
+		if (domain & abo->preferred_domains & AMDGPU_GEM_DOMAIN_VRAM)
+			places[c].flags |= TTM_PL_FLAG_FALLBACK;
 		c++;
 	}
 
-- 
2.34.1


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

* ✗ Fi.CI.CHECKPATCH: warning for series starting with [1/2] drm/ttm: improve idle/busy handling v4
  2024-01-26 14:09 Rework TTMs busy handling Christian König
  2024-01-26 14:09 ` [PATCH 1/2] drm/ttm: improve idle/busy handling v4 Christian König
  2024-01-26 14:09 ` [PATCH 2/2] drm/amdgpu: use GTT only as fallback for VRAM|GTT Christian König
@ 2024-01-26 14:38 ` Patchwork
  2024-01-26 14:38 ` ✗ Fi.CI.SPARSE: " Patchwork
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 13+ messages in thread
From: Patchwork @ 2024-01-26 14:38 UTC (permalink / raw)
  To: Christian König; +Cc: intel-gfx

== Series Details ==

Series: series starting with [1/2] drm/ttm: improve idle/busy handling v4
URL   : https://patchwork.freedesktop.org/series/129197/
State : warning

== Summary ==

Error: dim checkpatch failed
72c0fca2f3d6 drm/ttm: improve idle/busy handling v4
-:26: WARNING:BAD_SIGN_OFF: Unexpected content after email: 'Zack Rusin <zack.rusin@broadcom.com> v3', should be: 'Zack Rusin <zack.rusin@broadcom.com> (v3)'
#26: 
Reviewed-by: Zack Rusin <zack.rusin@broadcom.com> v3

-:387: WARNING:FROM_SIGN_OFF_MISMATCH: From:/Signed-off-by: email address mismatch: 'From: "Christian König" <ckoenig.leichtzumerken@gmail.com>' != 'Signed-off-by: Christian König <christian.koenig@amd.com>'

total: 0 errors, 2 warnings, 0 checks, 341 lines checked
a894c42d4f6e drm/amdgpu: use GTT only as fallback for VRAM|GTT
-:33: WARNING:FROM_SIGN_OFF_MISMATCH: From:/Signed-off-by: email address mismatch: 'From: "Christian König" <ckoenig.leichtzumerken@gmail.com>' != 'Signed-off-by: Christian König <christian.koenig@amd.com>'

total: 0 errors, 1 warnings, 0 checks, 12 lines checked



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

* ✗ Fi.CI.SPARSE: warning for series starting with [1/2] drm/ttm: improve idle/busy handling v4
  2024-01-26 14:09 Rework TTMs busy handling Christian König
                   ` (2 preceding siblings ...)
  2024-01-26 14:38 ` ✗ Fi.CI.CHECKPATCH: warning for series starting with [1/2] drm/ttm: improve idle/busy handling v4 Patchwork
@ 2024-01-26 14:38 ` Patchwork
  2024-01-26 14:52 ` ✓ Fi.CI.BAT: success " Patchwork
  2024-01-26 16:06 ` ✗ Fi.CI.IGT: failure " Patchwork
  5 siblings, 0 replies; 13+ messages in thread
From: Patchwork @ 2024-01-26 14:38 UTC (permalink / raw)
  To: Christian König; +Cc: intel-gfx

== Series Details ==

Series: series starting with [1/2] drm/ttm: improve idle/busy handling v4
URL   : https://patchwork.freedesktop.org/series/129197/
State : warning

== Summary ==

Error: dim sparse failed
Sparse version: v0.6.2
Fast mode used, each commit won't be checked separately.



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

* ✓ Fi.CI.BAT: success for series starting with [1/2] drm/ttm: improve idle/busy handling v4
  2024-01-26 14:09 Rework TTMs busy handling Christian König
                   ` (3 preceding siblings ...)
  2024-01-26 14:38 ` ✗ Fi.CI.SPARSE: " Patchwork
@ 2024-01-26 14:52 ` Patchwork
  2024-01-26 16:06 ` ✗ Fi.CI.IGT: failure " Patchwork
  5 siblings, 0 replies; 13+ messages in thread
From: Patchwork @ 2024-01-26 14:52 UTC (permalink / raw)
  To: Christian König; +Cc: intel-gfx

[-- Attachment #1: Type: text/plain, Size: 4444 bytes --]

== Series Details ==

Series: series starting with [1/2] drm/ttm: improve idle/busy handling v4
URL   : https://patchwork.freedesktop.org/series/129197/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_14181 -> Patchwork_129197v1
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

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

Participating hosts (37 -> 35)
------------------------------

  Missing    (2): bat-kbl-2 fi-snb-2520m 

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

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

### IGT changes ###

#### Issues hit ####

  * igt@gem_lmem_swapping@parallel-random-engines:
    - bat-adlm-1:         NOTRUN -> [SKIP][1] ([i915#4613]) +3 other tests skip
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/bat-adlm-1/igt@gem_lmem_swapping@parallel-random-engines.html

  * igt@i915_pm_rps@basic-api:
    - bat-adlm-1:         NOTRUN -> [SKIP][2] ([i915#6621])
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/bat-adlm-1/igt@i915_pm_rps@basic-api.html

  * igt@kms_force_connector_basic@force-load-detect:
    - bat-adlm-1:         NOTRUN -> [SKIP][3] ([fdo#109285])
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/bat-adlm-1/igt@kms_force_connector_basic@force-load-detect.html

  * igt@kms_frontbuffer_tracking@basic:
    - bat-adlm-1:         NOTRUN -> [SKIP][4] ([i915#1849] / [i915#4342])
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/bat-adlm-1/igt@kms_frontbuffer_tracking@basic.html

  * igt@kms_pipe_crc_basic@hang-read-crc:
    - bat-adlm-1:         NOTRUN -> [SKIP][5] ([i915#9875] / [i915#9900]) +6 other tests skip
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/bat-adlm-1/igt@kms_pipe_crc_basic@hang-read-crc.html

  * igt@kms_pm_backlight@basic-brightness:
    - bat-adlm-1:         NOTRUN -> [SKIP][6] ([i915#5354])
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/bat-adlm-1/igt@kms_pm_backlight@basic-brightness.html

  * igt@kms_setmode@basic-clone-single-crtc:
    - bat-adlm-1:         NOTRUN -> [SKIP][7] ([i915#3555])
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/bat-adlm-1/igt@kms_setmode@basic-clone-single-crtc.html

  * igt@prime_vgem@basic-fence-flip:
    - bat-adlm-1:         NOTRUN -> [SKIP][8] ([i915#3708] / [i915#9900])
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/bat-adlm-1/igt@prime_vgem@basic-fence-flip.html

  * igt@prime_vgem@basic-write:
    - bat-adlm-1:         NOTRUN -> [SKIP][9] ([i915#3708]) +2 other tests skip
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/bat-adlm-1/igt@prime_vgem@basic-write.html

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

  [fdo#109285]: https://bugs.freedesktop.org/show_bug.cgi?id=109285
  [i915#1849]: https://gitlab.freedesktop.org/drm/intel/issues/1849
  [i915#3555]: https://gitlab.freedesktop.org/drm/intel/issues/3555
  [i915#3708]: https://gitlab.freedesktop.org/drm/intel/issues/3708
  [i915#4342]: https://gitlab.freedesktop.org/drm/intel/issues/4342
  [i915#4613]: https://gitlab.freedesktop.org/drm/intel/issues/4613
  [i915#5354]: https://gitlab.freedesktop.org/drm/intel/issues/5354
  [i915#6621]: https://gitlab.freedesktop.org/drm/intel/issues/6621
  [i915#9673]: https://gitlab.freedesktop.org/drm/intel/issues/9673
  [i915#9732]: https://gitlab.freedesktop.org/drm/intel/issues/9732
  [i915#9875]: https://gitlab.freedesktop.org/drm/intel/issues/9875
  [i915#9900]: https://gitlab.freedesktop.org/drm/intel/issues/9900


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

  * Linux: CI_DRM_14181 -> Patchwork_129197v1

  CI-20190529: 20190529
  CI_DRM_14181: 6aa961ab469df8db84bee01a55606a91a6ae5d67 @ git://anongit.freedesktop.org/gfx-ci/linux
  IGT_7693: f5f774ada63296536195fd381d8720f5ac7e2208 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  Patchwork_129197v1: 6aa961ab469df8db84bee01a55606a91a6ae5d67 @ git://anongit.freedesktop.org/gfx-ci/linux


### Linux commits

21de0716d104 drm/amdgpu: use GTT only as fallback for VRAM|GTT
a4a9e7bef55e drm/ttm: improve idle/busy handling v4

== Logs ==

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

[-- Attachment #2: Type: text/html, Size: 5277 bytes --]

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

* ✗ Fi.CI.IGT: failure for series starting with [1/2] drm/ttm: improve idle/busy handling v4
  2024-01-26 14:09 Rework TTMs busy handling Christian König
                   ` (4 preceding siblings ...)
  2024-01-26 14:52 ` ✓ Fi.CI.BAT: success " Patchwork
@ 2024-01-26 16:06 ` Patchwork
  5 siblings, 0 replies; 13+ messages in thread
From: Patchwork @ 2024-01-26 16:06 UTC (permalink / raw)
  To: Christian König; +Cc: intel-gfx

[-- Attachment #1: Type: text/plain, Size: 100292 bytes --]

== Series Details ==

Series: series starting with [1/2] drm/ttm: improve idle/busy handling v4
URL   : https://patchwork.freedesktop.org/series/129197/
State : failure

== Summary ==

CI Bug Log - changes from CI_DRM_14181_full -> Patchwork_129197v1_full
====================================================

Summary
-------

  **FAILURE**

  Serious unknown changes coming with Patchwork_129197v1_full absolutely need to be
  verified manually.
  
  If you think the reported changes have nothing to do with the changes
  introduced in Patchwork_129197v1_full, please notify your bug team (I915-ci-infra@lists.freedesktop.org) 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_129197v1/index.html

Participating hosts (9 -> 8)
------------------------------

  Missing    (1): shard-snb-0 

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

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

### IGT changes ###

#### Possible regressions ####

  * igt@gem_exec_create@forked@smem:
    - shard-snb:          NOTRUN -> [INCOMPLETE][1]
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-snb1/igt@gem_exec_create@forked@smem.html

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

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

### CI changes ###

#### Issues hit ####

  * boot:
    - shard-glk:          ([PASS][2], [PASS][3], [PASS][4], [PASS][5], [PASS][6], [PASS][7], [PASS][8], [PASS][9], [PASS][10], [PASS][11], [PASS][12], [PASS][13], [PASS][14], [PASS][15], [PASS][16], [PASS][17], [PASS][18], [PASS][19], [PASS][20], [PASS][21], [PASS][22]) -> ([PASS][23], [PASS][24], [PASS][25], [PASS][26], [PASS][27], [PASS][28], [PASS][29], [PASS][30], [PASS][31], [PASS][32], [PASS][33], [FAIL][34], [PASS][35], [PASS][36], [PASS][37], [PASS][38], [PASS][39], [PASS][40]) ([i915#8293])
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-glk9/boot.html
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-glk9/boot.html
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-glk9/boot.html
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-glk8/boot.html
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-glk8/boot.html
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-glk8/boot.html
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-glk7/boot.html
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-glk7/boot.html
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-glk7/boot.html
   [11]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-glk5/boot.html
   [12]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-glk5/boot.html
   [13]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-glk5/boot.html
   [14]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-glk4/boot.html
   [15]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-glk4/boot.html
   [16]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-glk4/boot.html
   [17]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-glk3/boot.html
   [18]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-glk3/boot.html
   [19]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-glk3/boot.html
   [20]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-glk1/boot.html
   [21]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-glk1/boot.html
   [22]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-glk1/boot.html
   [23]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-glk1/boot.html
   [24]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-glk1/boot.html
   [25]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-glk3/boot.html
   [26]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-glk3/boot.html
   [27]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-glk3/boot.html
   [28]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-glk4/boot.html
   [29]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-glk4/boot.html
   [30]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-glk5/boot.html
   [31]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-glk5/boot.html
   [32]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-glk5/boot.html
   [33]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-glk7/boot.html
   [34]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-glk7/boot.html
   [35]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-glk7/boot.html
   [36]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-glk8/boot.html
   [37]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-glk8/boot.html
   [38]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-glk8/boot.html
   [39]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-glk9/boot.html
   [40]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-glk9/boot.html

  

### IGT changes ###

#### Issues hit ####

  * igt@api_intel_bb@crc32:
    - shard-tglu:         NOTRUN -> [SKIP][41] ([i915#6230])
   [41]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-7/igt@api_intel_bb@crc32.html

  * igt@api_intel_bb@object-reloc-purge-cache:
    - shard-dg2:          NOTRUN -> [SKIP][42] ([i915#8411]) +2 other tests skip
   [42]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-5/igt@api_intel_bb@object-reloc-purge-cache.html

  * igt@debugfs_test@basic-hwmon:
    - shard-mtlp:         NOTRUN -> [SKIP][43] ([i915#9318])
   [43]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-4/igt@debugfs_test@basic-hwmon.html
    - shard-rkl:          NOTRUN -> [SKIP][44] ([i915#9318])
   [44]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-1/igt@debugfs_test@basic-hwmon.html
    - shard-tglu:         NOTRUN -> [SKIP][45] ([i915#9318])
   [45]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-5/igt@debugfs_test@basic-hwmon.html

  * igt@device_reset@unbind-cold-reset-rebind:
    - shard-mtlp:         NOTRUN -> [SKIP][46] ([i915#7701])
   [46]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-1/igt@device_reset@unbind-cold-reset-rebind.html

  * igt@device_reset@unbind-reset-rebind:
    - shard-dg1:          NOTRUN -> [ABORT][47] ([i915#9618])
   [47]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-13/igt@device_reset@unbind-reset-rebind.html

  * igt@drm_buddy@drm_buddy@drm_test_buddy_alloc_limit:
    - shard-rkl:          NOTRUN -> [DMESG-WARN][48] ([i915#10140])
   [48]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-6/igt@drm_buddy@drm_buddy@drm_test_buddy_alloc_limit.html

  * igt@drm_fdinfo@busy-idle-check-all@ccs3:
    - shard-dg2:          NOTRUN -> [SKIP][49] ([i915#8414]) +51 other tests skip
   [49]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-1/igt@drm_fdinfo@busy-idle-check-all@ccs3.html

  * igt@drm_fdinfo@busy@vcs1:
    - shard-dg1:          NOTRUN -> [SKIP][50] ([i915#8414]) +10 other tests skip
   [50]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-17/igt@drm_fdinfo@busy@vcs1.html

  * igt@drm_fdinfo@most-busy-check-all@rcs0:
    - shard-rkl:          NOTRUN -> [FAIL][51] ([i915#7742])
   [51]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-6/igt@drm_fdinfo@most-busy-check-all@rcs0.html

  * igt@drm_mm@drm_mm@drm_test_mm_init:
    - shard-snb:          NOTRUN -> [DMESG-WARN][52] ([i915#10140])
   [52]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-snb5/igt@drm_mm@drm_mm@drm_test_mm_init.html
    - shard-dg2:          NOTRUN -> [DMESG-WARN][53] ([i915#10140])
   [53]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-7/igt@drm_mm@drm_mm@drm_test_mm_init.html

  * igt@gem_ccs@ctrl-surf-copy-new-ctx:
    - shard-mtlp:         NOTRUN -> [SKIP][54] ([i915#9323])
   [54]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-4/igt@gem_ccs@ctrl-surf-copy-new-ctx.html
    - shard-rkl:          NOTRUN -> [SKIP][55] ([i915#9323])
   [55]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-1/igt@gem_ccs@ctrl-surf-copy-new-ctx.html
    - shard-dg1:          NOTRUN -> [SKIP][56] ([i915#9323])
   [56]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-19/igt@gem_ccs@ctrl-surf-copy-new-ctx.html
    - shard-tglu:         NOTRUN -> [SKIP][57] ([i915#9323])
   [57]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-5/igt@gem_ccs@ctrl-surf-copy-new-ctx.html

  * igt@gem_ccs@suspend-resume@xmajor-compressed-compfmt0-smem-lmem0:
    - shard-dg2:          NOTRUN -> [INCOMPLETE][58] ([i915#7297])
   [58]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-5/igt@gem_ccs@suspend-resume@xmajor-compressed-compfmt0-smem-lmem0.html

  * igt@gem_close_race@multigpu-basic-process:
    - shard-tglu:         NOTRUN -> [SKIP][59] ([i915#7697])
   [59]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-7/igt@gem_close_race@multigpu-basic-process.html
    - shard-dg2:          NOTRUN -> [SKIP][60] ([i915#7697]) +1 other test skip
   [60]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-5/igt@gem_close_race@multigpu-basic-process.html

  * igt@gem_close_race@multigpu-basic-threads:
    - shard-rkl:          NOTRUN -> [SKIP][61] ([i915#7697])
   [61]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-2/igt@gem_close_race@multigpu-basic-threads.html

  * igt@gem_create@create-ext-cpu-access-big:
    - shard-rkl:          NOTRUN -> [SKIP][62] ([i915#6335])
   [62]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-2/igt@gem_create@create-ext-cpu-access-big.html

  * igt@gem_create@create-ext-set-pat:
    - shard-dg2:          NOTRUN -> [SKIP][63] ([i915#8562])
   [63]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-5/igt@gem_create@create-ext-set-pat.html

  * igt@gem_ctx_exec@basic-nohangcheck:
    - shard-tglu:         [PASS][64] -> [FAIL][65] ([i915#6268])
   [64]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-tglu-10/igt@gem_ctx_exec@basic-nohangcheck.html
   [65]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-10/igt@gem_ctx_exec@basic-nohangcheck.html

  * igt@gem_ctx_persistence@heartbeat-many:
    - shard-dg2:          NOTRUN -> [SKIP][66] ([i915#8555])
   [66]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-10/igt@gem_ctx_persistence@heartbeat-many.html

  * igt@gem_ctx_persistence@heartbeat-stop:
    - shard-mtlp:         NOTRUN -> [SKIP][67] ([i915#8555])
   [67]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-1/igt@gem_ctx_persistence@heartbeat-stop.html

  * igt@gem_ctx_persistence@legacy-engines-mixed-process:
    - shard-snb:          NOTRUN -> [SKIP][68] ([fdo#109271] / [i915#1099])
   [68]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-snb1/igt@gem_ctx_persistence@legacy-engines-mixed-process.html

  * igt@gem_ctx_sseu@engines:
    - shard-rkl:          NOTRUN -> [SKIP][69] ([i915#280])
   [69]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-5/igt@gem_ctx_sseu@engines.html
    - shard-dg2:          NOTRUN -> [SKIP][70] ([i915#280])
   [70]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-1/igt@gem_ctx_sseu@engines.html

  * igt@gem_eio@hibernate:
    - shard-rkl:          NOTRUN -> [ABORT][71] ([i915#7975] / [i915#8213])
   [71]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-6/igt@gem_eio@hibernate.html

  * igt@gem_exec_balancer@bonded-dual:
    - shard-mtlp:         NOTRUN -> [SKIP][72] ([i915#4771])
   [72]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-1/igt@gem_exec_balancer@bonded-dual.html

  * igt@gem_exec_balancer@bonded-true-hang:
    - shard-dg2:          NOTRUN -> [SKIP][73] ([i915#4812]) +3 other tests skip
   [73]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-7/igt@gem_exec_balancer@bonded-true-hang.html

  * igt@gem_exec_balancer@invalid-bonds:
    - shard-dg2:          NOTRUN -> [SKIP][74] ([i915#4036])
   [74]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-7/igt@gem_exec_balancer@invalid-bonds.html

  * igt@gem_exec_balancer@parallel-keep-submit-fence:
    - shard-rkl:          NOTRUN -> [SKIP][75] ([i915#4525]) +1 other test skip
   [75]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-6/igt@gem_exec_balancer@parallel-keep-submit-fence.html

  * igt@gem_exec_capture@capture-invisible@smem0:
    - shard-glk:          NOTRUN -> [SKIP][76] ([fdo#109271] / [i915#6334])
   [76]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-glk7/igt@gem_exec_capture@capture-invisible@smem0.html

  * igt@gem_exec_capture@many-4k-incremental:
    - shard-rkl:          NOTRUN -> [FAIL][77] ([i915#9606])
   [77]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-2/igt@gem_exec_capture@many-4k-incremental.html

  * igt@gem_exec_capture@many-4k-zero:
    - shard-tglu:         NOTRUN -> [FAIL][78] ([i915#9606])
   [78]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-7/igt@gem_exec_capture@many-4k-zero.html
    - shard-dg2:          NOTRUN -> [FAIL][79] ([i915#9606])
   [79]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-5/igt@gem_exec_capture@many-4k-zero.html

  * igt@gem_exec_fair@basic-none-vip@rcs0:
    - shard-glk:          [PASS][80] -> [FAIL][81] ([i915#2842]) +1 other test fail
   [80]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-glk5/igt@gem_exec_fair@basic-none-vip@rcs0.html
   [81]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-glk7/igt@gem_exec_fair@basic-none-vip@rcs0.html

  * igt@gem_exec_fair@basic-none@vecs0:
    - shard-rkl:          [PASS][82] -> [FAIL][83] ([i915#2842]) +2 other tests fail
   [82]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-rkl-4/igt@gem_exec_fair@basic-none@vecs0.html
   [83]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-1/igt@gem_exec_fair@basic-none@vecs0.html

  * igt@gem_exec_fair@basic-pace-solo:
    - shard-dg2:          NOTRUN -> [SKIP][84] ([i915#3539]) +4 other tests skip
   [84]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-10/igt@gem_exec_fair@basic-pace-solo.html
    - shard-dg1:          NOTRUN -> [SKIP][85] ([i915#3539]) +1 other test skip
   [85]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-19/igt@gem_exec_fair@basic-pace-solo.html
    - shard-mtlp:         NOTRUN -> [SKIP][86] ([i915#4473])
   [86]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-4/igt@gem_exec_fair@basic-pace-solo.html

  * igt@gem_exec_fair@basic-throttle:
    - shard-mtlp:         NOTRUN -> [SKIP][87] ([i915#4473] / [i915#4771])
   [87]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-4/igt@gem_exec_fair@basic-throttle.html

  * igt@gem_exec_fair@basic-throttle@rcs0:
    - shard-rkl:          NOTRUN -> [FAIL][88] ([i915#2842])
   [88]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-1/igt@gem_exec_fair@basic-throttle@rcs0.html
    - shard-tglu:         NOTRUN -> [FAIL][89] ([i915#2842])
   [89]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-5/igt@gem_exec_fair@basic-throttle@rcs0.html

  * igt@gem_exec_flush@basic-uc-ro-default:
    - shard-dg2:          NOTRUN -> [SKIP][90] ([i915#3539] / [i915#4852]) +5 other tests skip
   [90]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-1/igt@gem_exec_flush@basic-uc-ro-default.html

  * igt@gem_exec_flush@basic-wb-rw-default:
    - shard-dg1:          NOTRUN -> [SKIP][91] ([i915#3539] / [i915#4852]) +2 other tests skip
   [91]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-17/igt@gem_exec_flush@basic-wb-rw-default.html

  * igt@gem_exec_params@rsvd2-dirt:
    - shard-dg2:          NOTRUN -> [SKIP][92] ([fdo#109283] / [i915#5107])
   [92]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-10/igt@gem_exec_params@rsvd2-dirt.html

  * igt@gem_exec_params@secure-non-root:
    - shard-dg2:          NOTRUN -> [SKIP][93] ([fdo#112283])
   [93]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-5/igt@gem_exec_params@secure-non-root.html

  * igt@gem_exec_reloc@basic-gtt-wc-noreloc:
    - shard-rkl:          NOTRUN -> [SKIP][94] ([i915#3281]) +12 other tests skip
   [94]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-5/igt@gem_exec_reloc@basic-gtt-wc-noreloc.html

  * igt@gem_exec_reloc@basic-range-active:
    - shard-mtlp:         NOTRUN -> [SKIP][95] ([i915#3281]) +4 other tests skip
   [95]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-1/igt@gem_exec_reloc@basic-range-active.html

  * igt@gem_exec_reloc@basic-wc:
    - shard-dg2:          NOTRUN -> [SKIP][96] ([i915#3281]) +22 other tests skip
   [96]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-10/igt@gem_exec_reloc@basic-wc.html

  * igt@gem_exec_reloc@basic-wc-cpu-noreloc:
    - shard-dg1:          NOTRUN -> [SKIP][97] ([i915#3281]) +8 other tests skip
   [97]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-17/igt@gem_exec_reloc@basic-wc-cpu-noreloc.html

  * igt@gem_exec_schedule@preempt-queue-chain:
    - shard-dg2:          NOTRUN -> [SKIP][98] ([i915#4537] / [i915#4812]) +2 other tests skip
   [98]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-5/igt@gem_exec_schedule@preempt-queue-chain.html

  * igt@gem_exec_schedule@preempt-queue-contexts:
    - shard-dg1:          NOTRUN -> [SKIP][99] ([i915#4812])
   [99]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-17/igt@gem_exec_schedule@preempt-queue-contexts.html

  * igt@gem_exec_suspend@basic-s0@lmem0:
    - shard-dg2:          NOTRUN -> [INCOMPLETE][100] ([i915#9275])
   [100]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-1/igt@gem_exec_suspend@basic-s0@lmem0.html

  * igt@gem_fence_thrash@bo-write-verify-none:
    - shard-mtlp:         NOTRUN -> [SKIP][101] ([i915#4860]) +1 other test skip
   [101]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-1/igt@gem_fence_thrash@bo-write-verify-none.html

  * igt@gem_fence_thrash@bo-write-verify-x:
    - shard-dg2:          NOTRUN -> [SKIP][102] ([i915#4860]) +4 other tests skip
   [102]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-2/igt@gem_fence_thrash@bo-write-verify-x.html
    - shard-dg1:          NOTRUN -> [SKIP][103] ([i915#4860])
   [103]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-17/igt@gem_fence_thrash@bo-write-verify-x.html

  * igt@gem_lmem_evict@dontneed-evict-race:
    - shard-rkl:          NOTRUN -> [SKIP][104] ([i915#4613] / [i915#7582])
   [104]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-1/igt@gem_lmem_evict@dontneed-evict-race.html
    - shard-tglu:         NOTRUN -> [SKIP][105] ([i915#4613] / [i915#7582])
   [105]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-5/igt@gem_lmem_evict@dontneed-evict-race.html

  * igt@gem_lmem_swapping@parallel-random-verify-ccs:
    - shard-rkl:          NOTRUN -> [SKIP][106] ([i915#4613]) +2 other tests skip
   [106]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-2/igt@gem_lmem_swapping@parallel-random-verify-ccs.html

  * igt@gem_lmem_swapping@random:
    - shard-glk:          NOTRUN -> [SKIP][107] ([fdo#109271] / [i915#4613]) +3 other tests skip
   [107]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-glk8/igt@gem_lmem_swapping@random.html

  * igt@gem_lmem_swapping@smem-oom@lmem0:
    - shard-dg1:          [PASS][108] -> [TIMEOUT][109] ([i915#5493])
   [108]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-dg1-15/igt@gem_lmem_swapping@smem-oom@lmem0.html
   [109]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-15/igt@gem_lmem_swapping@smem-oom@lmem0.html

  * igt@gem_lmem_swapping@verify-ccs:
    - shard-tglu:         NOTRUN -> [SKIP][110] ([i915#4613]) +1 other test skip
   [110]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-5/igt@gem_lmem_swapping@verify-ccs.html
    - shard-mtlp:         NOTRUN -> [SKIP][111] ([i915#4613]) +3 other tests skip
   [111]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-4/igt@gem_lmem_swapping@verify-ccs.html

  * igt@gem_lmem_swapping@verify-ccs@lmem0:
    - shard-dg1:          NOTRUN -> [SKIP][112] ([i915#4565])
   [112]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-19/igt@gem_lmem_swapping@verify-ccs@lmem0.html

  * igt@gem_media_vme:
    - shard-mtlp:         NOTRUN -> [SKIP][113] ([i915#284])
   [113]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-1/igt@gem_media_vme.html

  * igt@gem_mmap@basic-small-bo:
    - shard-mtlp:         NOTRUN -> [SKIP][114] ([i915#4083]) +4 other tests skip
   [114]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-1/igt@gem_mmap@basic-small-bo.html

  * igt@gem_mmap_gtt@big-bo-tiledy:
    - shard-mtlp:         NOTRUN -> [SKIP][115] ([i915#4077]) +4 other tests skip
   [115]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-7/igt@gem_mmap_gtt@big-bo-tiledy.html

  * igt@gem_mmap_gtt@big-copy-odd:
    - shard-dg1:          NOTRUN -> [SKIP][116] ([i915#4077]) +7 other tests skip
   [116]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-18/igt@gem_mmap_gtt@big-copy-odd.html

  * igt@gem_mmap_gtt@cpuset-big-copy:
    - shard-dg2:          NOTRUN -> [SKIP][117] ([i915#4077]) +20 other tests skip
   [117]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-1/igt@gem_mmap_gtt@cpuset-big-copy.html

  * igt@gem_mmap_wc@bad-size:
    - shard-dg2:          NOTRUN -> [SKIP][118] ([i915#4083]) +9 other tests skip
   [118]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-5/igt@gem_mmap_wc@bad-size.html

  * igt@gem_mmap_wc@write-read:
    - shard-dg1:          NOTRUN -> [SKIP][119] ([i915#4083]) +6 other tests skip
   [119]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-18/igt@gem_mmap_wc@write-read.html

  * igt@gem_partial_pwrite_pread@reads:
    - shard-dg2:          NOTRUN -> [SKIP][120] ([i915#3282]) +6 other tests skip
   [120]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-1/igt@gem_partial_pwrite_pread@reads.html

  * igt@gem_partial_pwrite_pread@write-snoop:
    - shard-mtlp:         NOTRUN -> [SKIP][121] ([i915#3282])
   [121]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-4/igt@gem_partial_pwrite_pread@write-snoop.html

  * igt@gem_partial_pwrite_pread@writes-after-reads-snoop:
    - shard-dg1:          NOTRUN -> [SKIP][122] ([i915#3282]) +1 other test skip
   [122]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-17/igt@gem_partial_pwrite_pread@writes-after-reads-snoop.html

  * igt@gem_pread@exhaustion:
    - shard-glk:          NOTRUN -> [WARN][123] ([i915#2658])
   [123]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-glk9/igt@gem_pread@exhaustion.html

  * igt@gem_pxp@create-protected-buffer:
    - shard-rkl:          NOTRUN -> [SKIP][124] ([i915#4270]) +4 other tests skip
   [124]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-2/igt@gem_pxp@create-protected-buffer.html

  * igt@gem_pxp@reject-modify-context-protection-off-3:
    - shard-snb:          NOTRUN -> [SKIP][125] ([fdo#109271]) +159 other tests skip
   [125]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-snb1/igt@gem_pxp@reject-modify-context-protection-off-3.html
    - shard-dg1:          NOTRUN -> [SKIP][126] ([i915#4270]) +2 other tests skip
   [126]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-19/igt@gem_pxp@reject-modify-context-protection-off-3.html
    - shard-tglu:         NOTRUN -> [SKIP][127] ([i915#4270]) +1 other test skip
   [127]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-5/igt@gem_pxp@reject-modify-context-protection-off-3.html
    - shard-mtlp:         NOTRUN -> [SKIP][128] ([i915#4270]) +1 other test skip
   [128]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-4/igt@gem_pxp@reject-modify-context-protection-off-3.html

  * igt@gem_pxp@verify-pxp-execution-after-suspend-resume:
    - shard-dg2:          NOTRUN -> [SKIP][129] ([i915#4270]) +5 other tests skip
   [129]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-1/igt@gem_pxp@verify-pxp-execution-after-suspend-resume.html

  * igt@gem_render_copy@y-tiled-mc-ccs-to-vebox-y-tiled:
    - shard-mtlp:         NOTRUN -> [SKIP][130] ([i915#8428]) +1 other test skip
   [130]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-1/igt@gem_render_copy@y-tiled-mc-ccs-to-vebox-y-tiled.html

  * igt@gem_render_tiled_blits@basic:
    - shard-dg2:          NOTRUN -> [SKIP][131] ([i915#4079])
   [131]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-5/igt@gem_render_tiled_blits@basic.html

  * igt@gem_set_tiling_vs_gtt:
    - shard-dg1:          NOTRUN -> [SKIP][132] ([i915#4079])
   [132]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-18/igt@gem_set_tiling_vs_gtt.html

  * igt@gem_softpin@noreloc-s3:
    - shard-tglu:         [PASS][133] -> [ABORT][134] ([i915#8213])
   [133]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-tglu-5/igt@gem_softpin@noreloc-s3.html
   [134]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-9/igt@gem_softpin@noreloc-s3.html

  * igt@gem_tiled_partial_pwrite_pread@writes:
    - shard-rkl:          NOTRUN -> [SKIP][135] ([i915#3282]) +7 other tests skip
   [135]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-6/igt@gem_tiled_partial_pwrite_pread@writes.html

  * igt@gem_userptr_blits@access-control:
    - shard-mtlp:         NOTRUN -> [SKIP][136] ([i915#3297])
   [136]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-4/igt@gem_userptr_blits@access-control.html
    - shard-rkl:          NOTRUN -> [SKIP][137] ([i915#3297])
   [137]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-1/igt@gem_userptr_blits@access-control.html
    - shard-dg1:          NOTRUN -> [SKIP][138] ([i915#3297])
   [138]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-19/igt@gem_userptr_blits@access-control.html

  * igt@gem_userptr_blits@coherency-sync:
    - shard-tglu:         NOTRUN -> [SKIP][139] ([fdo#110542])
   [139]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-7/igt@gem_userptr_blits@coherency-sync.html

  * igt@gem_userptr_blits@create-destroy-unsync:
    - shard-dg2:          NOTRUN -> [SKIP][140] ([i915#3297]) +4 other tests skip
   [140]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-5/igt@gem_userptr_blits@create-destroy-unsync.html

  * igt@gem_userptr_blits@dmabuf-sync:
    - shard-tglu:         NOTRUN -> [SKIP][141] ([i915#3323])
   [141]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-7/igt@gem_userptr_blits@dmabuf-sync.html

  * igt@gem_userptr_blits@invalid-mmap-offset-unsync:
    - shard-tglu:         NOTRUN -> [SKIP][142] ([i915#3297]) +3 other tests skip
   [142]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-7/igt@gem_userptr_blits@invalid-mmap-offset-unsync.html

  * igt@gem_userptr_blits@map-fixed-invalidate-overlap:
    - shard-dg2:          NOTRUN -> [SKIP][143] ([i915#3297] / [i915#4880])
   [143]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-5/igt@gem_userptr_blits@map-fixed-invalidate-overlap.html

  * igt@gem_userptr_blits@sd-probe:
    - shard-dg2:          NOTRUN -> [SKIP][144] ([i915#3297] / [i915#4958])
   [144]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-10/igt@gem_userptr_blits@sd-probe.html

  * igt@gen7_exec_parse@basic-allowed:
    - shard-tglu:         NOTRUN -> [SKIP][145] ([fdo#109289]) +1 other test skip
   [145]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-7/igt@gen7_exec_parse@basic-allowed.html

  * igt@gen7_exec_parse@batch-without-end:
    - shard-rkl:          NOTRUN -> [SKIP][146] ([fdo#109289]) +3 other tests skip
   [146]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-6/igt@gen7_exec_parse@batch-without-end.html

  * igt@gen7_exec_parse@bitmasks:
    - shard-mtlp:         NOTRUN -> [SKIP][147] ([fdo#109289]) +1 other test skip
   [147]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-1/igt@gen7_exec_parse@bitmasks.html

  * igt@gen7_exec_parse@chained-batch:
    - shard-dg1:          NOTRUN -> [SKIP][148] ([fdo#109289])
   [148]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-18/igt@gen7_exec_parse@chained-batch.html

  * igt@gen9_exec_parse@batch-without-end:
    - shard-mtlp:         NOTRUN -> [SKIP][149] ([i915#2856]) +1 other test skip
   [149]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-4/igt@gen9_exec_parse@batch-without-end.html

  * igt@gen9_exec_parse@cmd-crossing-page:
    - shard-tglu:         NOTRUN -> [SKIP][150] ([i915#2527] / [i915#2856]) +3 other tests skip
   [150]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-7/igt@gen9_exec_parse@cmd-crossing-page.html

  * igt@gen9_exec_parse@shadow-peek:
    - shard-dg2:          NOTRUN -> [SKIP][151] ([i915#2856]) +2 other tests skip
   [151]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-2/igt@gen9_exec_parse@shadow-peek.html
    - shard-rkl:          NOTRUN -> [SKIP][152] ([i915#2527]) +2 other tests skip
   [152]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-6/igt@gen9_exec_parse@shadow-peek.html
    - shard-dg1:          NOTRUN -> [SKIP][153] ([i915#2527]) +1 other test skip
   [153]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-17/igt@gen9_exec_parse@shadow-peek.html

  * igt@i915_module_load@load:
    - shard-snb:          NOTRUN -> [SKIP][154] ([fdo#109271] / [i915#6227])
   [154]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-snb1/igt@i915_module_load@load.html
    - shard-dg1:          NOTRUN -> [SKIP][155] ([i915#6227])
   [155]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-19/igt@i915_module_load@load.html
    - shard-tglu:         NOTRUN -> [SKIP][156] ([i915#6227])
   [156]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-5/igt@i915_module_load@load.html
    - shard-mtlp:         NOTRUN -> [SKIP][157] ([i915#6227])
   [157]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-4/igt@i915_module_load@load.html
    - shard-dg2:          NOTRUN -> [SKIP][158] ([i915#6227])
   [158]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-10/igt@i915_module_load@load.html
    - shard-rkl:          NOTRUN -> [SKIP][159] ([i915#6227])
   [159]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-1/igt@i915_module_load@load.html

  * igt@i915_module_load@reload:
    - shard-snb:          [PASS][160] -> [INCOMPLETE][161] ([i915#9849])
   [160]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-snb7/igt@i915_module_load@reload.html
   [161]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-snb5/igt@i915_module_load@reload.html

  * igt@i915_module_load@reload-with-fault-injection:
    - shard-snb:          [PASS][162] -> [INCOMPLETE][163] ([i915#10137] / [i915#9200] / [i915#9849])
   [162]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-snb7/igt@i915_module_load@reload-with-fault-injection.html
   [163]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-snb5/igt@i915_module_load@reload-with-fault-injection.html
    - shard-tglu:         [PASS][164] -> [INCOMPLETE][165] ([i915#10137] / [i915#9200])
   [164]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-tglu-6/igt@i915_module_load@reload-with-fault-injection.html
   [165]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-9/igt@i915_module_load@reload-with-fault-injection.html
    - shard-mtlp:         [PASS][166] -> [ABORT][167] ([i915#10131] / [i915#9820])
   [166]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-mtlp-4/igt@i915_module_load@reload-with-fault-injection.html
   [167]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-2/igt@i915_module_load@reload-with-fault-injection.html

  * igt@i915_module_load@resize-bar:
    - shard-rkl:          NOTRUN -> [SKIP][168] ([i915#6412])
   [168]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-6/igt@i915_module_load@resize-bar.html
    - shard-dg1:          NOTRUN -> [SKIP][169] ([i915#7178])
   [169]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-17/igt@i915_module_load@resize-bar.html
    - shard-tglu:         NOTRUN -> [SKIP][170] ([i915#6412])
   [170]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-3/igt@i915_module_load@resize-bar.html

  * igt@i915_pm_rps@min-max-config-idle:
    - shard-dg2:          NOTRUN -> [SKIP][171] ([i915#6621]) +2 other tests skip
   [171]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-7/igt@i915_pm_rps@min-max-config-idle.html

  * igt@i915_pm_rps@thresholds-idle@gt0:
    - shard-dg2:          NOTRUN -> [SKIP][172] ([i915#8925]) +1 other test skip
   [172]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-1/igt@i915_pm_rps@thresholds-idle@gt0.html
    - shard-dg1:          NOTRUN -> [SKIP][173] ([i915#8925])
   [173]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-18/igt@i915_pm_rps@thresholds-idle@gt0.html

  * igt@i915_pm_sseu@full-enable:
    - shard-tglu:         NOTRUN -> [SKIP][174] ([i915#4387])
   [174]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-7/igt@i915_pm_sseu@full-enable.html

  * igt@i915_query@query-topology-coherent-slice-mask:
    - shard-dg2:          NOTRUN -> [SKIP][175] ([i915#6188])
   [175]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-5/igt@i915_query@query-topology-coherent-slice-mask.html

  * igt@i915_query@query-topology-known-pci-ids:
    - shard-dg2:          NOTRUN -> [SKIP][176] ([fdo#109303])
   [176]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-1/igt@i915_query@query-topology-known-pci-ids.html
    - shard-rkl:          NOTRUN -> [SKIP][177] ([fdo#109303])
   [177]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-5/igt@i915_query@query-topology-known-pci-ids.html

  * igt@i915_query@query-topology-unsupported:
    - shard-rkl:          NOTRUN -> [SKIP][178] ([fdo#109302])
   [178]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-6/igt@i915_query@query-topology-unsupported.html
    - shard-dg1:          NOTRUN -> [SKIP][179] ([fdo#109302])
   [179]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-17/igt@i915_query@query-topology-unsupported.html
    - shard-tglu:         NOTRUN -> [SKIP][180] ([fdo#109302])
   [180]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-3/igt@i915_query@query-topology-unsupported.html
    - shard-dg2:          NOTRUN -> [SKIP][181] ([fdo#109302])
   [181]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-2/igt@i915_query@query-topology-unsupported.html

  * igt@kms_addfb_basic@addfb25-x-tiled-mismatch-legacy:
    - shard-mtlp:         NOTRUN -> [SKIP][182] ([i915#4212]) +2 other tests skip
   [182]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-4/igt@kms_addfb_basic@addfb25-x-tiled-mismatch-legacy.html

  * igt@kms_addfb_basic@framebuffer-vs-set-tiling:
    - shard-dg2:          NOTRUN -> [SKIP][183] ([i915#4212]) +3 other tests skip
   [183]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-10/igt@kms_addfb_basic@framebuffer-vs-set-tiling.html
    - shard-dg1:          NOTRUN -> [SKIP][184] ([i915#4212]) +1 other test skip
   [184]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-19/igt@kms_addfb_basic@framebuffer-vs-set-tiling.html

  * igt@kms_async_flips@async-flip-with-page-flip-events@pipe-b-hdmi-a-1-y-rc-ccs:
    - shard-tglu:         NOTRUN -> [SKIP][185] ([i915#8709]) +7 other tests skip
   [185]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-7/igt@kms_async_flips@async-flip-with-page-flip-events@pipe-b-hdmi-a-1-y-rc-ccs.html

  * igt@kms_async_flips@async-flip-with-page-flip-events@pipe-b-hdmi-a-4-y-rc-ccs:
    - shard-dg1:          NOTRUN -> [SKIP][186] ([i915#8709]) +7 other tests skip
   [186]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-16/igt@kms_async_flips@async-flip-with-page-flip-events@pipe-b-hdmi-a-4-y-rc-ccs.html

  * igt@kms_async_flips@async-flip-with-page-flip-events@pipe-d-hdmi-a-3-4-mc-ccs:
    - shard-dg2:          NOTRUN -> [SKIP][187] ([i915#8709]) +11 other tests skip
   [187]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-5/igt@kms_async_flips@async-flip-with-page-flip-events@pipe-d-hdmi-a-3-4-mc-ccs.html

  * igt@kms_async_flips@invalid-async-flip:
    - shard-mtlp:         NOTRUN -> [SKIP][188] ([i915#6228])
   [188]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-1/igt@kms_async_flips@invalid-async-flip.html

  * igt@kms_big_fb@4-tiled-8bpp-rotate-180:
    - shard-dg1:          NOTRUN -> [SKIP][189] ([i915#4538] / [i915#5286]) +1 other test skip
   [189]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-18/igt@kms_big_fb@4-tiled-8bpp-rotate-180.html

  * igt@kms_big_fb@4-tiled-8bpp-rotate-270:
    - shard-mtlp:         NOTRUN -> [SKIP][190] ([fdo#111614]) +2 other tests skip
   [190]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-1/igt@kms_big_fb@4-tiled-8bpp-rotate-270.html

  * igt@kms_big_fb@4-tiled-addfb-size-offset-overflow:
    - shard-tglu:         NOTRUN -> [SKIP][191] ([i915#5286])
   [191]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-3/igt@kms_big_fb@4-tiled-addfb-size-offset-overflow.html
    - shard-dg1:          NOTRUN -> [SKIP][192] ([i915#5286])
   [192]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-17/igt@kms_big_fb@4-tiled-addfb-size-offset-overflow.html

  * igt@kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-0-hflip:
    - shard-rkl:          NOTRUN -> [SKIP][193] ([i915#5286]) +6 other tests skip
   [193]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-2/igt@kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-0-hflip.html

  * igt@kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-180-hflip-async-flip:
    - shard-tglu:         NOTRUN -> [SKIP][194] ([fdo#111615] / [i915#5286]) +3 other tests skip
   [194]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-7/igt@kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-180-hflip-async-flip.html

  * igt@kms_big_fb@linear-8bpp-rotate-270:
    - shard-rkl:          NOTRUN -> [SKIP][195] ([fdo#111614] / [i915#3638]) +3 other tests skip
   [195]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-6/igt@kms_big_fb@linear-8bpp-rotate-270.html

  * igt@kms_big_fb@x-tiled-32bpp-rotate-90:
    - shard-tglu:         NOTRUN -> [SKIP][196] ([fdo#111614]) +3 other tests skip
   [196]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-5/igt@kms_big_fb@x-tiled-32bpp-rotate-90.html

  * igt@kms_big_fb@x-tiled-64bpp-rotate-270:
    - shard-dg2:          NOTRUN -> [SKIP][197] ([fdo#111614]) +5 other tests skip
   [197]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-10/igt@kms_big_fb@x-tiled-64bpp-rotate-270.html

  * igt@kms_big_fb@y-tiled-64bpp-rotate-0:
    - shard-dg2:          NOTRUN -> [SKIP][198] ([i915#5190]) +28 other tests skip
   [198]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-1/igt@kms_big_fb@y-tiled-64bpp-rotate-0.html

  * igt@kms_big_fb@y-tiled-64bpp-rotate-90:
    - shard-dg1:          NOTRUN -> [SKIP][199] ([i915#3638]) +4 other tests skip
   [199]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-17/igt@kms_big_fb@y-tiled-64bpp-rotate-90.html

  * igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-180-hflip-async-flip:
    - shard-tglu:         [PASS][200] -> [FAIL][201] ([i915#3743]) +1 other test fail
   [200]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-tglu-7/igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-180-hflip-async-flip.html
   [201]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-2/igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-180-hflip-async-flip.html

  * igt@kms_big_fb@yf-tiled-16bpp-rotate-0:
    - shard-tglu:         NOTRUN -> [SKIP][202] ([fdo#111615]) +1 other test skip
   [202]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-3/igt@kms_big_fb@yf-tiled-16bpp-rotate-0.html

  * igt@kms_big_fb@yf-tiled-8bpp-rotate-90:
    - shard-dg2:          NOTRUN -> [SKIP][203] ([i915#4538] / [i915#5190]) +8 other tests skip
   [203]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-5/igt@kms_big_fb@yf-tiled-8bpp-rotate-90.html

  * igt@kms_big_fb@yf-tiled-addfb-size-overflow:
    - shard-rkl:          NOTRUN -> [SKIP][204] ([fdo#111615])
   [204]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-5/igt@kms_big_fb@yf-tiled-addfb-size-overflow.html

  * igt@kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-180:
    - shard-rkl:          NOTRUN -> [SKIP][205] ([fdo#110723]) +2 other tests skip
   [205]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-2/igt@kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-180.html

  * igt@kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-180-async-flip:
    - shard-mtlp:         NOTRUN -> [SKIP][206] ([fdo#111615]) +5 other tests skip
   [206]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-1/igt@kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-180-async-flip.html

  * igt@kms_big_fb@yf-tiled-max-hw-stride-64bpp-rotate-180:
    - shard-dg1:          NOTRUN -> [SKIP][207] ([i915#4538]) +3 other tests skip
   [207]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-13/igt@kms_big_fb@yf-tiled-max-hw-stride-64bpp-rotate-180.html

  * igt@kms_big_joiner@invalid-modeset:
    - shard-dg2:          NOTRUN -> [SKIP][208] ([i915#2705])
   [208]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-1/igt@kms_big_joiner@invalid-modeset.html

  * igt@kms_ccs@pipe-b-ccs-on-another-bo-y-tiled-gen12-mc-ccs:
    - shard-dg2:          NOTRUN -> [SKIP][209] ([i915#5354]) +153 other tests skip
   [209]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-1/igt@kms_ccs@pipe-b-ccs-on-another-bo-y-tiled-gen12-mc-ccs.html

  * igt@kms_ccs@pipe-b-crc-primary-basic-yf-tiled-ccs:
    - shard-rkl:          NOTRUN -> [SKIP][210] ([i915#5354] / [i915#6095]) +24 other tests skip
   [210]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-6/igt@kms_ccs@pipe-b-crc-primary-basic-yf-tiled-ccs.html

  * igt@kms_ccs@pipe-b-random-ccs-data-y-tiled-gen12-mc-ccs:
    - shard-dg1:          NOTRUN -> [SKIP][211] ([i915#5354] / [i915#6095]) +40 other tests skip
   [211]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-19/igt@kms_ccs@pipe-b-random-ccs-data-y-tiled-gen12-mc-ccs.html

  * igt@kms_ccs@pipe-c-bad-rotation-90-4-tiled-mtl-rc-ccs-cc:
    - shard-tglu:         NOTRUN -> [SKIP][212] ([i915#5354] / [i915#6095]) +39 other tests skip
   [212]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-7/igt@kms_ccs@pipe-c-bad-rotation-90-4-tiled-mtl-rc-ccs-cc.html

  * igt@kms_ccs@pipe-c-crc-primary-basic-y-tiled-ccs:
    - shard-mtlp:         NOTRUN -> [SKIP][213] ([i915#5354] / [i915#6095]) +24 other tests skip
   [213]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-4/igt@kms_ccs@pipe-c-crc-primary-basic-y-tiled-ccs.html

  * igt@kms_ccs@pipe-d-crc-sprite-planes-basic-4-tiled-mtl-mc-ccs:
    - shard-rkl:          NOTRUN -> [SKIP][214] ([i915#5354]) +34 other tests skip
   [214]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-6/igt@kms_ccs@pipe-d-crc-sprite-planes-basic-4-tiled-mtl-mc-ccs.html

  * igt@kms_cdclk@mode-transition:
    - shard-tglu:         NOTRUN -> [SKIP][215] ([i915#3742])
   [215]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-7/igt@kms_cdclk@mode-transition.html

  * igt@kms_cdclk@mode-transition-all-outputs:
    - shard-dg2:          NOTRUN -> [SKIP][216] ([i915#4087] / [i915#7213])
   [216]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-5/igt@kms_cdclk@mode-transition-all-outputs.html

  * igt@kms_cdclk@mode-transition@pipe-b-edp-1:
    - shard-mtlp:         NOTRUN -> [SKIP][217] ([i915#7213] / [i915#9010]) +3 other tests skip
   [217]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-7/igt@kms_cdclk@mode-transition@pipe-b-edp-1.html

  * igt@kms_cdclk@plane-scaling@pipe-b-hdmi-a-3:
    - shard-dg2:          NOTRUN -> [SKIP][218] ([i915#4087]) +3 other tests skip
   [218]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-7/igt@kms_cdclk@plane-scaling@pipe-b-hdmi-a-3.html

  * igt@kms_chamelium_color@ctm-green-to-red:
    - shard-dg2:          NOTRUN -> [SKIP][219] ([fdo#111827]) +4 other tests skip
   [219]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-5/igt@kms_chamelium_color@ctm-green-to-red.html
    - shard-tglu:         NOTRUN -> [SKIP][220] ([fdo#111827]) +2 other tests skip
   [220]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-7/igt@kms_chamelium_color@ctm-green-to-red.html

  * igt@kms_chamelium_color@ctm-max:
    - shard-mtlp:         NOTRUN -> [SKIP][221] ([fdo#111827])
   [221]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-4/igt@kms_chamelium_color@ctm-max.html
    - shard-rkl:          NOTRUN -> [SKIP][222] ([fdo#111827]) +1 other test skip
   [222]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-1/igt@kms_chamelium_color@ctm-max.html
    - shard-dg1:          NOTRUN -> [SKIP][223] ([fdo#111827])
   [223]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-19/igt@kms_chamelium_color@ctm-max.html

  * igt@kms_chamelium_edid@hdmi-edid-change-during-suspend:
    - shard-rkl:          NOTRUN -> [SKIP][224] ([i915#7828]) +9 other tests skip
   [224]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-6/igt@kms_chamelium_edid@hdmi-edid-change-during-suspend.html

  * igt@kms_chamelium_edid@hdmi-mode-timings:
    - shard-tglu:         NOTRUN -> [SKIP][225] ([i915#7828]) +3 other tests skip
   [225]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-3/igt@kms_chamelium_edid@hdmi-mode-timings.html

  * igt@kms_chamelium_frames@dp-crc-fast:
    - shard-dg2:          NOTRUN -> [SKIP][226] ([i915#7828]) +18 other tests skip
   [226]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-10/igt@kms_chamelium_frames@dp-crc-fast.html

  * igt@kms_chamelium_hpd@dp-hpd-storm-disable:
    - shard-dg1:          NOTRUN -> [SKIP][227] ([i915#7828]) +5 other tests skip
   [227]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-16/igt@kms_chamelium_hpd@dp-hpd-storm-disable.html

  * igt@kms_chamelium_hpd@vga-hpd-enable-disable-mode:
    - shard-mtlp:         NOTRUN -> [SKIP][228] ([i915#7828]) +3 other tests skip
   [228]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-1/igt@kms_chamelium_hpd@vga-hpd-enable-disable-mode.html

  * igt@kms_content_protection@content-type-change:
    - shard-dg2:          NOTRUN -> [SKIP][229] ([i915#9424])
   [229]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-7/igt@kms_content_protection@content-type-change.html

  * igt@kms_content_protection@dp-mst-lic-type-0:
    - shard-dg2:          NOTRUN -> [SKIP][230] ([i915#3299]) +1 other test skip
   [230]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-1/igt@kms_content_protection@dp-mst-lic-type-0.html

  * igt@kms_content_protection@dp-mst-type-0:
    - shard-rkl:          NOTRUN -> [SKIP][231] ([i915#3116])
   [231]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-1/igt@kms_content_protection@dp-mst-type-0.html
    - shard-dg1:          NOTRUN -> [SKIP][232] ([i915#3299])
   [232]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-19/igt@kms_content_protection@dp-mst-type-0.html
    - shard-tglu:         NOTRUN -> [SKIP][233] ([i915#3116] / [i915#3299])
   [233]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-5/igt@kms_content_protection@dp-mst-type-0.html
    - shard-mtlp:         NOTRUN -> [SKIP][234] ([i915#3299])
   [234]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-4/igt@kms_content_protection@dp-mst-type-0.html

  * igt@kms_content_protection@legacy:
    - shard-dg1:          NOTRUN -> [SKIP][235] ([i915#7116])
   [235]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-18/igt@kms_content_protection@legacy.html

  * igt@kms_content_protection@type1:
    - shard-dg2:          NOTRUN -> [SKIP][236] ([i915#7118]) +1 other test skip
   [236]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-10/igt@kms_content_protection@type1.html

  * igt@kms_content_protection@uevent:
    - shard-rkl:          NOTRUN -> [SKIP][237] ([i915#7118])
   [237]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-5/igt@kms_content_protection@uevent.html

  * igt@kms_cursor_crc@cursor-offscreen-32x32:
    - shard-dg1:          NOTRUN -> [SKIP][238] ([i915#3555]) +3 other tests skip
   [238]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-17/igt@kms_cursor_crc@cursor-offscreen-32x32.html
    - shard-tglu:         NOTRUN -> [SKIP][239] ([i915#3555]) +4 other tests skip
   [239]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-3/igt@kms_cursor_crc@cursor-offscreen-32x32.html

  * igt@kms_cursor_crc@cursor-offscreen-512x170:
    - shard-tglu:         NOTRUN -> [SKIP][240] ([fdo#109279] / [i915#3359])
   [240]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-7/igt@kms_cursor_crc@cursor-offscreen-512x170.html

  * igt@kms_cursor_crc@cursor-random-256x85:
    - shard-mtlp:         NOTRUN -> [SKIP][241] ([i915#8814])
   [241]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-4/igt@kms_cursor_crc@cursor-random-256x85.html

  * igt@kms_cursor_crc@cursor-random-512x512:
    - shard-dg2:          NOTRUN -> [SKIP][242] ([i915#3359]) +2 other tests skip
   [242]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-10/igt@kms_cursor_crc@cursor-random-512x512.html
    - shard-rkl:          NOTRUN -> [SKIP][243] ([i915#3359])
   [243]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-1/igt@kms_cursor_crc@cursor-random-512x512.html
    - shard-dg1:          NOTRUN -> [SKIP][244] ([i915#3359]) +1 other test skip
   [244]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-19/igt@kms_cursor_crc@cursor-random-512x512.html
    - shard-tglu:         NOTRUN -> [SKIP][245] ([i915#3359])
   [245]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-5/igt@kms_cursor_crc@cursor-random-512x512.html
    - shard-mtlp:         NOTRUN -> [SKIP][246] ([i915#3359])
   [246]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-4/igt@kms_cursor_crc@cursor-random-512x512.html

  * igt@kms_cursor_crc@cursor-rapid-movement-32x32:
    - shard-dg2:          NOTRUN -> [SKIP][247] ([i915#3555]) +9 other tests skip
   [247]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-5/igt@kms_cursor_crc@cursor-rapid-movement-32x32.html

  * igt@kms_cursor_crc@cursor-sliding-32x10:
    - shard-rkl:          NOTRUN -> [SKIP][248] ([i915#3555]) +5 other tests skip
   [248]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-6/igt@kms_cursor_crc@cursor-sliding-32x10.html

  * igt@kms_cursor_legacy@basic-busy-flip-before-cursor-atomic:
    - shard-dg2:          NOTRUN -> [SKIP][249] ([i915#4103] / [i915#4213])
   [249]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-7/igt@kms_cursor_legacy@basic-busy-flip-before-cursor-atomic.html

  * igt@kms_cursor_legacy@basic-busy-flip-before-cursor-legacy:
    - shard-mtlp:         NOTRUN -> [SKIP][250] ([i915#4213])
   [250]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-1/igt@kms_cursor_legacy@basic-busy-flip-before-cursor-legacy.html

  * igt@kms_cursor_legacy@cursora-vs-flipb-atomic-transitions:
    - shard-tglu:         NOTRUN -> [SKIP][251] ([fdo#109274])
   [251]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-7/igt@kms_cursor_legacy@cursora-vs-flipb-atomic-transitions.html

  * igt@kms_cursor_legacy@cursorb-vs-flipb-varying-size:
    - shard-dg2:          NOTRUN -> [SKIP][252] ([fdo#109274] / [i915#5354]) +7 other tests skip
   [252]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-1/igt@kms_cursor_legacy@cursorb-vs-flipb-varying-size.html

  * igt@kms_cursor_legacy@modeset-atomic-cursor-hotspot:
    - shard-dg1:          NOTRUN -> [SKIP][253] ([i915#9067])
   [253]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-18/igt@kms_cursor_legacy@modeset-atomic-cursor-hotspot.html

  * igt@kms_dirtyfb@fbc-dirtyfb-ioctl@a-hdmi-a-3:
    - shard-dg2:          NOTRUN -> [SKIP][254] ([i915#9227])
   [254]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-6/igt@kms_dirtyfb@fbc-dirtyfb-ioctl@a-hdmi-a-3.html

  * igt@kms_display_modes@mst-extended-mode-negative:
    - shard-dg2:          NOTRUN -> [SKIP][255] ([i915#8588])
   [255]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-1/igt@kms_display_modes@mst-extended-mode-negative.html
    - shard-rkl:          NOTRUN -> [SKIP][256] ([i915#8588])
   [256]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-5/igt@kms_display_modes@mst-extended-mode-negative.html

  * igt@kms_dither@fb-8bpc-vs-panel-6bpc@pipe-a-hdmi-a-2:
    - shard-rkl:          NOTRUN -> [SKIP][257] ([i915#3804])
   [257]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-1/igt@kms_dither@fb-8bpc-vs-panel-6bpc@pipe-a-hdmi-a-2.html

  * igt@kms_dsc@dsc-basic:
    - shard-dg2:          NOTRUN -> [SKIP][258] ([i915#3555] / [i915#3840]) +2 other tests skip
   [258]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-10/igt@kms_dsc@dsc-basic.html
    - shard-rkl:          NOTRUN -> [SKIP][259] ([i915#3555] / [i915#3840]) +1 other test skip
   [259]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-1/igt@kms_dsc@dsc-basic.html
    - shard-dg1:          NOTRUN -> [SKIP][260] ([i915#3555] / [i915#3840])
   [260]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-19/igt@kms_dsc@dsc-basic.html
    - shard-tglu:         NOTRUN -> [SKIP][261] ([i915#3555] / [i915#3840])
   [261]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-5/igt@kms_dsc@dsc-basic.html
    - shard-mtlp:         NOTRUN -> [SKIP][262] ([i915#3555] / [i915#3840] / [i915#9159])
   [262]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-4/igt@kms_dsc@dsc-basic.html

  * igt@kms_dsc@dsc-with-output-formats-with-bpc:
    - shard-dg2:          NOTRUN -> [SKIP][263] ([i915#3840] / [i915#9053])
   [263]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-1/igt@kms_dsc@dsc-with-output-formats-with-bpc.html

  * igt@kms_fbcon_fbt@psr:
    - shard-rkl:          NOTRUN -> [SKIP][264] ([i915#3955])
   [264]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-6/igt@kms_fbcon_fbt@psr.html

  * igt@kms_fbcon_fbt@psr-suspend:
    - shard-rkl:          NOTRUN -> [SKIP][265] ([fdo#110189] / [i915#3955])
   [265]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-2/igt@kms_fbcon_fbt@psr-suspend.html

  * igt@kms_fence_pin_leak:
    - shard-mtlp:         NOTRUN -> [SKIP][266] ([i915#4881])
   [266]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-1/igt@kms_fence_pin_leak.html

  * igt@kms_flip@2x-blocking-absolute-wf_vblank:
    - shard-tglu:         NOTRUN -> [SKIP][267] ([fdo#109274] / [i915#3637]) +5 other tests skip
   [267]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-7/igt@kms_flip@2x-blocking-absolute-wf_vblank.html
    - shard-mtlp:         NOTRUN -> [SKIP][268] ([i915#3637]) +3 other tests skip
   [268]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-7/igt@kms_flip@2x-blocking-absolute-wf_vblank.html

  * igt@kms_flip@2x-flip-vs-expired-vblank-interruptible:
    - shard-dg2:          NOTRUN -> [SKIP][269] ([fdo#109274] / [fdo#111767])
   [269]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-5/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible.html

  * igt@kms_flip@2x-flip-vs-fences-interruptible:
    - shard-dg1:          NOTRUN -> [SKIP][270] ([i915#8381]) +1 other test skip
   [270]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-17/igt@kms_flip@2x-flip-vs-fences-interruptible.html

  * igt@kms_flip@2x-modeset-vs-vblank-race:
    - shard-dg2:          NOTRUN -> [SKIP][271] ([fdo#109274]) +11 other tests skip
   [271]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-10/igt@kms_flip@2x-modeset-vs-vblank-race.html

  * igt@kms_flip@2x-plain-flip:
    - shard-rkl:          NOTRUN -> [SKIP][272] ([fdo#111825]) +11 other tests skip
   [272]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-2/igt@kms_flip@2x-plain-flip.html

  * igt@kms_flip@2x-plain-flip-ts-check-interruptible:
    - shard-dg1:          NOTRUN -> [SKIP][273] ([fdo#111825] / [i915#9934]) +3 other tests skip
   [273]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-19/igt@kms_flip@2x-plain-flip-ts-check-interruptible.html

  * igt@kms_flip@flip-vs-fences-interruptible:
    - shard-dg2:          NOTRUN -> [SKIP][274] ([i915#8381]) +1 other test skip
   [274]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-1/igt@kms_flip@flip-vs-fences-interruptible.html

  * igt@kms_flip_scaled_crc@flip-32bpp-xtile-to-64bpp-xtile-downscaling@pipe-a-default-mode:
    - shard-mtlp:         NOTRUN -> [SKIP][275] ([i915#3555] / [i915#8810])
   [275]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-1/igt@kms_flip_scaled_crc@flip-32bpp-xtile-to-64bpp-xtile-downscaling@pipe-a-default-mode.html

  * igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-64bpp-yftile-upscaling@pipe-a-default-mode:
    - shard-mtlp:         NOTRUN -> [SKIP][276] ([i915#2672])
   [276]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-1/igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-64bpp-yftile-upscaling@pipe-a-default-mode.html

  * igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-16bpp-4tile-upscaling@pipe-a-valid-mode:
    - shard-dg1:          NOTRUN -> [SKIP][277] ([i915#2587] / [i915#2672]) +3 other tests skip
   [277]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-19/igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-16bpp-4tile-upscaling@pipe-a-valid-mode.html
    - shard-tglu:         NOTRUN -> [SKIP][278] ([i915#2587] / [i915#2672]) +1 other test skip
   [278]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-5/igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-16bpp-4tile-upscaling@pipe-a-valid-mode.html

  * igt@kms_flip_scaled_crc@flip-64bpp-yftile-to-16bpp-yftile-downscaling@pipe-a-valid-mode:
    - shard-rkl:          NOTRUN -> [SKIP][279] ([i915#2672]) +3 other tests skip
   [279]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-6/igt@kms_flip_scaled_crc@flip-64bpp-yftile-to-16bpp-yftile-downscaling@pipe-a-valid-mode.html

  * igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytile-upscaling@pipe-a-valid-mode:
    - shard-dg2:          NOTRUN -> [SKIP][280] ([i915#2672]) +2 other tests skip
   [280]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-5/igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytile-upscaling@pipe-a-valid-mode.html

  * igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling@pipe-a-valid-mode:
    - shard-dg2:          NOTRUN -> [SKIP][281] ([i915#2672] / [i915#3555])
   [281]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-10/igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling@pipe-a-valid-mode.html

  * igt@kms_force_connector_basic@force-load-detect:
    - shard-dg1:          NOTRUN -> [SKIP][282] ([fdo#109285])
   [282]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-18/igt@kms_force_connector_basic@force-load-detect.html

  * igt@kms_force_connector_basic@prune-stale-modes:
    - shard-mtlp:         NOTRUN -> [SKIP][283] ([i915#5274])
   [283]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-1/igt@kms_force_connector_basic@prune-stale-modes.html

  * igt@kms_frontbuffer_tracking@fbc-1p-offscren-pri-shrfb-draw-mmap-gtt:
    - shard-mtlp:         NOTRUN -> [SKIP][284] ([i915#8708]) +3 other tests skip
   [284]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-4/igt@kms_frontbuffer_tracking@fbc-1p-offscren-pri-shrfb-draw-mmap-gtt.html

  * igt@kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-draw-render:
    - shard-snb:          [PASS][285] -> [SKIP][286] ([fdo#109271]) +8 other tests skip
   [285]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-snb7/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-draw-render.html
   [286]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-snb5/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-draw-render:
    - shard-tglu:         NOTRUN -> [SKIP][287] ([fdo#109280]) +30 other tests skip
   [287]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-5/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@fbcpsr-1p-offscren-pri-indfb-draw-pwrite:
    - shard-dg2:          NOTRUN -> [SKIP][288] ([i915#3458]) +32 other tests skip
   [288]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-1/igt@kms_frontbuffer_tracking@fbcpsr-1p-offscren-pri-indfb-draw-pwrite.html

  * igt@kms_frontbuffer_tracking@fbcpsr-1p-offscren-pri-shrfb-draw-mmap-wc:
    - shard-dg1:          NOTRUN -> [SKIP][289] ([i915#8708]) +14 other tests skip
   [289]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-19/igt@kms_frontbuffer_tracking@fbcpsr-1p-offscren-pri-shrfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-pri-indfb-draw-render:
    - shard-dg1:          NOTRUN -> [SKIP][290] ([fdo#111825]) +24 other tests skip
   [290]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-19/igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-pri-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-pri-shrfb-draw-mmap-wc:
    - shard-dg2:          NOTRUN -> [SKIP][291] ([i915#8708]) +36 other tests skip
   [291]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-5/igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-pri-shrfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-pri-shrfb-draw-blt:
    - shard-mtlp:         NOTRUN -> [SKIP][292] ([i915#1825]) +15 other tests skip
   [292]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-4/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-pri-shrfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@fbcpsr-tiling-4:
    - shard-rkl:          NOTRUN -> [SKIP][293] ([i915#5439])
   [293]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-1/igt@kms_frontbuffer_tracking@fbcpsr-tiling-4.html
    - shard-dg1:          NOTRUN -> [SKIP][294] ([i915#5439])
   [294]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-19/igt@kms_frontbuffer_tracking@fbcpsr-tiling-4.html
    - shard-tglu:         NOTRUN -> [SKIP][295] ([i915#5439])
   [295]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-5/igt@kms_frontbuffer_tracking@fbcpsr-tiling-4.html

  * igt@kms_frontbuffer_tracking@pipe-fbc-rte:
    - shard-dg2:          NOTRUN -> [SKIP][296] ([i915#9766])
   [296]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-10/igt@kms_frontbuffer_tracking@pipe-fbc-rte.html

  * igt@kms_frontbuffer_tracking@psr-1p-offscren-pri-indfb-draw-mmap-cpu:
    - shard-tglu:         NOTRUN -> [SKIP][297] ([fdo#110189]) +17 other tests skip
   [297]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-5/igt@kms_frontbuffer_tracking@psr-1p-offscren-pri-indfb-draw-mmap-cpu.html

  * igt@kms_frontbuffer_tracking@psr-1p-pri-indfb-multidraw:
    - shard-glk:          NOTRUN -> [SKIP][298] ([fdo#109271]) +151 other tests skip
   [298]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-glk9/igt@kms_frontbuffer_tracking@psr-1p-pri-indfb-multidraw.html

  * igt@kms_frontbuffer_tracking@psr-1p-primscrn-spr-indfb-draw-pwrite:
    - shard-rkl:          NOTRUN -> [SKIP][299] ([i915#3023]) +27 other tests skip
   [299]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-6/igt@kms_frontbuffer_tracking@psr-1p-primscrn-spr-indfb-draw-pwrite.html

  * igt@kms_frontbuffer_tracking@psr-2p-scndscrn-indfb-msflip-blt:
    - shard-rkl:          NOTRUN -> [SKIP][300] ([fdo#111825] / [i915#1825]) +36 other tests skip
   [300]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-1/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-indfb-msflip-blt.html

  * igt@kms_frontbuffer_tracking@psr-rgb101010-draw-pwrite:
    - shard-dg1:          NOTRUN -> [SKIP][301] ([i915#3458]) +11 other tests skip
   [301]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-19/igt@kms_frontbuffer_tracking@psr-rgb101010-draw-pwrite.html

  * igt@kms_hdr@bpc-switch-suspend:
    - shard-rkl:          NOTRUN -> [SKIP][302] ([i915#3555] / [i915#8228])
   [302]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-2/igt@kms_hdr@bpc-switch-suspend.html

  * igt@kms_hdr@invalid-metadata-sizes:
    - shard-dg2:          NOTRUN -> [SKIP][303] ([i915#3555] / [i915#8228]) +2 other tests skip
   [303]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-5/igt@kms_hdr@invalid-metadata-sizes.html

  * igt@kms_panel_fitting@atomic-fastset:
    - shard-dg2:          NOTRUN -> [SKIP][304] ([i915#6301])
   [304]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-1/igt@kms_panel_fitting@atomic-fastset.html

  * igt@kms_pipe_b_c_ivb@from-pipe-c-to-b-with-3-lanes:
    - shard-dg2:          NOTRUN -> [SKIP][305] ([fdo#109289]) +7 other tests skip
   [305]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-7/igt@kms_pipe_b_c_ivb@from-pipe-c-to-b-with-3-lanes.html

  * igt@kms_plane_lowres@tiling-y:
    - shard-dg2:          NOTRUN -> [SKIP][306] ([i915#8821])
   [306]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-5/igt@kms_plane_lowres@tiling-y.html

  * igt@kms_plane_multiple@tiling-y:
    - shard-dg2:          NOTRUN -> [SKIP][307] ([i915#8806])
   [307]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-5/igt@kms_plane_multiple@tiling-y.html

  * igt@kms_plane_scaling@2x-scaler-multi-pipe:
    - shard-mtlp:         NOTRUN -> [SKIP][308] ([i915#9809])
   [308]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-1/igt@kms_plane_scaling@2x-scaler-multi-pipe.html

  * igt@kms_plane_scaling@plane-downscale-factor-0-25-with-rotation@pipe-b-hdmi-a-3:
    - shard-dg2:          NOTRUN -> [SKIP][309] ([i915#9423]) +3 other tests skip
   [309]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-7/igt@kms_plane_scaling@plane-downscale-factor-0-25-with-rotation@pipe-b-hdmi-a-3.html

  * igt@kms_plane_scaling@plane-downscale-factor-0-25-with-rotation@pipe-c-hdmi-a-3:
    - shard-dg1:          NOTRUN -> [SKIP][310] ([i915#9423]) +19 other tests skip
   [310]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-12/igt@kms_plane_scaling@plane-downscale-factor-0-25-with-rotation@pipe-c-hdmi-a-3.html

  * igt@kms_plane_scaling@plane-downscale-factor-0-75-with-rotation@pipe-a-hdmi-a-2:
    - shard-rkl:          NOTRUN -> [SKIP][311] ([i915#9423]) +11 other tests skip
   [311]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-6/igt@kms_plane_scaling@plane-downscale-factor-0-75-with-rotation@pipe-a-hdmi-a-2.html

  * igt@kms_plane_scaling@plane-downscale-factor-0-75-with-rotation@pipe-d-hdmi-a-1:
    - shard-tglu:         NOTRUN -> [SKIP][312] ([i915#9423]) +3 other tests skip
   [312]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-3/igt@kms_plane_scaling@plane-downscale-factor-0-75-with-rotation@pipe-d-hdmi-a-1.html

  * igt@kms_plane_scaling@plane-scaler-with-clipping-clamping-pixel-formats@pipe-b-edp-1:
    - shard-mtlp:         NOTRUN -> [SKIP][313] ([i915#5176]) +5 other tests skip
   [313]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-4/igt@kms_plane_scaling@plane-scaler-with-clipping-clamping-pixel-formats@pipe-b-edp-1.html

  * igt@kms_plane_scaling@plane-scaler-with-clipping-clamping-rotation@pipe-b-hdmi-a-2:
    - shard-rkl:          NOTRUN -> [SKIP][314] ([i915#5176] / [i915#9423]) +1 other test skip
   [314]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-1/igt@kms_plane_scaling@plane-scaler-with-clipping-clamping-rotation@pipe-b-hdmi-a-2.html

  * igt@kms_plane_scaling@planes-downscale-factor-0-25-unity-scaling@pipe-c-hdmi-a-3:
    - shard-dg1:          NOTRUN -> [SKIP][315] ([i915#5235]) +11 other tests skip
   [315]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-13/igt@kms_plane_scaling@planes-downscale-factor-0-25-unity-scaling@pipe-c-hdmi-a-3.html

  * igt@kms_plane_scaling@planes-downscale-factor-0-25@pipe-d-hdmi-a-2:
    - shard-dg2:          NOTRUN -> [SKIP][316] ([i915#5235] / [i915#9423]) +19 other tests skip
   [316]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-3/igt@kms_plane_scaling@planes-downscale-factor-0-25@pipe-d-hdmi-a-2.html

  * igt@kms_plane_scaling@planes-unity-scaling-downscale-factor-0-25@pipe-a-hdmi-a-1:
    - shard-rkl:          NOTRUN -> [SKIP][317] ([i915#5235]) +3 other tests skip
   [317]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-4/igt@kms_plane_scaling@planes-unity-scaling-downscale-factor-0-25@pipe-a-hdmi-a-1.html

  * igt@kms_plane_scaling@planes-unity-scaling-downscale-factor-0-5@pipe-d-edp-1:
    - shard-mtlp:         NOTRUN -> [SKIP][318] ([i915#5235]) +3 other tests skip
   [318]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-4/igt@kms_plane_scaling@planes-unity-scaling-downscale-factor-0-5@pipe-d-edp-1.html

  * igt@kms_pm_backlight@fade-with-dpms:
    - shard-dg1:          NOTRUN -> [SKIP][319] ([i915#5354]) +1 other test skip
   [319]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-16/igt@kms_pm_backlight@fade-with-dpms.html
    - shard-tglu:         NOTRUN -> [SKIP][320] ([i915#9812])
   [320]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-7/igt@kms_pm_backlight@fade-with-dpms.html

  * igt@kms_pm_dc@dc5-psr:
    - shard-dg1:          NOTRUN -> [SKIP][321] ([i915#9685])
   [321]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-18/igt@kms_pm_dc@dc5-psr.html

  * igt@kms_pm_dc@dc6-dpms:
    - shard-dg2:          NOTRUN -> [SKIP][322] ([i915#5978])
   [322]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-7/igt@kms_pm_dc@dc6-dpms.html

  * igt@kms_pm_rpm@dpms-mode-unset-non-lpsp:
    - shard-dg2:          NOTRUN -> [SKIP][323] ([i915#9519]) +2 other tests skip
   [323]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-10/igt@kms_pm_rpm@dpms-mode-unset-non-lpsp.html

  * igt@kms_pm_rpm@modeset-lpsp-stress:
    - shard-rkl:          NOTRUN -> [SKIP][324] ([i915#9519]) +1 other test skip
   [324]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-6/igt@kms_pm_rpm@modeset-lpsp-stress.html
    - shard-dg1:          NOTRUN -> [SKIP][325] ([i915#9519])
   [325]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-17/igt@kms_pm_rpm@modeset-lpsp-stress.html

  * igt@kms_pm_rpm@modeset-non-lpsp-stress-no-wait:
    - shard-tglu:         NOTRUN -> [SKIP][326] ([i915#9519]) +2 other tests skip
   [326]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-5/igt@kms_pm_rpm@modeset-non-lpsp-stress-no-wait.html
    - shard-mtlp:         NOTRUN -> [SKIP][327] ([i915#9519]) +1 other test skip
   [327]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-4/igt@kms_pm_rpm@modeset-non-lpsp-stress-no-wait.html

  * igt@kms_pm_rpm@pc8-residency:
    - shard-dg2:          NOTRUN -> [SKIP][328] ([fdo#109293] / [fdo#109506])
   [328]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-7/igt@kms_pm_rpm@pc8-residency.html

  * igt@kms_prime@basic-crc-hybrid:
    - shard-dg2:          NOTRUN -> [SKIP][329] ([i915#6524] / [i915#6805]) +1 other test skip
   [329]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-1/igt@kms_prime@basic-crc-hybrid.html

  * igt@kms_prime@basic-crc-vgem:
    - shard-dg1:          NOTRUN -> [SKIP][330] ([i915#6524])
   [330]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-18/igt@kms_prime@basic-crc-vgem.html

  * igt@kms_prime@d3hot:
    - shard-rkl:          NOTRUN -> [SKIP][331] ([i915#6524])
   [331]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-2/igt@kms_prime@d3hot.html

  * igt@kms_psr2_sf@overlay-plane-move-continuous-exceed-fully-sf:
    - shard-rkl:          NOTRUN -> [SKIP][332] ([i915#9683])
   [332]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-6/igt@kms_psr2_sf@overlay-plane-move-continuous-exceed-fully-sf.html

  * igt@kms_psr2_sf@overlay-plane-move-continuous-exceed-sf:
    - shard-dg2:          NOTRUN -> [SKIP][333] ([i915#9683]) +1 other test skip
   [333]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-10/igt@kms_psr2_sf@overlay-plane-move-continuous-exceed-sf.html

  * igt@kms_psr2_sf@overlay-plane-update-sf-dmg-area:
    - shard-dg1:          NOTRUN -> [SKIP][334] ([fdo#111068] / [i915#9683])
   [334]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-18/igt@kms_psr2_sf@overlay-plane-update-sf-dmg-area.html

  * igt@kms_psr_stress_test@flip-primary-invalidate-overlay:
    - shard-dg2:          NOTRUN -> [SKIP][335] ([i915#9685])
   [335]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-5/igt@kms_psr_stress_test@flip-primary-invalidate-overlay.html

  * igt@kms_psr_stress_test@invalidate-primary-flip-overlay:
    - shard-rkl:          NOTRUN -> [SKIP][336] ([i915#9685])
   [336]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-6/igt@kms_psr_stress_test@invalidate-primary-flip-overlay.html

  * igt@kms_rotation_crc@primary-4-tiled-reflect-x-0:
    - shard-dg1:          NOTRUN -> [SKIP][337] ([i915#5289])
   [337]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-18/igt@kms_rotation_crc@primary-4-tiled-reflect-x-0.html

  * igt@kms_rotation_crc@primary-4-tiled-reflect-x-180:
    - shard-rkl:          NOTRUN -> [SKIP][338] ([i915#5289])
   [338]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-2/igt@kms_rotation_crc@primary-4-tiled-reflect-x-180.html

  * igt@kms_rotation_crc@primary-y-tiled-reflect-x-270:
    - shard-dg2:          NOTRUN -> [SKIP][339] ([i915#4235] / [i915#5190])
   [339]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-2/igt@kms_rotation_crc@primary-y-tiled-reflect-x-270.html

  * igt@kms_rotation_crc@primary-yf-tiled-reflect-x-0:
    - shard-rkl:          NOTRUN -> [SKIP][340] ([fdo#111615] / [i915#5289])
   [340]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-1/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-0.html
    - shard-dg1:          NOTRUN -> [SKIP][341] ([fdo#111615] / [i915#5289])
   [341]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-19/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-0.html
    - shard-tglu:         NOTRUN -> [SKIP][342] ([fdo#111615] / [i915#5289])
   [342]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-5/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-0.html
    - shard-mtlp:         NOTRUN -> [SKIP][343] ([i915#5289])
   [343]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-4/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-0.html

  * igt@kms_rotation_crc@primary-yf-tiled-reflect-x-270:
    - shard-mtlp:         NOTRUN -> [SKIP][344] ([i915#4235])
   [344]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-1/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-270.html

  * igt@kms_rotation_crc@sprite-rotation-90:
    - shard-dg2:          NOTRUN -> [SKIP][345] ([i915#4235]) +1 other test skip
   [345]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-7/igt@kms_rotation_crc@sprite-rotation-90.html

  * igt@kms_selftest@drm_format_helper@drm_format_helper_test-drm_test_fb_build_fourcc_list:
    - shard-dg2:          NOTRUN -> [FAIL][346] ([i915#10136])
   [346]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-1/igt@kms_selftest@drm_format_helper@drm_format_helper_test-drm_test_fb_build_fourcc_list.html

  * igt@kms_selftest@drm_format_helper@drm_format_helper_test-drm_test_fb_swab:
    - shard-dg2:          NOTRUN -> [DMESG-WARN][347] ([i915#10143]) +1 other test dmesg-warn
   [347]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-1/igt@kms_selftest@drm_format_helper@drm_format_helper_test-drm_test_fb_swab.html
    - shard-rkl:          [PASS][348] -> [DMESG-WARN][349] ([i915#10143]) +2 other tests dmesg-warn
   [348]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-rkl-2/igt@kms_selftest@drm_format_helper@drm_format_helper_test-drm_test_fb_swab.html
   [349]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-7/igt@kms_selftest@drm_format_helper@drm_format_helper_test-drm_test_fb_swab.html

  * igt@kms_selftest@drm_format_helper@drm_format_helper_test-drm_test_fb_xrgb8888_to_abgr8888:
    - shard-snb:          [PASS][350] -> [DMESG-WARN][351] ([i915#10143])
   [350]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-snb1/igt@kms_selftest@drm_format_helper@drm_format_helper_test-drm_test_fb_xrgb8888_to_abgr8888.html
   [351]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-snb4/igt@kms_selftest@drm_format_helper@drm_format_helper_test-drm_test_fb_xrgb8888_to_abgr8888.html

  * igt@kms_selftest@drm_format_helper@drm_format_helper_test-drm_test_fb_xrgb8888_to_rgb888:
    - shard-glk:          [PASS][352] -> [DMESG-WARN][353] ([i915#10143])
   [352]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-glk7/igt@kms_selftest@drm_format_helper@drm_format_helper_test-drm_test_fb_xrgb8888_to_rgb888.html
   [353]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-glk5/igt@kms_selftest@drm_format_helper@drm_format_helper_test-drm_test_fb_xrgb8888_to_rgb888.html

  * igt@kms_sysfs_edid_timing:
    - shard-dg2:          NOTRUN -> [FAIL][354] ([IGT#2])
   [354]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-1/igt@kms_sysfs_edid_timing.html
    - shard-dg1:          NOTRUN -> [FAIL][355] ([IGT#2] / [i915#6493])
   [355]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-18/igt@kms_sysfs_edid_timing.html

  * igt@kms_tiled_display@basic-test-pattern-with-chamelium:
    - shard-rkl:          NOTRUN -> [SKIP][356] ([i915#8623])
   [356]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-1/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html
    - shard-dg1:          NOTRUN -> [SKIP][357] ([i915#8623])
   [357]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-19/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html
    - shard-tglu:         NOTRUN -> [SKIP][358] ([i915#8623])
   [358]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-5/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html
    - shard-mtlp:         NOTRUN -> [SKIP][359] ([i915#8623])
   [359]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-4/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html
    - shard-dg2:          NOTRUN -> [SKIP][360] ([i915#8623])
   [360]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-10/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html

  * igt@kms_tv_load_detect@load-detect:
    - shard-dg1:          NOTRUN -> [SKIP][361] ([fdo#109309])
   [361]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-18/igt@kms_tv_load_detect@load-detect.html

  * igt@kms_universal_plane@cursor-fb-leak@pipe-b-hdmi-a-1:
    - shard-snb:          [PASS][362] -> [FAIL][363] ([i915#9196])
   [362]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-snb4/igt@kms_universal_plane@cursor-fb-leak@pipe-b-hdmi-a-1.html
   [363]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-snb6/igt@kms_universal_plane@cursor-fb-leak@pipe-b-hdmi-a-1.html

  * igt@kms_vrr@flip-basic-fastset:
    - shard-dg2:          NOTRUN -> [SKIP][364] ([i915#9906])
   [364]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-1/igt@kms_vrr@flip-basic-fastset.html

  * igt@kms_writeback@writeback-check-output:
    - shard-dg2:          NOTRUN -> [SKIP][365] ([i915#2437]) +1 other test skip
   [365]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-10/igt@kms_writeback@writeback-check-output.html
    - shard-rkl:          NOTRUN -> [SKIP][366] ([i915#2437]) +2 other tests skip
   [366]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-1/igt@kms_writeback@writeback-check-output.html
    - shard-dg1:          NOTRUN -> [SKIP][367] ([i915#2437])
   [367]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-19/igt@kms_writeback@writeback-check-output.html
    - shard-tglu:         NOTRUN -> [SKIP][368] ([i915#2437])
   [368]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-5/igt@kms_writeback@writeback-check-output.html
    - shard-mtlp:         NOTRUN -> [SKIP][369] ([i915#2437])
   [369]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-4/igt@kms_writeback@writeback-check-output.html

  * igt@kms_writeback@writeback-invalid-parameters:
    - shard-glk:          NOTRUN -> [SKIP][370] ([fdo#109271] / [i915#2437])
   [370]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-glk8/igt@kms_writeback@writeback-invalid-parameters.html

  * igt@perf@global-sseu-config-invalid:
    - shard-dg2:          NOTRUN -> [SKIP][371] ([i915#7387])
   [371]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-1/igt@perf@global-sseu-config-invalid.html

  * igt@perf@non-zero-reason@0-rcs0:
    - shard-dg2:          [PASS][372] -> [FAIL][373] ([i915#7484])
   [372]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-dg2-1/igt@perf@non-zero-reason@0-rcs0.html
   [373]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-10/igt@perf@non-zero-reason@0-rcs0.html

  * igt@perf_pmu@faulting-read@gtt:
    - shard-mtlp:         NOTRUN -> [SKIP][374] ([i915#8440])
   [374]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-1/igt@perf_pmu@faulting-read@gtt.html

  * igt@perf_pmu@frequency@gt0:
    - shard-dg1:          NOTRUN -> [FAIL][375] ([i915#6806])
   [375]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-18/igt@perf_pmu@frequency@gt0.html

  * igt@perf_pmu@rc6@other-idle-gt0:
    - shard-dg2:          NOTRUN -> [SKIP][376] ([i915#8516])
   [376]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-2/igt@perf_pmu@rc6@other-idle-gt0.html
    - shard-rkl:          NOTRUN -> [SKIP][377] ([i915#8516])
   [377]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-6/igt@perf_pmu@rc6@other-idle-gt0.html
    - shard-dg1:          NOTRUN -> [SKIP][378] ([i915#8516])
   [378]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-17/igt@perf_pmu@rc6@other-idle-gt0.html
    - shard-tglu:         NOTRUN -> [SKIP][379] ([i915#8516])
   [379]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-3/igt@perf_pmu@rc6@other-idle-gt0.html

  * igt@prime_mmap@test_aperture_limit@test_aperture_limit-smem:
    - shard-dg2:          NOTRUN -> [INCOMPLETE][380] ([i915#5493])
   [380]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-7/igt@prime_mmap@test_aperture_limit@test_aperture_limit-smem.html

  * igt@prime_udl:
    - shard-dg2:          NOTRUN -> [SKIP][381] ([fdo#109291])
   [381]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-10/igt@prime_udl.html

  * igt@prime_vgem@basic-fence-read:
    - shard-mtlp:         NOTRUN -> [SKIP][382] ([i915#3708])
   [382]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-1/igt@prime_vgem@basic-fence-read.html

  * igt@prime_vgem@basic-gtt:
    - shard-dg2:          NOTRUN -> [SKIP][383] ([i915#3708] / [i915#4077]) +1 other test skip
   [383]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-5/igt@prime_vgem@basic-gtt.html

  * igt@prime_vgem@basic-read:
    - shard-dg2:          NOTRUN -> [SKIP][384] ([i915#3291] / [i915#3708])
   [384]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-5/igt@prime_vgem@basic-read.html

  * igt@prime_vgem@fence-flip-hang:
    - shard-dg2:          NOTRUN -> [SKIP][385] ([i915#3708])
   [385]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-7/igt@prime_vgem@fence-flip-hang.html

  * igt@sriov_basic@enable-vfs-autoprobe-off:
    - shard-dg2:          NOTRUN -> [SKIP][386] ([i915#9917])
   [386]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-5/igt@sriov_basic@enable-vfs-autoprobe-off.html
    - shard-tglu:         NOTRUN -> [SKIP][387] ([i915#9917])
   [387]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-7/igt@sriov_basic@enable-vfs-autoprobe-off.html

  * igt@sriov_basic@enable-vfs-autoprobe-on:
    - shard-dg1:          NOTRUN -> [SKIP][388] ([i915#9917])
   [388]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-13/igt@sriov_basic@enable-vfs-autoprobe-on.html

  * igt@syncobj_timeline@invalid-wait-zero-handles:
    - shard-dg2:          NOTRUN -> [FAIL][389] ([i915#9781])
   [389]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-2/igt@syncobj_timeline@invalid-wait-zero-handles.html
    - shard-rkl:          NOTRUN -> [FAIL][390] ([i915#9781])
   [390]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-6/igt@syncobj_timeline@invalid-wait-zero-handles.html
    - shard-dg1:          NOTRUN -> [FAIL][391] ([i915#9781])
   [391]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-17/igt@syncobj_timeline@invalid-wait-zero-handles.html
    - shard-tglu:         NOTRUN -> [FAIL][392] ([i915#9781])
   [392]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-3/igt@syncobj_timeline@invalid-wait-zero-handles.html

  * igt@syncobj_wait@invalid-wait-zero-handles:
    - shard-dg2:          NOTRUN -> [FAIL][393] ([i915#9779])
   [393]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-10/igt@syncobj_wait@invalid-wait-zero-handles.html

  * igt@tools_test@sysfs_l3_parity:
    - shard-rkl:          NOTRUN -> [SKIP][394] ([fdo#109307])
   [394]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-6/igt@tools_test@sysfs_l3_parity.html

  * igt@v3d/v3d_perfmon@get-values-valid-perfmon:
    - shard-rkl:          NOTRUN -> [SKIP][395] ([fdo#109315]) +12 other tests skip
   [395]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-6/igt@v3d/v3d_perfmon@get-values-valid-perfmon.html

  * igt@v3d/v3d_submit_cl@bad-multisync-pad:
    - shard-tglu:         NOTRUN -> [SKIP][396] ([fdo#109315] / [i915#2575]) +10 other tests skip
   [396]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-5/igt@v3d/v3d_submit_cl@bad-multisync-pad.html
    - shard-mtlp:         NOTRUN -> [SKIP][397] ([i915#2575]) +7 other tests skip
   [397]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-4/igt@v3d/v3d_submit_cl@bad-multisync-pad.html

  * igt@v3d/v3d_submit_cl@job-perfmon:
    - shard-dg1:          NOTRUN -> [SKIP][398] ([i915#2575]) +9 other tests skip
   [398]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-18/igt@v3d/v3d_submit_cl@job-perfmon.html

  * igt@v3d/v3d_submit_cl@multisync-out-syncs:
    - shard-dg2:          NOTRUN -> [SKIP][399] ([i915#2575]) +26 other tests skip
   [399]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-10/igt@v3d/v3d_submit_cl@multisync-out-syncs.html

  * igt@vc4/vc4_perfmon@create-two-perfmon:
    - shard-rkl:          NOTRUN -> [SKIP][400] ([i915#7711]) +9 other tests skip
   [400]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-6/igt@vc4/vc4_perfmon@create-two-perfmon.html

  * igt@vc4/vc4_purgeable_bo@mark-unpurgeable-check-retained:
    - shard-dg2:          NOTRUN -> [SKIP][401] ([i915#7711]) +17 other tests skip
   [401]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-1/igt@vc4/vc4_purgeable_bo@mark-unpurgeable-check-retained.html

  * igt@vc4/vc4_purgeable_bo@mark-unpurgeable-twice:
    - shard-dg1:          NOTRUN -> [SKIP][402] ([i915#7711]) +5 other tests skip
   [402]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-17/igt@vc4/vc4_purgeable_bo@mark-unpurgeable-twice.html
    - shard-tglu:         NOTRUN -> [SKIP][403] ([i915#2575]) +6 other tests skip
   [403]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-3/igt@vc4/vc4_purgeable_bo@mark-unpurgeable-twice.html

  * igt@vc4/vc4_wait_bo@used-bo:
    - shard-mtlp:         NOTRUN -> [SKIP][404] ([i915#7711]) +2 other tests skip
   [404]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-1/igt@vc4/vc4_wait_bo@used-bo.html

  
#### Possible fixes ####

  * igt@gem_ctx_shared@exec-single-timeline@ccs3:
    - shard-dg2:          [INCOMPLETE][405] -> [PASS][406]
   [405]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-dg2-1/igt@gem_ctx_shared@exec-single-timeline@ccs3.html
   [406]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-7/igt@gem_ctx_shared@exec-single-timeline@ccs3.html

  * igt@gem_eio@in-flight-suspend:
    - shard-tglu:         [ABORT][407] ([i915#10030]) -> [PASS][408]
   [407]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-tglu-9/igt@gem_eio@in-flight-suspend.html
   [408]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-7/igt@gem_eio@in-flight-suspend.html

  * igt@gem_eio@reset-stress:
    - shard-dg1:          [FAIL][409] ([i915#5784]) -> [PASS][410]
   [409]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-dg1-13/igt@gem_eio@reset-stress.html
   [410]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-16/igt@gem_eio@reset-stress.html

  * igt@gem_exec_fair@basic-none@bcs0:
    - shard-rkl:          [FAIL][411] ([i915#2842]) -> [PASS][412] +4 other tests pass
   [411]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-rkl-4/igt@gem_exec_fair@basic-none@bcs0.html
   [412]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-1/igt@gem_exec_fair@basic-none@bcs0.html

  * igt@i915_pm_rc6_residency@rc6-idle@gt0-bcs0:
    - shard-dg1:          [FAIL][413] ([i915#3591]) -> [PASS][414] +1 other test pass
   [413]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-dg1-19/igt@i915_pm_rc6_residency@rc6-idle@gt0-bcs0.html
   [414]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg1-17/igt@i915_pm_rc6_residency@rc6-idle@gt0-bcs0.html

  * igt@kms_big_fb@4-tiled-64bpp-rotate-180:
    - shard-mtlp:         [FAIL][415] ([i915#5138]) -> [PASS][416]
   [415]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-mtlp-1/igt@kms_big_fb@4-tiled-64bpp-rotate-180.html
   [416]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-7/igt@kms_big_fb@4-tiled-64bpp-rotate-180.html

  * igt@kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-0-hflip-async-flip:
    - shard-tglu:         [FAIL][417] ([i915#3743]) -> [PASS][418] +1 other test pass
   [417]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-tglu-6/igt@kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-0-hflip-async-flip.html
   [418]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-5/igt@kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-0-hflip-async-flip.html

  * igt@kms_cursor_legacy@cursorb-vs-flipb-toggle:
    - shard-snb:          [SKIP][419] ([fdo#109271] / [fdo#111767]) -> [PASS][420]
   [419]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-snb5/igt@kms_cursor_legacy@cursorb-vs-flipb-toggle.html
   [420]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-snb7/igt@kms_cursor_legacy@cursorb-vs-flipb-toggle.html

  * igt@kms_frontbuffer_tracking@fbc-2p-primscrn-pri-shrfb-draw-mmap-cpu:
    - shard-snb:          [SKIP][421] ([fdo#109271]) -> [PASS][422] +8 other tests pass
   [421]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-snb5/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-pri-shrfb-draw-mmap-cpu.html
   [422]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-snb7/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-pri-shrfb-draw-mmap-cpu.html

  * igt@kms_pm_rpm@modeset-non-lpsp-stress:
    - shard-dg2:          [SKIP][423] ([i915#9519]) -> [PASS][424]
   [423]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-dg2-10/igt@kms_pm_rpm@modeset-non-lpsp-stress.html
   [424]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-dg2-2/igt@kms_pm_rpm@modeset-non-lpsp-stress.html
    - shard-rkl:          [SKIP][425] ([i915#9519]) -> [PASS][426] +2 other tests pass
   [425]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-rkl-4/igt@kms_pm_rpm@modeset-non-lpsp-stress.html
   [426]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-1/igt@kms_pm_rpm@modeset-non-lpsp-stress.html

  * igt@kms_selftest@drm_format_helper@drm_format_helper_test-drm_test_fb_swab:
    - shard-snb:          [DMESG-WARN][427] ([i915#10143]) -> [PASS][428]
   [427]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-snb1/igt@kms_selftest@drm_format_helper@drm_format_helper_test-drm_test_fb_swab.html
   [428]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-snb4/igt@kms_selftest@drm_format_helper@drm_format_helper_test-drm_test_fb_swab.html

  * igt@kms_selftest@drm_format_helper@drm_format_helper_test-drm_test_fb_xrgb8888_to_xbgr8888:
    - shard-mtlp:         [DMESG-WARN][429] ([i915#10143]) -> [PASS][430] +2 other tests pass
   [429]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-mtlp-2/igt@kms_selftest@drm_format_helper@drm_format_helper_test-drm_test_fb_xrgb8888_to_xbgr8888.html
   [430]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-mtlp-7/igt@kms_selftest@drm_format_helper@drm_format_helper_test-drm_test_fb_xrgb8888_to_xbgr8888.html

  * igt@kms_selftest@drm_format_helper@drm_format_helper_test-drm_test_fb_xrgb8888_to_xrgb2101010:
    - shard-glk:          [DMESG-WARN][431] ([i915#10143]) -> [PASS][432]
   [431]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-glk7/igt@kms_selftest@drm_format_helper@drm_format_helper_test-drm_test_fb_xrgb8888_to_xrgb2101010.html
   [432]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-glk5/igt@kms_selftest@drm_format_helper@drm_format_helper_test-drm_test_fb_xrgb8888_to_xrgb2101010.html
    - shard-rkl:          [DMESG-WARN][433] ([i915#10143]) -> [PASS][434] +1 other test pass
   [433]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-rkl-2/igt@kms_selftest@drm_format_helper@drm_format_helper_test-drm_test_fb_xrgb8888_to_xrgb2101010.html
   [434]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-rkl-7/igt@kms_selftest@drm_format_helper@drm_format_helper_test-drm_test_fb_xrgb8888_to_xrgb2101010.html

  * igt@kms_universal_plane@cursor-fb-leak@pipe-a-hdmi-a-1:
    - shard-snb:          [FAIL][435] ([i915#9196]) -> [PASS][436]
   [435]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-snb4/igt@kms_universal_plane@cursor-fb-leak@pipe-a-hdmi-a-1.html
   [436]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-snb6/igt@kms_universal_plane@cursor-fb-leak@pipe-a-hdmi-a-1.html

  
#### Warnings ####

  * igt@gem_pwrite@basic-exhaustion:
    - shard-glk:          [WARN][437] ([i915#2658]) -> [INCOMPLETE][438] ([i915#10042] / [i915#10137])
   [437]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-glk7/igt@gem_pwrite@basic-exhaustion.html
   [438]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-glk8/igt@gem_pwrite@basic-exhaustion.html

  * igt@i915_pm_rc6_residency@rc6-idle@gt0-bcs0:
    - shard-tglu:         [FAIL][439] ([i915#3591]) -> [WARN][440] ([i915#2681])
   [439]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-tglu-2/igt@i915_pm_rc6_residency@rc6-idle@gt0-bcs0.html
   [440]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129197v1/shard-tglu-8/igt@i915_pm_rc6_residency@rc6-idle@gt0-bcs0.html

  * igt@kms_content_protection@atomic-dpms:
    - shard-snb:          [INCOMPLETE][441] ([i915#8816]) -> [SKIP][442] ([fdo#109271])
   [441]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14181/shard-snb7/igt@kms_content_protec

== Logs ==

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

[-- Attachment #2: Type: text/html, Size: 110614 bytes --]

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

* Re: [PATCH 1/2] drm/ttm: improve idle/busy handling v4
  2024-01-26 14:09 ` [PATCH 1/2] drm/ttm: improve idle/busy handling v4 Christian König
@ 2024-02-06 12:53   ` Thomas Hellström
  2024-02-06 12:56     ` Christian König
  0 siblings, 1 reply; 13+ messages in thread
From: Thomas Hellström @ 2024-02-06 12:53 UTC (permalink / raw)
  To: Christian König, dri-devel, intel-gfx, nouveau

Hi, Christian,

On Fri, 2024-01-26 at 15:09 +0100, Christian König wrote:
> Previously we would never try to move a BO into the preferred
> placements
> when it ever landed in a busy placement since those were considered
> compatible.
> 
> Rework the whole handling and finally unify the idle and busy
> handling.
> ttm_bo_validate() is now responsible to try idle placement first and
> then
> use the busy placement if that didn't worked.
> 
> Drawback is that we now always try the idle placement first for each
> validation which might cause some additional CPU overhead on
> overcommit.
> 
> v2: fix kerneldoc warning and coding style
> v3: take care of XE as well
> v4: keep the ttm_bo_mem_space functionality as it is for now, only
> add
>     new handling for ttm_bo_validate as suggested by Thomas
> 
> Signed-off-by: Christian König <christian.koenig@amd.com>
> Reviewed-by: Zack Rusin <zack.rusin@broadcom.com> v3

Sending this through xe CI, will try to review asap.

/Thomas


> ---
>  drivers/gpu/drm/ttm/ttm_bo.c       | 231 +++++++++++++--------------
> --
>  drivers/gpu/drm/ttm/ttm_resource.c |  16 +-
>  include/drm/ttm/ttm_resource.h     |   3 +-
>  3 files changed, 121 insertions(+), 129 deletions(-)
> 
> diff --git a/drivers/gpu/drm/ttm/ttm_bo.c
> b/drivers/gpu/drm/ttm/ttm_bo.c
> index ba3f09e2d7e6..b12f435542a9 100644
> --- a/drivers/gpu/drm/ttm/ttm_bo.c
> +++ b/drivers/gpu/drm/ttm/ttm_bo.c
> @@ -724,64 +724,36 @@ static int ttm_bo_add_move_fence(struct
> ttm_buffer_object *bo,
>  	return ret;
>  }
>  
> -/*
> - * Repeatedly evict memory from the LRU for @mem_type until we
> create enough
> - * space, or we've evicted everything and there isn't enough space.
> - */
> -static int ttm_bo_mem_force_space(struct ttm_buffer_object *bo,
> -				  const struct ttm_place *place,
> -				  struct ttm_resource **mem,
> -				  struct ttm_operation_ctx *ctx)
> -{
> -	struct ttm_device *bdev = bo->bdev;
> -	struct ttm_resource_manager *man;
> -	struct ww_acquire_ctx *ticket;
> -	int ret;
> -
> -	man = ttm_manager_type(bdev, place->mem_type);
> -	ticket = dma_resv_locking_ctx(bo->base.resv);
> -	do {
> -		ret = ttm_resource_alloc(bo, place, mem);
> -		if (likely(!ret))
> -			break;
> -		if (unlikely(ret != -ENOSPC))
> -			return ret;
> -		ret = ttm_mem_evict_first(bdev, man, place, ctx,
> -					  ticket);
> -		if (unlikely(ret != 0))
> -			return ret;
> -	} while (1);
> -
> -	return ttm_bo_add_move_fence(bo, man, *mem, ctx-
> >no_wait_gpu);
> -}
> -
>  /**
> - * ttm_bo_mem_space
> + * ttm_bo_alloc_resource - Allocate backing store for a BO
>   *
> - * @bo: Pointer to a struct ttm_buffer_object. the data of which
> - * we want to allocate space for.
> - * @placement: Proposed new placement for the buffer object.
> - * @mem: A struct ttm_resource.
> + * @bo: Pointer to a struct ttm_buffer_object of which we want a
> resource for
> + * @placement: Proposed new placement for the buffer object
>   * @ctx: if and how to sleep, lock buffers and alloc memory
> + * @force_space: If we should evict buffers to force space
> + * @res: The resulting struct ttm_resource.
>   *
> - * Allocate memory space for the buffer object pointed to by @bo,
> using
> - * the placement flags in @placement, potentially evicting other
> idle buffer objects.
> - * This function may sleep while waiting for space to become
> available.
> + * Allocates a resource for the buffer object pointed to by @bo,
> using the
> + * placement flags in @placement, potentially evicting other buffer
> objects when
> + * @force_space is true.
> + * This function may sleep while waiting for resources to become
> available.
>   * Returns:
> - * -EBUSY: No space available (only if no_wait == 1).
> + * -EBUSY: No space available (only if no_wait == true).
>   * -ENOSPC: Could not allocate space for the buffer object, either
> due to
>   * fragmentation or concurrent allocators.
>   * -ERESTARTSYS: An interruptible sleep was interrupted by a signal.
>   */
> -int ttm_bo_mem_space(struct ttm_buffer_object *bo,
> -			struct ttm_placement *placement,
> -			struct ttm_resource **mem,
> -			struct ttm_operation_ctx *ctx)
> +static int ttm_bo_alloc_resource(struct ttm_buffer_object *bo,
> +				 struct ttm_placement *placement,
> +				 struct ttm_operation_ctx *ctx,
> +				 bool force_space,
> +				 struct ttm_resource **res)
>  {
>  	struct ttm_device *bdev = bo->bdev;
> -	bool type_found = false;
> +	struct ww_acquire_ctx *ticket;
>  	int i, ret;
>  
> +	ticket = dma_resv_locking_ctx(bo->base.resv);
>  	ret = dma_resv_reserve_fences(bo->base.resv, 1);
>  	if (unlikely(ret))
>  		return ret;
> @@ -790,98 +762,73 @@ int ttm_bo_mem_space(struct ttm_buffer_object
> *bo,
>  		const struct ttm_place *place = &placement-
> >placement[i];
>  		struct ttm_resource_manager *man;
>  
> -		if (place->flags & TTM_PL_FLAG_FALLBACK)
> -			continue;
> -
>  		man = ttm_manager_type(bdev, place->mem_type);
>  		if (!man || !ttm_resource_manager_used(man))
>  			continue;
>  
> -		type_found = true;
> -		ret = ttm_resource_alloc(bo, place, mem);
> -		if (ret == -ENOSPC)
> +		if (place->flags & (force_space ?
> TTM_PL_FLAG_DESIRED :
> +				    TTM_PL_FLAG_FALLBACK))
> +			continue;
> +
> +		do {
> +			ret = ttm_resource_alloc(bo, place, res);
> +			if (unlikely(ret != -ENOSPC))
> +				return ret;
> +			if (likely(!ret) || !force_space)
> +				break;
> +
> +			ret = ttm_mem_evict_first(bdev, man, place,
> ctx,
> +						  ticket);
> +			if (unlikely(ret == -EBUSY))
> +				break;
> +			if (unlikely(ret))
> +				return ret;
> +		} while (1);
> +		if (ret)
>  			continue;
> -		if (unlikely(ret))
> -			goto error;
>  
> -		ret = ttm_bo_add_move_fence(bo, man, *mem, ctx-
> >no_wait_gpu);
> +		ret = ttm_bo_add_move_fence(bo, man, *res, ctx-
> >no_wait_gpu);
>  		if (unlikely(ret)) {
> -			ttm_resource_free(bo, mem);
> +			ttm_resource_free(bo, res);
>  			if (ret == -EBUSY)
>  				continue;
>  
> -			goto error;
> +			return ret;
>  		}
>  		return 0;
>  	}
>  
> -	for (i = 0; i < placement->num_placement; ++i) {
> -		const struct ttm_place *place = &placement-
> >placement[i];
> -		struct ttm_resource_manager *man;
> -
> -		if (place->flags & TTM_PL_FLAG_DESIRED)
> -			continue;
> -
> -		man = ttm_manager_type(bdev, place->mem_type);
> -		if (!man || !ttm_resource_manager_used(man))
> -			continue;
> -
> -		type_found = true;
> -		ret = ttm_bo_mem_force_space(bo, place, mem, ctx);
> -		if (likely(!ret))
> -			return 0;
> -
> -		if (ret && ret != -EBUSY)
> -			goto error;
> -	}
> -
> -	ret = -ENOSPC;
> -	if (!type_found) {
> -		pr_err(TTM_PFX "No compatible memory type found\n");
> -		ret = -EINVAL;
> -	}
> -
> -error:
> -	return ret;
> +	return -ENOSPC;
>  }
> -EXPORT_SYMBOL(ttm_bo_mem_space);
>  
> -static int ttm_bo_move_buffer(struct ttm_buffer_object *bo,
> -			      struct ttm_placement *placement,
> -			      struct ttm_operation_ctx *ctx)
> +/*
> + * ttm_bo_mem_space - Wrapper around ttm_bo_alloc_resource
> + *
> + * @bo: Pointer to a struct ttm_buffer_object of which we want a
> resource for
> + * @placement: Proposed new placement for the buffer object
> + * @res: The resulting struct ttm_resource.
> + * @ctx: if and how to sleep, lock buffers and alloc memory
> + *
> + * Tries both idle allocation and forcefully eviction of buffers.
> See
> + * ttm_bo_alloc_resource for details.
> + */
> +int ttm_bo_mem_space(struct ttm_buffer_object *bo,
> +		     struct ttm_placement *placement,
> +		     struct ttm_resource **res,
> +		     struct ttm_operation_ctx *ctx)
>  {
> -	struct ttm_resource *mem;
> -	struct ttm_place hop;
> +	bool force_space = false;
>  	int ret;
>  
> -	dma_resv_assert_held(bo->base.resv);
> +	do {
> +		ret = ttm_bo_alloc_resource(bo, placement, ctx,
> +					    force_space, res);
> +		force_space = !force_space;
> +	} while (ret == -ENOSPC && force_space);
>  
> -	/*
> -	 * Determine where to move the buffer.
> -	 *
> -	 * If driver determines move is going to need
> -	 * an extra step then it will return -EMULTIHOP
> -	 * and the buffer will be moved to the temporary
> -	 * stop and the driver will be called to make
> -	 * the second hop.
> -	 */
> -	ret = ttm_bo_mem_space(bo, placement, &mem, ctx);
> -	if (ret)
> -		return ret;
> -bounce:
> -	ret = ttm_bo_handle_move_mem(bo, mem, false, ctx, &hop);
> -	if (ret == -EMULTIHOP) {
> -		ret = ttm_bo_bounce_temp_buffer(bo, &mem, ctx,
> &hop);
> -		if (ret)
> -			goto out;
> -		/* try and move to final place now. */
> -		goto bounce;
> -	}
> -out:
> -	if (ret)
> -		ttm_resource_free(bo, &mem);
>  	return ret;
>  }
> +EXPORT_SYMBOL(ttm_bo_mem_space);
>  
>  /**
>   * ttm_bo_validate
> @@ -902,6 +849,9 @@ int ttm_bo_validate(struct ttm_buffer_object *bo,
>  		    struct ttm_placement *placement,
>  		    struct ttm_operation_ctx *ctx)
>  {
> +	struct ttm_resource *res;
> +	struct ttm_place hop;
> +	bool force_space;
>  	int ret;
>  
>  	dma_resv_assert_held(bo->base.resv);
> @@ -912,20 +862,53 @@ int ttm_bo_validate(struct ttm_buffer_object
> *bo,
>  	if (!placement->num_placement)
>  		return ttm_bo_pipeline_gutting(bo);
>  
> -	/* Check whether we need to move buffer. */
> -	if (bo->resource && ttm_resource_compatible(bo->resource,
> placement))
> -		return 0;
> +	force_space = false;
> +	do {
> +		/* Check whether we need to move buffer. */
> +		if (bo->resource &&
> +		    ttm_resource_compatible(bo->resource, placement,
> +					    force_space))
> +			return 0;
>  
> -	/* Moving of pinned BOs is forbidden */
> -	if (bo->pin_count)
> -		return -EINVAL;
> +		/* Moving of pinned BOs is forbidden */
> +		if (bo->pin_count)
> +			return -EINVAL;
> +
> +		/*
> +		 * Determine where to move the buffer.
> +		 *
> +		 * If driver determines move is going to need
> +		 * an extra step then it will return -EMULTIHOP
> +		 * and the buffer will be moved to the temporary
> +		 * stop and the driver will be called to make
> +		 * the second hop.
> +		 */
> +		ret = ttm_bo_alloc_resource(bo, placement, ctx,
> force_space,
> +					    &res);
> +		force_space = !force_space;
> +		if (ret == -ENOSPC)
> +			continue;
> +		if (ret)
> +			return ret;
> +
> +bounce:
> +		ret = ttm_bo_handle_move_mem(bo, res, false, ctx,
> &hop);
> +		if (ret == -EMULTIHOP) {
> +			ret = ttm_bo_bounce_temp_buffer(bo, &res,
> ctx, &hop);
> +			/* try and move to final place now. */
> +			if (!ret)
> +				goto bounce;
> +		}
> +		if (ret) {
> +			ttm_resource_free(bo, &res);
> +			return ret;
> +		}
> +
> +	} while (ret && force_space);
>  
> -	ret = ttm_bo_move_buffer(bo, placement, ctx);
>  	/* For backward compatibility with userspace */
>  	if (ret == -ENOSPC)
>  		return -ENOMEM;
> -	if (ret)
> -		return ret;
>  
>  	/*
>  	 * We might need to add a TTM.
> diff --git a/drivers/gpu/drm/ttm/ttm_resource.c
> b/drivers/gpu/drm/ttm/ttm_resource.c
> index fb14f7716cf8..65155f2013ca 100644
> --- a/drivers/gpu/drm/ttm/ttm_resource.c
> +++ b/drivers/gpu/drm/ttm/ttm_resource.c
> @@ -295,11 +295,13 @@ bool ttm_resource_intersects(struct ttm_device
> *bdev,
>   *
>   * @res: the resource to check
>   * @placement: the placement to check against
> + * @evicting: true if the caller is doing evictions
>   *
>   * Returns true if the placement is compatible.
>   */
>  bool ttm_resource_compatible(struct ttm_resource *res,
> -			     struct ttm_placement *placement)
> +			     struct ttm_placement *placement,
> +			     bool evicting)
>  {
>  	struct ttm_buffer_object *bo = res->bo;
>  	struct ttm_device *bdev = bo->bdev;
> @@ -315,14 +317,20 @@ bool ttm_resource_compatible(struct
> ttm_resource *res,
>  		if (res->mem_type != place->mem_type)
>  			continue;
>  
> +		if (place->flags & (evicting ? TTM_PL_FLAG_DESIRED :
> +				    TTM_PL_FLAG_FALLBACK))
> +			continue;
> +
> +		if (place->flags & TTM_PL_FLAG_CONTIGUOUS &&
> +		    !(res->placement & TTM_PL_FLAG_CONTIGUOUS))
> +			continue;
> +
>  		man = ttm_manager_type(bdev, res->mem_type);
>  		if (man->func->compatible &&
>  		    !man->func->compatible(man, res, place, bo-
> >base.size))
>  			continue;
>  
> -		if ((!(place->flags & TTM_PL_FLAG_CONTIGUOUS) ||
> -		     (res->placement & TTM_PL_FLAG_CONTIGUOUS)))
> -			return true;
> +		return true;
>  	}
>  	return false;
>  }
> diff --git a/include/drm/ttm/ttm_resource.h
> b/include/drm/ttm/ttm_resource.h
> index 1afa13f0c22b..7561023db43d 100644
> --- a/include/drm/ttm/ttm_resource.h
> +++ b/include/drm/ttm/ttm_resource.h
> @@ -366,7 +366,8 @@ bool ttm_resource_intersects(struct ttm_device
> *bdev,
>  			     const struct ttm_place *place,
>  			     size_t size);
>  bool ttm_resource_compatible(struct ttm_resource *res,
> -			     struct ttm_placement *placement);
> +			     struct ttm_placement *placement,
> +			     bool evicting);
>  void ttm_resource_set_bo(struct ttm_resource *res,
>  			 struct ttm_buffer_object *bo);
>  


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

* Re: [PATCH 1/2] drm/ttm: improve idle/busy handling v4
  2024-02-06 12:53   ` Thomas Hellström
@ 2024-02-06 12:56     ` Christian König
  2024-02-23 14:30       ` Christian König
  0 siblings, 1 reply; 13+ messages in thread
From: Christian König @ 2024-02-06 12:56 UTC (permalink / raw)
  To: Thomas Hellström, dri-devel, intel-gfx, nouveau

Am 06.02.24 um 13:53 schrieb Thomas Hellström:
> Hi, Christian,
>
> On Fri, 2024-01-26 at 15:09 +0100, Christian König wrote:
>> Previously we would never try to move a BO into the preferred
>> placements
>> when it ever landed in a busy placement since those were considered
>> compatible.
>>
>> Rework the whole handling and finally unify the idle and busy
>> handling.
>> ttm_bo_validate() is now responsible to try idle placement first and
>> then
>> use the busy placement if that didn't worked.
>>
>> Drawback is that we now always try the idle placement first for each
>> validation which might cause some additional CPU overhead on
>> overcommit.
>>
>> v2: fix kerneldoc warning and coding style
>> v3: take care of XE as well
>> v4: keep the ttm_bo_mem_space functionality as it is for now, only
>> add
>>      new handling for ttm_bo_validate as suggested by Thomas
>>
>> Signed-off-by: Christian König <christian.koenig@amd.com>
>> Reviewed-by: Zack Rusin <zack.rusin@broadcom.com> v3
> Sending this through xe CI, will try to review asap.

Take your time. At the moment people are bombarding me with work and I 
have only two hands and one head as well :(

Christian.

>
> /Thomas
>
>
>> ---
>>   drivers/gpu/drm/ttm/ttm_bo.c       | 231 +++++++++++++--------------
>> --
>>   drivers/gpu/drm/ttm/ttm_resource.c |  16 +-
>>   include/drm/ttm/ttm_resource.h     |   3 +-
>>   3 files changed, 121 insertions(+), 129 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/ttm/ttm_bo.c
>> b/drivers/gpu/drm/ttm/ttm_bo.c
>> index ba3f09e2d7e6..b12f435542a9 100644
>> --- a/drivers/gpu/drm/ttm/ttm_bo.c
>> +++ b/drivers/gpu/drm/ttm/ttm_bo.c
>> @@ -724,64 +724,36 @@ static int ttm_bo_add_move_fence(struct
>> ttm_buffer_object *bo,
>>   	return ret;
>>   }
>>   
>> -/*
>> - * Repeatedly evict memory from the LRU for @mem_type until we
>> create enough
>> - * space, or we've evicted everything and there isn't enough space.
>> - */
>> -static int ttm_bo_mem_force_space(struct ttm_buffer_object *bo,
>> -				  const struct ttm_place *place,
>> -				  struct ttm_resource **mem,
>> -				  struct ttm_operation_ctx *ctx)
>> -{
>> -	struct ttm_device *bdev = bo->bdev;
>> -	struct ttm_resource_manager *man;
>> -	struct ww_acquire_ctx *ticket;
>> -	int ret;
>> -
>> -	man = ttm_manager_type(bdev, place->mem_type);
>> -	ticket = dma_resv_locking_ctx(bo->base.resv);
>> -	do {
>> -		ret = ttm_resource_alloc(bo, place, mem);
>> -		if (likely(!ret))
>> -			break;
>> -		if (unlikely(ret != -ENOSPC))
>> -			return ret;
>> -		ret = ttm_mem_evict_first(bdev, man, place, ctx,
>> -					  ticket);
>> -		if (unlikely(ret != 0))
>> -			return ret;
>> -	} while (1);
>> -
>> -	return ttm_bo_add_move_fence(bo, man, *mem, ctx-
>>> no_wait_gpu);
>> -}
>> -
>>   /**
>> - * ttm_bo_mem_space
>> + * ttm_bo_alloc_resource - Allocate backing store for a BO
>>    *
>> - * @bo: Pointer to a struct ttm_buffer_object. the data of which
>> - * we want to allocate space for.
>> - * @placement: Proposed new placement for the buffer object.
>> - * @mem: A struct ttm_resource.
>> + * @bo: Pointer to a struct ttm_buffer_object of which we want a
>> resource for
>> + * @placement: Proposed new placement for the buffer object
>>    * @ctx: if and how to sleep, lock buffers and alloc memory
>> + * @force_space: If we should evict buffers to force space
>> + * @res: The resulting struct ttm_resource.
>>    *
>> - * Allocate memory space for the buffer object pointed to by @bo,
>> using
>> - * the placement flags in @placement, potentially evicting other
>> idle buffer objects.
>> - * This function may sleep while waiting for space to become
>> available.
>> + * Allocates a resource for the buffer object pointed to by @bo,
>> using the
>> + * placement flags in @placement, potentially evicting other buffer
>> objects when
>> + * @force_space is true.
>> + * This function may sleep while waiting for resources to become
>> available.
>>    * Returns:
>> - * -EBUSY: No space available (only if no_wait == 1).
>> + * -EBUSY: No space available (only if no_wait == true).
>>    * -ENOSPC: Could not allocate space for the buffer object, either
>> due to
>>    * fragmentation or concurrent allocators.
>>    * -ERESTARTSYS: An interruptible sleep was interrupted by a signal.
>>    */
>> -int ttm_bo_mem_space(struct ttm_buffer_object *bo,
>> -			struct ttm_placement *placement,
>> -			struct ttm_resource **mem,
>> -			struct ttm_operation_ctx *ctx)
>> +static int ttm_bo_alloc_resource(struct ttm_buffer_object *bo,
>> +				 struct ttm_placement *placement,
>> +				 struct ttm_operation_ctx *ctx,
>> +				 bool force_space,
>> +				 struct ttm_resource **res)
>>   {
>>   	struct ttm_device *bdev = bo->bdev;
>> -	bool type_found = false;
>> +	struct ww_acquire_ctx *ticket;
>>   	int i, ret;
>>   
>> +	ticket = dma_resv_locking_ctx(bo->base.resv);
>>   	ret = dma_resv_reserve_fences(bo->base.resv, 1);
>>   	if (unlikely(ret))
>>   		return ret;
>> @@ -790,98 +762,73 @@ int ttm_bo_mem_space(struct ttm_buffer_object
>> *bo,
>>   		const struct ttm_place *place = &placement-
>>> placement[i];
>>   		struct ttm_resource_manager *man;
>>   
>> -		if (place->flags & TTM_PL_FLAG_FALLBACK)
>> -			continue;
>> -
>>   		man = ttm_manager_type(bdev, place->mem_type);
>>   		if (!man || !ttm_resource_manager_used(man))
>>   			continue;
>>   
>> -		type_found = true;
>> -		ret = ttm_resource_alloc(bo, place, mem);
>> -		if (ret == -ENOSPC)
>> +		if (place->flags & (force_space ?
>> TTM_PL_FLAG_DESIRED :
>> +				    TTM_PL_FLAG_FALLBACK))
>> +			continue;
>> +
>> +		do {
>> +			ret = ttm_resource_alloc(bo, place, res);
>> +			if (unlikely(ret != -ENOSPC))
>> +				return ret;
>> +			if (likely(!ret) || !force_space)
>> +				break;
>> +
>> +			ret = ttm_mem_evict_first(bdev, man, place,
>> ctx,
>> +						  ticket);
>> +			if (unlikely(ret == -EBUSY))
>> +				break;
>> +			if (unlikely(ret))
>> +				return ret;
>> +		} while (1);
>> +		if (ret)
>>   			continue;
>> -		if (unlikely(ret))
>> -			goto error;
>>   
>> -		ret = ttm_bo_add_move_fence(bo, man, *mem, ctx-
>>> no_wait_gpu);
>> +		ret = ttm_bo_add_move_fence(bo, man, *res, ctx-
>>> no_wait_gpu);
>>   		if (unlikely(ret)) {
>> -			ttm_resource_free(bo, mem);
>> +			ttm_resource_free(bo, res);
>>   			if (ret == -EBUSY)
>>   				continue;
>>   
>> -			goto error;
>> +			return ret;
>>   		}
>>   		return 0;
>>   	}
>>   
>> -	for (i = 0; i < placement->num_placement; ++i) {
>> -		const struct ttm_place *place = &placement-
>>> placement[i];
>> -		struct ttm_resource_manager *man;
>> -
>> -		if (place->flags & TTM_PL_FLAG_DESIRED)
>> -			continue;
>> -
>> -		man = ttm_manager_type(bdev, place->mem_type);
>> -		if (!man || !ttm_resource_manager_used(man))
>> -			continue;
>> -
>> -		type_found = true;
>> -		ret = ttm_bo_mem_force_space(bo, place, mem, ctx);
>> -		if (likely(!ret))
>> -			return 0;
>> -
>> -		if (ret && ret != -EBUSY)
>> -			goto error;
>> -	}
>> -
>> -	ret = -ENOSPC;
>> -	if (!type_found) {
>> -		pr_err(TTM_PFX "No compatible memory type found\n");
>> -		ret = -EINVAL;
>> -	}
>> -
>> -error:
>> -	return ret;
>> +	return -ENOSPC;
>>   }
>> -EXPORT_SYMBOL(ttm_bo_mem_space);
>>   
>> -static int ttm_bo_move_buffer(struct ttm_buffer_object *bo,
>> -			      struct ttm_placement *placement,
>> -			      struct ttm_operation_ctx *ctx)
>> +/*
>> + * ttm_bo_mem_space - Wrapper around ttm_bo_alloc_resource
>> + *
>> + * @bo: Pointer to a struct ttm_buffer_object of which we want a
>> resource for
>> + * @placement: Proposed new placement for the buffer object
>> + * @res: The resulting struct ttm_resource.
>> + * @ctx: if and how to sleep, lock buffers and alloc memory
>> + *
>> + * Tries both idle allocation and forcefully eviction of buffers.
>> See
>> + * ttm_bo_alloc_resource for details.
>> + */
>> +int ttm_bo_mem_space(struct ttm_buffer_object *bo,
>> +		     struct ttm_placement *placement,
>> +		     struct ttm_resource **res,
>> +		     struct ttm_operation_ctx *ctx)
>>   {
>> -	struct ttm_resource *mem;
>> -	struct ttm_place hop;
>> +	bool force_space = false;
>>   	int ret;
>>   
>> -	dma_resv_assert_held(bo->base.resv);
>> +	do {
>> +		ret = ttm_bo_alloc_resource(bo, placement, ctx,
>> +					    force_space, res);
>> +		force_space = !force_space;
>> +	} while (ret == -ENOSPC && force_space);
>>   
>> -	/*
>> -	 * Determine where to move the buffer.
>> -	 *
>> -	 * If driver determines move is going to need
>> -	 * an extra step then it will return -EMULTIHOP
>> -	 * and the buffer will be moved to the temporary
>> -	 * stop and the driver will be called to make
>> -	 * the second hop.
>> -	 */
>> -	ret = ttm_bo_mem_space(bo, placement, &mem, ctx);
>> -	if (ret)
>> -		return ret;
>> -bounce:
>> -	ret = ttm_bo_handle_move_mem(bo, mem, false, ctx, &hop);
>> -	if (ret == -EMULTIHOP) {
>> -		ret = ttm_bo_bounce_temp_buffer(bo, &mem, ctx,
>> &hop);
>> -		if (ret)
>> -			goto out;
>> -		/* try and move to final place now. */
>> -		goto bounce;
>> -	}
>> -out:
>> -	if (ret)
>> -		ttm_resource_free(bo, &mem);
>>   	return ret;
>>   }
>> +EXPORT_SYMBOL(ttm_bo_mem_space);
>>   
>>   /**
>>    * ttm_bo_validate
>> @@ -902,6 +849,9 @@ int ttm_bo_validate(struct ttm_buffer_object *bo,
>>   		    struct ttm_placement *placement,
>>   		    struct ttm_operation_ctx *ctx)
>>   {
>> +	struct ttm_resource *res;
>> +	struct ttm_place hop;
>> +	bool force_space;
>>   	int ret;
>>   
>>   	dma_resv_assert_held(bo->base.resv);
>> @@ -912,20 +862,53 @@ int ttm_bo_validate(struct ttm_buffer_object
>> *bo,
>>   	if (!placement->num_placement)
>>   		return ttm_bo_pipeline_gutting(bo);
>>   
>> -	/* Check whether we need to move buffer. */
>> -	if (bo->resource && ttm_resource_compatible(bo->resource,
>> placement))
>> -		return 0;
>> +	force_space = false;
>> +	do {
>> +		/* Check whether we need to move buffer. */
>> +		if (bo->resource &&
>> +		    ttm_resource_compatible(bo->resource, placement,
>> +					    force_space))
>> +			return 0;
>>   
>> -	/* Moving of pinned BOs is forbidden */
>> -	if (bo->pin_count)
>> -		return -EINVAL;
>> +		/* Moving of pinned BOs is forbidden */
>> +		if (bo->pin_count)
>> +			return -EINVAL;
>> +
>> +		/*
>> +		 * Determine where to move the buffer.
>> +		 *
>> +		 * If driver determines move is going to need
>> +		 * an extra step then it will return -EMULTIHOP
>> +		 * and the buffer will be moved to the temporary
>> +		 * stop and the driver will be called to make
>> +		 * the second hop.
>> +		 */
>> +		ret = ttm_bo_alloc_resource(bo, placement, ctx,
>> force_space,
>> +					    &res);
>> +		force_space = !force_space;
>> +		if (ret == -ENOSPC)
>> +			continue;
>> +		if (ret)
>> +			return ret;
>> +
>> +bounce:
>> +		ret = ttm_bo_handle_move_mem(bo, res, false, ctx,
>> &hop);
>> +		if (ret == -EMULTIHOP) {
>> +			ret = ttm_bo_bounce_temp_buffer(bo, &res,
>> ctx, &hop);
>> +			/* try and move to final place now. */
>> +			if (!ret)
>> +				goto bounce;
>> +		}
>> +		if (ret) {
>> +			ttm_resource_free(bo, &res);
>> +			return ret;
>> +		}
>> +
>> +	} while (ret && force_space);
>>   
>> -	ret = ttm_bo_move_buffer(bo, placement, ctx);
>>   	/* For backward compatibility with userspace */
>>   	if (ret == -ENOSPC)
>>   		return -ENOMEM;
>> -	if (ret)
>> -		return ret;
>>   
>>   	/*
>>   	 * We might need to add a TTM.
>> diff --git a/drivers/gpu/drm/ttm/ttm_resource.c
>> b/drivers/gpu/drm/ttm/ttm_resource.c
>> index fb14f7716cf8..65155f2013ca 100644
>> --- a/drivers/gpu/drm/ttm/ttm_resource.c
>> +++ b/drivers/gpu/drm/ttm/ttm_resource.c
>> @@ -295,11 +295,13 @@ bool ttm_resource_intersects(struct ttm_device
>> *bdev,
>>    *
>>    * @res: the resource to check
>>    * @placement: the placement to check against
>> + * @evicting: true if the caller is doing evictions
>>    *
>>    * Returns true if the placement is compatible.
>>    */
>>   bool ttm_resource_compatible(struct ttm_resource *res,
>> -			     struct ttm_placement *placement)
>> +			     struct ttm_placement *placement,
>> +			     bool evicting)
>>   {
>>   	struct ttm_buffer_object *bo = res->bo;
>>   	struct ttm_device *bdev = bo->bdev;
>> @@ -315,14 +317,20 @@ bool ttm_resource_compatible(struct
>> ttm_resource *res,
>>   		if (res->mem_type != place->mem_type)
>>   			continue;
>>   
>> +		if (place->flags & (evicting ? TTM_PL_FLAG_DESIRED :
>> +				    TTM_PL_FLAG_FALLBACK))
>> +			continue;
>> +
>> +		if (place->flags & TTM_PL_FLAG_CONTIGUOUS &&
>> +		    !(res->placement & TTM_PL_FLAG_CONTIGUOUS))
>> +			continue;
>> +
>>   		man = ttm_manager_type(bdev, res->mem_type);
>>   		if (man->func->compatible &&
>>   		    !man->func->compatible(man, res, place, bo-
>>> base.size))
>>   			continue;
>>   
>> -		if ((!(place->flags & TTM_PL_FLAG_CONTIGUOUS) ||
>> -		     (res->placement & TTM_PL_FLAG_CONTIGUOUS)))
>> -			return true;
>> +		return true;
>>   	}
>>   	return false;
>>   }
>> diff --git a/include/drm/ttm/ttm_resource.h
>> b/include/drm/ttm/ttm_resource.h
>> index 1afa13f0c22b..7561023db43d 100644
>> --- a/include/drm/ttm/ttm_resource.h
>> +++ b/include/drm/ttm/ttm_resource.h
>> @@ -366,7 +366,8 @@ bool ttm_resource_intersects(struct ttm_device
>> *bdev,
>>   			     const struct ttm_place *place,
>>   			     size_t size);
>>   bool ttm_resource_compatible(struct ttm_resource *res,
>> -			     struct ttm_placement *placement);
>> +			     struct ttm_placement *placement,
>> +			     bool evicting);
>>   void ttm_resource_set_bo(struct ttm_resource *res,
>>   			 struct ttm_buffer_object *bo);
>>   


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

* Re: [PATCH 1/2] drm/ttm: improve idle/busy handling v4
  2024-02-06 12:56     ` Christian König
@ 2024-02-23 14:30       ` Christian König
  2024-02-26 20:21         ` Thomas Hellström
  0 siblings, 1 reply; 13+ messages in thread
From: Christian König @ 2024-02-23 14:30 UTC (permalink / raw)
  To: Thomas Hellström, dri-devel, intel-gfx, nouveau

Am 06.02.24 um 13:56 schrieb Christian König:
> Am 06.02.24 um 13:53 schrieb Thomas Hellström:
>> Hi, Christian,
>>
>> On Fri, 2024-01-26 at 15:09 +0100, Christian König wrote:
>>> Previously we would never try to move a BO into the preferred
>>> placements
>>> when it ever landed in a busy placement since those were considered
>>> compatible.
>>>
>>> Rework the whole handling and finally unify the idle and busy
>>> handling.
>>> ttm_bo_validate() is now responsible to try idle placement first and
>>> then
>>> use the busy placement if that didn't worked.
>>>
>>> Drawback is that we now always try the idle placement first for each
>>> validation which might cause some additional CPU overhead on
>>> overcommit.
>>>
>>> v2: fix kerneldoc warning and coding style
>>> v3: take care of XE as well
>>> v4: keep the ttm_bo_mem_space functionality as it is for now, only
>>> add
>>>      new handling for ttm_bo_validate as suggested by Thomas
>>>
>>> Signed-off-by: Christian König <christian.koenig@amd.com>
>>> Reviewed-by: Zack Rusin <zack.rusin@broadcom.com> v3
>> Sending this through xe CI, will try to review asap.
>
> Take your time. At the moment people are bombarding me with work and I 
> have only two hands and one head as well :(

So I've digged myself out of that hole and would rather like to get this 
new feature into 6.9.

Any time to review it? I can also plan some time to review your LRU 
changes next week.

Thanks,
Christian.

>
> Christian.
>
>>
>> /Thomas
>>
>>
>>> ---
>>>   drivers/gpu/drm/ttm/ttm_bo.c       | 231 +++++++++++++--------------
>>> -- 
>>>   drivers/gpu/drm/ttm/ttm_resource.c |  16 +-
>>>   include/drm/ttm/ttm_resource.h     |   3 +-
>>>   3 files changed, 121 insertions(+), 129 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/ttm/ttm_bo.c
>>> b/drivers/gpu/drm/ttm/ttm_bo.c
>>> index ba3f09e2d7e6..b12f435542a9 100644
>>> --- a/drivers/gpu/drm/ttm/ttm_bo.c
>>> +++ b/drivers/gpu/drm/ttm/ttm_bo.c
>>> @@ -724,64 +724,36 @@ static int ttm_bo_add_move_fence(struct
>>> ttm_buffer_object *bo,
>>>       return ret;
>>>   }
>>>   -/*
>>> - * Repeatedly evict memory from the LRU for @mem_type until we
>>> create enough
>>> - * space, or we've evicted everything and there isn't enough space.
>>> - */
>>> -static int ttm_bo_mem_force_space(struct ttm_buffer_object *bo,
>>> -                  const struct ttm_place *place,
>>> -                  struct ttm_resource **mem,
>>> -                  struct ttm_operation_ctx *ctx)
>>> -{
>>> -    struct ttm_device *bdev = bo->bdev;
>>> -    struct ttm_resource_manager *man;
>>> -    struct ww_acquire_ctx *ticket;
>>> -    int ret;
>>> -
>>> -    man = ttm_manager_type(bdev, place->mem_type);
>>> -    ticket = dma_resv_locking_ctx(bo->base.resv);
>>> -    do {
>>> -        ret = ttm_resource_alloc(bo, place, mem);
>>> -        if (likely(!ret))
>>> -            break;
>>> -        if (unlikely(ret != -ENOSPC))
>>> -            return ret;
>>> -        ret = ttm_mem_evict_first(bdev, man, place, ctx,
>>> -                      ticket);
>>> -        if (unlikely(ret != 0))
>>> -            return ret;
>>> -    } while (1);
>>> -
>>> -    return ttm_bo_add_move_fence(bo, man, *mem, ctx-
>>>> no_wait_gpu);
>>> -}
>>> -
>>>   /**
>>> - * ttm_bo_mem_space
>>> + * ttm_bo_alloc_resource - Allocate backing store for a BO
>>>    *
>>> - * @bo: Pointer to a struct ttm_buffer_object. the data of which
>>> - * we want to allocate space for.
>>> - * @placement: Proposed new placement for the buffer object.
>>> - * @mem: A struct ttm_resource.
>>> + * @bo: Pointer to a struct ttm_buffer_object of which we want a
>>> resource for
>>> + * @placement: Proposed new placement for the buffer object
>>>    * @ctx: if and how to sleep, lock buffers and alloc memory
>>> + * @force_space: If we should evict buffers to force space
>>> + * @res: The resulting struct ttm_resource.
>>>    *
>>> - * Allocate memory space for the buffer object pointed to by @bo,
>>> using
>>> - * the placement flags in @placement, potentially evicting other
>>> idle buffer objects.
>>> - * This function may sleep while waiting for space to become
>>> available.
>>> + * Allocates a resource for the buffer object pointed to by @bo,
>>> using the
>>> + * placement flags in @placement, potentially evicting other buffer
>>> objects when
>>> + * @force_space is true.
>>> + * This function may sleep while waiting for resources to become
>>> available.
>>>    * Returns:
>>> - * -EBUSY: No space available (only if no_wait == 1).
>>> + * -EBUSY: No space available (only if no_wait == true).
>>>    * -ENOSPC: Could not allocate space for the buffer object, either
>>> due to
>>>    * fragmentation or concurrent allocators.
>>>    * -ERESTARTSYS: An interruptible sleep was interrupted by a signal.
>>>    */
>>> -int ttm_bo_mem_space(struct ttm_buffer_object *bo,
>>> -            struct ttm_placement *placement,
>>> -            struct ttm_resource **mem,
>>> -            struct ttm_operation_ctx *ctx)
>>> +static int ttm_bo_alloc_resource(struct ttm_buffer_object *bo,
>>> +                 struct ttm_placement *placement,
>>> +                 struct ttm_operation_ctx *ctx,
>>> +                 bool force_space,
>>> +                 struct ttm_resource **res)
>>>   {
>>>       struct ttm_device *bdev = bo->bdev;
>>> -    bool type_found = false;
>>> +    struct ww_acquire_ctx *ticket;
>>>       int i, ret;
>>>   +    ticket = dma_resv_locking_ctx(bo->base.resv);
>>>       ret = dma_resv_reserve_fences(bo->base.resv, 1);
>>>       if (unlikely(ret))
>>>           return ret;
>>> @@ -790,98 +762,73 @@ int ttm_bo_mem_space(struct ttm_buffer_object
>>> *bo,
>>>           const struct ttm_place *place = &placement-
>>>> placement[i];
>>>           struct ttm_resource_manager *man;
>>>   -        if (place->flags & TTM_PL_FLAG_FALLBACK)
>>> -            continue;
>>> -
>>>           man = ttm_manager_type(bdev, place->mem_type);
>>>           if (!man || !ttm_resource_manager_used(man))
>>>               continue;
>>>   -        type_found = true;
>>> -        ret = ttm_resource_alloc(bo, place, mem);
>>> -        if (ret == -ENOSPC)
>>> +        if (place->flags & (force_space ?
>>> TTM_PL_FLAG_DESIRED :
>>> +                    TTM_PL_FLAG_FALLBACK))
>>> +            continue;
>>> +
>>> +        do {
>>> +            ret = ttm_resource_alloc(bo, place, res);
>>> +            if (unlikely(ret != -ENOSPC))
>>> +                return ret;
>>> +            if (likely(!ret) || !force_space)
>>> +                break;
>>> +
>>> +            ret = ttm_mem_evict_first(bdev, man, place,
>>> ctx,
>>> +                          ticket);
>>> +            if (unlikely(ret == -EBUSY))
>>> +                break;
>>> +            if (unlikely(ret))
>>> +                return ret;
>>> +        } while (1);
>>> +        if (ret)
>>>               continue;
>>> -        if (unlikely(ret))
>>> -            goto error;
>>>   -        ret = ttm_bo_add_move_fence(bo, man, *mem, ctx-
>>>> no_wait_gpu);
>>> +        ret = ttm_bo_add_move_fence(bo, man, *res, ctx-
>>>> no_wait_gpu);
>>>           if (unlikely(ret)) {
>>> -            ttm_resource_free(bo, mem);
>>> +            ttm_resource_free(bo, res);
>>>               if (ret == -EBUSY)
>>>                   continue;
>>>   -            goto error;
>>> +            return ret;
>>>           }
>>>           return 0;
>>>       }
>>>   -    for (i = 0; i < placement->num_placement; ++i) {
>>> -        const struct ttm_place *place = &placement-
>>>> placement[i];
>>> -        struct ttm_resource_manager *man;
>>> -
>>> -        if (place->flags & TTM_PL_FLAG_DESIRED)
>>> -            continue;
>>> -
>>> -        man = ttm_manager_type(bdev, place->mem_type);
>>> -        if (!man || !ttm_resource_manager_used(man))
>>> -            continue;
>>> -
>>> -        type_found = true;
>>> -        ret = ttm_bo_mem_force_space(bo, place, mem, ctx);
>>> -        if (likely(!ret))
>>> -            return 0;
>>> -
>>> -        if (ret && ret != -EBUSY)
>>> -            goto error;
>>> -    }
>>> -
>>> -    ret = -ENOSPC;
>>> -    if (!type_found) {
>>> -        pr_err(TTM_PFX "No compatible memory type found\n");
>>> -        ret = -EINVAL;
>>> -    }
>>> -
>>> -error:
>>> -    return ret;
>>> +    return -ENOSPC;
>>>   }
>>> -EXPORT_SYMBOL(ttm_bo_mem_space);
>>>   -static int ttm_bo_move_buffer(struct ttm_buffer_object *bo,
>>> -                  struct ttm_placement *placement,
>>> -                  struct ttm_operation_ctx *ctx)
>>> +/*
>>> + * ttm_bo_mem_space - Wrapper around ttm_bo_alloc_resource
>>> + *
>>> + * @bo: Pointer to a struct ttm_buffer_object of which we want a
>>> resource for
>>> + * @placement: Proposed new placement for the buffer object
>>> + * @res: The resulting struct ttm_resource.
>>> + * @ctx: if and how to sleep, lock buffers and alloc memory
>>> + *
>>> + * Tries both idle allocation and forcefully eviction of buffers.
>>> See
>>> + * ttm_bo_alloc_resource for details.
>>> + */
>>> +int ttm_bo_mem_space(struct ttm_buffer_object *bo,
>>> +             struct ttm_placement *placement,
>>> +             struct ttm_resource **res,
>>> +             struct ttm_operation_ctx *ctx)
>>>   {
>>> -    struct ttm_resource *mem;
>>> -    struct ttm_place hop;
>>> +    bool force_space = false;
>>>       int ret;
>>>   -    dma_resv_assert_held(bo->base.resv);
>>> +    do {
>>> +        ret = ttm_bo_alloc_resource(bo, placement, ctx,
>>> +                        force_space, res);
>>> +        force_space = !force_space;
>>> +    } while (ret == -ENOSPC && force_space);
>>>   -    /*
>>> -     * Determine where to move the buffer.
>>> -     *
>>> -     * If driver determines move is going to need
>>> -     * an extra step then it will return -EMULTIHOP
>>> -     * and the buffer will be moved to the temporary
>>> -     * stop and the driver will be called to make
>>> -     * the second hop.
>>> -     */
>>> -    ret = ttm_bo_mem_space(bo, placement, &mem, ctx);
>>> -    if (ret)
>>> -        return ret;
>>> -bounce:
>>> -    ret = ttm_bo_handle_move_mem(bo, mem, false, ctx, &hop);
>>> -    if (ret == -EMULTIHOP) {
>>> -        ret = ttm_bo_bounce_temp_buffer(bo, &mem, ctx,
>>> &hop);
>>> -        if (ret)
>>> -            goto out;
>>> -        /* try and move to final place now. */
>>> -        goto bounce;
>>> -    }
>>> -out:
>>> -    if (ret)
>>> -        ttm_resource_free(bo, &mem);
>>>       return ret;
>>>   }
>>> +EXPORT_SYMBOL(ttm_bo_mem_space);
>>>     /**
>>>    * ttm_bo_validate
>>> @@ -902,6 +849,9 @@ int ttm_bo_validate(struct ttm_buffer_object *bo,
>>>               struct ttm_placement *placement,
>>>               struct ttm_operation_ctx *ctx)
>>>   {
>>> +    struct ttm_resource *res;
>>> +    struct ttm_place hop;
>>> +    bool force_space;
>>>       int ret;
>>>         dma_resv_assert_held(bo->base.resv);
>>> @@ -912,20 +862,53 @@ int ttm_bo_validate(struct ttm_buffer_object
>>> *bo,
>>>       if (!placement->num_placement)
>>>           return ttm_bo_pipeline_gutting(bo);
>>>   -    /* Check whether we need to move buffer. */
>>> -    if (bo->resource && ttm_resource_compatible(bo->resource,
>>> placement))
>>> -        return 0;
>>> +    force_space = false;
>>> +    do {
>>> +        /* Check whether we need to move buffer. */
>>> +        if (bo->resource &&
>>> +            ttm_resource_compatible(bo->resource, placement,
>>> +                        force_space))
>>> +            return 0;
>>>   -    /* Moving of pinned BOs is forbidden */
>>> -    if (bo->pin_count)
>>> -        return -EINVAL;
>>> +        /* Moving of pinned BOs is forbidden */
>>> +        if (bo->pin_count)
>>> +            return -EINVAL;
>>> +
>>> +        /*
>>> +         * Determine where to move the buffer.
>>> +         *
>>> +         * If driver determines move is going to need
>>> +         * an extra step then it will return -EMULTIHOP
>>> +         * and the buffer will be moved to the temporary
>>> +         * stop and the driver will be called to make
>>> +         * the second hop.
>>> +         */
>>> +        ret = ttm_bo_alloc_resource(bo, placement, ctx,
>>> force_space,
>>> +                        &res);
>>> +        force_space = !force_space;
>>> +        if (ret == -ENOSPC)
>>> +            continue;
>>> +        if (ret)
>>> +            return ret;
>>> +
>>> +bounce:
>>> +        ret = ttm_bo_handle_move_mem(bo, res, false, ctx,
>>> &hop);
>>> +        if (ret == -EMULTIHOP) {
>>> +            ret = ttm_bo_bounce_temp_buffer(bo, &res,
>>> ctx, &hop);
>>> +            /* try and move to final place now. */
>>> +            if (!ret)
>>> +                goto bounce;
>>> +        }
>>> +        if (ret) {
>>> +            ttm_resource_free(bo, &res);
>>> +            return ret;
>>> +        }
>>> +
>>> +    } while (ret && force_space);
>>>   -    ret = ttm_bo_move_buffer(bo, placement, ctx);
>>>       /* For backward compatibility with userspace */
>>>       if (ret == -ENOSPC)
>>>           return -ENOMEM;
>>> -    if (ret)
>>> -        return ret;
>>>         /*
>>>        * We might need to add a TTM.
>>> diff --git a/drivers/gpu/drm/ttm/ttm_resource.c
>>> b/drivers/gpu/drm/ttm/ttm_resource.c
>>> index fb14f7716cf8..65155f2013ca 100644
>>> --- a/drivers/gpu/drm/ttm/ttm_resource.c
>>> +++ b/drivers/gpu/drm/ttm/ttm_resource.c
>>> @@ -295,11 +295,13 @@ bool ttm_resource_intersects(struct ttm_device
>>> *bdev,
>>>    *
>>>    * @res: the resource to check
>>>    * @placement: the placement to check against
>>> + * @evicting: true if the caller is doing evictions
>>>    *
>>>    * Returns true if the placement is compatible.
>>>    */
>>>   bool ttm_resource_compatible(struct ttm_resource *res,
>>> -                 struct ttm_placement *placement)
>>> +                 struct ttm_placement *placement,
>>> +                 bool evicting)
>>>   {
>>>       struct ttm_buffer_object *bo = res->bo;
>>>       struct ttm_device *bdev = bo->bdev;
>>> @@ -315,14 +317,20 @@ bool ttm_resource_compatible(struct
>>> ttm_resource *res,
>>>           if (res->mem_type != place->mem_type)
>>>               continue;
>>>   +        if (place->flags & (evicting ? TTM_PL_FLAG_DESIRED :
>>> +                    TTM_PL_FLAG_FALLBACK))
>>> +            continue;
>>> +
>>> +        if (place->flags & TTM_PL_FLAG_CONTIGUOUS &&
>>> +            !(res->placement & TTM_PL_FLAG_CONTIGUOUS))
>>> +            continue;
>>> +
>>>           man = ttm_manager_type(bdev, res->mem_type);
>>>           if (man->func->compatible &&
>>>               !man->func->compatible(man, res, place, bo-
>>>> base.size))
>>>               continue;
>>>   -        if ((!(place->flags & TTM_PL_FLAG_CONTIGUOUS) ||
>>> -             (res->placement & TTM_PL_FLAG_CONTIGUOUS)))
>>> -            return true;
>>> +        return true;
>>>       }
>>>       return false;
>>>   }
>>> diff --git a/include/drm/ttm/ttm_resource.h
>>> b/include/drm/ttm/ttm_resource.h
>>> index 1afa13f0c22b..7561023db43d 100644
>>> --- a/include/drm/ttm/ttm_resource.h
>>> +++ b/include/drm/ttm/ttm_resource.h
>>> @@ -366,7 +366,8 @@ bool ttm_resource_intersects(struct ttm_device
>>> *bdev,
>>>                    const struct ttm_place *place,
>>>                    size_t size);
>>>   bool ttm_resource_compatible(struct ttm_resource *res,
>>> -                 struct ttm_placement *placement);
>>> +                 struct ttm_placement *placement,
>>> +                 bool evicting);
>>>   void ttm_resource_set_bo(struct ttm_resource *res,
>>>                struct ttm_buffer_object *bo);
>


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

* Re: [PATCH 1/2] drm/ttm: improve idle/busy handling v4
  2024-02-23 14:30       ` Christian König
@ 2024-02-26 20:21         ` Thomas Hellström
  2024-02-27  8:12           ` Matthew Auld
  0 siblings, 1 reply; 13+ messages in thread
From: Thomas Hellström @ 2024-02-26 20:21 UTC (permalink / raw)
  To: Christian König, dri-devel, intel-gfx, nouveau

Hi, Christian

On Fri, 2024-02-23 at 15:30 +0100, Christian König wrote:
> Am 06.02.24 um 13:56 schrieb Christian König:
> > Am 06.02.24 um 13:53 schrieb Thomas Hellström:
> > > Hi, Christian,
> > > 
> > > On Fri, 2024-01-26 at 15:09 +0100, Christian König wrote:
> > > > Previously we would never try to move a BO into the preferred
> > > > placements
> > > > when it ever landed in a busy placement since those were
> > > > considered
> > > > compatible.
> > > > 
> > > > Rework the whole handling and finally unify the idle and busy
> > > > handling.
> > > > ttm_bo_validate() is now responsible to try idle placement
> > > > first and
> > > > then
> > > > use the busy placement if that didn't worked.
> > > > 
> > > > Drawback is that we now always try the idle placement first for
> > > > each
> > > > validation which might cause some additional CPU overhead on
> > > > overcommit.
> > > > 
> > > > v2: fix kerneldoc warning and coding style
> > > > v3: take care of XE as well
> > > > v4: keep the ttm_bo_mem_space functionality as it is for now,
> > > > only
> > > > add
> > > >      new handling for ttm_bo_validate as suggested by Thomas
> > > > 
> > > > Signed-off-by: Christian König <christian.koenig@amd.com>
> > > > Reviewed-by: Zack Rusin <zack.rusin@broadcom.com> v3
> > > Sending this through xe CI, will try to review asap.
> > 
> > Take your time. At the moment people are bombarding me with work
> > and I 
> > have only two hands and one head as well :(
> 
> So I've digged myself out of that hole and would rather like to get
> this 
> new feature into 6.9.
> 
> Any time to review it? I can also plan some time to review your LRU 
> changes next week.
> 
> Thanks,
> Christian.

Sorry for the late response. Was planning to review but saw that there
was still an xe CI failure.

https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-129579v1/bat-atsm-2/igt@xe_evict_ccs@evict-overcommit-parallel-nofree-samefd.html

I haven't really had time to look into what might be causing this,
though.

/Thomas

> 
> > 
> > Christian.
> > 
> > > 
> > > /Thomas
> > > 
> > > 
> > > > ---
> > > >   drivers/gpu/drm/ttm/ttm_bo.c       | 231 +++++++++++++-------
> > > > -------
> > > > -- 
> > > >   drivers/gpu/drm/ttm/ttm_resource.c |  16 +-
> > > >   include/drm/ttm/ttm_resource.h     |   3 +-
> > > >   3 files changed, 121 insertions(+), 129 deletions(-)
> > > > 
> > > > diff --git a/drivers/gpu/drm/ttm/ttm_bo.c
> > > > b/drivers/gpu/drm/ttm/ttm_bo.c
> > > > index ba3f09e2d7e6..b12f435542a9 100644
> > > > --- a/drivers/gpu/drm/ttm/ttm_bo.c
> > > > +++ b/drivers/gpu/drm/ttm/ttm_bo.c
> > > > @@ -724,64 +724,36 @@ static int ttm_bo_add_move_fence(struct
> > > > ttm_buffer_object *bo,
> > > >       return ret;
> > > >   }
> > > >   -/*
> > > > - * Repeatedly evict memory from the LRU for @mem_type until we
> > > > create enough
> > > > - * space, or we've evicted everything and there isn't enough
> > > > space.
> > > > - */
> > > > -static int ttm_bo_mem_force_space(struct ttm_buffer_object
> > > > *bo,
> > > > -                  const struct ttm_place *place,
> > > > -                  struct ttm_resource **mem,
> > > > -                  struct ttm_operation_ctx *ctx)
> > > > -{
> > > > -    struct ttm_device *bdev = bo->bdev;
> > > > -    struct ttm_resource_manager *man;
> > > > -    struct ww_acquire_ctx *ticket;
> > > > -    int ret;
> > > > -
> > > > -    man = ttm_manager_type(bdev, place->mem_type);
> > > > -    ticket = dma_resv_locking_ctx(bo->base.resv);
> > > > -    do {
> > > > -        ret = ttm_resource_alloc(bo, place, mem);
> > > > -        if (likely(!ret))
> > > > -            break;
> > > > -        if (unlikely(ret != -ENOSPC))
> > > > -            return ret;
> > > > -        ret = ttm_mem_evict_first(bdev, man, place, ctx,
> > > > -                      ticket);
> > > > -        if (unlikely(ret != 0))
> > > > -            return ret;
> > > > -    } while (1);
> > > > -
> > > > -    return ttm_bo_add_move_fence(bo, man, *mem, ctx-
> > > > > no_wait_gpu);
> > > > -}
> > > > -
> > > >   /**
> > > > - * ttm_bo_mem_space
> > > > + * ttm_bo_alloc_resource - Allocate backing store for a BO
> > > >    *
> > > > - * @bo: Pointer to a struct ttm_buffer_object. the data of
> > > > which
> > > > - * we want to allocate space for.
> > > > - * @placement: Proposed new placement for the buffer object.
> > > > - * @mem: A struct ttm_resource.
> > > > + * @bo: Pointer to a struct ttm_buffer_object of which we want
> > > > a
> > > > resource for
> > > > + * @placement: Proposed new placement for the buffer object
> > > >    * @ctx: if and how to sleep, lock buffers and alloc memory
> > > > + * @force_space: If we should evict buffers to force space
> > > > + * @res: The resulting struct ttm_resource.
> > > >    *
> > > > - * Allocate memory space for the buffer object pointed to by
> > > > @bo,
> > > > using
> > > > - * the placement flags in @placement, potentially evicting
> > > > other
> > > > idle buffer objects.
> > > > - * This function may sleep while waiting for space to become
> > > > available.
> > > > + * Allocates a resource for the buffer object pointed to by
> > > > @bo,
> > > > using the
> > > > + * placement flags in @placement, potentially evicting other
> > > > buffer
> > > > objects when
> > > > + * @force_space is true.
> > > > + * This function may sleep while waiting for resources to
> > > > become
> > > > available.
> > > >    * Returns:
> > > > - * -EBUSY: No space available (only if no_wait == 1).
> > > > + * -EBUSY: No space available (only if no_wait == true).
> > > >    * -ENOSPC: Could not allocate space for the buffer object,
> > > > either
> > > > due to
> > > >    * fragmentation or concurrent allocators.
> > > >    * -ERESTARTSYS: An interruptible sleep was interrupted by a
> > > > signal.
> > > >    */
> > > > -int ttm_bo_mem_space(struct ttm_buffer_object *bo,
> > > > -            struct ttm_placement *placement,
> > > > -            struct ttm_resource **mem,
> > > > -            struct ttm_operation_ctx *ctx)
> > > > +static int ttm_bo_alloc_resource(struct ttm_buffer_object *bo,
> > > > +                 struct ttm_placement *placement,
> > > > +                 struct ttm_operation_ctx *ctx,
> > > > +                 bool force_space,
> > > > +                 struct ttm_resource **res)
> > > >   {
> > > >       struct ttm_device *bdev = bo->bdev;
> > > > -    bool type_found = false;
> > > > +    struct ww_acquire_ctx *ticket;
> > > >       int i, ret;
> > > >   +    ticket = dma_resv_locking_ctx(bo->base.resv);
> > > >       ret = dma_resv_reserve_fences(bo->base.resv, 1);
> > > >       if (unlikely(ret))
> > > >           return ret;
> > > > @@ -790,98 +762,73 @@ int ttm_bo_mem_space(struct
> > > > ttm_buffer_object
> > > > *bo,
> > > >           const struct ttm_place *place = &placement-
> > > > > placement[i];
> > > >           struct ttm_resource_manager *man;
> > > >   -        if (place->flags & TTM_PL_FLAG_FALLBACK)
> > > > -            continue;
> > > > -
> > > >           man = ttm_manager_type(bdev, place->mem_type);
> > > >           if (!man || !ttm_resource_manager_used(man))
> > > >               continue;
> > > >   -        type_found = true;
> > > > -        ret = ttm_resource_alloc(bo, place, mem);
> > > > -        if (ret == -ENOSPC)
> > > > +        if (place->flags & (force_space ?
> > > > TTM_PL_FLAG_DESIRED :
> > > > +                    TTM_PL_FLAG_FALLBACK))
> > > > +            continue;
> > > > +
> > > > +        do {
> > > > +            ret = ttm_resource_alloc(bo, place, res);
> > > > +            if (unlikely(ret != -ENOSPC))
> > > > +                return ret;
> > > > +            if (likely(!ret) || !force_space)
> > > > +                break;
> > > > +
> > > > +            ret = ttm_mem_evict_first(bdev, man, place,
> > > > ctx,
> > > > +                          ticket);
> > > > +            if (unlikely(ret == -EBUSY))
> > > > +                break;
> > > > +            if (unlikely(ret))
> > > > +                return ret;
> > > > +        } while (1);
> > > > +        if (ret)
> > > >               continue;
> > > > -        if (unlikely(ret))
> > > > -            goto error;
> > > >   -        ret = ttm_bo_add_move_fence(bo, man, *mem, ctx-
> > > > > no_wait_gpu);
> > > > +        ret = ttm_bo_add_move_fence(bo, man, *res, ctx-
> > > > > no_wait_gpu);
> > > >           if (unlikely(ret)) {
> > > > -            ttm_resource_free(bo, mem);
> > > > +            ttm_resource_free(bo, res);
> > > >               if (ret == -EBUSY)
> > > >                   continue;
> > > >   -            goto error;
> > > > +            return ret;
> > > >           }
> > > >           return 0;
> > > >       }
> > > >   -    for (i = 0; i < placement->num_placement; ++i) {
> > > > -        const struct ttm_place *place = &placement-
> > > > > placement[i];
> > > > -        struct ttm_resource_manager *man;
> > > > -
> > > > -        if (place->flags & TTM_PL_FLAG_DESIRED)
> > > > -            continue;
> > > > -
> > > > -        man = ttm_manager_type(bdev, place->mem_type);
> > > > -        if (!man || !ttm_resource_manager_used(man))
> > > > -            continue;
> > > > -
> > > > -        type_found = true;
> > > > -        ret = ttm_bo_mem_force_space(bo, place, mem, ctx);
> > > > -        if (likely(!ret))
> > > > -            return 0;
> > > > -
> > > > -        if (ret && ret != -EBUSY)
> > > > -            goto error;
> > > > -    }
> > > > -
> > > > -    ret = -ENOSPC;
> > > > -    if (!type_found) {
> > > > -        pr_err(TTM_PFX "No compatible memory type found\n");
> > > > -        ret = -EINVAL;
> > > > -    }
> > > > -
> > > > -error:
> > > > -    return ret;
> > > > +    return -ENOSPC;
> > > >   }
> > > > -EXPORT_SYMBOL(ttm_bo_mem_space);
> > > >   -static int ttm_bo_move_buffer(struct ttm_buffer_object *bo,
> > > > -                  struct ttm_placement *placement,
> > > > -                  struct ttm_operation_ctx *ctx)
> > > > +/*
> > > > + * ttm_bo_mem_space - Wrapper around ttm_bo_alloc_resource
> > > > + *
> > > > + * @bo: Pointer to a struct ttm_buffer_object of which we want
> > > > a
> > > > resource for
> > > > + * @placement: Proposed new placement for the buffer object
> > > > + * @res: The resulting struct ttm_resource.
> > > > + * @ctx: if and how to sleep, lock buffers and alloc memory
> > > > + *
> > > > + * Tries both idle allocation and forcefully eviction of
> > > > buffers.
> > > > See
> > > > + * ttm_bo_alloc_resource for details.
> > > > + */
> > > > +int ttm_bo_mem_space(struct ttm_buffer_object *bo,
> > > > +             struct ttm_placement *placement,
> > > > +             struct ttm_resource **res,
> > > > +             struct ttm_operation_ctx *ctx)
> > > >   {
> > > > -    struct ttm_resource *mem;
> > > > -    struct ttm_place hop;
> > > > +    bool force_space = false;
> > > >       int ret;
> > > >   -    dma_resv_assert_held(bo->base.resv);
> > > > +    do {
> > > > +        ret = ttm_bo_alloc_resource(bo, placement, ctx,
> > > > +                        force_space, res);
> > > > +        force_space = !force_space;
> > > > +    } while (ret == -ENOSPC && force_space);
> > > >   -    /*
> > > > -     * Determine where to move the buffer.
> > > > -     *
> > > > -     * If driver determines move is going to need
> > > > -     * an extra step then it will return -EMULTIHOP
> > > > -     * and the buffer will be moved to the temporary
> > > > -     * stop and the driver will be called to make
> > > > -     * the second hop.
> > > > -     */
> > > > -    ret = ttm_bo_mem_space(bo, placement, &mem, ctx);
> > > > -    if (ret)
> > > > -        return ret;
> > > > -bounce:
> > > > -    ret = ttm_bo_handle_move_mem(bo, mem, false, ctx, &hop);
> > > > -    if (ret == -EMULTIHOP) {
> > > > -        ret = ttm_bo_bounce_temp_buffer(bo, &mem, ctx,
> > > > &hop);
> > > > -        if (ret)
> > > > -            goto out;
> > > > -        /* try and move to final place now. */
> > > > -        goto bounce;
> > > > -    }
> > > > -out:
> > > > -    if (ret)
> > > > -        ttm_resource_free(bo, &mem);
> > > >       return ret;
> > > >   }
> > > > +EXPORT_SYMBOL(ttm_bo_mem_space);
> > > >     /**
> > > >    * ttm_bo_validate
> > > > @@ -902,6 +849,9 @@ int ttm_bo_validate(struct
> > > > ttm_buffer_object *bo,
> > > >               struct ttm_placement *placement,
> > > >               struct ttm_operation_ctx *ctx)
> > > >   {
> > > > +    struct ttm_resource *res;
> > > > +    struct ttm_place hop;
> > > > +    bool force_space;
> > > >       int ret;
> > > >         dma_resv_assert_held(bo->base.resv);
> > > > @@ -912,20 +862,53 @@ int ttm_bo_validate(struct
> > > > ttm_buffer_object
> > > > *bo,
> > > >       if (!placement->num_placement)
> > > >           return ttm_bo_pipeline_gutting(bo);
> > > >   -    /* Check whether we need to move buffer. */
> > > > -    if (bo->resource && ttm_resource_compatible(bo->resource,
> > > > placement))
> > > > -        return 0;
> > > > +    force_space = false;
> > > > +    do {
> > > > +        /* Check whether we need to move buffer. */
> > > > +        if (bo->resource &&
> > > > +            ttm_resource_compatible(bo->resource, placement,
> > > > +                        force_space))
> > > > +            return 0;
> > > >   -    /* Moving of pinned BOs is forbidden */
> > > > -    if (bo->pin_count)
> > > > -        return -EINVAL;
> > > > +        /* Moving of pinned BOs is forbidden */
> > > > +        if (bo->pin_count)
> > > > +            return -EINVAL;
> > > > +
> > > > +        /*
> > > > +         * Determine where to move the buffer.
> > > > +         *
> > > > +         * If driver determines move is going to need
> > > > +         * an extra step then it will return -EMULTIHOP
> > > > +         * and the buffer will be moved to the temporary
> > > > +         * stop and the driver will be called to make
> > > > +         * the second hop.
> > > > +         */
> > > > +        ret = ttm_bo_alloc_resource(bo, placement, ctx,
> > > > force_space,
> > > > +                        &res);
> > > > +        force_space = !force_space;
> > > > +        if (ret == -ENOSPC)
> > > > +            continue;
> > > > +        if (ret)
> > > > +            return ret;
> > > > +
> > > > +bounce:
> > > > +        ret = ttm_bo_handle_move_mem(bo, res, false, ctx,
> > > > &hop);
> > > > +        if (ret == -EMULTIHOP) {
> > > > +            ret = ttm_bo_bounce_temp_buffer(bo, &res,
> > > > ctx, &hop);
> > > > +            /* try and move to final place now. */
> > > > +            if (!ret)
> > > > +                goto bounce;
> > > > +        }
> > > > +        if (ret) {
> > > > +            ttm_resource_free(bo, &res);
> > > > +            return ret;
> > > > +        }
> > > > +
> > > > +    } while (ret && force_space);
> > > >   -    ret = ttm_bo_move_buffer(bo, placement, ctx);
> > > >       /* For backward compatibility with userspace */
> > > >       if (ret == -ENOSPC)
> > > >           return -ENOMEM;
> > > > -    if (ret)
> > > > -        return ret;
> > > >         /*
> > > >        * We might need to add a TTM.
> > > > diff --git a/drivers/gpu/drm/ttm/ttm_resource.c
> > > > b/drivers/gpu/drm/ttm/ttm_resource.c
> > > > index fb14f7716cf8..65155f2013ca 100644
> > > > --- a/drivers/gpu/drm/ttm/ttm_resource.c
> > > > +++ b/drivers/gpu/drm/ttm/ttm_resource.c
> > > > @@ -295,11 +295,13 @@ bool ttm_resource_intersects(struct
> > > > ttm_device
> > > > *bdev,
> > > >    *
> > > >    * @res: the resource to check
> > > >    * @placement: the placement to check against
> > > > + * @evicting: true if the caller is doing evictions
> > > >    *
> > > >    * Returns true if the placement is compatible.
> > > >    */
> > > >   bool ttm_resource_compatible(struct ttm_resource *res,
> > > > -                 struct ttm_placement *placement)
> > > > +                 struct ttm_placement *placement,
> > > > +                 bool evicting)
> > > >   {
> > > >       struct ttm_buffer_object *bo = res->bo;
> > > >       struct ttm_device *bdev = bo->bdev;
> > > > @@ -315,14 +317,20 @@ bool ttm_resource_compatible(struct
> > > > ttm_resource *res,
> > > >           if (res->mem_type != place->mem_type)
> > > >               continue;
> > > >   +        if (place->flags & (evicting ? TTM_PL_FLAG_DESIRED :
> > > > +                    TTM_PL_FLAG_FALLBACK))
> > > > +            continue;
> > > > +
> > > > +        if (place->flags & TTM_PL_FLAG_CONTIGUOUS &&
> > > > +            !(res->placement & TTM_PL_FLAG_CONTIGUOUS))
> > > > +            continue;
> > > > +
> > > >           man = ttm_manager_type(bdev, res->mem_type);
> > > >           if (man->func->compatible &&
> > > >               !man->func->compatible(man, res, place, bo-
> > > > > base.size))
> > > >               continue;
> > > >   -        if ((!(place->flags & TTM_PL_FLAG_CONTIGUOUS) ||
> > > > -             (res->placement & TTM_PL_FLAG_CONTIGUOUS)))
> > > > -            return true;
> > > > +        return true;
> > > >       }
> > > >       return false;
> > > >   }
> > > > diff --git a/include/drm/ttm/ttm_resource.h
> > > > b/include/drm/ttm/ttm_resource.h
> > > > index 1afa13f0c22b..7561023db43d 100644
> > > > --- a/include/drm/ttm/ttm_resource.h
> > > > +++ b/include/drm/ttm/ttm_resource.h
> > > > @@ -366,7 +366,8 @@ bool ttm_resource_intersects(struct
> > > > ttm_device
> > > > *bdev,
> > > >                    const struct ttm_place *place,
> > > >                    size_t size);
> > > >   bool ttm_resource_compatible(struct ttm_resource *res,
> > > > -                 struct ttm_placement *placement);
> > > > +                 struct ttm_placement *placement,
> > > > +                 bool evicting);
> > > >   void ttm_resource_set_bo(struct ttm_resource *res,
> > > >                struct ttm_buffer_object *bo);
> > 
> 


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

* Re: [PATCH 1/2] drm/ttm: improve idle/busy handling v4
  2024-02-26 20:21         ` Thomas Hellström
@ 2024-02-27  8:12           ` Matthew Auld
  2024-02-27  8:33             ` Christian König
  0 siblings, 1 reply; 13+ messages in thread
From: Matthew Auld @ 2024-02-27  8:12 UTC (permalink / raw)
  To: Thomas Hellström, Christian König, dri-devel, intel-gfx,
	nouveau

On 26/02/2024 20:21, Thomas Hellström wrote:
> Hi, Christian
> 
> On Fri, 2024-02-23 at 15:30 +0100, Christian König wrote:
>> Am 06.02.24 um 13:56 schrieb Christian König:
>>> Am 06.02.24 um 13:53 schrieb Thomas Hellström:
>>>> Hi, Christian,
>>>>
>>>> On Fri, 2024-01-26 at 15:09 +0100, Christian König wrote:
>>>>> Previously we would never try to move a BO into the preferred
>>>>> placements
>>>>> when it ever landed in a busy placement since those were
>>>>> considered
>>>>> compatible.
>>>>>
>>>>> Rework the whole handling and finally unify the idle and busy
>>>>> handling.
>>>>> ttm_bo_validate() is now responsible to try idle placement
>>>>> first and
>>>>> then
>>>>> use the busy placement if that didn't worked.
>>>>>
>>>>> Drawback is that we now always try the idle placement first for
>>>>> each
>>>>> validation which might cause some additional CPU overhead on
>>>>> overcommit.
>>>>>
>>>>> v2: fix kerneldoc warning and coding style
>>>>> v3: take care of XE as well
>>>>> v4: keep the ttm_bo_mem_space functionality as it is for now,
>>>>> only
>>>>> add
>>>>>       new handling for ttm_bo_validate as suggested by Thomas
>>>>>
>>>>> Signed-off-by: Christian König <christian.koenig@amd.com>
>>>>> Reviewed-by: Zack Rusin <zack.rusin@broadcom.com> v3
>>>> Sending this through xe CI, will try to review asap.
>>>
>>> Take your time. At the moment people are bombarding me with work
>>> and I
>>> have only two hands and one head as well :(
>>
>> So I've digged myself out of that hole and would rather like to get
>> this
>> new feature into 6.9.
>>
>> Any time to review it? I can also plan some time to review your LRU
>> changes next week.
>>
>> Thanks,
>> Christian.
> 
> Sorry for the late response. Was planning to review but saw that there
> was still an xe CI failure.
> 
> https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-129579v1/bat-atsm-2/igt@xe_evict_ccs@evict-overcommit-parallel-nofree-samefd.html
> 
> I haven't really had time to look into what might be causing this,
> though.
Maybe in ttm_bo_alloc_resource():

@@ -772,7 +772,7 @@ static int ttm_bo_alloc_resource(struct 
ttm_buffer_object *bo,

                 do {
                         ret = ttm_resource_alloc(bo, place, res);
-                       if (unlikely(ret != -ENOSPC))
+                       if (unlikely(ret && ret != -ENOSPC))
                                 return ret;
                         if (likely(!ret) || !force_space)
                                 break;

Otherwise we allocate VRAM but never correctly synchronise against the 
move fence, since we missed adding it to the BO. When we trigger async 
evictions that would explain the above test failure where we detect VRAM 
corruption, since someone else is still using the VRAM we allocated. 
What do you think?

> 
> /Thomas
> 
>>
>>>
>>> Christian.
>>>
>>>>
>>>> /Thomas
>>>>
>>>>
>>>>> ---
>>>>>    drivers/gpu/drm/ttm/ttm_bo.c       | 231 +++++++++++++-------
>>>>> -------
>>>>> -- 
>>>>>    drivers/gpu/drm/ttm/ttm_resource.c |  16 +-
>>>>>    include/drm/ttm/ttm_resource.h     |   3 +-
>>>>>    3 files changed, 121 insertions(+), 129 deletions(-)
>>>>>
>>>>> diff --git a/drivers/gpu/drm/ttm/ttm_bo.c
>>>>> b/drivers/gpu/drm/ttm/ttm_bo.c
>>>>> index ba3f09e2d7e6..b12f435542a9 100644
>>>>> --- a/drivers/gpu/drm/ttm/ttm_bo.c
>>>>> +++ b/drivers/gpu/drm/ttm/ttm_bo.c
>>>>> @@ -724,64 +724,36 @@ static int ttm_bo_add_move_fence(struct
>>>>> ttm_buffer_object *bo,
>>>>>        return ret;
>>>>>    }
>>>>>    -/*
>>>>> - * Repeatedly evict memory from the LRU for @mem_type until we
>>>>> create enough
>>>>> - * space, or we've evicted everything and there isn't enough
>>>>> space.
>>>>> - */
>>>>> -static int ttm_bo_mem_force_space(struct ttm_buffer_object
>>>>> *bo,
>>>>> -                  const struct ttm_place *place,
>>>>> -                  struct ttm_resource **mem,
>>>>> -                  struct ttm_operation_ctx *ctx)
>>>>> -{
>>>>> -    struct ttm_device *bdev = bo->bdev;
>>>>> -    struct ttm_resource_manager *man;
>>>>> -    struct ww_acquire_ctx *ticket;
>>>>> -    int ret;
>>>>> -
>>>>> -    man = ttm_manager_type(bdev, place->mem_type);
>>>>> -    ticket = dma_resv_locking_ctx(bo->base.resv);
>>>>> -    do {
>>>>> -        ret = ttm_resource_alloc(bo, place, mem);
>>>>> -        if (likely(!ret))
>>>>> -            break;
>>>>> -        if (unlikely(ret != -ENOSPC))
>>>>> -            return ret;
>>>>> -        ret = ttm_mem_evict_first(bdev, man, place, ctx,
>>>>> -                      ticket);
>>>>> -        if (unlikely(ret != 0))
>>>>> -            return ret;
>>>>> -    } while (1);
>>>>> -
>>>>> -    return ttm_bo_add_move_fence(bo, man, *mem, ctx-
>>>>>> no_wait_gpu);
>>>>> -}
>>>>> -
>>>>>    /**
>>>>> - * ttm_bo_mem_space
>>>>> + * ttm_bo_alloc_resource - Allocate backing store for a BO
>>>>>     *
>>>>> - * @bo: Pointer to a struct ttm_buffer_object. the data of
>>>>> which
>>>>> - * we want to allocate space for.
>>>>> - * @placement: Proposed new placement for the buffer object.
>>>>> - * @mem: A struct ttm_resource.
>>>>> + * @bo: Pointer to a struct ttm_buffer_object of which we want
>>>>> a
>>>>> resource for
>>>>> + * @placement: Proposed new placement for the buffer object
>>>>>     * @ctx: if and how to sleep, lock buffers and alloc memory
>>>>> + * @force_space: If we should evict buffers to force space
>>>>> + * @res: The resulting struct ttm_resource.
>>>>>     *
>>>>> - * Allocate memory space for the buffer object pointed to by
>>>>> @bo,
>>>>> using
>>>>> - * the placement flags in @placement, potentially evicting
>>>>> other
>>>>> idle buffer objects.
>>>>> - * This function may sleep while waiting for space to become
>>>>> available.
>>>>> + * Allocates a resource for the buffer object pointed to by
>>>>> @bo,
>>>>> using the
>>>>> + * placement flags in @placement, potentially evicting other
>>>>> buffer
>>>>> objects when
>>>>> + * @force_space is true.
>>>>> + * This function may sleep while waiting for resources to
>>>>> become
>>>>> available.
>>>>>     * Returns:
>>>>> - * -EBUSY: No space available (only if no_wait == 1).
>>>>> + * -EBUSY: No space available (only if no_wait == true).
>>>>>     * -ENOSPC: Could not allocate space for the buffer object,
>>>>> either
>>>>> due to
>>>>>     * fragmentation or concurrent allocators.
>>>>>     * -ERESTARTSYS: An interruptible sleep was interrupted by a
>>>>> signal.
>>>>>     */
>>>>> -int ttm_bo_mem_space(struct ttm_buffer_object *bo,
>>>>> -            struct ttm_placement *placement,
>>>>> -            struct ttm_resource **mem,
>>>>> -            struct ttm_operation_ctx *ctx)
>>>>> +static int ttm_bo_alloc_resource(struct ttm_buffer_object *bo,
>>>>> +                 struct ttm_placement *placement,
>>>>> +                 struct ttm_operation_ctx *ctx,
>>>>> +                 bool force_space,
>>>>> +                 struct ttm_resource **res)
>>>>>    {
>>>>>        struct ttm_device *bdev = bo->bdev;
>>>>> -    bool type_found = false;
>>>>> +    struct ww_acquire_ctx *ticket;
>>>>>        int i, ret;
>>>>>    +    ticket = dma_resv_locking_ctx(bo->base.resv);
>>>>>        ret = dma_resv_reserve_fences(bo->base.resv, 1);
>>>>>        if (unlikely(ret))
>>>>>            return ret;
>>>>> @@ -790,98 +762,73 @@ int ttm_bo_mem_space(struct
>>>>> ttm_buffer_object
>>>>> *bo,
>>>>>            const struct ttm_place *place = &placement-
>>>>>> placement[i];
>>>>>            struct ttm_resource_manager *man;
>>>>>    -        if (place->flags & TTM_PL_FLAG_FALLBACK)
>>>>> -            continue;
>>>>> -
>>>>>            man = ttm_manager_type(bdev, place->mem_type);
>>>>>            if (!man || !ttm_resource_manager_used(man))
>>>>>                continue;
>>>>>    -        type_found = true;
>>>>> -        ret = ttm_resource_alloc(bo, place, mem);
>>>>> -        if (ret == -ENOSPC)
>>>>> +        if (place->flags & (force_space ?
>>>>> TTM_PL_FLAG_DESIRED :
>>>>> +                    TTM_PL_FLAG_FALLBACK))
>>>>> +            continue;
>>>>> +
>>>>> +        do {
>>>>> +            ret = ttm_resource_alloc(bo, place, res);
>>>>> +            if (unlikely(ret != -ENOSPC))
>>>>> +                return ret;
>>>>> +            if (likely(!ret) || !force_space)
>>>>> +                break;
>>>>> +
>>>>> +            ret = ttm_mem_evict_first(bdev, man, place,
>>>>> ctx,
>>>>> +                          ticket);
>>>>> +            if (unlikely(ret == -EBUSY))
>>>>> +                break;
>>>>> +            if (unlikely(ret))
>>>>> +                return ret;
>>>>> +        } while (1);
>>>>> +        if (ret)
>>>>>                continue;
>>>>> -        if (unlikely(ret))
>>>>> -            goto error;
>>>>>    -        ret = ttm_bo_add_move_fence(bo, man, *mem, ctx-
>>>>>> no_wait_gpu);
>>>>> +        ret = ttm_bo_add_move_fence(bo, man, *res, ctx-
>>>>>> no_wait_gpu);
>>>>>            if (unlikely(ret)) {
>>>>> -            ttm_resource_free(bo, mem);
>>>>> +            ttm_resource_free(bo, res);
>>>>>                if (ret == -EBUSY)
>>>>>                    continue;
>>>>>    -            goto error;
>>>>> +            return ret;
>>>>>            }
>>>>>            return 0;
>>>>>        }
>>>>>    -    for (i = 0; i < placement->num_placement; ++i) {
>>>>> -        const struct ttm_place *place = &placement-
>>>>>> placement[i];
>>>>> -        struct ttm_resource_manager *man;
>>>>> -
>>>>> -        if (place->flags & TTM_PL_FLAG_DESIRED)
>>>>> -            continue;
>>>>> -
>>>>> -        man = ttm_manager_type(bdev, place->mem_type);
>>>>> -        if (!man || !ttm_resource_manager_used(man))
>>>>> -            continue;
>>>>> -
>>>>> -        type_found = true;
>>>>> -        ret = ttm_bo_mem_force_space(bo, place, mem, ctx);
>>>>> -        if (likely(!ret))
>>>>> -            return 0;
>>>>> -
>>>>> -        if (ret && ret != -EBUSY)
>>>>> -            goto error;
>>>>> -    }
>>>>> -
>>>>> -    ret = -ENOSPC;
>>>>> -    if (!type_found) {
>>>>> -        pr_err(TTM_PFX "No compatible memory type found\n");
>>>>> -        ret = -EINVAL;
>>>>> -    }
>>>>> -
>>>>> -error:
>>>>> -    return ret;
>>>>> +    return -ENOSPC;
>>>>>    }
>>>>> -EXPORT_SYMBOL(ttm_bo_mem_space);
>>>>>    -static int ttm_bo_move_buffer(struct ttm_buffer_object *bo,
>>>>> -                  struct ttm_placement *placement,
>>>>> -                  struct ttm_operation_ctx *ctx)
>>>>> +/*
>>>>> + * ttm_bo_mem_space - Wrapper around ttm_bo_alloc_resource
>>>>> + *
>>>>> + * @bo: Pointer to a struct ttm_buffer_object of which we want
>>>>> a
>>>>> resource for
>>>>> + * @placement: Proposed new placement for the buffer object
>>>>> + * @res: The resulting struct ttm_resource.
>>>>> + * @ctx: if and how to sleep, lock buffers and alloc memory
>>>>> + *
>>>>> + * Tries both idle allocation and forcefully eviction of
>>>>> buffers.
>>>>> See
>>>>> + * ttm_bo_alloc_resource for details.
>>>>> + */
>>>>> +int ttm_bo_mem_space(struct ttm_buffer_object *bo,
>>>>> +             struct ttm_placement *placement,
>>>>> +             struct ttm_resource **res,
>>>>> +             struct ttm_operation_ctx *ctx)
>>>>>    {
>>>>> -    struct ttm_resource *mem;
>>>>> -    struct ttm_place hop;
>>>>> +    bool force_space = false;
>>>>>        int ret;
>>>>>    -    dma_resv_assert_held(bo->base.resv);
>>>>> +    do {
>>>>> +        ret = ttm_bo_alloc_resource(bo, placement, ctx,
>>>>> +                        force_space, res);
>>>>> +        force_space = !force_space;
>>>>> +    } while (ret == -ENOSPC && force_space);
>>>>>    -    /*
>>>>> -     * Determine where to move the buffer.
>>>>> -     *
>>>>> -     * If driver determines move is going to need
>>>>> -     * an extra step then it will return -EMULTIHOP
>>>>> -     * and the buffer will be moved to the temporary
>>>>> -     * stop and the driver will be called to make
>>>>> -     * the second hop.
>>>>> -     */
>>>>> -    ret = ttm_bo_mem_space(bo, placement, &mem, ctx);
>>>>> -    if (ret)
>>>>> -        return ret;
>>>>> -bounce:
>>>>> -    ret = ttm_bo_handle_move_mem(bo, mem, false, ctx, &hop);
>>>>> -    if (ret == -EMULTIHOP) {
>>>>> -        ret = ttm_bo_bounce_temp_buffer(bo, &mem, ctx,
>>>>> &hop);
>>>>> -        if (ret)
>>>>> -            goto out;
>>>>> -        /* try and move to final place now. */
>>>>> -        goto bounce;
>>>>> -    }
>>>>> -out:
>>>>> -    if (ret)
>>>>> -        ttm_resource_free(bo, &mem);
>>>>>        return ret;
>>>>>    }
>>>>> +EXPORT_SYMBOL(ttm_bo_mem_space);
>>>>>      /**
>>>>>     * ttm_bo_validate
>>>>> @@ -902,6 +849,9 @@ int ttm_bo_validate(struct
>>>>> ttm_buffer_object *bo,
>>>>>                struct ttm_placement *placement,
>>>>>                struct ttm_operation_ctx *ctx)
>>>>>    {
>>>>> +    struct ttm_resource *res;
>>>>> +    struct ttm_place hop;
>>>>> +    bool force_space;
>>>>>        int ret;
>>>>>          dma_resv_assert_held(bo->base.resv);
>>>>> @@ -912,20 +862,53 @@ int ttm_bo_validate(struct
>>>>> ttm_buffer_object
>>>>> *bo,
>>>>>        if (!placement->num_placement)
>>>>>            return ttm_bo_pipeline_gutting(bo);
>>>>>    -    /* Check whether we need to move buffer. */
>>>>> -    if (bo->resource && ttm_resource_compatible(bo->resource,
>>>>> placement))
>>>>> -        return 0;
>>>>> +    force_space = false;
>>>>> +    do {
>>>>> +        /* Check whether we need to move buffer. */
>>>>> +        if (bo->resource &&
>>>>> +            ttm_resource_compatible(bo->resource, placement,
>>>>> +                        force_space))
>>>>> +            return 0;
>>>>>    -    /* Moving of pinned BOs is forbidden */
>>>>> -    if (bo->pin_count)
>>>>> -        return -EINVAL;
>>>>> +        /* Moving of pinned BOs is forbidden */
>>>>> +        if (bo->pin_count)
>>>>> +            return -EINVAL;
>>>>> +
>>>>> +        /*
>>>>> +         * Determine where to move the buffer.
>>>>> +         *
>>>>> +         * If driver determines move is going to need
>>>>> +         * an extra step then it will return -EMULTIHOP
>>>>> +         * and the buffer will be moved to the temporary
>>>>> +         * stop and the driver will be called to make
>>>>> +         * the second hop.
>>>>> +         */
>>>>> +        ret = ttm_bo_alloc_resource(bo, placement, ctx,
>>>>> force_space,
>>>>> +                        &res);
>>>>> +        force_space = !force_space;
>>>>> +        if (ret == -ENOSPC)
>>>>> +            continue;
>>>>> +        if (ret)
>>>>> +            return ret;
>>>>> +
>>>>> +bounce:
>>>>> +        ret = ttm_bo_handle_move_mem(bo, res, false, ctx,
>>>>> &hop);
>>>>> +        if (ret == -EMULTIHOP) {
>>>>> +            ret = ttm_bo_bounce_temp_buffer(bo, &res,
>>>>> ctx, &hop);
>>>>> +            /* try and move to final place now. */
>>>>> +            if (!ret)
>>>>> +                goto bounce;
>>>>> +        }
>>>>> +        if (ret) {
>>>>> +            ttm_resource_free(bo, &res);
>>>>> +            return ret;
>>>>> +        }
>>>>> +
>>>>> +    } while (ret && force_space);
>>>>>    -    ret = ttm_bo_move_buffer(bo, placement, ctx);
>>>>>        /* For backward compatibility with userspace */
>>>>>        if (ret == -ENOSPC)
>>>>>            return -ENOMEM;
>>>>> -    if (ret)
>>>>> -        return ret;
>>>>>          /*
>>>>>         * We might need to add a TTM.
>>>>> diff --git a/drivers/gpu/drm/ttm/ttm_resource.c
>>>>> b/drivers/gpu/drm/ttm/ttm_resource.c
>>>>> index fb14f7716cf8..65155f2013ca 100644
>>>>> --- a/drivers/gpu/drm/ttm/ttm_resource.c
>>>>> +++ b/drivers/gpu/drm/ttm/ttm_resource.c
>>>>> @@ -295,11 +295,13 @@ bool ttm_resource_intersects(struct
>>>>> ttm_device
>>>>> *bdev,
>>>>>     *
>>>>>     * @res: the resource to check
>>>>>     * @placement: the placement to check against
>>>>> + * @evicting: true if the caller is doing evictions
>>>>>     *
>>>>>     * Returns true if the placement is compatible.
>>>>>     */
>>>>>    bool ttm_resource_compatible(struct ttm_resource *res,
>>>>> -                 struct ttm_placement *placement)
>>>>> +                 struct ttm_placement *placement,
>>>>> +                 bool evicting)
>>>>>    {
>>>>>        struct ttm_buffer_object *bo = res->bo;
>>>>>        struct ttm_device *bdev = bo->bdev;
>>>>> @@ -315,14 +317,20 @@ bool ttm_resource_compatible(struct
>>>>> ttm_resource *res,
>>>>>            if (res->mem_type != place->mem_type)
>>>>>                continue;
>>>>>    +        if (place->flags & (evicting ? TTM_PL_FLAG_DESIRED :
>>>>> +                    TTM_PL_FLAG_FALLBACK))
>>>>> +            continue;
>>>>> +
>>>>> +        if (place->flags & TTM_PL_FLAG_CONTIGUOUS &&
>>>>> +            !(res->placement & TTM_PL_FLAG_CONTIGUOUS))
>>>>> +            continue;
>>>>> +
>>>>>            man = ttm_manager_type(bdev, res->mem_type);
>>>>>            if (man->func->compatible &&
>>>>>                !man->func->compatible(man, res, place, bo-
>>>>>> base.size))
>>>>>                continue;
>>>>>    -        if ((!(place->flags & TTM_PL_FLAG_CONTIGUOUS) ||
>>>>> -             (res->placement & TTM_PL_FLAG_CONTIGUOUS)))
>>>>> -            return true;
>>>>> +        return true;
>>>>>        }
>>>>>        return false;
>>>>>    }
>>>>> diff --git a/include/drm/ttm/ttm_resource.h
>>>>> b/include/drm/ttm/ttm_resource.h
>>>>> index 1afa13f0c22b..7561023db43d 100644
>>>>> --- a/include/drm/ttm/ttm_resource.h
>>>>> +++ b/include/drm/ttm/ttm_resource.h
>>>>> @@ -366,7 +366,8 @@ bool ttm_resource_intersects(struct
>>>>> ttm_device
>>>>> *bdev,
>>>>>                     const struct ttm_place *place,
>>>>>                     size_t size);
>>>>>    bool ttm_resource_compatible(struct ttm_resource *res,
>>>>> -                 struct ttm_placement *placement);
>>>>> +                 struct ttm_placement *placement,
>>>>> +                 bool evicting);
>>>>>    void ttm_resource_set_bo(struct ttm_resource *res,
>>>>>                 struct ttm_buffer_object *bo);
>>>
>>
> 

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

* Re: [PATCH 1/2] drm/ttm: improve idle/busy handling v4
  2024-02-27  8:12           ` Matthew Auld
@ 2024-02-27  8:33             ` Christian König
  0 siblings, 0 replies; 13+ messages in thread
From: Christian König @ 2024-02-27  8:33 UTC (permalink / raw)
  To: Matthew Auld, Thomas Hellström, dri-devel, intel-gfx,
	nouveau

Am 27.02.24 um 09:12 schrieb Matthew Auld:
> On 26/02/2024 20:21, Thomas Hellström wrote:
>> Hi, Christian
>>
>> On Fri, 2024-02-23 at 15:30 +0100, Christian König wrote:
>>> Am 06.02.24 um 13:56 schrieb Christian König:
>>>> Am 06.02.24 um 13:53 schrieb Thomas Hellström:
>>>>> Hi, Christian,
>>>>>
>>>>> On Fri, 2024-01-26 at 15:09 +0100, Christian König wrote:
>>>>>> Previously we would never try to move a BO into the preferred
>>>>>> placements
>>>>>> when it ever landed in a busy placement since those were
>>>>>> considered
>>>>>> compatible.
>>>>>>
>>>>>> Rework the whole handling and finally unify the idle and busy
>>>>>> handling.
>>>>>> ttm_bo_validate() is now responsible to try idle placement
>>>>>> first and
>>>>>> then
>>>>>> use the busy placement if that didn't worked.
>>>>>>
>>>>>> Drawback is that we now always try the idle placement first for
>>>>>> each
>>>>>> validation which might cause some additional CPU overhead on
>>>>>> overcommit.
>>>>>>
>>>>>> v2: fix kerneldoc warning and coding style
>>>>>> v3: take care of XE as well
>>>>>> v4: keep the ttm_bo_mem_space functionality as it is for now,
>>>>>> only
>>>>>> add
>>>>>>       new handling for ttm_bo_validate as suggested by Thomas
>>>>>>
>>>>>> Signed-off-by: Christian König <christian.koenig@amd.com>
>>>>>> Reviewed-by: Zack Rusin <zack.rusin@broadcom.com> v3
>>>>> Sending this through xe CI, will try to review asap.
>>>>
>>>> Take your time. At the moment people are bombarding me with work
>>>> and I
>>>> have only two hands and one head as well :(
>>>
>>> So I've digged myself out of that hole and would rather like to get
>>> this
>>> new feature into 6.9.
>>>
>>> Any time to review it? I can also plan some time to review your LRU
>>> changes next week.
>>>
>>> Thanks,
>>> Christian.
>>
>> Sorry for the late response. Was planning to review but saw that there
>> was still an xe CI failure.
>>
>> https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-129579v1/bat-atsm-2/igt@xe_evict_ccs@evict-overcommit-parallel-nofree-samefd.html 
>>
>>
>> I haven't really had time to look into what might be causing this,
>> though.
> Maybe in ttm_bo_alloc_resource():
>
> @@ -772,7 +772,7 @@ static int ttm_bo_alloc_resource(struct 
> ttm_buffer_object *bo,
>
>                 do {
>                         ret = ttm_resource_alloc(bo, place, res);
> -                       if (unlikely(ret != -ENOSPC))
> +                       if (unlikely(ret && ret != -ENOSPC))
>                                 return ret;
>                         if (likely(!ret) || !force_space)
>                                 break;
>
> Otherwise we allocate VRAM but never correctly synchronise against the 
> move fence, since we missed adding it to the BO. When we trigger async 
> evictions that would explain the above test failure where we detect 
> VRAM corruption, since someone else is still using the VRAM we 
> allocated. What do you think?

Yup, that looks like the right thing to do. Thanks.

Give me a moment to fix that.

Christian.

>
>>
>> /Thomas
>>
>>>
>>>>
>>>> Christian.
>>>>
>>>>>
>>>>> /Thomas
>>>>>
>>>>>
>>>>>> ---
>>>>>>    drivers/gpu/drm/ttm/ttm_bo.c       | 231 +++++++++++++-------
>>>>>> -------
>>>>>> -- 
>>>>>>    drivers/gpu/drm/ttm/ttm_resource.c |  16 +-
>>>>>>    include/drm/ttm/ttm_resource.h     |   3 +-
>>>>>>    3 files changed, 121 insertions(+), 129 deletions(-)
>>>>>>
>>>>>> diff --git a/drivers/gpu/drm/ttm/ttm_bo.c
>>>>>> b/drivers/gpu/drm/ttm/ttm_bo.c
>>>>>> index ba3f09e2d7e6..b12f435542a9 100644
>>>>>> --- a/drivers/gpu/drm/ttm/ttm_bo.c
>>>>>> +++ b/drivers/gpu/drm/ttm/ttm_bo.c
>>>>>> @@ -724,64 +724,36 @@ static int ttm_bo_add_move_fence(struct
>>>>>> ttm_buffer_object *bo,
>>>>>>        return ret;
>>>>>>    }
>>>>>>    -/*
>>>>>> - * Repeatedly evict memory from the LRU for @mem_type until we
>>>>>> create enough
>>>>>> - * space, or we've evicted everything and there isn't enough
>>>>>> space.
>>>>>> - */
>>>>>> -static int ttm_bo_mem_force_space(struct ttm_buffer_object
>>>>>> *bo,
>>>>>> -                  const struct ttm_place *place,
>>>>>> -                  struct ttm_resource **mem,
>>>>>> -                  struct ttm_operation_ctx *ctx)
>>>>>> -{
>>>>>> -    struct ttm_device *bdev = bo->bdev;
>>>>>> -    struct ttm_resource_manager *man;
>>>>>> -    struct ww_acquire_ctx *ticket;
>>>>>> -    int ret;
>>>>>> -
>>>>>> -    man = ttm_manager_type(bdev, place->mem_type);
>>>>>> -    ticket = dma_resv_locking_ctx(bo->base.resv);
>>>>>> -    do {
>>>>>> -        ret = ttm_resource_alloc(bo, place, mem);
>>>>>> -        if (likely(!ret))
>>>>>> -            break;
>>>>>> -        if (unlikely(ret != -ENOSPC))
>>>>>> -            return ret;
>>>>>> -        ret = ttm_mem_evict_first(bdev, man, place, ctx,
>>>>>> -                      ticket);
>>>>>> -        if (unlikely(ret != 0))
>>>>>> -            return ret;
>>>>>> -    } while (1);
>>>>>> -
>>>>>> -    return ttm_bo_add_move_fence(bo, man, *mem, ctx-
>>>>>>> no_wait_gpu);
>>>>>> -}
>>>>>> -
>>>>>>    /**
>>>>>> - * ttm_bo_mem_space
>>>>>> + * ttm_bo_alloc_resource - Allocate backing store for a BO
>>>>>>     *
>>>>>> - * @bo: Pointer to a struct ttm_buffer_object. the data of
>>>>>> which
>>>>>> - * we want to allocate space for.
>>>>>> - * @placement: Proposed new placement for the buffer object.
>>>>>> - * @mem: A struct ttm_resource.
>>>>>> + * @bo: Pointer to a struct ttm_buffer_object of which we want
>>>>>> a
>>>>>> resource for
>>>>>> + * @placement: Proposed new placement for the buffer object
>>>>>>     * @ctx: if and how to sleep, lock buffers and alloc memory
>>>>>> + * @force_space: If we should evict buffers to force space
>>>>>> + * @res: The resulting struct ttm_resource.
>>>>>>     *
>>>>>> - * Allocate memory space for the buffer object pointed to by
>>>>>> @bo,
>>>>>> using
>>>>>> - * the placement flags in @placement, potentially evicting
>>>>>> other
>>>>>> idle buffer objects.
>>>>>> - * This function may sleep while waiting for space to become
>>>>>> available.
>>>>>> + * Allocates a resource for the buffer object pointed to by
>>>>>> @bo,
>>>>>> using the
>>>>>> + * placement flags in @placement, potentially evicting other
>>>>>> buffer
>>>>>> objects when
>>>>>> + * @force_space is true.
>>>>>> + * This function may sleep while waiting for resources to
>>>>>> become
>>>>>> available.
>>>>>>     * Returns:
>>>>>> - * -EBUSY: No space available (only if no_wait == 1).
>>>>>> + * -EBUSY: No space available (only if no_wait == true).
>>>>>>     * -ENOSPC: Could not allocate space for the buffer object,
>>>>>> either
>>>>>> due to
>>>>>>     * fragmentation or concurrent allocators.
>>>>>>     * -ERESTARTSYS: An interruptible sleep was interrupted by a
>>>>>> signal.
>>>>>>     */
>>>>>> -int ttm_bo_mem_space(struct ttm_buffer_object *bo,
>>>>>> -            struct ttm_placement *placement,
>>>>>> -            struct ttm_resource **mem,
>>>>>> -            struct ttm_operation_ctx *ctx)
>>>>>> +static int ttm_bo_alloc_resource(struct ttm_buffer_object *bo,
>>>>>> +                 struct ttm_placement *placement,
>>>>>> +                 struct ttm_operation_ctx *ctx,
>>>>>> +                 bool force_space,
>>>>>> +                 struct ttm_resource **res)
>>>>>>    {
>>>>>>        struct ttm_device *bdev = bo->bdev;
>>>>>> -    bool type_found = false;
>>>>>> +    struct ww_acquire_ctx *ticket;
>>>>>>        int i, ret;
>>>>>>    +    ticket = dma_resv_locking_ctx(bo->base.resv);
>>>>>>        ret = dma_resv_reserve_fences(bo->base.resv, 1);
>>>>>>        if (unlikely(ret))
>>>>>>            return ret;
>>>>>> @@ -790,98 +762,73 @@ int ttm_bo_mem_space(struct
>>>>>> ttm_buffer_object
>>>>>> *bo,
>>>>>>            const struct ttm_place *place = &placement-
>>>>>>> placement[i];
>>>>>>            struct ttm_resource_manager *man;
>>>>>>    -        if (place->flags & TTM_PL_FLAG_FALLBACK)
>>>>>> -            continue;
>>>>>> -
>>>>>>            man = ttm_manager_type(bdev, place->mem_type);
>>>>>>            if (!man || !ttm_resource_manager_used(man))
>>>>>>                continue;
>>>>>>    -        type_found = true;
>>>>>> -        ret = ttm_resource_alloc(bo, place, mem);
>>>>>> -        if (ret == -ENOSPC)
>>>>>> +        if (place->flags & (force_space ?
>>>>>> TTM_PL_FLAG_DESIRED :
>>>>>> +                    TTM_PL_FLAG_FALLBACK))
>>>>>> +            continue;
>>>>>> +
>>>>>> +        do {
>>>>>> +            ret = ttm_resource_alloc(bo, place, res);
>>>>>> +            if (unlikely(ret != -ENOSPC))
>>>>>> +                return ret;
>>>>>> +            if (likely(!ret) || !force_space)
>>>>>> +                break;
>>>>>> +
>>>>>> +            ret = ttm_mem_evict_first(bdev, man, place,
>>>>>> ctx,
>>>>>> +                          ticket);
>>>>>> +            if (unlikely(ret == -EBUSY))
>>>>>> +                break;
>>>>>> +            if (unlikely(ret))
>>>>>> +                return ret;
>>>>>> +        } while (1);
>>>>>> +        if (ret)
>>>>>>                continue;
>>>>>> -        if (unlikely(ret))
>>>>>> -            goto error;
>>>>>>    -        ret = ttm_bo_add_move_fence(bo, man, *mem, ctx-
>>>>>>> no_wait_gpu);
>>>>>> +        ret = ttm_bo_add_move_fence(bo, man, *res, ctx-
>>>>>>> no_wait_gpu);
>>>>>>            if (unlikely(ret)) {
>>>>>> -            ttm_resource_free(bo, mem);
>>>>>> +            ttm_resource_free(bo, res);
>>>>>>                if (ret == -EBUSY)
>>>>>>                    continue;
>>>>>>    -            goto error;
>>>>>> +            return ret;
>>>>>>            }
>>>>>>            return 0;
>>>>>>        }
>>>>>>    -    for (i = 0; i < placement->num_placement; ++i) {
>>>>>> -        const struct ttm_place *place = &placement-
>>>>>>> placement[i];
>>>>>> -        struct ttm_resource_manager *man;
>>>>>> -
>>>>>> -        if (place->flags & TTM_PL_FLAG_DESIRED)
>>>>>> -            continue;
>>>>>> -
>>>>>> -        man = ttm_manager_type(bdev, place->mem_type);
>>>>>> -        if (!man || !ttm_resource_manager_used(man))
>>>>>> -            continue;
>>>>>> -
>>>>>> -        type_found = true;
>>>>>> -        ret = ttm_bo_mem_force_space(bo, place, mem, ctx);
>>>>>> -        if (likely(!ret))
>>>>>> -            return 0;
>>>>>> -
>>>>>> -        if (ret && ret != -EBUSY)
>>>>>> -            goto error;
>>>>>> -    }
>>>>>> -
>>>>>> -    ret = -ENOSPC;
>>>>>> -    if (!type_found) {
>>>>>> -        pr_err(TTM_PFX "No compatible memory type found\n");
>>>>>> -        ret = -EINVAL;
>>>>>> -    }
>>>>>> -
>>>>>> -error:
>>>>>> -    return ret;
>>>>>> +    return -ENOSPC;
>>>>>>    }
>>>>>> -EXPORT_SYMBOL(ttm_bo_mem_space);
>>>>>>    -static int ttm_bo_move_buffer(struct ttm_buffer_object *bo,
>>>>>> -                  struct ttm_placement *placement,
>>>>>> -                  struct ttm_operation_ctx *ctx)
>>>>>> +/*
>>>>>> + * ttm_bo_mem_space - Wrapper around ttm_bo_alloc_resource
>>>>>> + *
>>>>>> + * @bo: Pointer to a struct ttm_buffer_object of which we want
>>>>>> a
>>>>>> resource for
>>>>>> + * @placement: Proposed new placement for the buffer object
>>>>>> + * @res: The resulting struct ttm_resource.
>>>>>> + * @ctx: if and how to sleep, lock buffers and alloc memory
>>>>>> + *
>>>>>> + * Tries both idle allocation and forcefully eviction of
>>>>>> buffers.
>>>>>> See
>>>>>> + * ttm_bo_alloc_resource for details.
>>>>>> + */
>>>>>> +int ttm_bo_mem_space(struct ttm_buffer_object *bo,
>>>>>> +             struct ttm_placement *placement,
>>>>>> +             struct ttm_resource **res,
>>>>>> +             struct ttm_operation_ctx *ctx)
>>>>>>    {
>>>>>> -    struct ttm_resource *mem;
>>>>>> -    struct ttm_place hop;
>>>>>> +    bool force_space = false;
>>>>>>        int ret;
>>>>>>    -    dma_resv_assert_held(bo->base.resv);
>>>>>> +    do {
>>>>>> +        ret = ttm_bo_alloc_resource(bo, placement, ctx,
>>>>>> +                        force_space, res);
>>>>>> +        force_space = !force_space;
>>>>>> +    } while (ret == -ENOSPC && force_space);
>>>>>>    -    /*
>>>>>> -     * Determine where to move the buffer.
>>>>>> -     *
>>>>>> -     * If driver determines move is going to need
>>>>>> -     * an extra step then it will return -EMULTIHOP
>>>>>> -     * and the buffer will be moved to the temporary
>>>>>> -     * stop and the driver will be called to make
>>>>>> -     * the second hop.
>>>>>> -     */
>>>>>> -    ret = ttm_bo_mem_space(bo, placement, &mem, ctx);
>>>>>> -    if (ret)
>>>>>> -        return ret;
>>>>>> -bounce:
>>>>>> -    ret = ttm_bo_handle_move_mem(bo, mem, false, ctx, &hop);
>>>>>> -    if (ret == -EMULTIHOP) {
>>>>>> -        ret = ttm_bo_bounce_temp_buffer(bo, &mem, ctx,
>>>>>> &hop);
>>>>>> -        if (ret)
>>>>>> -            goto out;
>>>>>> -        /* try and move to final place now. */
>>>>>> -        goto bounce;
>>>>>> -    }
>>>>>> -out:
>>>>>> -    if (ret)
>>>>>> -        ttm_resource_free(bo, &mem);
>>>>>>        return ret;
>>>>>>    }
>>>>>> +EXPORT_SYMBOL(ttm_bo_mem_space);
>>>>>>      /**
>>>>>>     * ttm_bo_validate
>>>>>> @@ -902,6 +849,9 @@ int ttm_bo_validate(struct
>>>>>> ttm_buffer_object *bo,
>>>>>>                struct ttm_placement *placement,
>>>>>>                struct ttm_operation_ctx *ctx)
>>>>>>    {
>>>>>> +    struct ttm_resource *res;
>>>>>> +    struct ttm_place hop;
>>>>>> +    bool force_space;
>>>>>>        int ret;
>>>>>>          dma_resv_assert_held(bo->base.resv);
>>>>>> @@ -912,20 +862,53 @@ int ttm_bo_validate(struct
>>>>>> ttm_buffer_object
>>>>>> *bo,
>>>>>>        if (!placement->num_placement)
>>>>>>            return ttm_bo_pipeline_gutting(bo);
>>>>>>    -    /* Check whether we need to move buffer. */
>>>>>> -    if (bo->resource && ttm_resource_compatible(bo->resource,
>>>>>> placement))
>>>>>> -        return 0;
>>>>>> +    force_space = false;
>>>>>> +    do {
>>>>>> +        /* Check whether we need to move buffer. */
>>>>>> +        if (bo->resource &&
>>>>>> +            ttm_resource_compatible(bo->resource, placement,
>>>>>> +                        force_space))
>>>>>> +            return 0;
>>>>>>    -    /* Moving of pinned BOs is forbidden */
>>>>>> -    if (bo->pin_count)
>>>>>> -        return -EINVAL;
>>>>>> +        /* Moving of pinned BOs is forbidden */
>>>>>> +        if (bo->pin_count)
>>>>>> +            return -EINVAL;
>>>>>> +
>>>>>> +        /*
>>>>>> +         * Determine where to move the buffer.
>>>>>> +         *
>>>>>> +         * If driver determines move is going to need
>>>>>> +         * an extra step then it will return -EMULTIHOP
>>>>>> +         * and the buffer will be moved to the temporary
>>>>>> +         * stop and the driver will be called to make
>>>>>> +         * the second hop.
>>>>>> +         */
>>>>>> +        ret = ttm_bo_alloc_resource(bo, placement, ctx,
>>>>>> force_space,
>>>>>> +                        &res);
>>>>>> +        force_space = !force_space;
>>>>>> +        if (ret == -ENOSPC)
>>>>>> +            continue;
>>>>>> +        if (ret)
>>>>>> +            return ret;
>>>>>> +
>>>>>> +bounce:
>>>>>> +        ret = ttm_bo_handle_move_mem(bo, res, false, ctx,
>>>>>> &hop);
>>>>>> +        if (ret == -EMULTIHOP) {
>>>>>> +            ret = ttm_bo_bounce_temp_buffer(bo, &res,
>>>>>> ctx, &hop);
>>>>>> +            /* try and move to final place now. */
>>>>>> +            if (!ret)
>>>>>> +                goto bounce;
>>>>>> +        }
>>>>>> +        if (ret) {
>>>>>> +            ttm_resource_free(bo, &res);
>>>>>> +            return ret;
>>>>>> +        }
>>>>>> +
>>>>>> +    } while (ret && force_space);
>>>>>>    -    ret = ttm_bo_move_buffer(bo, placement, ctx);
>>>>>>        /* For backward compatibility with userspace */
>>>>>>        if (ret == -ENOSPC)
>>>>>>            return -ENOMEM;
>>>>>> -    if (ret)
>>>>>> -        return ret;
>>>>>>          /*
>>>>>>         * We might need to add a TTM.
>>>>>> diff --git a/drivers/gpu/drm/ttm/ttm_resource.c
>>>>>> b/drivers/gpu/drm/ttm/ttm_resource.c
>>>>>> index fb14f7716cf8..65155f2013ca 100644
>>>>>> --- a/drivers/gpu/drm/ttm/ttm_resource.c
>>>>>> +++ b/drivers/gpu/drm/ttm/ttm_resource.c
>>>>>> @@ -295,11 +295,13 @@ bool ttm_resource_intersects(struct
>>>>>> ttm_device
>>>>>> *bdev,
>>>>>>     *
>>>>>>     * @res: the resource to check
>>>>>>     * @placement: the placement to check against
>>>>>> + * @evicting: true if the caller is doing evictions
>>>>>>     *
>>>>>>     * Returns true if the placement is compatible.
>>>>>>     */
>>>>>>    bool ttm_resource_compatible(struct ttm_resource *res,
>>>>>> -                 struct ttm_placement *placement)
>>>>>> +                 struct ttm_placement *placement,
>>>>>> +                 bool evicting)
>>>>>>    {
>>>>>>        struct ttm_buffer_object *bo = res->bo;
>>>>>>        struct ttm_device *bdev = bo->bdev;
>>>>>> @@ -315,14 +317,20 @@ bool ttm_resource_compatible(struct
>>>>>> ttm_resource *res,
>>>>>>            if (res->mem_type != place->mem_type)
>>>>>>                continue;
>>>>>>    +        if (place->flags & (evicting ? TTM_PL_FLAG_DESIRED :
>>>>>> +                    TTM_PL_FLAG_FALLBACK))
>>>>>> +            continue;
>>>>>> +
>>>>>> +        if (place->flags & TTM_PL_FLAG_CONTIGUOUS &&
>>>>>> +            !(res->placement & TTM_PL_FLAG_CONTIGUOUS))
>>>>>> +            continue;
>>>>>> +
>>>>>>            man = ttm_manager_type(bdev, res->mem_type);
>>>>>>            if (man->func->compatible &&
>>>>>>                !man->func->compatible(man, res, place, bo-
>>>>>>> base.size))
>>>>>>                continue;
>>>>>>    -        if ((!(place->flags & TTM_PL_FLAG_CONTIGUOUS) ||
>>>>>> -             (res->placement & TTM_PL_FLAG_CONTIGUOUS)))
>>>>>> -            return true;
>>>>>> +        return true;
>>>>>>        }
>>>>>>        return false;
>>>>>>    }
>>>>>> diff --git a/include/drm/ttm/ttm_resource.h
>>>>>> b/include/drm/ttm/ttm_resource.h
>>>>>> index 1afa13f0c22b..7561023db43d 100644
>>>>>> --- a/include/drm/ttm/ttm_resource.h
>>>>>> +++ b/include/drm/ttm/ttm_resource.h
>>>>>> @@ -366,7 +366,8 @@ bool ttm_resource_intersects(struct
>>>>>> ttm_device
>>>>>> *bdev,
>>>>>>                     const struct ttm_place *place,
>>>>>>                     size_t size);
>>>>>>    bool ttm_resource_compatible(struct ttm_resource *res,
>>>>>> -                 struct ttm_placement *placement);
>>>>>> +                 struct ttm_placement *placement,
>>>>>> +                 bool evicting);
>>>>>>    void ttm_resource_set_bo(struct ttm_resource *res,
>>>>>>                 struct ttm_buffer_object *bo);
>>>>
>>>
>>


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

end of thread, other threads:[~2024-02-27  8:34 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-01-26 14:09 Rework TTMs busy handling Christian König
2024-01-26 14:09 ` [PATCH 1/2] drm/ttm: improve idle/busy handling v4 Christian König
2024-02-06 12:53   ` Thomas Hellström
2024-02-06 12:56     ` Christian König
2024-02-23 14:30       ` Christian König
2024-02-26 20:21         ` Thomas Hellström
2024-02-27  8:12           ` Matthew Auld
2024-02-27  8:33             ` Christian König
2024-01-26 14:09 ` [PATCH 2/2] drm/amdgpu: use GTT only as fallback for VRAM|GTT Christian König
2024-01-26 14:38 ` ✗ Fi.CI.CHECKPATCH: warning for series starting with [1/2] drm/ttm: improve idle/busy handling v4 Patchwork
2024-01-26 14:38 ` ✗ Fi.CI.SPARSE: " Patchwork
2024-01-26 14:52 ` ✓ Fi.CI.BAT: success " Patchwork
2024-01-26 16:06 ` ✗ Fi.CI.IGT: failure " Patchwork

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox