intel-xe.lists.freedesktop.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 00/10] drm/i915/frontbuffer: Fix the intel_frontbuffer lifetime mess
@ 2025-10-16 18:53 Ville Syrjala
  2025-10-16 18:53 ` [PATCH v2 01/10] drm/i915/overlay: Drop the DIRTYFB flush Ville Syrjala
                   ` (13 more replies)
  0 siblings, 14 replies; 20+ messages in thread
From: Ville Syrjala @ 2025-10-16 18:53 UTC (permalink / raw)
  To: intel-gfx; +Cc: intel-xe

From: Ville Syrjälä <ville.syrjala@linux.intel.com>

The attempted piecemeal intel_frontbuffer split between
i915 and xe is not good. Redo it with a bigger shovel.

v2: Rebase

Ville Syrjälä (10):
  drm/i915/overlay: Drop the DIRTYFB flush
  drm/i915/overlay: Switch to intel_frontbuffer_flip()
  drm/i915/frontbuffer: Nuke intel_frontbuffer_flip_{prepare,complete}()
  drm/i915/frontbuffer: Turn intel_bo_flush_if_display() into a
    frontbuffer operation
  drm/i915/frontbuffer: Handle the dirtyfb cache flush inside
    intel_frontbuffer_flush()
  drm/i915/frontbuffef: Split fb_tracking.lock into two
  drm/i915/frontbuffer: Extract intel_frontbuffer_ref()
  drm/i915/frontbuffer: Add intel_frontbuffer::display
  drm/i915/frontbuffer: Fix intel_frontbuffer lifetime handling
  drm/i915/gem:
    s/i915_gem_object_get_frontbuffer/i915_gem_object_frontbuffer_lookup/

 drivers/gpu/drm/i915/Makefile                 |   1 +
 drivers/gpu/drm/i915/display/intel_bo.c       |  40 +++--
 drivers/gpu/drm/i915/display/intel_bo.h       |   8 +-
 .../gpu/drm/i915/display/intel_display_core.h |   5 +-
 .../drm/i915/display/intel_display_debugfs.c  |   3 -
 drivers/gpu/drm/i915/display/intel_fb.c       |   1 -
 .../gpu/drm/i915/display/intel_frontbuffer.c  | 155 +++---------------
 .../gpu/drm/i915/display/intel_frontbuffer.h  |  18 +-
 drivers/gpu/drm/i915/display/intel_overlay.c  |   6 +-
 drivers/gpu/drm/i915/gem/i915_gem_object.c    |  16 +-
 .../i915/gem/i915_gem_object_frontbuffer.c    | 103 ++++++++++++
 .../i915/gem/i915_gem_object_frontbuffer.h    |  54 ++----
 .../gpu/drm/i915/gem/i915_gem_object_types.h  |   2 +-
 drivers/gpu/drm/i915/i915_drv.h               |   2 +
 drivers/gpu/drm/i915/i915_gem.c               |   2 +
 drivers/gpu/drm/i915/i915_vma.c               |   8 +-
 .../gpu/drm/xe/compat-i915-headers/i915_vma.h |   2 -
 drivers/gpu/drm/xe/display/intel_bo.c         |  60 ++++++-
 18 files changed, 257 insertions(+), 229 deletions(-)
 create mode 100644 drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.c

-- 
2.49.1


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

* [PATCH v2 01/10] drm/i915/overlay: Drop the DIRTYFB flush
  2025-10-16 18:53 [PATCH v2 00/10] drm/i915/frontbuffer: Fix the intel_frontbuffer lifetime mess Ville Syrjala
@ 2025-10-16 18:53 ` Ville Syrjala
  2025-10-16 18:54 ` [PATCH v2 02/10] drm/i915/overlay: Switch to intel_frontbuffer_flip() Ville Syrjala
                   ` (12 subsequent siblings)
  13 siblings, 0 replies; 20+ messages in thread
From: Ville Syrjala @ 2025-10-16 18:53 UTC (permalink / raw)
  To: intel-gfx; +Cc: intel-xe, Jani Nikula

From: Ville Syrjälä <ville.syrjala@linux.intel.com>

I don't even know why we have this DIRTYFB flush in the overlay
code. We'll anyway call intel_frontbuffer_flip() so there should
be no need to pretend that this is some kind of frontbuffer only
rendering operation.

Acked-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/gpu/drm/i915/display/intel_overlay.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_overlay.c b/drivers/gpu/drm/i915/display/intel_overlay.c
index 272f9e7af4d4..8400a0236cdd 100644
--- a/drivers/gpu/drm/i915/display/intel_overlay.c
+++ b/drivers/gpu/drm/i915/display/intel_overlay.c
@@ -821,8 +821,6 @@ static int intel_overlay_do_put_image(struct intel_overlay *overlay,
 		goto out_pin_section;
 	}
 
-	i915_gem_object_flush_frontbuffer(new_bo, ORIGIN_DIRTYFB);
-
 	if (!overlay->active) {
 		const struct intel_crtc_state *crtc_state =
 			overlay->crtc->config;
-- 
2.49.1


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

* [PATCH v2 02/10] drm/i915/overlay: Switch to intel_frontbuffer_flip()
  2025-10-16 18:53 [PATCH v2 00/10] drm/i915/frontbuffer: Fix the intel_frontbuffer lifetime mess Ville Syrjala
  2025-10-16 18:53 ` [PATCH v2 01/10] drm/i915/overlay: Drop the DIRTYFB flush Ville Syrjala
@ 2025-10-16 18:54 ` Ville Syrjala
  2025-10-16 18:54 ` [PATCH v2 03/10] drm/i915/frontbuffer: Nuke intel_frontbuffer_flip_{prepare, complete}() Ville Syrjala
                   ` (11 subsequent siblings)
  13 siblings, 0 replies; 20+ messages in thread
From: Ville Syrjala @ 2025-10-16 18:54 UTC (permalink / raw)
  To: intel-gfx; +Cc: intel-xe, Jani Nikula

From: Ville Syrjälä <ville.syrjala@linux.intel.com>

Get rid of intel_frontbuffer_flip_{prepare,complete}() from
the overlay code and just use intel_frontbuffer_flip() instead.

The only difference between these are the light interactions
with the ORIGIN_CS busyness tracking, but since the only user
of this is the overlay/xf86-video-intel/Xv the buffer will
always be filled by the CPU and thus we'll never see any
ORIGIN_CS frontbuffer activity there anyway. Also I don't
think we actually have anything covered by the frontbuffer
tracking that affects the overlay (FBC is on the primary
plane, DRRS isn't currently enabled on the platforms with
overlay, and PSR doesn't exist in the hardware).

Acked-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/gpu/drm/i915/display/intel_overlay.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_overlay.c b/drivers/gpu/drm/i915/display/intel_overlay.c
index 8400a0236cdd..60ec68e917a5 100644
--- a/drivers/gpu/drm/i915/display/intel_overlay.c
+++ b/drivers/gpu/drm/i915/display/intel_overlay.c
@@ -307,8 +307,6 @@ static void intel_overlay_flip_prepare(struct intel_overlay *overlay,
 		intel_frontbuffer_put(overlay->frontbuffer);
 	overlay->frontbuffer = frontbuffer;
 
-	intel_frontbuffer_flip_prepare(display, INTEL_FRONTBUFFER_OVERLAY(pipe));
-
 	overlay->old_vma = overlay->vma;
 	if (vma)
 		overlay->vma = i915_vma_get(vma);
@@ -365,7 +363,7 @@ static void intel_overlay_release_old_vma(struct intel_overlay *overlay)
 	if (drm_WARN_ON(display->drm, !vma))
 		return;
 
-	intel_frontbuffer_flip_complete(display, INTEL_FRONTBUFFER_OVERLAY(overlay->crtc->pipe));
+	intel_frontbuffer_flip(display, INTEL_FRONTBUFFER_OVERLAY(overlay->crtc->pipe));
 
 	i915_vma_unpin(vma);
 	i915_vma_put(vma);
-- 
2.49.1


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

* [PATCH v2 03/10] drm/i915/frontbuffer: Nuke intel_frontbuffer_flip_{prepare, complete}()
  2025-10-16 18:53 [PATCH v2 00/10] drm/i915/frontbuffer: Fix the intel_frontbuffer lifetime mess Ville Syrjala
  2025-10-16 18:53 ` [PATCH v2 01/10] drm/i915/overlay: Drop the DIRTYFB flush Ville Syrjala
  2025-10-16 18:54 ` [PATCH v2 02/10] drm/i915/overlay: Switch to intel_frontbuffer_flip() Ville Syrjala
@ 2025-10-16 18:54 ` Ville Syrjala
  2025-10-16 18:54 ` [PATCH v2 04/10] drm/i915/frontbuffer: Turn intel_bo_flush_if_display() into a frontbuffer operation Ville Syrjala
                   ` (10 subsequent siblings)
  13 siblings, 0 replies; 20+ messages in thread
From: Ville Syrjala @ 2025-10-16 18:54 UTC (permalink / raw)
  To: intel-gfx; +Cc: intel-xe, Jani Nikula

From: Ville Syrjälä <ville.syrjala@linux.intel.com>

Get rid of intel_frontbuffer_flip_{prepare,complete}() (and
the accompanying flip_bits) since they are unused.

I suppose these could technically provide a minor optiimization
over intel_frontbuffer_flip() in that the flush would get
deferred further if new rendering were to sneak in between the
prepare() and complete() calls. But for correctness it should
not make any difference since another flush will anyway follow
once the new rendering finishes.

Acked-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 .../gpu/drm/i915/display/intel_display_core.h |  4 +-
 .../drm/i915/display/intel_display_debugfs.c  |  3 --
 .../gpu/drm/i915/display/intel_frontbuffer.c  | 46 -------------------
 .../gpu/drm/i915/display/intel_frontbuffer.h  |  4 --
 4 files changed, 1 insertion(+), 56 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h b/drivers/gpu/drm/i915/display/intel_display_core.h
index df4da52cbdb3..fa43636b89fa 100644
--- a/drivers/gpu/drm/i915/display/intel_display_core.h
+++ b/drivers/gpu/drm/i915/display/intel_display_core.h
@@ -144,11 +144,9 @@ struct intel_frontbuffer_tracking {
 	spinlock_t lock;
 
 	/*
-	 * Tracking bits for delayed frontbuffer flushing du to gpu activity or
-	 * scheduled flips.
+	 * Tracking bits for delayed frontbuffer flushing due to gpu activity.
 	 */
 	unsigned busy_bits;
-	unsigned flip_bits;
 };
 
 struct intel_hotplug {
diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
index 10dddec3796f..4e8397504774 100644
--- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
+++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
@@ -76,9 +76,6 @@ static int i915_frontbuffer_tracking(struct seq_file *m, void *unused)
 	seq_printf(m, "FB tracking busy bits: 0x%08x\n",
 		   display->fb_tracking.busy_bits);
 
-	seq_printf(m, "FB tracking flip bits: 0x%08x\n",
-		   display->fb_tracking.flip_bits);
-
 	spin_unlock(&display->fb_tracking.lock);
 
 	return 0;
diff --git a/drivers/gpu/drm/i915/display/intel_frontbuffer.c b/drivers/gpu/drm/i915/display/intel_frontbuffer.c
index 73ed28ac9573..53e93985c7d4 100644
--- a/drivers/gpu/drm/i915/display/intel_frontbuffer.c
+++ b/drivers/gpu/drm/i915/display/intel_frontbuffer.c
@@ -102,51 +102,6 @@ static void frontbuffer_flush(struct intel_display *display,
 	intel_fbc_flush(display, frontbuffer_bits, origin);
 }
 
-/**
- * intel_frontbuffer_flip_prepare - prepare asynchronous frontbuffer flip
- * @display: display device
- * @frontbuffer_bits: frontbuffer plane tracking bits
- *
- * This function gets called after scheduling a flip on @obj. The actual
- * frontbuffer flushing will be delayed until completion is signalled with
- * intel_frontbuffer_flip_complete. If an invalidate happens in between this
- * flush will be cancelled.
- *
- * Can be called without any locks held.
- */
-void intel_frontbuffer_flip_prepare(struct intel_display *display,
-				    unsigned frontbuffer_bits)
-{
-	spin_lock(&display->fb_tracking.lock);
-	display->fb_tracking.flip_bits |= frontbuffer_bits;
-	/* Remove stale busy bits due to the old buffer. */
-	display->fb_tracking.busy_bits &= ~frontbuffer_bits;
-	spin_unlock(&display->fb_tracking.lock);
-}
-
-/**
- * intel_frontbuffer_flip_complete - complete asynchronous frontbuffer flip
- * @display: display device
- * @frontbuffer_bits: frontbuffer plane tracking bits
- *
- * This function gets called after the flip has been latched and will complete
- * on the next vblank. It will execute the flush if it hasn't been cancelled yet.
- *
- * Can be called without any locks held.
- */
-void intel_frontbuffer_flip_complete(struct intel_display *display,
-				     unsigned frontbuffer_bits)
-{
-	spin_lock(&display->fb_tracking.lock);
-	/* Mask any cancelled flips. */
-	frontbuffer_bits &= display->fb_tracking.flip_bits;
-	display->fb_tracking.flip_bits &= ~frontbuffer_bits;
-	spin_unlock(&display->fb_tracking.lock);
-
-	if (frontbuffer_bits)
-		frontbuffer_flush(display, frontbuffer_bits, ORIGIN_FLIP);
-}
-
 /**
  * intel_frontbuffer_flip - synchronous frontbuffer flip
  * @display: display device
@@ -178,7 +133,6 @@ void __intel_fb_invalidate(struct intel_frontbuffer *front,
 	if (origin == ORIGIN_CS) {
 		spin_lock(&display->fb_tracking.lock);
 		display->fb_tracking.busy_bits |= frontbuffer_bits;
-		display->fb_tracking.flip_bits &= ~frontbuffer_bits;
 		spin_unlock(&display->fb_tracking.lock);
 	}
 
diff --git a/drivers/gpu/drm/i915/display/intel_frontbuffer.h b/drivers/gpu/drm/i915/display/intel_frontbuffer.h
index 2fee12eaf9b6..293c2d0152d6 100644
--- a/drivers/gpu/drm/i915/display/intel_frontbuffer.h
+++ b/drivers/gpu/drm/i915/display/intel_frontbuffer.h
@@ -68,10 +68,6 @@ struct intel_frontbuffer {
 	GENMASK(INTEL_FRONTBUFFER_BITS_PER_PIPE * ((pipe) + 1) - 1,	\
 		INTEL_FRONTBUFFER_BITS_PER_PIPE * (pipe))
 
-void intel_frontbuffer_flip_prepare(struct intel_display *display,
-				    unsigned frontbuffer_bits);
-void intel_frontbuffer_flip_complete(struct intel_display *display,
-				     unsigned frontbuffer_bits);
 void intel_frontbuffer_flip(struct intel_display *display,
 			    unsigned frontbuffer_bits);
 
-- 
2.49.1


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

* [PATCH v2 04/10] drm/i915/frontbuffer: Turn intel_bo_flush_if_display() into a frontbuffer operation
  2025-10-16 18:53 [PATCH v2 00/10] drm/i915/frontbuffer: Fix the intel_frontbuffer lifetime mess Ville Syrjala
                   ` (2 preceding siblings ...)
  2025-10-16 18:54 ` [PATCH v2 03/10] drm/i915/frontbuffer: Nuke intel_frontbuffer_flip_{prepare, complete}() Ville Syrjala
@ 2025-10-16 18:54 ` Ville Syrjala
  2025-10-16 18:54 ` [PATCH v2 05/10] drm/i915/frontbuffer: Handle the dirtyfb cache flush inside intel_frontbuffer_flush() Ville Syrjala
                   ` (9 subsequent siblings)
  13 siblings, 0 replies; 20+ messages in thread
From: Ville Syrjala @ 2025-10-16 18:54 UTC (permalink / raw)
  To: intel-gfx; +Cc: intel-xe, Jani Nikula

From: Ville Syrjälä <ville.syrjala@linux.intel.com>

Convert intel_bo_flush_if_display() to be an operation on the
frontbuffer object rather than the underlying gem bo. This
will help with cleaning up the frontbuffer xe/i915 vs. display
split.

Acked-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/gpu/drm/i915/display/intel_bo.c          | 10 +++++-----
 drivers/gpu/drm/i915/display/intel_bo.h          |  2 +-
 drivers/gpu/drm/i915/display/intel_fb.c          |  2 +-
 drivers/gpu/drm/i915/display/intel_frontbuffer.c |  2 +-
 drivers/gpu/drm/xe/display/intel_bo.c            |  8 ++++----
 5 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_bo.c b/drivers/gpu/drm/i915/display/intel_bo.c
index 6ae1374d5c2b..2792aca7bc22 100644
--- a/drivers/gpu/drm/i915/display/intel_bo.c
+++ b/drivers/gpu/drm/i915/display/intel_bo.c
@@ -29,11 +29,6 @@ bool intel_bo_is_protected(struct drm_gem_object *obj)
 	return i915_gem_object_is_protected(to_intel_bo(obj));
 }
 
-void intel_bo_flush_if_display(struct drm_gem_object *obj)
-{
-	i915_gem_object_flush_if_display(to_intel_bo(obj));
-}
-
 int intel_bo_fb_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma)
 {
 	return i915_gem_fb_mmap(to_intel_bo(obj), vma);
@@ -55,6 +50,11 @@ struct intel_frontbuffer *intel_bo_set_frontbuffer(struct drm_gem_object *obj,
 	return i915_gem_object_set_frontbuffer(to_intel_bo(obj), front);
 }
 
+void intel_bo_frontbuffer_flush_for_display(struct intel_frontbuffer *front)
+{
+	i915_gem_object_flush_if_display(to_intel_bo(front->obj));
+}
+
 void intel_bo_describe(struct seq_file *m, struct drm_gem_object *obj)
 {
 	i915_debugfs_describe_obj(m, to_intel_bo(obj));
diff --git a/drivers/gpu/drm/i915/display/intel_bo.h b/drivers/gpu/drm/i915/display/intel_bo.h
index 48d87019e48a..08247bf36d40 100644
--- a/drivers/gpu/drm/i915/display/intel_bo.h
+++ b/drivers/gpu/drm/i915/display/intel_bo.h
@@ -16,13 +16,13 @@ bool intel_bo_is_tiled(struct drm_gem_object *obj);
 bool intel_bo_is_userptr(struct drm_gem_object *obj);
 bool intel_bo_is_shmem(struct drm_gem_object *obj);
 bool intel_bo_is_protected(struct drm_gem_object *obj);
-void intel_bo_flush_if_display(struct drm_gem_object *obj);
 int intel_bo_fb_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma);
 int intel_bo_read_from_page(struct drm_gem_object *obj, u64 offset, void *dst, int size);
 
 struct intel_frontbuffer *intel_bo_get_frontbuffer(struct drm_gem_object *obj);
 struct intel_frontbuffer *intel_bo_set_frontbuffer(struct drm_gem_object *obj,
 						   struct intel_frontbuffer *front);
+void intel_bo_frontbuffer_flush_for_display(struct intel_frontbuffer *front);
 
 void intel_bo_describe(struct seq_file *m, struct drm_gem_object *obj);
 
diff --git a/drivers/gpu/drm/i915/display/intel_fb.c b/drivers/gpu/drm/i915/display/intel_fb.c
index 3958628c73e9..ab301c657395 100644
--- a/drivers/gpu/drm/i915/display/intel_fb.c
+++ b/drivers/gpu/drm/i915/display/intel_fb.c
@@ -2194,7 +2194,7 @@ static int intel_user_framebuffer_dirty(struct drm_framebuffer *fb,
 	return ret;
 
 flush:
-	intel_bo_flush_if_display(obj);
+	intel_bo_frontbuffer_flush_for_display(front);
 	intel_frontbuffer_flush(front, ORIGIN_DIRTYFB);
 	return ret;
 }
diff --git a/drivers/gpu/drm/i915/display/intel_frontbuffer.c b/drivers/gpu/drm/i915/display/intel_frontbuffer.c
index 53e93985c7d4..5562801d2ea3 100644
--- a/drivers/gpu/drm/i915/display/intel_frontbuffer.c
+++ b/drivers/gpu/drm/i915/display/intel_frontbuffer.c
@@ -167,7 +167,7 @@ static void intel_frontbuffer_flush_work(struct work_struct *work)
 	struct intel_frontbuffer *front =
 		container_of(work, struct intel_frontbuffer, flush_work);
 
-	intel_bo_flush_if_display(front->obj);
+	intel_bo_frontbuffer_flush_for_display(front);
 	intel_frontbuffer_flush(front, ORIGIN_DIRTYFB);
 	intel_frontbuffer_put(front);
 }
diff --git a/drivers/gpu/drm/xe/display/intel_bo.c b/drivers/gpu/drm/xe/display/intel_bo.c
index 27437c22bd70..2437c00a2d3e 100644
--- a/drivers/gpu/drm/xe/display/intel_bo.c
+++ b/drivers/gpu/drm/xe/display/intel_bo.c
@@ -28,10 +28,6 @@ bool intel_bo_is_protected(struct drm_gem_object *obj)
 	return xe_bo_is_protected(gem_to_xe_bo(obj));
 }
 
-void intel_bo_flush_if_display(struct drm_gem_object *obj)
-{
-}
-
 int intel_bo_fb_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma)
 {
 	return drm_gem_prime_mmap(obj, vma);
@@ -55,6 +51,10 @@ struct intel_frontbuffer *intel_bo_set_frontbuffer(struct drm_gem_object *obj,
 	return front;
 }
 
+void intel_bo_frontbuffer_flush_for_display(struct intel_frontbuffer *front)
+{
+}
+
 void intel_bo_describe(struct seq_file *m, struct drm_gem_object *obj)
 {
 	/* FIXME */
-- 
2.49.1


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

* [PATCH v2 05/10] drm/i915/frontbuffer: Handle the dirtyfb cache flush inside intel_frontbuffer_flush()
  2025-10-16 18:53 [PATCH v2 00/10] drm/i915/frontbuffer: Fix the intel_frontbuffer lifetime mess Ville Syrjala
                   ` (3 preceding siblings ...)
  2025-10-16 18:54 ` [PATCH v2 04/10] drm/i915/frontbuffer: Turn intel_bo_flush_if_display() into a frontbuffer operation Ville Syrjala
@ 2025-10-16 18:54 ` Ville Syrjala
  2025-10-16 18:54 ` [PATCH v2 06/10] drm/i915/frontbuffef: Split fb_tracking.lock into two Ville Syrjala
                   ` (8 subsequent siblings)
  13 siblings, 0 replies; 20+ messages in thread
From: Ville Syrjala @ 2025-10-16 18:54 UTC (permalink / raw)
  To: intel-gfx; +Cc: intel-xe, Jani Nikula

From: Ville Syrjälä <ville.syrjala@linux.intel.com>

intel_bo_frontbuffer_flush_for_display() is a bit too low level
to be direclty in the high level dirtyfb code. Move the calls
into intel_frontbuffer_flush().

There is a slight beahavioural change here in that we now skip
the flush if the bo is not a current scanout buffer (front->bits
== 0). But that is fine as the flush will eventually happen via
the fb pinning code if/when the bo becomes a scanout buffer again.

Acked-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/gpu/drm/i915/display/intel_fb.c          | 1 -
 drivers/gpu/drm/i915/display/intel_frontbuffer.c | 4 +++-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_fb.c b/drivers/gpu/drm/i915/display/intel_fb.c
index ab301c657395..088e194ecf69 100644
--- a/drivers/gpu/drm/i915/display/intel_fb.c
+++ b/drivers/gpu/drm/i915/display/intel_fb.c
@@ -2194,7 +2194,6 @@ static int intel_user_framebuffer_dirty(struct drm_framebuffer *fb,
 	return ret;
 
 flush:
-	intel_bo_frontbuffer_flush_for_display(front);
 	intel_frontbuffer_flush(front, ORIGIN_DIRTYFB);
 	return ret;
 }
diff --git a/drivers/gpu/drm/i915/display/intel_frontbuffer.c b/drivers/gpu/drm/i915/display/intel_frontbuffer.c
index 5562801d2ea3..bdf8bfa7deb9 100644
--- a/drivers/gpu/drm/i915/display/intel_frontbuffer.c
+++ b/drivers/gpu/drm/i915/display/intel_frontbuffer.c
@@ -150,6 +150,9 @@ void __intel_fb_flush(struct intel_frontbuffer *front,
 {
 	struct intel_display *display = to_intel_display(front->obj->dev);
 
+	if (origin == ORIGIN_DIRTYFB)
+		intel_bo_frontbuffer_flush_for_display(front);
+
 	if (origin == ORIGIN_CS) {
 		spin_lock(&display->fb_tracking.lock);
 		/* Filter out new bits since rendering started. */
@@ -167,7 +170,6 @@ static void intel_frontbuffer_flush_work(struct work_struct *work)
 	struct intel_frontbuffer *front =
 		container_of(work, struct intel_frontbuffer, flush_work);
 
-	intel_bo_frontbuffer_flush_for_display(front);
 	intel_frontbuffer_flush(front, ORIGIN_DIRTYFB);
 	intel_frontbuffer_put(front);
 }
-- 
2.49.1


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

* [PATCH v2 06/10] drm/i915/frontbuffef: Split fb_tracking.lock into two
  2025-10-16 18:53 [PATCH v2 00/10] drm/i915/frontbuffer: Fix the intel_frontbuffer lifetime mess Ville Syrjala
                   ` (4 preceding siblings ...)
  2025-10-16 18:54 ` [PATCH v2 05/10] drm/i915/frontbuffer: Handle the dirtyfb cache flush inside intel_frontbuffer_flush() Ville Syrjala
@ 2025-10-16 18:54 ` Ville Syrjala
  2025-10-16 18:54 ` [PATCH v2 07/10] drm/i915/frontbuffer: Extract intel_frontbuffer_ref() Ville Syrjala
                   ` (7 subsequent siblings)
  13 siblings, 0 replies; 20+ messages in thread
From: Ville Syrjala @ 2025-10-16 18:54 UTC (permalink / raw)
  To: intel-gfx; +Cc: intel-xe, Jani Nikula

From: Ville Syrjälä <ville.syrjala@linux.intel.com>

Our fb_tracking.lock is serving a double duty:
- protects fb_tracking.busy_bits
- provides the write-side protection for obj->frontbuffer

Split obj->frontbuffer role into a separate lock so that
we can clean up the current mess with the frontbuffer lifetime
management.

Acked-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/gpu/drm/i915/display/intel_display_core.h      |  4 ++++
 drivers/gpu/drm/i915/display/intel_display_driver.c    |  1 +
 drivers/gpu/drm/i915/display/intel_frontbuffer.c       | 10 +++++-----
 drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.h |  2 +-
 4 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h b/drivers/gpu/drm/i915/display/intel_display_core.h
index fa43636b89fa..13576d07c999 100644
--- a/drivers/gpu/drm/i915/display/intel_display_core.h
+++ b/drivers/gpu/drm/i915/display/intel_display_core.h
@@ -141,6 +141,10 @@ struct intel_dpll_global {
 };
 
 struct intel_frontbuffer_tracking {
+	/* protects obj->frontbuffer (write-side) */
+	spinlock_t frontbuffer_lock;
+
+	/* protects busy_bits */
 	spinlock_t lock;
 
 	/*
diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c b/drivers/gpu/drm/i915/display/intel_display_driver.c
index f84a0b26b7a6..ac684f8c5d40 100644
--- a/drivers/gpu/drm/i915/display/intel_display_driver.c
+++ b/drivers/gpu/drm/i915/display/intel_display_driver.c
@@ -184,6 +184,7 @@ void intel_display_driver_early_probe(struct intel_display *display)
 	if (!HAS_DISPLAY(display))
 		return;
 
+	spin_lock_init(&display->fb_tracking.frontbuffer_lock);
 	spin_lock_init(&display->fb_tracking.lock);
 	mutex_init(&display->backlight.lock);
 	mutex_init(&display->audio.mutex);
diff --git a/drivers/gpu/drm/i915/display/intel_frontbuffer.c b/drivers/gpu/drm/i915/display/intel_frontbuffer.c
index bdf8bfa7deb9..02b06dfb9fee 100644
--- a/drivers/gpu/drm/i915/display/intel_frontbuffer.c
+++ b/drivers/gpu/drm/i915/display/intel_frontbuffer.c
@@ -210,7 +210,7 @@ static void frontbuffer_retire(struct i915_active *ref)
 }
 
 static void frontbuffer_release(struct kref *ref)
-	__releases(&to_intel_display(front->obj->dev)->fb_tracking.lock)
+	__releases(&to_intel_display(front->obj->dev)->fb_tracking.frontbuffer_lock)
 {
 	struct intel_frontbuffer *ret, *front =
 		container_of(ref, typeof(*front), ref);
@@ -223,7 +223,7 @@ static void frontbuffer_release(struct kref *ref)
 
 	ret = intel_bo_set_frontbuffer(obj, NULL);
 	drm_WARN_ON(display->drm, ret);
-	spin_unlock(&display->fb_tracking.lock);
+	spin_unlock(&display->fb_tracking.frontbuffer_lock);
 
 	i915_active_fini(&front->write);
 
@@ -256,9 +256,9 @@ intel_frontbuffer_get(struct drm_gem_object *obj)
 			 I915_ACTIVE_RETIRE_SLEEPS);
 	INIT_WORK(&front->flush_work, intel_frontbuffer_flush_work);
 
-	spin_lock(&display->fb_tracking.lock);
+	spin_lock(&display->fb_tracking.frontbuffer_lock);
 	cur = intel_bo_set_frontbuffer(obj, front);
-	spin_unlock(&display->fb_tracking.lock);
+	spin_unlock(&display->fb_tracking.frontbuffer_lock);
 
 	if (cur != front) {
 		drm_gem_object_put(obj);
@@ -272,7 +272,7 @@ void intel_frontbuffer_put(struct intel_frontbuffer *front)
 {
 	kref_put_lock(&front->ref,
 		      frontbuffer_release,
-		      &to_intel_display(front->obj->dev)->fb_tracking.lock);
+		      &to_intel_display(front->obj->dev)->fb_tracking.frontbuffer_lock);
 }
 
 /**
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.h b/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.h
index b682969e3a29..1ec382c43aee 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.h
+++ b/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.h
@@ -77,7 +77,7 @@ i915_gem_object_get_frontbuffer(const struct drm_i915_gem_object *obj)
  * Set object's frontbuffer pointer. If frontbuffer is already set for the
  * object keep it and return it's pointer to the caller. Please note that RCU
  * mechanism is used to handle e.g. ongoing removal of frontbuffer pointer. This
- * function is protected by i915->display->fb_tracking.lock
+ * function is protected by i915->display->fb_tracking.frontbuffer_lock
  *
  * Return: pointer to frontbuffer which was set.
  */
-- 
2.49.1


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

* [PATCH v2 07/10] drm/i915/frontbuffer: Extract intel_frontbuffer_ref()
  2025-10-16 18:53 [PATCH v2 00/10] drm/i915/frontbuffer: Fix the intel_frontbuffer lifetime mess Ville Syrjala
                   ` (5 preceding siblings ...)
  2025-10-16 18:54 ` [PATCH v2 06/10] drm/i915/frontbuffef: Split fb_tracking.lock into two Ville Syrjala
@ 2025-10-16 18:54 ` Ville Syrjala
  2025-10-16 18:54 ` [PATCH v2 08/10] drm/i915/frontbuffer: Add intel_frontbuffer::display Ville Syrjala
                   ` (6 subsequent siblings)
  13 siblings, 0 replies; 20+ messages in thread
From: Ville Syrjala @ 2025-10-16 18:54 UTC (permalink / raw)
  To: intel-gfx; +Cc: intel-xe, Jani Nikula

From: Ville Syrjälä <ville.syrjala@linux.intel.com>

I want to hide the kref from the high level frontbuffer code.
To that end abstract the kref_get() in intel_frontbuffer_queue_flush()
(which is the only high level function that needs this) as a new
intel_frontbuffer_ref().

Acked-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/gpu/drm/i915/display/intel_frontbuffer.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/display/intel_frontbuffer.c b/drivers/gpu/drm/i915/display/intel_frontbuffer.c
index 02b06dfb9fee..e5f3f0d555a8 100644
--- a/drivers/gpu/drm/i915/display/intel_frontbuffer.c
+++ b/drivers/gpu/drm/i915/display/intel_frontbuffer.c
@@ -165,6 +165,11 @@ void __intel_fb_flush(struct intel_frontbuffer *front,
 		frontbuffer_flush(display, frontbuffer_bits, origin);
 }
 
+static void intel_frontbuffer_ref(struct intel_frontbuffer *front)
+{
+	kref_get(&front->ref);
+}
+
 static void intel_frontbuffer_flush_work(struct work_struct *work)
 {
 	struct intel_frontbuffer *front =
@@ -186,7 +191,7 @@ void intel_frontbuffer_queue_flush(struct intel_frontbuffer *front)
 	if (!front)
 		return;
 
-	kref_get(&front->ref);
+	intel_frontbuffer_ref(front);
 	if (!schedule_work(&front->flush_work))
 		intel_frontbuffer_put(front);
 }
-- 
2.49.1


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

* [PATCH v2 08/10] drm/i915/frontbuffer: Add intel_frontbuffer::display
  2025-10-16 18:53 [PATCH v2 00/10] drm/i915/frontbuffer: Fix the intel_frontbuffer lifetime mess Ville Syrjala
                   ` (6 preceding siblings ...)
  2025-10-16 18:54 ` [PATCH v2 07/10] drm/i915/frontbuffer: Extract intel_frontbuffer_ref() Ville Syrjala
@ 2025-10-16 18:54 ` Ville Syrjala
  2025-10-16 18:54 ` [PATCH v2 09/10] drm/i915/frontbuffer: Fix intel_frontbuffer lifetime handling Ville Syrjala
                   ` (5 subsequent siblings)
  13 siblings, 0 replies; 20+ messages in thread
From: Ville Syrjala @ 2025-10-16 18:54 UTC (permalink / raw)
  To: intel-gfx; +Cc: intel-xe, Jani Nikula

From: Ville Syrjälä <ville.syrjala@linux.intel.com>

After upcoming intel_frontbuffer lifetime related changed we
won't need intel_frontbuffer::obj for anything apart from
getting at the display. Add a direct pointer for that instead
so that the obj pointer can be completely eliminated.

Acked-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 .../gpu/drm/i915/display/intel_frontbuffer.c  | 19 ++++++++-----------
 .../gpu/drm/i915/display/intel_frontbuffer.h  |  1 +
 2 files changed, 9 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_frontbuffer.c b/drivers/gpu/drm/i915/display/intel_frontbuffer.c
index e5f3f0d555a8..5d627eac07bd 100644
--- a/drivers/gpu/drm/i915/display/intel_frontbuffer.c
+++ b/drivers/gpu/drm/i915/display/intel_frontbuffer.c
@@ -128,7 +128,7 @@ void __intel_fb_invalidate(struct intel_frontbuffer *front,
 			   enum fb_op_origin origin,
 			   unsigned int frontbuffer_bits)
 {
-	struct intel_display *display = to_intel_display(front->obj->dev);
+	struct intel_display *display = front->display;
 
 	if (origin == ORIGIN_CS) {
 		spin_lock(&display->fb_tracking.lock);
@@ -148,7 +148,7 @@ void __intel_fb_flush(struct intel_frontbuffer *front,
 		      enum fb_op_origin origin,
 		      unsigned int frontbuffer_bits)
 {
-	struct intel_display *display = to_intel_display(front->obj->dev);
+	struct intel_display *display = front->display;
 
 	if (origin == ORIGIN_DIRTYFB)
 		intel_bo_frontbuffer_flush_for_display(front);
@@ -215,12 +215,12 @@ static void frontbuffer_retire(struct i915_active *ref)
 }
 
 static void frontbuffer_release(struct kref *ref)
-	__releases(&to_intel_display(front->obj->dev)->fb_tracking.frontbuffer_lock)
+	__releases(&front->display->fb_tracking.frontbuffer_lock)
 {
 	struct intel_frontbuffer *ret, *front =
 		container_of(ref, typeof(*front), ref);
+	struct intel_display *display = front->display;
 	struct drm_gem_object *obj = front->obj;
-	struct intel_display *display = to_intel_display(obj->dev);
 
 	drm_WARN_ON(display->drm, atomic_read(&front->bits));
 
@@ -253,6 +253,7 @@ intel_frontbuffer_get(struct drm_gem_object *obj)
 	drm_gem_object_get(obj);
 
 	front->obj = obj;
+	front->display = display;
 	kref_init(&front->ref);
 	atomic_set(&front->bits, 0);
 	i915_active_init(&front->write,
@@ -277,7 +278,7 @@ void intel_frontbuffer_put(struct intel_frontbuffer *front)
 {
 	kref_put_lock(&front->ref,
 		      frontbuffer_release,
-		      &to_intel_display(front->obj->dev)->fb_tracking.frontbuffer_lock);
+		      &front->display->fb_tracking.frontbuffer_lock);
 }
 
 /**
@@ -306,17 +307,13 @@ void intel_frontbuffer_track(struct intel_frontbuffer *old,
 	BUILD_BUG_ON(I915_MAX_PLANES > INTEL_FRONTBUFFER_BITS_PER_PIPE);
 
 	if (old) {
-		struct intel_display *display = to_intel_display(old->obj->dev);
-
-		drm_WARN_ON(display->drm,
+		drm_WARN_ON(old->display->drm,
 			    !(atomic_read(&old->bits) & frontbuffer_bits));
 		atomic_andnot(frontbuffer_bits, &old->bits);
 	}
 
 	if (new) {
-		struct intel_display *display = to_intel_display(new->obj->dev);
-
-		drm_WARN_ON(display->drm,
+		drm_WARN_ON(new->display->drm,
 			    atomic_read(&new->bits) & frontbuffer_bits);
 		atomic_or(frontbuffer_bits, &new->bits);
 	}
diff --git a/drivers/gpu/drm/i915/display/intel_frontbuffer.h b/drivers/gpu/drm/i915/display/intel_frontbuffer.h
index 293c2d0152d6..ff2a6ac75a34 100644
--- a/drivers/gpu/drm/i915/display/intel_frontbuffer.h
+++ b/drivers/gpu/drm/i915/display/intel_frontbuffer.h
@@ -43,6 +43,7 @@ enum fb_op_origin {
 
 struct intel_frontbuffer {
 	struct kref ref;
+	struct intel_display *display;
 	atomic_t bits;
 	struct i915_active write;
 	struct drm_gem_object *obj;
-- 
2.49.1


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

* [PATCH v2 09/10] drm/i915/frontbuffer: Fix intel_frontbuffer lifetime handling
  2025-10-16 18:53 [PATCH v2 00/10] drm/i915/frontbuffer: Fix the intel_frontbuffer lifetime mess Ville Syrjala
                   ` (7 preceding siblings ...)
  2025-10-16 18:54 ` [PATCH v2 08/10] drm/i915/frontbuffer: Add intel_frontbuffer::display Ville Syrjala
@ 2025-10-16 18:54 ` Ville Syrjala
  2025-10-29 13:51   ` Jani Nikula
  2025-10-16 18:54 ` [PATCH v2 10/10] drm/i915/gem: s/i915_gem_object_get_frontbuffer/i915_gem_object_frontbuffer_lookup/ Ville Syrjala
                   ` (4 subsequent siblings)
  13 siblings, 1 reply; 20+ messages in thread
From: Ville Syrjala @ 2025-10-16 18:54 UTC (permalink / raw)
  To: intel-gfx; +Cc: intel-xe, Jani Nikula

From: Ville Syrjälä <ville.syrjala@linux.intel.com>

The current attempted split between xe/i915 vs. display
for intel_frontbuffer is a mess:
- the i915 rcu leaks through the interface to the display side
- the obj->frontbuffer write-side is now protected by a display
  specific spinlock even though the actual obj->framebuffer
  pointer lives in a i915 specific structure
- the kref is getting poked directly from both sides
- i915_active is still on the display side

Clean up the mess by moving everything about the frontbuffer
lifetime management to the i915/xe side:
- the rcu usage is now completely contained in i915
- frontbuffer_lock is moved into i915
- kref is on the i915/xe side (xe needs the refcount as well
  due to intel_frontbuffer_queue_flush()->intel_frontbuffer_ref())
- the bo (and its refcounting) is no longer on the display side
- i915_active is contained in i915

I was pondering whether we could do this in some kind of smaller
steps, and perhaps we could, but it would probably have to start
with a bunch of reverts (which for sure won't go cleanly anymore).
So not convinced it's worth the hassle.

Acked-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/gpu/drm/i915/Makefile                 |   1 +
 drivers/gpu/drm/i915/display/intel_bo.c       |  34 ++++--
 drivers/gpu/drm/i915/display/intel_bo.h       |   6 +-
 .../gpu/drm/i915/display/intel_display_core.h |   3 -
 .../drm/i915/display/intel_display_driver.c   |   1 -
 .../gpu/drm/i915/display/intel_frontbuffer.c  |  89 ++-------------
 .../gpu/drm/i915/display/intel_frontbuffer.h  |  13 +--
 drivers/gpu/drm/i915/gem/i915_gem_object.c    |  12 +-
 .../i915/gem/i915_gem_object_frontbuffer.c    | 103 ++++++++++++++++++
 .../i915/gem/i915_gem_object_frontbuffer.h    |  48 +++-----
 .../gpu/drm/i915/gem/i915_gem_object_types.h  |   2 +-
 drivers/gpu/drm/i915/i915_drv.h               |   2 +
 drivers/gpu/drm/i915/i915_gem.c               |   2 +
 drivers/gpu/drm/i915/i915_vma.c               |   6 +-
 .../gpu/drm/xe/compat-i915-headers/i915_vma.h |   2 -
 drivers/gpu/drm/xe/display/intel_bo.c         |  52 ++++++++-
 16 files changed, 227 insertions(+), 149 deletions(-)
 create mode 100644 drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.c

diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
index aa2f0fd95117..717e57205c85 100644
--- a/drivers/gpu/drm/i915/Makefile
+++ b/drivers/gpu/drm/i915/Makefile
@@ -155,6 +155,7 @@ gem-y += \
 	gem/i915_gem_lmem.o \
 	gem/i915_gem_mman.o \
 	gem/i915_gem_object.o \
+	gem/i915_gem_object_frontbuffer.o \
 	gem/i915_gem_pages.o \
 	gem/i915_gem_phys.o \
 	gem/i915_gem_pm.o \
diff --git a/drivers/gpu/drm/i915/display/intel_bo.c b/drivers/gpu/drm/i915/display/intel_bo.c
index 2792aca7bc22..f3687eb63467 100644
--- a/drivers/gpu/drm/i915/display/intel_bo.c
+++ b/drivers/gpu/drm/i915/display/intel_bo.c
@@ -39,20 +39,40 @@ int intel_bo_read_from_page(struct drm_gem_object *obj, u64 offset, void *dst, i
 	return i915_gem_object_read_from_page(to_intel_bo(obj), offset, dst, size);
 }
 
-struct intel_frontbuffer *intel_bo_get_frontbuffer(struct drm_gem_object *obj)
+struct intel_frontbuffer *intel_bo_frontbuffer_get(struct drm_gem_object *_obj)
 {
-	return i915_gem_object_get_frontbuffer(to_intel_bo(obj));
+	struct drm_i915_gem_object *obj = to_intel_bo(_obj);
+	struct i915_frontbuffer *front;
+
+	front = i915_gem_object_frontbuffer_get(obj);
+	if (!front)
+		return NULL;
+
+	return &front->base;
+}
+
+void intel_bo_frontbuffer_ref(struct intel_frontbuffer *_front)
+{
+	struct i915_frontbuffer *front =
+		container_of(_front, typeof(*front), base);
+
+	i915_gem_object_frontbuffer_ref(front);
 }
 
-struct intel_frontbuffer *intel_bo_set_frontbuffer(struct drm_gem_object *obj,
-						   struct intel_frontbuffer *front)
+void intel_bo_frontbuffer_put(struct intel_frontbuffer *_front)
 {
-	return i915_gem_object_set_frontbuffer(to_intel_bo(obj), front);
+	struct i915_frontbuffer *front =
+		container_of(_front, typeof(*front), base);
+
+	return i915_gem_object_frontbuffer_put(front);
 }
 
-void intel_bo_frontbuffer_flush_for_display(struct intel_frontbuffer *front)
+void intel_bo_frontbuffer_flush_for_display(struct intel_frontbuffer *_front)
 {
-	i915_gem_object_flush_if_display(to_intel_bo(front->obj));
+	struct i915_frontbuffer *front =
+		container_of(_front, typeof(*front), base);
+
+	i915_gem_object_flush_if_display(front->obj);
 }
 
 void intel_bo_describe(struct seq_file *m, struct drm_gem_object *obj)
diff --git a/drivers/gpu/drm/i915/display/intel_bo.h b/drivers/gpu/drm/i915/display/intel_bo.h
index 08247bf36d40..fc05f680dc76 100644
--- a/drivers/gpu/drm/i915/display/intel_bo.h
+++ b/drivers/gpu/drm/i915/display/intel_bo.h
@@ -19,9 +19,9 @@ bool intel_bo_is_protected(struct drm_gem_object *obj);
 int intel_bo_fb_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma);
 int intel_bo_read_from_page(struct drm_gem_object *obj, u64 offset, void *dst, int size);
 
-struct intel_frontbuffer *intel_bo_get_frontbuffer(struct drm_gem_object *obj);
-struct intel_frontbuffer *intel_bo_set_frontbuffer(struct drm_gem_object *obj,
-						   struct intel_frontbuffer *front);
+struct intel_frontbuffer *intel_bo_frontbuffer_get(struct drm_gem_object *obj);
+void intel_bo_frontbuffer_ref(struct intel_frontbuffer *front);
+void intel_bo_frontbuffer_put(struct intel_frontbuffer *front);
 void intel_bo_frontbuffer_flush_for_display(struct intel_frontbuffer *front);
 
 void intel_bo_describe(struct seq_file *m, struct drm_gem_object *obj);
diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h b/drivers/gpu/drm/i915/display/intel_display_core.h
index 13576d07c999..34d578e2cc25 100644
--- a/drivers/gpu/drm/i915/display/intel_display_core.h
+++ b/drivers/gpu/drm/i915/display/intel_display_core.h
@@ -141,9 +141,6 @@ struct intel_dpll_global {
 };
 
 struct intel_frontbuffer_tracking {
-	/* protects obj->frontbuffer (write-side) */
-	spinlock_t frontbuffer_lock;
-
 	/* protects busy_bits */
 	spinlock_t lock;
 
diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c b/drivers/gpu/drm/i915/display/intel_display_driver.c
index ac684f8c5d40..f84a0b26b7a6 100644
--- a/drivers/gpu/drm/i915/display/intel_display_driver.c
+++ b/drivers/gpu/drm/i915/display/intel_display_driver.c
@@ -184,7 +184,6 @@ void intel_display_driver_early_probe(struct intel_display *display)
 	if (!HAS_DISPLAY(display))
 		return;
 
-	spin_lock_init(&display->fb_tracking.frontbuffer_lock);
 	spin_lock_init(&display->fb_tracking.lock);
 	mutex_init(&display->backlight.lock);
 	mutex_init(&display->audio.mutex);
diff --git a/drivers/gpu/drm/i915/display/intel_frontbuffer.c b/drivers/gpu/drm/i915/display/intel_frontbuffer.c
index 5d627eac07bd..4761e116e442 100644
--- a/drivers/gpu/drm/i915/display/intel_frontbuffer.c
+++ b/drivers/gpu/drm/i915/display/intel_frontbuffer.c
@@ -57,8 +57,6 @@
 
 #include <drm/drm_gem.h>
 
-#include "i915_active.h"
-#include "i915_vma.h"
 #include "intel_bo.h"
 #include "intel_display_trace.h"
 #include "intel_display_types.h"
@@ -167,7 +165,7 @@ void __intel_fb_flush(struct intel_frontbuffer *front,
 
 static void intel_frontbuffer_ref(struct intel_frontbuffer *front)
 {
-	kref_get(&front->ref);
+	intel_bo_frontbuffer_ref(front);
 }
 
 static void intel_frontbuffer_flush_work(struct work_struct *work)
@@ -196,89 +194,26 @@ void intel_frontbuffer_queue_flush(struct intel_frontbuffer *front)
 		intel_frontbuffer_put(front);
 }
 
-static int frontbuffer_active(struct i915_active *ref)
+void intel_frontbuffer_init(struct intel_frontbuffer *front, struct drm_device *drm)
 {
-	struct intel_frontbuffer *front =
-		container_of(ref, typeof(*front), write);
-
-	kref_get(&front->ref);
-	return 0;
-}
-
-static void frontbuffer_retire(struct i915_active *ref)
-{
-	struct intel_frontbuffer *front =
-		container_of(ref, typeof(*front), write);
-
-	intel_frontbuffer_flush(front, ORIGIN_CS);
-	intel_frontbuffer_put(front);
-}
-
-static void frontbuffer_release(struct kref *ref)
-	__releases(&front->display->fb_tracking.frontbuffer_lock)
-{
-	struct intel_frontbuffer *ret, *front =
-		container_of(ref, typeof(*front), ref);
-	struct intel_display *display = front->display;
-	struct drm_gem_object *obj = front->obj;
-
-	drm_WARN_ON(display->drm, atomic_read(&front->bits));
-
-	i915_ggtt_clear_scanout(to_intel_bo(obj));
-
-	ret = intel_bo_set_frontbuffer(obj, NULL);
-	drm_WARN_ON(display->drm, ret);
-	spin_unlock(&display->fb_tracking.frontbuffer_lock);
-
-	i915_active_fini(&front->write);
-
-	drm_gem_object_put(obj);
-	kfree_rcu(front, rcu);
-}
-
-struct intel_frontbuffer *
-intel_frontbuffer_get(struct drm_gem_object *obj)
-{
-	struct intel_display *display = to_intel_display(obj->dev);
-	struct intel_frontbuffer *front, *cur;
-
-	front = intel_bo_get_frontbuffer(obj);
-	if (front)
-		return front;
-
-	front = kmalloc(sizeof(*front), GFP_KERNEL);
-	if (!front)
-		return NULL;
-
-	drm_gem_object_get(obj);
-
-	front->obj = obj;
-	front->display = display;
-	kref_init(&front->ref);
+	front->display = to_intel_display(drm);
 	atomic_set(&front->bits, 0);
-	i915_active_init(&front->write,
-			 frontbuffer_active,
-			 frontbuffer_retire,
-			 I915_ACTIVE_RETIRE_SLEEPS);
 	INIT_WORK(&front->flush_work, intel_frontbuffer_flush_work);
+}
 
-	spin_lock(&display->fb_tracking.frontbuffer_lock);
-	cur = intel_bo_set_frontbuffer(obj, front);
-	spin_unlock(&display->fb_tracking.frontbuffer_lock);
+void intel_frontbuffer_fini(struct intel_frontbuffer *front)
+{
+	drm_WARN_ON(front->display->drm, atomic_read(&front->bits));
+}
 
-	if (cur != front) {
-		drm_gem_object_put(obj);
-		kfree(front);
-	}
-
-	return cur;
+struct intel_frontbuffer *intel_frontbuffer_get(struct drm_gem_object *obj)
+{
+	return intel_bo_frontbuffer_get(obj);
 }
 
 void intel_frontbuffer_put(struct intel_frontbuffer *front)
 {
-	kref_put_lock(&front->ref,
-		      frontbuffer_release,
-		      &front->display->fb_tracking.frontbuffer_lock);
+	intel_bo_frontbuffer_put(front);
 }
 
 /**
diff --git a/drivers/gpu/drm/i915/display/intel_frontbuffer.h b/drivers/gpu/drm/i915/display/intel_frontbuffer.h
index ff2a6ac75a34..22677acb4c06 100644
--- a/drivers/gpu/drm/i915/display/intel_frontbuffer.h
+++ b/drivers/gpu/drm/i915/display/intel_frontbuffer.h
@@ -26,10 +26,9 @@
 
 #include <linux/atomic.h>
 #include <linux/bits.h>
-#include <linux/kref.h>
-
-#include "i915_active_types.h"
+#include <linux/workqueue_types.h>
 
+struct drm_device;
 struct drm_gem_object;
 struct intel_display;
 
@@ -42,13 +41,8 @@ enum fb_op_origin {
 };
 
 struct intel_frontbuffer {
-	struct kref ref;
 	struct intel_display *display;
 	atomic_t bits;
-	struct i915_active write;
-	struct drm_gem_object *obj;
-	struct rcu_head rcu;
-
 	struct work_struct flush_work;
 };
 
@@ -141,4 +135,7 @@ void intel_frontbuffer_track(struct intel_frontbuffer *old,
 			     struct intel_frontbuffer *new,
 			     unsigned int frontbuffer_bits);
 
+void intel_frontbuffer_init(struct intel_frontbuffer *front, struct drm_device *drm);
+void intel_frontbuffer_fini(struct intel_frontbuffer *front);
+
 #endif /* __INTEL_FRONTBUFFER_H__ */
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.c b/drivers/gpu/drm/i915/gem/i915_gem_object.c
index 478011e5ecb3..36680eddf88e 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_object.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_object.c
@@ -476,24 +476,24 @@ static void i915_gem_free_object(struct drm_gem_object *gem_obj)
 void __i915_gem_object_flush_frontbuffer(struct drm_i915_gem_object *obj,
 					 enum fb_op_origin origin)
 {
-	struct intel_frontbuffer *front;
+	struct i915_frontbuffer *front;
 
 	front = i915_gem_object_get_frontbuffer(obj);
 	if (front) {
-		intel_frontbuffer_flush(front, origin);
-		intel_frontbuffer_put(front);
+		intel_frontbuffer_flush(&front->base, origin);
+		i915_gem_object_frontbuffer_put(front);
 	}
 }
 
 void __i915_gem_object_invalidate_frontbuffer(struct drm_i915_gem_object *obj,
 					      enum fb_op_origin origin)
 {
-	struct intel_frontbuffer *front;
+	struct i915_frontbuffer *front;
 
 	front = i915_gem_object_get_frontbuffer(obj);
 	if (front) {
-		intel_frontbuffer_invalidate(front, origin);
-		intel_frontbuffer_put(front);
+		intel_frontbuffer_invalidate(&front->base, origin);
+		i915_gem_object_frontbuffer_put(front);
 	}
 }
 
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.c b/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.c
new file mode 100644
index 000000000000..7ef89613c025
--- /dev/null
+++ b/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.c
@@ -0,0 +1,103 @@
+// SPDX-License-Identifier: MIT
+/* Copyright © 2025 Intel Corporation */
+
+#include "i915_drv.h"
+#include "i915_gem_object_frontbuffer.h"
+
+static int frontbuffer_active(struct i915_active *ref)
+{
+	struct i915_frontbuffer *front =
+		container_of(ref, typeof(*front), write);
+
+	kref_get(&front->ref);
+	return 0;
+}
+
+static void frontbuffer_retire(struct i915_active *ref)
+{
+	struct i915_frontbuffer *front =
+		container_of(ref, typeof(*front), write);
+
+	intel_frontbuffer_flush(&front->base, ORIGIN_CS);
+	i915_gem_object_frontbuffer_put(front);
+}
+
+struct i915_frontbuffer *
+i915_gem_object_frontbuffer_get(struct drm_i915_gem_object *obj)
+{
+	struct drm_i915_private *i915 = to_i915(obj->base.dev);
+	struct i915_frontbuffer *front, *cur;
+
+	front = i915_gem_object_get_frontbuffer(obj);
+	if (front)
+		return front;
+
+	front = kmalloc(sizeof(*front), GFP_KERNEL);
+	if (!front)
+		return NULL;
+
+	intel_frontbuffer_init(&front->base, &i915->drm);
+
+	kref_init(&front->ref);
+	i915_gem_object_get(obj);
+	front->obj = obj;
+
+	i915_active_init(&front->write,
+			 frontbuffer_active,
+			 frontbuffer_retire,
+			 I915_ACTIVE_RETIRE_SLEEPS);
+
+	spin_lock(&i915->frontbuffer_lock);
+	if (rcu_access_pointer(obj->frontbuffer)) {
+		cur = rcu_dereference_protected(obj->frontbuffer, true);
+		kref_get(&cur->ref);
+	} else {
+		cur = front;
+		rcu_assign_pointer(obj->frontbuffer, front);
+	}
+	spin_unlock(&i915->frontbuffer_lock);
+
+	if (cur != front) {
+		i915_gem_object_put(obj);
+		intel_frontbuffer_fini(&front->base);
+		kfree(front);
+	}
+
+	return cur;
+}
+
+void i915_gem_object_frontbuffer_ref(struct i915_frontbuffer *front)
+{
+	kref_get(&front->ref);
+}
+
+static void frontbuffer_release(struct kref *ref)
+	__releases(&i915->frontbuffer_lock)
+{
+	struct i915_frontbuffer *front =
+		container_of(ref, typeof(*front), ref);
+	struct drm_i915_gem_object *obj = front->obj;
+	struct drm_i915_private *i915 = to_i915(obj->base.dev);
+
+	i915_ggtt_clear_scanout(obj);
+
+	RCU_INIT_POINTER(obj->frontbuffer, NULL);
+
+	spin_unlock(&i915->frontbuffer_lock);
+
+	i915_active_fini(&front->write);
+
+	i915_gem_object_put(obj);
+
+	intel_frontbuffer_fini(&front->base);
+
+	kfree_rcu(front, rcu);
+}
+
+void i915_gem_object_frontbuffer_put(struct i915_frontbuffer *front)
+{
+	struct drm_i915_private *i915 = to_i915(front->obj->base.dev);
+
+	kref_put_lock(&front->ref, frontbuffer_release,
+		      &i915->frontbuffer_lock);
+}
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.h b/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.h
index 1ec382c43aee..385f7e8049b8 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.h
+++ b/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.h
@@ -12,6 +12,14 @@
 #include "display/intel_frontbuffer.h"
 #include "i915_gem_object_types.h"
 
+struct i915_frontbuffer {
+	struct intel_frontbuffer base;
+	struct drm_i915_gem_object *obj;
+	struct i915_active write;
+	struct rcu_head rcu;
+	struct kref ref;
+};
+
 void __i915_gem_object_flush_frontbuffer(struct drm_i915_gem_object *obj,
 					 enum fb_op_origin origin);
 void __i915_gem_object_invalidate_frontbuffer(struct drm_i915_gem_object *obj,
@@ -33,6 +41,10 @@ i915_gem_object_invalidate_frontbuffer(struct drm_i915_gem_object *obj,
 		__i915_gem_object_invalidate_frontbuffer(obj, origin);
 }
 
+struct i915_frontbuffer *i915_gem_object_frontbuffer_get(struct drm_i915_gem_object *obj);
+void i915_gem_object_frontbuffer_ref(struct i915_frontbuffer *front);
+void i915_gem_object_frontbuffer_put(struct i915_frontbuffer *front);
+
 /**
  * i915_gem_object_get_frontbuffer - Get the object's frontbuffer
  * @obj: The object whose frontbuffer to get.
@@ -42,10 +54,10 @@ i915_gem_object_invalidate_frontbuffer(struct drm_i915_gem_object *obj,
  *
  * Return: pointer to object's frontbuffer is such exists or NULL
  */
-static inline struct intel_frontbuffer *
+static inline struct i915_frontbuffer *
 i915_gem_object_get_frontbuffer(const struct drm_i915_gem_object *obj)
 {
-	struct intel_frontbuffer *front;
+	struct i915_frontbuffer *front;
 
 	if (likely(!rcu_access_pointer(obj->frontbuffer)))
 		return NULL;
@@ -62,41 +74,11 @@ i915_gem_object_get_frontbuffer(const struct drm_i915_gem_object *obj)
 		if (likely(front == rcu_access_pointer(obj->frontbuffer)))
 			break;
 
-		intel_frontbuffer_put(front);
+		i915_gem_object_frontbuffer_put(front);
 	} while (1);
 	rcu_read_unlock();
 
 	return front;
 }
 
-/**
- * i915_gem_object_set_frontbuffer - Set the object's frontbuffer
- * @obj: The object whose frontbuffer to set.
- * @front: The frontbuffer to set
- *
- * Set object's frontbuffer pointer. If frontbuffer is already set for the
- * object keep it and return it's pointer to the caller. Please note that RCU
- * mechanism is used to handle e.g. ongoing removal of frontbuffer pointer. This
- * function is protected by i915->display->fb_tracking.frontbuffer_lock
- *
- * Return: pointer to frontbuffer which was set.
- */
-static inline struct intel_frontbuffer *
-i915_gem_object_set_frontbuffer(struct drm_i915_gem_object *obj,
-				struct intel_frontbuffer *front)
-{
-	struct intel_frontbuffer *cur = front;
-
-	if (!front) {
-		RCU_INIT_POINTER(obj->frontbuffer, NULL);
-	} else if (rcu_access_pointer(obj->frontbuffer)) {
-		cur = rcu_dereference_protected(obj->frontbuffer, true);
-		kref_get(&cur->ref);
-	} else {
-		rcu_assign_pointer(obj->frontbuffer, front);
-	}
-
-	return cur;
-}
-
 #endif
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object_types.h b/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
index 64600aa8227f..465ce94aee76 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
+++ b/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
@@ -574,7 +574,7 @@ struct drm_i915_gem_object {
 	 */
 	u16 write_domain;
 
-	struct intel_frontbuffer __rcu *frontbuffer;
+	struct i915_frontbuffer __rcu *frontbuffer;
 
 	/** Current tiling stride for the object, if it's tiled. */
 	unsigned int tiling_and_stride;
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 95f9ddf22ce4..5381a934a671 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -311,6 +311,8 @@ struct drm_i915_private {
 		struct file *mmap_singleton;
 	} gem;
 
+	spinlock_t frontbuffer_lock; /* protects obj->frontbuffer (write-side) */
+
 	struct intel_pxp *pxp;
 
 	struct i915_pmu pmu;
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index e14a0c3db999..39b747c3e223 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -1298,6 +1298,8 @@ void i915_gem_init_early(struct drm_i915_private *dev_priv)
 {
 	i915_gem_init__mm(dev_priv);
 	i915_gem_init__contexts(dev_priv);
+
+	spin_lock_init(&dev_priv->frontbuffer_lock);
 }
 
 void i915_gem_cleanup_early(struct drm_i915_private *dev_priv)
diff --git a/drivers/gpu/drm/i915/i915_vma.c b/drivers/gpu/drm/i915/i915_vma.c
index 25e97031d76e..cb36daaa101d 100644
--- a/drivers/gpu/drm/i915/i915_vma.c
+++ b/drivers/gpu/drm/i915/i915_vma.c
@@ -1990,13 +1990,13 @@ int _i915_vma_move_to_active(struct i915_vma *vma,
 	}
 
 	if (flags & EXEC_OBJECT_WRITE) {
-		struct intel_frontbuffer *front;
+		struct i915_frontbuffer *front;
 
 		front = i915_gem_object_get_frontbuffer(obj);
 		if (unlikely(front)) {
-			if (intel_frontbuffer_invalidate(front, ORIGIN_CS))
+			if (intel_frontbuffer_invalidate(&front->base, ORIGIN_CS))
 				i915_active_add_request(&front->write, rq);
-			intel_frontbuffer_put(front);
+			i915_gem_object_frontbuffer_put(front);
 		}
 	}
 
diff --git a/drivers/gpu/drm/xe/compat-i915-headers/i915_vma.h b/drivers/gpu/drm/xe/compat-i915-headers/i915_vma.h
index 4465c40f8134..b17e3bab23d5 100644
--- a/drivers/gpu/drm/xe/compat-i915-headers/i915_vma.h
+++ b/drivers/gpu/drm/xe/compat-i915-headers/i915_vma.h
@@ -26,8 +26,6 @@ struct i915_vma {
 	struct xe_ggtt_node *node;
 };
 
-#define i915_ggtt_clear_scanout(bo) do { } while (0)
-
 #define i915_vma_fence_id(vma) -1
 
 static inline u32 i915_ggtt_offset(const struct i915_vma *vma)
diff --git a/drivers/gpu/drm/xe/display/intel_bo.c b/drivers/gpu/drm/xe/display/intel_bo.c
index 2437c00a2d3e..bad2243b9114 100644
--- a/drivers/gpu/drm/xe/display/intel_bo.c
+++ b/drivers/gpu/drm/xe/display/intel_bo.c
@@ -5,6 +5,7 @@
 
 #include "xe_bo.h"
 #include "intel_bo.h"
+#include "intel_frontbuffer.h"
 
 bool intel_bo_is_tiled(struct drm_gem_object *obj)
 {
@@ -40,15 +41,56 @@ int intel_bo_read_from_page(struct drm_gem_object *obj, u64 offset, void *dst, i
 	return xe_bo_read(bo, offset, dst, size);
 }
 
-struct intel_frontbuffer *intel_bo_get_frontbuffer(struct drm_gem_object *obj)
+struct xe_frontbuffer {
+	struct intel_frontbuffer base;
+	struct drm_gem_object *obj;
+	struct kref ref;
+};
+
+struct intel_frontbuffer *intel_bo_frontbuffer_get(struct drm_gem_object *obj)
 {
-	return NULL;
+	struct xe_frontbuffer *front;
+
+	front = kmalloc(sizeof(*front), GFP_KERNEL);
+	if (!front)
+		return NULL;
+
+	intel_frontbuffer_init(&front->base, obj->dev);
+
+	kref_init(&front->ref);
+
+	drm_gem_object_get(obj);
+	front->obj = obj;
+
+	return &front->base;
 }
 
-struct intel_frontbuffer *intel_bo_set_frontbuffer(struct drm_gem_object *obj,
-						   struct intel_frontbuffer *front)
+void intel_bo_frontbuffer_ref(struct intel_frontbuffer *_front)
 {
-	return front;
+	struct xe_frontbuffer *front =
+		container_of(_front, typeof(*front), base);
+
+	kref_get(&front->ref);
+}
+
+static void frontbuffer_release(struct kref *ref)
+{
+	struct xe_frontbuffer *front =
+		container_of(ref, typeof(*front), ref);
+
+	intel_frontbuffer_fini(&front->base);
+
+	drm_gem_object_put(front->obj);
+
+	kfree(front);
+}
+
+void intel_bo_frontbuffer_put(struct intel_frontbuffer *_front)
+{
+	struct xe_frontbuffer *front =
+		container_of(_front, typeof(*front), base);
+
+	kref_put(&front->ref, frontbuffer_release);
 }
 
 void intel_bo_frontbuffer_flush_for_display(struct intel_frontbuffer *front)
-- 
2.49.1


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

* [PATCH v2 10/10] drm/i915/gem: s/i915_gem_object_get_frontbuffer/i915_gem_object_frontbuffer_lookup/
  2025-10-16 18:53 [PATCH v2 00/10] drm/i915/frontbuffer: Fix the intel_frontbuffer lifetime mess Ville Syrjala
                   ` (8 preceding siblings ...)
  2025-10-16 18:54 ` [PATCH v2 09/10] drm/i915/frontbuffer: Fix intel_frontbuffer lifetime handling Ville Syrjala
@ 2025-10-16 18:54 ` Ville Syrjala
  2025-10-16 19:00 ` ✗ CI.checkpatch: warning for drm/i915/frontbuffer: Fix the intel_frontbuffer lifetime mess (rev2) Patchwork
                   ` (3 subsequent siblings)
  13 siblings, 0 replies; 20+ messages in thread
From: Ville Syrjala @ 2025-10-16 18:54 UTC (permalink / raw)
  To: intel-gfx; +Cc: intel-xe, Jani Nikula

From: Ville Syrjälä <ville.syrjala@linux.intel.com>

The i915_gem_object_get_frontbuffer() name is rather confusing wrt.
intel_frontbuffer_get(). Rename to i915_gem_object_frontbuffer_lookup()
to make things less confusing.

Acked-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/gpu/drm/i915/gem/i915_gem_object.c             | 4 ++--
 drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.c | 2 +-
 drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.h | 6 +++---
 drivers/gpu/drm/i915/i915_vma.c                        | 2 +-
 4 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.c b/drivers/gpu/drm/i915/gem/i915_gem_object.c
index 36680eddf88e..828936e603a6 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_object.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_object.c
@@ -478,7 +478,7 @@ void __i915_gem_object_flush_frontbuffer(struct drm_i915_gem_object *obj,
 {
 	struct i915_frontbuffer *front;
 
-	front = i915_gem_object_get_frontbuffer(obj);
+	front = i915_gem_object_frontbuffer_lookup(obj);
 	if (front) {
 		intel_frontbuffer_flush(&front->base, origin);
 		i915_gem_object_frontbuffer_put(front);
@@ -490,7 +490,7 @@ void __i915_gem_object_invalidate_frontbuffer(struct drm_i915_gem_object *obj,
 {
 	struct i915_frontbuffer *front;
 
-	front = i915_gem_object_get_frontbuffer(obj);
+	front = i915_gem_object_frontbuffer_lookup(obj);
 	if (front) {
 		intel_frontbuffer_invalidate(&front->base, origin);
 		i915_gem_object_frontbuffer_put(front);
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.c b/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.c
index 7ef89613c025..aaa15e7b3f17 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.c
@@ -28,7 +28,7 @@ i915_gem_object_frontbuffer_get(struct drm_i915_gem_object *obj)
 	struct drm_i915_private *i915 = to_i915(obj->base.dev);
 	struct i915_frontbuffer *front, *cur;
 
-	front = i915_gem_object_get_frontbuffer(obj);
+	front = i915_gem_object_frontbuffer_lookup(obj);
 	if (front)
 		return front;
 
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.h b/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.h
index 385f7e8049b8..2133e29047c5 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.h
+++ b/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.h
@@ -46,8 +46,8 @@ void i915_gem_object_frontbuffer_ref(struct i915_frontbuffer *front);
 void i915_gem_object_frontbuffer_put(struct i915_frontbuffer *front);
 
 /**
- * i915_gem_object_get_frontbuffer - Get the object's frontbuffer
- * @obj: The object whose frontbuffer to get.
+ * i915_gem_object_frontbuffer_lookup - Look up the object's frontbuffer
+ * @obj: The object whose frontbuffer to look up.
  *
  * Get pointer to object's frontbuffer if such exists. Please note that RCU
  * mechanism is used to handle e.g. ongoing removal of frontbuffer pointer.
@@ -55,7 +55,7 @@ void i915_gem_object_frontbuffer_put(struct i915_frontbuffer *front);
  * Return: pointer to object's frontbuffer is such exists or NULL
  */
 static inline struct i915_frontbuffer *
-i915_gem_object_get_frontbuffer(const struct drm_i915_gem_object *obj)
+i915_gem_object_frontbuffer_lookup(const struct drm_i915_gem_object *obj)
 {
 	struct i915_frontbuffer *front;
 
diff --git a/drivers/gpu/drm/i915/i915_vma.c b/drivers/gpu/drm/i915/i915_vma.c
index cb36daaa101d..6888d3f4557b 100644
--- a/drivers/gpu/drm/i915/i915_vma.c
+++ b/drivers/gpu/drm/i915/i915_vma.c
@@ -1992,7 +1992,7 @@ int _i915_vma_move_to_active(struct i915_vma *vma,
 	if (flags & EXEC_OBJECT_WRITE) {
 		struct i915_frontbuffer *front;
 
-		front = i915_gem_object_get_frontbuffer(obj);
+		front = i915_gem_object_frontbuffer_lookup(obj);
 		if (unlikely(front)) {
 			if (intel_frontbuffer_invalidate(&front->base, ORIGIN_CS))
 				i915_active_add_request(&front->write, rq);
-- 
2.49.1


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

* ✗ CI.checkpatch: warning for drm/i915/frontbuffer: Fix the intel_frontbuffer lifetime mess (rev2)
  2025-10-16 18:53 [PATCH v2 00/10] drm/i915/frontbuffer: Fix the intel_frontbuffer lifetime mess Ville Syrjala
                   ` (9 preceding siblings ...)
  2025-10-16 18:54 ` [PATCH v2 10/10] drm/i915/gem: s/i915_gem_object_get_frontbuffer/i915_gem_object_frontbuffer_lookup/ Ville Syrjala
@ 2025-10-16 19:00 ` Patchwork
  2025-10-16 19:01 ` ✓ CI.KUnit: success " Patchwork
                   ` (2 subsequent siblings)
  13 siblings, 0 replies; 20+ messages in thread
From: Patchwork @ 2025-10-16 19:00 UTC (permalink / raw)
  To: Ville Syrjala; +Cc: intel-xe

== Series Details ==

Series: drm/i915/frontbuffer: Fix the intel_frontbuffer lifetime mess (rev2)
URL   : https://patchwork.freedesktop.org/series/155471/
State : warning

== Summary ==

+ KERNEL=/kernel
+ git clone https://gitlab.freedesktop.org/drm/maintainer-tools mt
Cloning into 'mt'...
warning: redirecting to https://gitlab.freedesktop.org/drm/maintainer-tools.git/
+ git -C mt rev-list -n1 origin/master
fbd08a78c3a3bb17964db2a326514c69c1dca660
+ cd /kernel
+ git config --global --add safe.directory /kernel
+ git log -n1
commit 60e0051b935509d4429a757e1e9f08c0fe20e2d1
Author: Ville Syrjälä <ville.syrjala@linux.intel.com>
Date:   Thu Oct 16 21:54:08 2025 +0300

    drm/i915/gem: s/i915_gem_object_get_frontbuffer/i915_gem_object_frontbuffer_lookup/
    
    The i915_gem_object_get_frontbuffer() name is rather confusing wrt.
    intel_frontbuffer_get(). Rename to i915_gem_object_frontbuffer_lookup()
    to make things less confusing.
    
    Acked-by: Jani Nikula <jani.nikula@intel.com>
    Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
+ /mt/dim checkpatch e919806d9a23ee1c2611792492289a170be4cf9d drm-intel
e2894b10e624 drm/i915/overlay: Drop the DIRTYFB flush
ee752dd4248f drm/i915/overlay: Switch to intel_frontbuffer_flip()
53cf494b3401 drm/i915/frontbuffer: Nuke intel_frontbuffer_flip_{prepare, complete}()
2ac736aea0a4 drm/i915/frontbuffer: Turn intel_bo_flush_if_display() into a frontbuffer operation
5d5194ee1b35 drm/i915/frontbuffer: Handle the dirtyfb cache flush inside intel_frontbuffer_flush()
9405441d18c2 drm/i915/frontbuffef: Split fb_tracking.lock into two
35204bd3d404 drm/i915/frontbuffer: Extract intel_frontbuffer_ref()
fcff16599211 drm/i915/frontbuffer: Add intel_frontbuffer::display
95a23c502196 drm/i915/frontbuffer: Fix intel_frontbuffer lifetime handling
-:338: WARNING:FILE_PATH_CHANGES: added, moved or deleted file(s), does MAINTAINERS need updating?
#338: 
new file mode 100644

total: 0 errors, 1 warnings, 0 checks, 555 lines checked
60e0051b9355 drm/i915/gem: s/i915_gem_object_get_frontbuffer/i915_gem_object_frontbuffer_lookup/



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

* ✓ CI.KUnit: success for drm/i915/frontbuffer: Fix the intel_frontbuffer lifetime mess (rev2)
  2025-10-16 18:53 [PATCH v2 00/10] drm/i915/frontbuffer: Fix the intel_frontbuffer lifetime mess Ville Syrjala
                   ` (10 preceding siblings ...)
  2025-10-16 19:00 ` ✗ CI.checkpatch: warning for drm/i915/frontbuffer: Fix the intel_frontbuffer lifetime mess (rev2) Patchwork
@ 2025-10-16 19:01 ` Patchwork
  2025-10-16 19:17 ` ✗ CI.checksparse: warning " Patchwork
  2025-10-17 16:49 ` ✗ Xe.CI.Full: failure " Patchwork
  13 siblings, 0 replies; 20+ messages in thread
From: Patchwork @ 2025-10-16 19:01 UTC (permalink / raw)
  To: Ville Syrjala; +Cc: intel-xe

== Series Details ==

Series: drm/i915/frontbuffer: Fix the intel_frontbuffer lifetime mess (rev2)
URL   : https://patchwork.freedesktop.org/series/155471/
State : success

== Summary ==

+ trap cleanup EXIT
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig
[19:00:31] Configuring KUnit Kernel ...
Generating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[19:00:36] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
[19:01:06] Starting KUnit Kernel (1/1)...
[19:01:06] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[19:01:06] ================== guc_buf (11 subtests) ===================
[19:01:06] [PASSED] test_smallest
[19:01:06] [PASSED] test_largest
[19:01:06] [PASSED] test_granular
[19:01:06] [PASSED] test_unique
[19:01:06] [PASSED] test_overlap
[19:01:06] [PASSED] test_reusable
[19:01:06] [PASSED] test_too_big
[19:01:06] [PASSED] test_flush
[19:01:06] [PASSED] test_lookup
[19:01:06] [PASSED] test_data
[19:01:06] [PASSED] test_class
[19:01:06] ===================== [PASSED] guc_buf =====================
[19:01:06] =================== guc_dbm (7 subtests) ===================
[19:01:06] [PASSED] test_empty
[19:01:06] [PASSED] test_default
[19:01:06] ======================== test_size  ========================
[19:01:06] [PASSED] 4
[19:01:06] [PASSED] 8
[19:01:06] [PASSED] 32
[19:01:06] [PASSED] 256
[19:01:06] ==================== [PASSED] test_size ====================
[19:01:06] ======================= test_reuse  ========================
[19:01:06] [PASSED] 4
[19:01:06] [PASSED] 8
[19:01:06] [PASSED] 32
[19:01:06] [PASSED] 256
[19:01:06] =================== [PASSED] test_reuse ====================
[19:01:06] =================== test_range_overlap  ====================
[19:01:06] [PASSED] 4
[19:01:06] [PASSED] 8
[19:01:06] [PASSED] 32
[19:01:06] [PASSED] 256
[19:01:06] =============== [PASSED] test_range_overlap ================
[19:01:06] =================== test_range_compact  ====================
[19:01:06] [PASSED] 4
[19:01:06] [PASSED] 8
[19:01:06] [PASSED] 32
[19:01:06] [PASSED] 256
[19:01:06] =============== [PASSED] test_range_compact ================
[19:01:06] ==================== test_range_spare  =====================
[19:01:06] [PASSED] 4
[19:01:06] [PASSED] 8
[19:01:06] [PASSED] 32
[19:01:06] [PASSED] 256
[19:01:06] ================ [PASSED] test_range_spare =================
[19:01:06] ===================== [PASSED] guc_dbm =====================
[19:01:06] =================== guc_idm (6 subtests) ===================
[19:01:06] [PASSED] bad_init
[19:01:06] [PASSED] no_init
[19:01:06] [PASSED] init_fini
[19:01:06] [PASSED] check_used
[19:01:06] [PASSED] check_quota
[19:01:06] [PASSED] check_all
[19:01:06] ===================== [PASSED] guc_idm =====================
[19:01:06] ================== no_relay (3 subtests) ===================
[19:01:06] [PASSED] xe_drops_guc2pf_if_not_ready
[19:01:06] [PASSED] xe_drops_guc2vf_if_not_ready
[19:01:06] [PASSED] xe_rejects_send_if_not_ready
[19:01:06] ==================== [PASSED] no_relay =====================
[19:01:06] ================== pf_relay (14 subtests) ==================
[19:01:06] [PASSED] pf_rejects_guc2pf_too_short
[19:01:06] [PASSED] pf_rejects_guc2pf_too_long
[19:01:06] [PASSED] pf_rejects_guc2pf_no_payload
[19:01:06] [PASSED] pf_fails_no_payload
[19:01:06] [PASSED] pf_fails_bad_origin
[19:01:06] [PASSED] pf_fails_bad_type
[19:01:06] [PASSED] pf_txn_reports_error
[19:01:06] [PASSED] pf_txn_sends_pf2guc
[19:01:06] [PASSED] pf_sends_pf2guc
[19:01:06] [SKIPPED] pf_loopback_nop
[19:01:06] [SKIPPED] pf_loopback_echo
[19:01:06] [SKIPPED] pf_loopback_fail
[19:01:06] [SKIPPED] pf_loopback_busy
[19:01:06] [SKIPPED] pf_loopback_retry
[19:01:06] ==================== [PASSED] pf_relay =====================
[19:01:06] ================== vf_relay (3 subtests) ===================
[19:01:06] [PASSED] vf_rejects_guc2vf_too_short
[19:01:06] [PASSED] vf_rejects_guc2vf_too_long
[19:01:06] [PASSED] vf_rejects_guc2vf_no_payload
[19:01:06] ==================== [PASSED] vf_relay =====================
[19:01:06] ===================== lmtt (1 subtest) =====================
[19:01:06] ======================== test_ops  =========================
[19:01:06] [PASSED] 2-level
[19:01:06] [PASSED] multi-level
[19:01:06] ==================== [PASSED] test_ops =====================
[19:01:06] ====================== [PASSED] lmtt =======================
[19:01:06] ================= pf_service (11 subtests) =================
[19:01:06] [PASSED] pf_negotiate_any
[19:01:06] [PASSED] pf_negotiate_base_match
[19:01:06] [PASSED] pf_negotiate_base_newer
[19:01:06] [PASSED] pf_negotiate_base_next
[19:01:06] [SKIPPED] pf_negotiate_base_older
[19:01:06] [PASSED] pf_negotiate_base_prev
[19:01:06] [PASSED] pf_negotiate_latest_match
[19:01:06] [PASSED] pf_negotiate_latest_newer
[19:01:06] [PASSED] pf_negotiate_latest_next
[19:01:06] [SKIPPED] pf_negotiate_latest_older
[19:01:06] [SKIPPED] pf_negotiate_latest_prev
[19:01:06] =================== [PASSED] pf_service ====================
[19:01:06] ================= xe_guc_g2g (2 subtests) ==================
[19:01:06] ============== xe_live_guc_g2g_kunit_default  ==============
[19:01:06] ========= [SKIPPED] xe_live_guc_g2g_kunit_default ==========
[19:01:06] ============== xe_live_guc_g2g_kunit_allmem  ===============
[19:01:06] ========== [SKIPPED] xe_live_guc_g2g_kunit_allmem ==========
[19:01:06] =================== [SKIPPED] xe_guc_g2g ===================
[19:01:06] =================== xe_mocs (2 subtests) ===================
[19:01:06] ================ xe_live_mocs_kernel_kunit  ================
[19:01:06] =========== [SKIPPED] xe_live_mocs_kernel_kunit ============
[19:01:06] ================ xe_live_mocs_reset_kunit  =================
[19:01:06] ============ [SKIPPED] xe_live_mocs_reset_kunit ============
[19:01:06] ==================== [SKIPPED] xe_mocs =====================
[19:01:06] ================= xe_migrate (2 subtests) ==================
[19:01:06] ================= xe_migrate_sanity_kunit  =================
[19:01:06] ============ [SKIPPED] xe_migrate_sanity_kunit =============
[19:01:06] ================== xe_validate_ccs_kunit  ==================
[19:01:06] ============= [SKIPPED] xe_validate_ccs_kunit ==============
[19:01:06] =================== [SKIPPED] xe_migrate ===================
[19:01:06] ================== xe_dma_buf (1 subtest) ==================
[19:01:06] ==================== xe_dma_buf_kunit  =====================
[19:01:06] ================ [SKIPPED] xe_dma_buf_kunit ================
[19:01:06] =================== [SKIPPED] xe_dma_buf ===================
[19:01:06] ================= xe_bo_shrink (1 subtest) =================
[19:01:06] =================== xe_bo_shrink_kunit  ====================
[19:01:06] =============== [SKIPPED] xe_bo_shrink_kunit ===============
[19:01:06] ================== [SKIPPED] xe_bo_shrink ==================
[19:01:06] ==================== xe_bo (2 subtests) ====================
[19:01:06] ================== xe_ccs_migrate_kunit  ===================
[19:01:06] ============== [SKIPPED] xe_ccs_migrate_kunit ==============
[19:01:06] ==================== xe_bo_evict_kunit  ====================
[19:01:06] =============== [SKIPPED] xe_bo_evict_kunit ================
[19:01:06] ===================== [SKIPPED] xe_bo ======================
[19:01:06] ==================== args (11 subtests) ====================
[19:01:06] [PASSED] count_args_test
[19:01:06] [PASSED] call_args_example
[19:01:06] [PASSED] call_args_test
[19:01:06] [PASSED] drop_first_arg_example
[19:01:06] [PASSED] drop_first_arg_test
[19:01:06] [PASSED] first_arg_example
[19:01:06] [PASSED] first_arg_test
[19:01:06] [PASSED] last_arg_example
[19:01:06] [PASSED] last_arg_test
[19:01:06] [PASSED] pick_arg_example
[19:01:06] [PASSED] sep_comma_example
[19:01:06] ====================== [PASSED] args =======================
[19:01:06] =================== xe_pci (3 subtests) ====================
[19:01:06] ==================== check_graphics_ip  ====================
[19:01:06] [PASSED] 12.00 Xe_LP
[19:01:06] [PASSED] 12.10 Xe_LP+
[19:01:06] [PASSED] 12.55 Xe_HPG
[19:01:06] [PASSED] 12.60 Xe_HPC
[19:01:06] [PASSED] 12.70 Xe_LPG
[19:01:06] [PASSED] 12.71 Xe_LPG
[19:01:06] [PASSED] 12.74 Xe_LPG+
[19:01:06] [PASSED] 20.01 Xe2_HPG
[19:01:06] [PASSED] 20.02 Xe2_HPG
[19:01:06] [PASSED] 20.04 Xe2_LPG
[19:01:06] [PASSED] 30.00 Xe3_LPG
[19:01:06] [PASSED] 30.01 Xe3_LPG
[19:01:06] [PASSED] 30.03 Xe3_LPG
[19:01:06] ================ [PASSED] check_graphics_ip ================
[19:01:06] ===================== check_media_ip  ======================
[19:01:06] [PASSED] 12.00 Xe_M
[19:01:06] [PASSED] 12.55 Xe_HPM
[19:01:06] [PASSED] 13.00 Xe_LPM+
[19:01:06] [PASSED] 13.01 Xe2_HPM
[19:01:06] [PASSED] 20.00 Xe2_LPM
[19:01:06] [PASSED] 30.00 Xe3_LPM
[19:01:06] [PASSED] 30.02 Xe3_LPM
[19:01:06] ================= [PASSED] check_media_ip ==================
[19:01:06] ================= check_platform_gt_count  =================
[19:01:06] [PASSED] 0x9A60 (TIGERLAKE)
[19:01:06] [PASSED] 0x9A68 (TIGERLAKE)
[19:01:06] [PASSED] 0x9A70 (TIGERLAKE)
[19:01:06] [PASSED] 0x9A40 (TIGERLAKE)
[19:01:06] [PASSED] 0x9A49 (TIGERLAKE)
[19:01:06] [PASSED] 0x9A59 (TIGERLAKE)
[19:01:06] [PASSED] 0x9A78 (TIGERLAKE)
[19:01:06] [PASSED] 0x9AC0 (TIGERLAKE)
[19:01:06] [PASSED] 0x9AC9 (TIGERLAKE)
[19:01:06] [PASSED] 0x9AD9 (TIGERLAKE)
[19:01:06] [PASSED] 0x9AF8 (TIGERLAKE)
[19:01:06] [PASSED] 0x4C80 (ROCKETLAKE)
[19:01:06] [PASSED] 0x4C8A (ROCKETLAKE)
[19:01:06] [PASSED] 0x4C8B (ROCKETLAKE)
[19:01:06] [PASSED] 0x4C8C (ROCKETLAKE)
[19:01:06] [PASSED] 0x4C90 (ROCKETLAKE)
[19:01:06] [PASSED] 0x4C9A (ROCKETLAKE)
[19:01:06] [PASSED] 0x4680 (ALDERLAKE_S)
[19:01:06] [PASSED] 0x4682 (ALDERLAKE_S)
[19:01:06] [PASSED] 0x4688 (ALDERLAKE_S)
[19:01:06] [PASSED] 0x468A (ALDERLAKE_S)
[19:01:06] [PASSED] 0x468B (ALDERLAKE_S)
[19:01:06] [PASSED] 0x4690 (ALDERLAKE_S)
[19:01:06] [PASSED] 0x4692 (ALDERLAKE_S)
[19:01:06] [PASSED] 0x4693 (ALDERLAKE_S)
[19:01:06] [PASSED] 0x46A0 (ALDERLAKE_P)
[19:01:06] [PASSED] 0x46A1 (ALDERLAKE_P)
[19:01:06] [PASSED] 0x46A2 (ALDERLAKE_P)
[19:01:06] [PASSED] 0x46A3 (ALDERLAKE_P)
[19:01:06] [PASSED] 0x46A6 (ALDERLAKE_P)
[19:01:06] [PASSED] 0x46A8 (ALDERLAKE_P)
[19:01:06] [PASSED] 0x46AA (ALDERLAKE_P)
[19:01:06] [PASSED] 0x462A (ALDERLAKE_P)
[19:01:06] [PASSED] 0x4626 (ALDERLAKE_P)
[19:01:06] [PASSED] 0x4628 (ALDERLAKE_P)
[19:01:06] [PASSED] 0x46B0 (ALDERLAKE_P)
[19:01:06] [PASSED] 0x46B1 (ALDERLAKE_P)
[19:01:06] [PASSED] 0x46B2 (ALDERLAKE_P)
[19:01:06] [PASSED] 0x46B3 (ALDERLAKE_P)
[19:01:06] [PASSED] 0x46C0 (ALDERLAKE_P)
[19:01:06] [PASSED] 0x46C1 (ALDERLAKE_P)
[19:01:06] [PASSED] 0x46C2 (ALDERLAKE_P)
[19:01:06] [PASSED] 0x46C3 (ALDERLAKE_P)
[19:01:06] [PASSED] 0x46D0 (ALDERLAKE_N)
[19:01:06] [PASSED] 0x46D1 (ALDERLAKE_N)
[19:01:06] [PASSED] 0x46D2 (ALDERLAKE_N)
[19:01:06] [PASSED] 0x46D3 (ALDERLAKE_N)
[19:01:06] [PASSED] 0x46D4 (ALDERLAKE_N)
[19:01:06] [PASSED] 0xA721 (ALDERLAKE_P)
[19:01:06] [PASSED] 0xA7A1 (ALDERLAKE_P)
[19:01:06] [PASSED] 0xA7A9 (ALDERLAKE_P)
[19:01:06] [PASSED] 0xA7AC (ALDERLAKE_P)
[19:01:06] [PASSED] 0xA7AD (ALDERLAKE_P)
[19:01:06] [PASSED] 0xA720 (ALDERLAKE_P)
[19:01:06] [PASSED] 0xA7A0 (ALDERLAKE_P)
[19:01:06] [PASSED] 0xA7A8 (ALDERLAKE_P)
[19:01:06] [PASSED] 0xA7AA (ALDERLAKE_P)
[19:01:06] [PASSED] 0xA7AB (ALDERLAKE_P)
[19:01:06] [PASSED] 0xA780 (ALDERLAKE_S)
[19:01:06] [PASSED] 0xA781 (ALDERLAKE_S)
[19:01:06] [PASSED] 0xA782 (ALDERLAKE_S)
[19:01:06] [PASSED] 0xA783 (ALDERLAKE_S)
[19:01:06] [PASSED] 0xA788 (ALDERLAKE_S)
[19:01:06] [PASSED] 0xA789 (ALDERLAKE_S)
[19:01:06] [PASSED] 0xA78A (ALDERLAKE_S)
[19:01:06] [PASSED] 0xA78B (ALDERLAKE_S)
[19:01:06] [PASSED] 0x4905 (DG1)
[19:01:06] [PASSED] 0x4906 (DG1)
[19:01:06] [PASSED] 0x4907 (DG1)
[19:01:06] [PASSED] 0x4908 (DG1)
[19:01:06] [PASSED] 0x4909 (DG1)
[19:01:06] [PASSED] 0x56C0 (DG2)
[19:01:06] [PASSED] 0x56C2 (DG2)
[19:01:06] [PASSED] 0x56C1 (DG2)
[19:01:06] [PASSED] 0x7D51 (METEORLAKE)
[19:01:06] [PASSED] 0x7DD1 (METEORLAKE)
[19:01:06] [PASSED] 0x7D41 (METEORLAKE)
[19:01:06] [PASSED] 0x7D67 (METEORLAKE)
[19:01:06] [PASSED] 0xB640 (METEORLAKE)
[19:01:06] [PASSED] 0x56A0 (DG2)
[19:01:06] [PASSED] 0x56A1 (DG2)
[19:01:06] [PASSED] 0x56A2 (DG2)
[19:01:06] [PASSED] 0x56BE (DG2)
[19:01:06] [PASSED] 0x56BF (DG2)
[19:01:06] [PASSED] 0x5690 (DG2)
[19:01:06] [PASSED] 0x5691 (DG2)
[19:01:06] [PASSED] 0x5692 (DG2)
[19:01:06] [PASSED] 0x56A5 (DG2)
[19:01:06] [PASSED] 0x56A6 (DG2)
[19:01:06] [PASSED] 0x56B0 (DG2)
[19:01:06] [PASSED] 0x56B1 (DG2)
[19:01:06] [PASSED] 0x56BA (DG2)
[19:01:06] [PASSED] 0x56BB (DG2)
[19:01:06] [PASSED] 0x56BC (DG2)
[19:01:06] [PASSED] 0x56BD (DG2)
[19:01:06] [PASSED] 0x5693 (DG2)
[19:01:06] [PASSED] 0x5694 (DG2)
[19:01:06] [PASSED] 0x5695 (DG2)
[19:01:06] [PASSED] 0x56A3 (DG2)
[19:01:06] [PASSED] 0x56A4 (DG2)
[19:01:06] [PASSED] 0x56B2 (DG2)
[19:01:06] [PASSED] 0x56B3 (DG2)
[19:01:06] [PASSED] 0x5696 (DG2)
[19:01:06] [PASSED] 0x5697 (DG2)
[19:01:06] [PASSED] 0xB69 (PVC)
[19:01:06] [PASSED] 0xB6E (PVC)
[19:01:06] [PASSED] 0xBD4 (PVC)
[19:01:06] [PASSED] 0xBD5 (PVC)
[19:01:06] [PASSED] 0xBD6 (PVC)
[19:01:06] [PASSED] 0xBD7 (PVC)
[19:01:06] [PASSED] 0xBD8 (PVC)
[19:01:06] [PASSED] 0xBD9 (PVC)
[19:01:06] [PASSED] 0xBDA (PVC)
[19:01:06] [PASSED] 0xBDB (PVC)
[19:01:06] [PASSED] 0xBE0 (PVC)
[19:01:06] [PASSED] 0xBE1 (PVC)
[19:01:06] [PASSED] 0xBE5 (PVC)
[19:01:06] [PASSED] 0x7D40 (METEORLAKE)
[19:01:06] [PASSED] 0x7D45 (METEORLAKE)
[19:01:06] [PASSED] 0x7D55 (METEORLAKE)
[19:01:06] [PASSED] 0x7D60 (METEORLAKE)
[19:01:06] [PASSED] 0x7DD5 (METEORLAKE)
[19:01:06] [PASSED] 0x6420 (LUNARLAKE)
[19:01:06] [PASSED] 0x64A0 (LUNARLAKE)
[19:01:06] [PASSED] 0x64B0 (LUNARLAKE)
[19:01:06] [PASSED] 0xE202 (BATTLEMAGE)
[19:01:06] [PASSED] 0xE209 (BATTLEMAGE)
[19:01:06] [PASSED] 0xE20B (BATTLEMAGE)
[19:01:06] [PASSED] 0xE20C (BATTLEMAGE)
[19:01:06] [PASSED] 0xE20D (BATTLEMAGE)
[19:01:06] [PASSED] 0xE210 (BATTLEMAGE)
[19:01:06] [PASSED] 0xE211 (BATTLEMAGE)
[19:01:06] [PASSED] 0xE212 (BATTLEMAGE)
[19:01:06] [PASSED] 0xE216 (BATTLEMAGE)
[19:01:06] [PASSED] 0xE220 (BATTLEMAGE)
[19:01:06] [PASSED] 0xE221 (BATTLEMAGE)
[19:01:06] [PASSED] 0xE222 (BATTLEMAGE)
[19:01:06] [PASSED] 0xE223 (BATTLEMAGE)
[19:01:06] [PASSED] 0xB080 (PANTHERLAKE)
[19:01:06] [PASSED] 0xB081 (PANTHERLAKE)
[19:01:06] [PASSED] 0xB082 (PANTHERLAKE)
[19:01:06] [PASSED] 0xB083 (PANTHERLAKE)
[19:01:06] [PASSED] 0xB084 (PANTHERLAKE)
[19:01:06] [PASSED] 0xB085 (PANTHERLAKE)
[19:01:06] [PASSED] 0xB086 (PANTHERLAKE)
[19:01:06] [PASSED] 0xB087 (PANTHERLAKE)
[19:01:06] [PASSED] 0xB08F (PANTHERLAKE)
[19:01:06] [PASSED] 0xB090 (PANTHERLAKE)
[19:01:06] [PASSED] 0xB0A0 (PANTHERLAKE)
[19:01:06] [PASSED] 0xB0B0 (PANTHERLAKE)
[19:01:06] [PASSED] 0xFD80 (PANTHERLAKE)
[19:01:06] [PASSED] 0xFD81 (PANTHERLAKE)
[19:01:06] ============= [PASSED] check_platform_gt_count =============
[19:01:06] ===================== [PASSED] xe_pci ======================
[19:01:06] =================== xe_rtp (2 subtests) ====================
[19:01:06] =============== xe_rtp_process_to_sr_tests  ================
[19:01:06] [PASSED] coalesce-same-reg
[19:01:06] [PASSED] no-match-no-add
[19:01:06] [PASSED] match-or
[19:01:06] [PASSED] match-or-xfail
[19:01:06] [PASSED] no-match-no-add-multiple-rules
[19:01:06] [PASSED] two-regs-two-entries
[19:01:06] [PASSED] clr-one-set-other
[19:01:06] [PASSED] set-field
[19:01:06] [PASSED] conflict-duplicate
[19:01:06] [PASSED] conflict-not-disjoint
[19:01:06] [PASSED] conflict-reg-type
[19:01:06] =========== [PASSED] xe_rtp_process_to_sr_tests ============
[19:01:06] ================== xe_rtp_process_tests  ===================
[19:01:06] [PASSED] active1
[19:01:06] [PASSED] active2
[19:01:06] [PASSED] active-inactive
[19:01:06] [PASSED] inactive-active
[19:01:06] [PASSED] inactive-1st_or_active-inactive
[19:01:06] [PASSED] inactive-2nd_or_active-inactive
[19:01:06] [PASSED] inactive-last_or_active-inactive
[19:01:06] [PASSED] inactive-no_or_active-inactive
[19:01:06] ============== [PASSED] xe_rtp_process_tests ===============
[19:01:06] ===================== [PASSED] xe_rtp ======================
[19:01:06] ==================== xe_wa (1 subtest) =====================
[19:01:06] ======================== xe_wa_gt  =========================
[19:01:06] [PASSED] TIGERLAKE B0
[19:01:06] [PASSED] DG1 A0
[19:01:06] [PASSED] DG1 B0
[19:01:06] [PASSED] ALDERLAKE_S A0
[19:01:06] [PASSED] ALDERLAKE_S B0
stty: 'standard input': Inappropriate ioctl for device
[19:01:06] [PASSED] ALDERLAKE_S C0
[19:01:06] [PASSED] ALDERLAKE_S D0
[19:01:06] [PASSED] ALDERLAKE_P A0
[19:01:06] [PASSED] ALDERLAKE_P B0
[19:01:06] [PASSED] ALDERLAKE_P C0
[19:01:06] [PASSED] ALDERLAKE_S RPLS D0
[19:01:06] [PASSED] ALDERLAKE_P RPLU E0
[19:01:06] [PASSED] DG2 G10 C0
[19:01:06] [PASSED] DG2 G11 B1
[19:01:06] [PASSED] DG2 G12 A1
[19:01:06] [PASSED] METEORLAKE 12.70(Xe_LPG) A0 13.00(Xe_LPM+) A0
[19:01:06] [PASSED] METEORLAKE 12.71(Xe_LPG) A0 13.00(Xe_LPM+) A0
[19:01:06] [PASSED] METEORLAKE 12.74(Xe_LPG+) A0 13.00(Xe_LPM+) A0
[19:01:06] [PASSED] LUNARLAKE 20.04(Xe2_LPG) A0 20.00(Xe2_LPM) A0
[19:01:06] [PASSED] LUNARLAKE 20.04(Xe2_LPG) B0 20.00(Xe2_LPM) A0
[19:01:06] [PASSED] BATTLEMAGE 20.01(Xe2_HPG) A0 13.01(Xe2_HPM) A1
[19:01:06] [PASSED] PANTHERLAKE 30.00(Xe3_LPG) A0 30.00(Xe3_LPM) A0
[19:01:06] ==================== [PASSED] xe_wa_gt =====================
[19:01:06] ====================== [PASSED] xe_wa ======================
[19:01:06] ============================================================
[19:01:06] Testing complete. Ran 306 tests: passed: 288, skipped: 18
[19:01:06] Elapsed time: 35.074s total, 4.195s configuring, 30.512s building, 0.341s running

+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/tests/.kunitconfig
[19:01:07] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[19:01:08] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
[19:01:33] Starting KUnit Kernel (1/1)...
[19:01:33] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[19:01:33] ============ drm_test_pick_cmdline (2 subtests) ============
[19:01:33] [PASSED] drm_test_pick_cmdline_res_1920_1080_60
[19:01:33] =============== drm_test_pick_cmdline_named  ===============
[19:01:33] [PASSED] NTSC
[19:01:33] [PASSED] NTSC-J
[19:01:33] [PASSED] PAL
[19:01:33] [PASSED] PAL-M
[19:01:33] =========== [PASSED] drm_test_pick_cmdline_named ===========
[19:01:33] ============== [PASSED] drm_test_pick_cmdline ==============
[19:01:33] == drm_test_atomic_get_connector_for_encoder (1 subtest) ===
[19:01:33] [PASSED] drm_test_drm_atomic_get_connector_for_encoder
[19:01:33] ==== [PASSED] drm_test_atomic_get_connector_for_encoder ====
[19:01:33] =========== drm_validate_clone_mode (2 subtests) ===========
[19:01:33] ============== drm_test_check_in_clone_mode  ===============
[19:01:33] [PASSED] in_clone_mode
[19:01:33] [PASSED] not_in_clone_mode
[19:01:33] ========== [PASSED] drm_test_check_in_clone_mode ===========
[19:01:33] =============== drm_test_check_valid_clones  ===============
[19:01:33] [PASSED] not_in_clone_mode
[19:01:33] [PASSED] valid_clone
[19:01:33] [PASSED] invalid_clone
[19:01:33] =========== [PASSED] drm_test_check_valid_clones ===========
[19:01:33] ============= [PASSED] drm_validate_clone_mode =============
[19:01:33] ============= drm_validate_modeset (1 subtest) =============
[19:01:33] [PASSED] drm_test_check_connector_changed_modeset
[19:01:33] ============== [PASSED] drm_validate_modeset ===============
[19:01:33] ====== drm_test_bridge_get_current_state (2 subtests) ======
[19:01:33] [PASSED] drm_test_drm_bridge_get_current_state_atomic
[19:01:33] [PASSED] drm_test_drm_bridge_get_current_state_legacy
[19:01:33] ======== [PASSED] drm_test_bridge_get_current_state ========
[19:01:33] ====== drm_test_bridge_helper_reset_crtc (3 subtests) ======
[19:01:33] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic
[19:01:33] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic_disabled
[19:01:33] [PASSED] drm_test_drm_bridge_helper_reset_crtc_legacy
[19:01:33] ======== [PASSED] drm_test_bridge_helper_reset_crtc ========
[19:01:33] ============== drm_bridge_alloc (2 subtests) ===============
[19:01:33] [PASSED] drm_test_drm_bridge_alloc_basic
[19:01:33] [PASSED] drm_test_drm_bridge_alloc_get_put
[19:01:33] ================ [PASSED] drm_bridge_alloc =================
[19:01:33] ================== drm_buddy (8 subtests) ==================
[19:01:33] [PASSED] drm_test_buddy_alloc_limit
[19:01:33] [PASSED] drm_test_buddy_alloc_optimistic
[19:01:33] [PASSED] drm_test_buddy_alloc_pessimistic
[19:01:33] [PASSED] drm_test_buddy_alloc_pathological
[19:01:33] [PASSED] drm_test_buddy_alloc_contiguous
[19:01:33] [PASSED] drm_test_buddy_alloc_clear
[19:01:33] [PASSED] drm_test_buddy_alloc_range_bias
[19:01:33] [PASSED] drm_test_buddy_fragmentation_performance
[19:01:33] ==================== [PASSED] drm_buddy ====================
[19:01:33] ============= drm_cmdline_parser (40 subtests) =============
[19:01:33] [PASSED] drm_test_cmdline_force_d_only
[19:01:33] [PASSED] drm_test_cmdline_force_D_only_dvi
[19:01:33] [PASSED] drm_test_cmdline_force_D_only_hdmi
[19:01:33] [PASSED] drm_test_cmdline_force_D_only_not_digital
[19:01:33] [PASSED] drm_test_cmdline_force_e_only
[19:01:33] [PASSED] drm_test_cmdline_res
[19:01:33] [PASSED] drm_test_cmdline_res_vesa
[19:01:33] [PASSED] drm_test_cmdline_res_vesa_rblank
[19:01:33] [PASSED] drm_test_cmdline_res_rblank
[19:01:33] [PASSED] drm_test_cmdline_res_bpp
[19:01:33] [PASSED] drm_test_cmdline_res_refresh
[19:01:33] [PASSED] drm_test_cmdline_res_bpp_refresh
[19:01:33] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced
[19:01:33] [PASSED] drm_test_cmdline_res_bpp_refresh_margins
[19:01:33] [PASSED] drm_test_cmdline_res_bpp_refresh_force_off
[19:01:33] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on
[19:01:33] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_analog
[19:01:33] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_digital
[19:01:33] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced_margins_force_on
[19:01:33] [PASSED] drm_test_cmdline_res_margins_force_on
[19:01:33] [PASSED] drm_test_cmdline_res_vesa_margins
[19:01:33] [PASSED] drm_test_cmdline_name
[19:01:33] [PASSED] drm_test_cmdline_name_bpp
[19:01:33] [PASSED] drm_test_cmdline_name_option
[19:01:33] [PASSED] drm_test_cmdline_name_bpp_option
[19:01:33] [PASSED] drm_test_cmdline_rotate_0
[19:01:33] [PASSED] drm_test_cmdline_rotate_90
[19:01:33] [PASSED] drm_test_cmdline_rotate_180
[19:01:33] [PASSED] drm_test_cmdline_rotate_270
[19:01:33] [PASSED] drm_test_cmdline_hmirror
[19:01:33] [PASSED] drm_test_cmdline_vmirror
[19:01:33] [PASSED] drm_test_cmdline_margin_options
[19:01:33] [PASSED] drm_test_cmdline_multiple_options
[19:01:33] [PASSED] drm_test_cmdline_bpp_extra_and_option
[19:01:33] [PASSED] drm_test_cmdline_extra_and_option
[19:01:33] [PASSED] drm_test_cmdline_freestanding_options
[19:01:33] [PASSED] drm_test_cmdline_freestanding_force_e_and_options
[19:01:33] [PASSED] drm_test_cmdline_panel_orientation
[19:01:33] ================ drm_test_cmdline_invalid  =================
[19:01:33] [PASSED] margin_only
[19:01:33] [PASSED] interlace_only
[19:01:33] [PASSED] res_missing_x
[19:01:33] [PASSED] res_missing_y
[19:01:33] [PASSED] res_bad_y
[19:01:33] [PASSED] res_missing_y_bpp
[19:01:33] [PASSED] res_bad_bpp
[19:01:33] [PASSED] res_bad_refresh
[19:01:33] [PASSED] res_bpp_refresh_force_on_off
[19:01:33] [PASSED] res_invalid_mode
[19:01:33] [PASSED] res_bpp_wrong_place_mode
[19:01:33] [PASSED] name_bpp_refresh
[19:01:33] [PASSED] name_refresh
[19:01:33] [PASSED] name_refresh_wrong_mode
[19:01:33] [PASSED] name_refresh_invalid_mode
[19:01:33] [PASSED] rotate_multiple
[19:01:33] [PASSED] rotate_invalid_val
[19:01:33] [PASSED] rotate_truncated
[19:01:33] [PASSED] invalid_option
[19:01:33] [PASSED] invalid_tv_option
[19:01:33] [PASSED] truncated_tv_option
[19:01:33] ============ [PASSED] drm_test_cmdline_invalid =============
[19:01:33] =============== drm_test_cmdline_tv_options  ===============
[19:01:33] [PASSED] NTSC
[19:01:33] [PASSED] NTSC_443
[19:01:33] [PASSED] NTSC_J
[19:01:33] [PASSED] PAL
[19:01:33] [PASSED] PAL_M
[19:01:33] [PASSED] PAL_N
[19:01:33] [PASSED] SECAM
[19:01:33] [PASSED] MONO_525
[19:01:33] [PASSED] MONO_625
[19:01:33] =========== [PASSED] drm_test_cmdline_tv_options ===========
[19:01:33] =============== [PASSED] drm_cmdline_parser ================
[19:01:33] ========== drmm_connector_hdmi_init (20 subtests) ==========
[19:01:33] [PASSED] drm_test_connector_hdmi_init_valid
[19:01:33] [PASSED] drm_test_connector_hdmi_init_bpc_8
[19:01:33] [PASSED] drm_test_connector_hdmi_init_bpc_10
[19:01:33] [PASSED] drm_test_connector_hdmi_init_bpc_12
[19:01:33] [PASSED] drm_test_connector_hdmi_init_bpc_invalid
[19:01:33] [PASSED] drm_test_connector_hdmi_init_bpc_null
[19:01:33] [PASSED] drm_test_connector_hdmi_init_formats_empty
[19:01:33] [PASSED] drm_test_connector_hdmi_init_formats_no_rgb
[19:01:33] === drm_test_connector_hdmi_init_formats_yuv420_allowed  ===
[19:01:33] [PASSED] supported_formats=0x9 yuv420_allowed=1
[19:01:33] [PASSED] supported_formats=0x9 yuv420_allowed=0
[19:01:33] [PASSED] supported_formats=0x3 yuv420_allowed=1
[19:01:33] [PASSED] supported_formats=0x3 yuv420_allowed=0
[19:01:33] === [PASSED] drm_test_connector_hdmi_init_formats_yuv420_allowed ===
[19:01:33] [PASSED] drm_test_connector_hdmi_init_null_ddc
[19:01:33] [PASSED] drm_test_connector_hdmi_init_null_product
[19:01:33] [PASSED] drm_test_connector_hdmi_init_null_vendor
[19:01:33] [PASSED] drm_test_connector_hdmi_init_product_length_exact
[19:01:33] [PASSED] drm_test_connector_hdmi_init_product_length_too_long
[19:01:33] [PASSED] drm_test_connector_hdmi_init_product_valid
[19:01:33] [PASSED] drm_test_connector_hdmi_init_vendor_length_exact
[19:01:33] [PASSED] drm_test_connector_hdmi_init_vendor_length_too_long
[19:01:33] [PASSED] drm_test_connector_hdmi_init_vendor_valid
[19:01:33] ========= drm_test_connector_hdmi_init_type_valid  =========
[19:01:33] [PASSED] HDMI-A
[19:01:33] [PASSED] HDMI-B
[19:01:33] ===== [PASSED] drm_test_connector_hdmi_init_type_valid =====
[19:01:33] ======== drm_test_connector_hdmi_init_type_invalid  ========
[19:01:33] [PASSED] Unknown
[19:01:33] [PASSED] VGA
[19:01:33] [PASSED] DVI-I
[19:01:33] [PASSED] DVI-D
[19:01:33] [PASSED] DVI-A
[19:01:33] [PASSED] Composite
[19:01:33] [PASSED] SVIDEO
[19:01:33] [PASSED] LVDS
[19:01:33] [PASSED] Component
[19:01:33] [PASSED] DIN
[19:01:33] [PASSED] DP
[19:01:33] [PASSED] TV
[19:01:33] [PASSED] eDP
[19:01:33] [PASSED] Virtual
[19:01:33] [PASSED] DSI
[19:01:33] [PASSED] DPI
[19:01:33] [PASSED] Writeback
[19:01:33] [PASSED] SPI
[19:01:33] [PASSED] USB
[19:01:33] ==== [PASSED] drm_test_connector_hdmi_init_type_invalid ====
[19:01:33] ============ [PASSED] drmm_connector_hdmi_init =============
[19:01:33] ============= drmm_connector_init (3 subtests) =============
[19:01:33] [PASSED] drm_test_drmm_connector_init
[19:01:33] [PASSED] drm_test_drmm_connector_init_null_ddc
[19:01:33] ========= drm_test_drmm_connector_init_type_valid  =========
[19:01:33] [PASSED] Unknown
[19:01:33] [PASSED] VGA
[19:01:33] [PASSED] DVI-I
[19:01:33] [PASSED] DVI-D
[19:01:33] [PASSED] DVI-A
[19:01:33] [PASSED] Composite
[19:01:33] [PASSED] SVIDEO
[19:01:33] [PASSED] LVDS
[19:01:33] [PASSED] Component
[19:01:33] [PASSED] DIN
[19:01:33] [PASSED] DP
[19:01:33] [PASSED] HDMI-A
[19:01:33] [PASSED] HDMI-B
[19:01:33] [PASSED] TV
[19:01:33] [PASSED] eDP
[19:01:33] [PASSED] Virtual
[19:01:33] [PASSED] DSI
[19:01:33] [PASSED] DPI
[19:01:33] [PASSED] Writeback
[19:01:33] [PASSED] SPI
[19:01:33] [PASSED] USB
[19:01:33] ===== [PASSED] drm_test_drmm_connector_init_type_valid =====
[19:01:33] =============== [PASSED] drmm_connector_init ===============
[19:01:33] ========= drm_connector_dynamic_init (6 subtests) ==========
[19:01:33] [PASSED] drm_test_drm_connector_dynamic_init
[19:01:33] [PASSED] drm_test_drm_connector_dynamic_init_null_ddc
[19:01:33] [PASSED] drm_test_drm_connector_dynamic_init_not_added
[19:01:33] [PASSED] drm_test_drm_connector_dynamic_init_properties
[19:01:33] ===== drm_test_drm_connector_dynamic_init_type_valid  ======
[19:01:33] [PASSED] Unknown
[19:01:33] [PASSED] VGA
[19:01:33] [PASSED] DVI-I
[19:01:33] [PASSED] DVI-D
[19:01:33] [PASSED] DVI-A
[19:01:33] [PASSED] Composite
[19:01:33] [PASSED] SVIDEO
[19:01:33] [PASSED] LVDS
[19:01:33] [PASSED] Component
[19:01:33] [PASSED] DIN
[19:01:33] [PASSED] DP
[19:01:33] [PASSED] HDMI-A
[19:01:33] [PASSED] HDMI-B
[19:01:33] [PASSED] TV
[19:01:33] [PASSED] eDP
[19:01:33] [PASSED] Virtual
[19:01:33] [PASSED] DSI
[19:01:33] [PASSED] DPI
[19:01:33] [PASSED] Writeback
[19:01:33] [PASSED] SPI
[19:01:33] [PASSED] USB
[19:01:33] = [PASSED] drm_test_drm_connector_dynamic_init_type_valid ==
[19:01:33] ======== drm_test_drm_connector_dynamic_init_name  =========
[19:01:33] [PASSED] Unknown
[19:01:33] [PASSED] VGA
[19:01:33] [PASSED] DVI-I
[19:01:33] [PASSED] DVI-D
[19:01:33] [PASSED] DVI-A
[19:01:33] [PASSED] Composite
[19:01:33] [PASSED] SVIDEO
[19:01:33] [PASSED] LVDS
[19:01:33] [PASSED] Component
[19:01:33] [PASSED] DIN
[19:01:33] [PASSED] DP
[19:01:33] [PASSED] HDMI-A
[19:01:33] [PASSED] HDMI-B
[19:01:33] [PASSED] TV
[19:01:33] [PASSED] eDP
[19:01:33] [PASSED] Virtual
[19:01:33] [PASSED] DSI
[19:01:33] [PASSED] DPI
[19:01:33] [PASSED] Writeback
[19:01:33] [PASSED] SPI
[19:01:33] [PASSED] USB
[19:01:33] ==== [PASSED] drm_test_drm_connector_dynamic_init_name =====
[19:01:33] =========== [PASSED] drm_connector_dynamic_init ============
[19:01:33] ==== drm_connector_dynamic_register_early (4 subtests) =====
[19:01:33] [PASSED] drm_test_drm_connector_dynamic_register_early_on_list
[19:01:33] [PASSED] drm_test_drm_connector_dynamic_register_early_defer
[19:01:33] [PASSED] drm_test_drm_connector_dynamic_register_early_no_init
[19:01:33] [PASSED] drm_test_drm_connector_dynamic_register_early_no_mode_object
[19:01:33] ====== [PASSED] drm_connector_dynamic_register_early =======
[19:01:33] ======= drm_connector_dynamic_register (7 subtests) ========
[19:01:33] [PASSED] drm_test_drm_connector_dynamic_register_on_list
[19:01:33] [PASSED] drm_test_drm_connector_dynamic_register_no_defer
[19:01:33] [PASSED] drm_test_drm_connector_dynamic_register_no_init
[19:01:33] [PASSED] drm_test_drm_connector_dynamic_register_mode_object
[19:01:33] [PASSED] drm_test_drm_connector_dynamic_register_sysfs
[19:01:33] [PASSED] drm_test_drm_connector_dynamic_register_sysfs_name
[19:01:33] [PASSED] drm_test_drm_connector_dynamic_register_debugfs
[19:01:33] ========= [PASSED] drm_connector_dynamic_register ==========
[19:01:33] = drm_connector_attach_broadcast_rgb_property (2 subtests) =
[19:01:33] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property
[19:01:33] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property_hdmi_connector
[19:01:33] === [PASSED] drm_connector_attach_broadcast_rgb_property ===
[19:01:33] ========== drm_get_tv_mode_from_name (2 subtests) ==========
[19:01:33] ========== drm_test_get_tv_mode_from_name_valid  ===========
[19:01:33] [PASSED] NTSC
[19:01:33] [PASSED] NTSC-443
[19:01:33] [PASSED] NTSC-J
[19:01:33] [PASSED] PAL
[19:01:33] [PASSED] PAL-M
[19:01:33] [PASSED] PAL-N
[19:01:33] [PASSED] SECAM
[19:01:33] [PASSED] Mono
[19:01:33] ====== [PASSED] drm_test_get_tv_mode_from_name_valid =======
[19:01:33] [PASSED] drm_test_get_tv_mode_from_name_truncated
[19:01:33] ============ [PASSED] drm_get_tv_mode_from_name ============
[19:01:33] = drm_test_connector_hdmi_compute_mode_clock (12 subtests) =
[19:01:33] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb
[19:01:33] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc
[19:01:33] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc_vic_1
[19:01:33] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc
[19:01:33] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc_vic_1
[19:01:33] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_double
[19:01:33] = drm_test_connector_hdmi_compute_mode_clock_yuv420_valid  =
[19:01:33] [PASSED] VIC 96
[19:01:33] [PASSED] VIC 97
[19:01:33] [PASSED] VIC 101
[19:01:33] [PASSED] VIC 102
[19:01:33] [PASSED] VIC 106
[19:01:33] [PASSED] VIC 107
[19:01:33] === [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_valid ===
[19:01:33] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_10_bpc
[19:01:33] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_12_bpc
[19:01:33] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_8_bpc
[19:01:33] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_10_bpc
[19:01:33] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_12_bpc
[19:01:33] === [PASSED] drm_test_connector_hdmi_compute_mode_clock ====
[19:01:33] == drm_hdmi_connector_get_broadcast_rgb_name (2 subtests) ==
[19:01:33] === drm_test_drm_hdmi_connector_get_broadcast_rgb_name  ====
[19:01:33] [PASSED] Automatic
[19:01:33] [PASSED] Full
[19:01:33] [PASSED] Limited 16:235
[19:01:33] === [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name ===
[19:01:33] [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name_invalid
[19:01:33] ==== [PASSED] drm_hdmi_connector_get_broadcast_rgb_name ====
[19:01:33] == drm_hdmi_connector_get_output_format_name (2 subtests) ==
[19:01:33] === drm_test_drm_hdmi_connector_get_output_format_name  ====
[19:01:33] [PASSED] RGB
[19:01:33] [PASSED] YUV 4:2:0
[19:01:33] [PASSED] YUV 4:2:2
[19:01:33] [PASSED] YUV 4:4:4
[19:01:33] === [PASSED] drm_test_drm_hdmi_connector_get_output_format_name ===
[19:01:33] [PASSED] drm_test_drm_hdmi_connector_get_output_format_name_invalid
[19:01:33] ==== [PASSED] drm_hdmi_connector_get_output_format_name ====
[19:01:33] ============= drm_damage_helper (21 subtests) ==============
[19:01:33] [PASSED] drm_test_damage_iter_no_damage
[19:01:33] [PASSED] drm_test_damage_iter_no_damage_fractional_src
[19:01:33] [PASSED] drm_test_damage_iter_no_damage_src_moved
[19:01:33] [PASSED] drm_test_damage_iter_no_damage_fractional_src_moved
[19:01:33] [PASSED] drm_test_damage_iter_no_damage_not_visible
[19:01:33] [PASSED] drm_test_damage_iter_no_damage_no_crtc
[19:01:33] [PASSED] drm_test_damage_iter_no_damage_no_fb
[19:01:33] [PASSED] drm_test_damage_iter_simple_damage
[19:01:33] [PASSED] drm_test_damage_iter_single_damage
[19:01:33] [PASSED] drm_test_damage_iter_single_damage_intersect_src
[19:01:33] [PASSED] drm_test_damage_iter_single_damage_outside_src
[19:01:33] [PASSED] drm_test_damage_iter_single_damage_fractional_src
[19:01:33] [PASSED] drm_test_damage_iter_single_damage_intersect_fractional_src
[19:01:33] [PASSED] drm_test_damage_iter_single_damage_outside_fractional_src
[19:01:33] [PASSED] drm_test_damage_iter_single_damage_src_moved
[19:01:33] [PASSED] drm_test_damage_iter_single_damage_fractional_src_moved
[19:01:33] [PASSED] drm_test_damage_iter_damage
[19:01:33] [PASSED] drm_test_damage_iter_damage_one_intersect
[19:01:33] [PASSED] drm_test_damage_iter_damage_one_outside
[19:01:33] [PASSED] drm_test_damage_iter_damage_src_moved
[19:01:33] [PASSED] drm_test_damage_iter_damage_not_visible
[19:01:33] ================ [PASSED] drm_damage_helper ================
[19:01:33] ============== drm_dp_mst_helper (3 subtests) ==============
[19:01:33] ============== drm_test_dp_mst_calc_pbn_mode  ==============
[19:01:33] [PASSED] Clock 154000 BPP 30 DSC disabled
[19:01:33] [PASSED] Clock 234000 BPP 30 DSC disabled
[19:01:33] [PASSED] Clock 297000 BPP 24 DSC disabled
[19:01:33] [PASSED] Clock 332880 BPP 24 DSC enabled
[19:01:33] [PASSED] Clock 324540 BPP 24 DSC enabled
[19:01:33] ========== [PASSED] drm_test_dp_mst_calc_pbn_mode ==========
[19:01:33] ============== drm_test_dp_mst_calc_pbn_div  ===============
[19:01:33] [PASSED] Link rate 2000000 lane count 4
[19:01:33] [PASSED] Link rate 2000000 lane count 2
[19:01:33] [PASSED] Link rate 2000000 lane count 1
[19:01:33] [PASSED] Link rate 1350000 lane count 4
[19:01:33] [PASSED] Link rate 1350000 lane count 2
[19:01:33] [PASSED] Link rate 1350000 lane count 1
[19:01:33] [PASSED] Link rate 1000000 lane count 4
[19:01:33] [PASSED] Link rate 1000000 lane count 2
[19:01:33] [PASSED] Link rate 1000000 lane count 1
[19:01:33] [PASSED] Link rate 810000 lane count 4
[19:01:33] [PASSED] Link rate 810000 lane count 2
[19:01:33] [PASSED] Link rate 810000 lane count 1
[19:01:33] [PASSED] Link rate 540000 lane count 4
[19:01:33] [PASSED] Link rate 540000 lane count 2
[19:01:33] [PASSED] Link rate 540000 lane count 1
[19:01:33] [PASSED] Link rate 270000 lane count 4
[19:01:33] [PASSED] Link rate 270000 lane count 2
[19:01:33] [PASSED] Link rate 270000 lane count 1
[19:01:33] [PASSED] Link rate 162000 lane count 4
[19:01:33] [PASSED] Link rate 162000 lane count 2
[19:01:33] [PASSED] Link rate 162000 lane count 1
[19:01:33] ========== [PASSED] drm_test_dp_mst_calc_pbn_div ===========
[19:01:33] ========= drm_test_dp_mst_sideband_msg_req_decode  =========
[19:01:33] [PASSED] DP_ENUM_PATH_RESOURCES with port number
[19:01:33] [PASSED] DP_POWER_UP_PHY with port number
[19:01:33] [PASSED] DP_POWER_DOWN_PHY with port number
[19:01:33] [PASSED] DP_ALLOCATE_PAYLOAD with SDP stream sinks
[19:01:33] [PASSED] DP_ALLOCATE_PAYLOAD with port number
[19:01:33] [PASSED] DP_ALLOCATE_PAYLOAD with VCPI
[19:01:33] [PASSED] DP_ALLOCATE_PAYLOAD with PBN
[19:01:33] [PASSED] DP_QUERY_PAYLOAD with port number
[19:01:33] [PASSED] DP_QUERY_PAYLOAD with VCPI
[19:01:33] [PASSED] DP_REMOTE_DPCD_READ with port number
[19:01:33] [PASSED] DP_REMOTE_DPCD_READ with DPCD address
[19:01:33] [PASSED] DP_REMOTE_DPCD_READ with max number of bytes
[19:01:33] [PASSED] DP_REMOTE_DPCD_WRITE with port number
[19:01:33] [PASSED] DP_REMOTE_DPCD_WRITE with DPCD address
[19:01:33] [PASSED] DP_REMOTE_DPCD_WRITE with data array
[19:01:33] [PASSED] DP_REMOTE_I2C_READ with port number
[19:01:33] [PASSED] DP_REMOTE_I2C_READ with I2C device ID
[19:01:33] [PASSED] DP_REMOTE_I2C_READ with transactions array
[19:01:33] [PASSED] DP_REMOTE_I2C_WRITE with port number
[19:01:33] [PASSED] DP_REMOTE_I2C_WRITE with I2C device ID
[19:01:33] [PASSED] DP_REMOTE_I2C_WRITE with data array
[19:01:33] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream ID
[19:01:33] [PASSED] DP_QUERY_STREAM_ENC_STATUS with client ID
[19:01:33] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream event
[19:01:33] [PASSED] DP_QUERY_STREAM_ENC_STATUS with valid stream event
[19:01:33] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream behavior
[19:01:33] [PASSED] DP_QUERY_STREAM_ENC_STATUS with a valid stream behavior
[19:01:33] ===== [PASSED] drm_test_dp_mst_sideband_msg_req_decode =====
[19:01:33] ================ [PASSED] drm_dp_mst_helper ================
[19:01:33] ================== drm_exec (7 subtests) ===================
[19:01:33] [PASSED] sanitycheck
[19:01:33] [PASSED] test_lock
[19:01:33] [PASSED] test_lock_unlock
[19:01:33] [PASSED] test_duplicates
[19:01:33] [PASSED] test_prepare
[19:01:33] [PASSED] test_prepare_array
[19:01:33] [PASSED] test_multiple_loops
[19:01:33] ==================== [PASSED] drm_exec =====================
[19:01:33] =========== drm_format_helper_test (17 subtests) ===========
[19:01:33] ============== drm_test_fb_xrgb8888_to_gray8  ==============
[19:01:33] [PASSED] single_pixel_source_buffer
[19:01:33] [PASSED] single_pixel_clip_rectangle
[19:01:33] [PASSED] well_known_colors
[19:01:33] [PASSED] destination_pitch
[19:01:33] ========== [PASSED] drm_test_fb_xrgb8888_to_gray8 ==========
[19:01:33] ============= drm_test_fb_xrgb8888_to_rgb332  ==============
[19:01:33] [PASSED] single_pixel_source_buffer
[19:01:33] [PASSED] single_pixel_clip_rectangle
[19:01:33] [PASSED] well_known_colors
[19:01:33] [PASSED] destination_pitch
[19:01:33] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb332 ==========
[19:01:33] ============= drm_test_fb_xrgb8888_to_rgb565  ==============
[19:01:33] [PASSED] single_pixel_source_buffer
[19:01:33] [PASSED] single_pixel_clip_rectangle
[19:01:33] [PASSED] well_known_colors
[19:01:33] [PASSED] destination_pitch
[19:01:33] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb565 ==========
[19:01:33] ============ drm_test_fb_xrgb8888_to_xrgb1555  =============
[19:01:33] [PASSED] single_pixel_source_buffer
[19:01:33] [PASSED] single_pixel_clip_rectangle
[19:01:33] [PASSED] well_known_colors
[19:01:33] [PASSED] destination_pitch
[19:01:33] ======== [PASSED] drm_test_fb_xrgb8888_to_xrgb1555 =========
[19:01:33] ============ drm_test_fb_xrgb8888_to_argb1555  =============
[19:01:33] [PASSED] single_pixel_source_buffer
[19:01:33] [PASSED] single_pixel_clip_rectangle
[19:01:33] [PASSED] well_known_colors
[19:01:33] [PASSED] destination_pitch
[19:01:33] ======== [PASSED] drm_test_fb_xrgb8888_to_argb1555 =========
[19:01:33] ============ drm_test_fb_xrgb8888_to_rgba5551  =============
[19:01:33] [PASSED] single_pixel_source_buffer
[19:01:33] [PASSED] single_pixel_clip_rectangle
[19:01:33] [PASSED] well_known_colors
[19:01:33] [PASSED] destination_pitch
[19:01:33] ======== [PASSED] drm_test_fb_xrgb8888_to_rgba5551 =========
[19:01:33] ============= drm_test_fb_xrgb8888_to_rgb888  ==============
[19:01:33] [PASSED] single_pixel_source_buffer
[19:01:33] [PASSED] single_pixel_clip_rectangle
[19:01:33] [PASSED] well_known_colors
[19:01:33] [PASSED] destination_pitch
[19:01:33] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb888 ==========
[19:01:33] ============= drm_test_fb_xrgb8888_to_bgr888  ==============
[19:01:33] [PASSED] single_pixel_source_buffer
[19:01:33] [PASSED] single_pixel_clip_rectangle
[19:01:33] [PASSED] well_known_colors
[19:01:33] [PASSED] destination_pitch
[19:01:33] ========= [PASSED] drm_test_fb_xrgb8888_to_bgr888 ==========
[19:01:33] ============ drm_test_fb_xrgb8888_to_argb8888  =============
[19:01:33] [PASSED] single_pixel_source_buffer
[19:01:33] [PASSED] single_pixel_clip_rectangle
[19:01:33] [PASSED] well_known_colors
[19:01:33] [PASSED] destination_pitch
[19:01:33] ======== [PASSED] drm_test_fb_xrgb8888_to_argb8888 =========
[19:01:33] =========== drm_test_fb_xrgb8888_to_xrgb2101010  ===========
[19:01:33] [PASSED] single_pixel_source_buffer
[19:01:33] [PASSED] single_pixel_clip_rectangle
[19:01:33] [PASSED] well_known_colors
[19:01:33] [PASSED] destination_pitch
[19:01:33] ======= [PASSED] drm_test_fb_xrgb8888_to_xrgb2101010 =======
[19:01:33] =========== drm_test_fb_xrgb8888_to_argb2101010  ===========
[19:01:33] [PASSED] single_pixel_source_buffer
[19:01:33] [PASSED] single_pixel_clip_rectangle
[19:01:33] [PASSED] well_known_colors
[19:01:33] [PASSED] destination_pitch
[19:01:33] ======= [PASSED] drm_test_fb_xrgb8888_to_argb2101010 =======
[19:01:33] ============== drm_test_fb_xrgb8888_to_mono  ===============
[19:01:33] [PASSED] single_pixel_source_buffer
[19:01:33] [PASSED] single_pixel_clip_rectangle
[19:01:33] [PASSED] well_known_colors
[19:01:33] [PASSED] destination_pitch
[19:01:33] ========== [PASSED] drm_test_fb_xrgb8888_to_mono ===========
[19:01:33] ==================== drm_test_fb_swab  =====================
[19:01:33] [PASSED] single_pixel_source_buffer
[19:01:33] [PASSED] single_pixel_clip_rectangle
[19:01:33] [PASSED] well_known_colors
[19:01:33] [PASSED] destination_pitch
[19:01:33] ================ [PASSED] drm_test_fb_swab =================
[19:01:33] ============ drm_test_fb_xrgb8888_to_xbgr8888  =============
[19:01:33] [PASSED] single_pixel_source_buffer
[19:01:33] [PASSED] single_pixel_clip_rectangle
[19:01:33] [PASSED] well_known_colors
[19:01:33] [PASSED] destination_pitch
[19:01:33] ======== [PASSED] drm_test_fb_xrgb8888_to_xbgr8888 =========
[19:01:33] ============ drm_test_fb_xrgb8888_to_abgr8888  =============
[19:01:33] [PASSED] single_pixel_source_buffer
[19:01:33] [PASSED] single_pixel_clip_rectangle
[19:01:33] [PASSED] well_known_colors
[19:01:33] [PASSED] destination_pitch
[19:01:33] ======== [PASSED] drm_test_fb_xrgb8888_to_abgr8888 =========
[19:01:33] ================= drm_test_fb_clip_offset  =================
[19:01:33] [PASSED] pass through
[19:01:33] [PASSED] horizontal offset
[19:01:33] [PASSED] vertical offset
[19:01:33] [PASSED] horizontal and vertical offset
[19:01:33] [PASSED] horizontal offset (custom pitch)
[19:01:33] [PASSED] vertical offset (custom pitch)
[19:01:33] [PASSED] horizontal and vertical offset (custom pitch)
[19:01:33] ============= [PASSED] drm_test_fb_clip_offset =============
[19:01:33] =================== drm_test_fb_memcpy  ====================
[19:01:33] [PASSED] single_pixel_source_buffer: XR24 little-endian (0x34325258)
[19:01:33] [PASSED] single_pixel_source_buffer: XRA8 little-endian (0x38415258)
[19:01:33] [PASSED] single_pixel_source_buffer: YU24 little-endian (0x34325559)
[19:01:33] [PASSED] single_pixel_clip_rectangle: XB24 little-endian (0x34324258)
[19:01:33] [PASSED] single_pixel_clip_rectangle: XRA8 little-endian (0x38415258)
[19:01:33] [PASSED] single_pixel_clip_rectangle: YU24 little-endian (0x34325559)
[19:01:33] [PASSED] well_known_colors: XB24 little-endian (0x34324258)
[19:01:33] [PASSED] well_known_colors: XRA8 little-endian (0x38415258)
[19:01:33] [PASSED] well_known_colors: YU24 little-endian (0x34325559)
[19:01:33] [PASSED] destination_pitch: XB24 little-endian (0x34324258)
[19:01:33] [PASSED] destination_pitch: XRA8 little-endian (0x38415258)
[19:01:33] [PASSED] destination_pitch: YU24 little-endian (0x34325559)
[19:01:33] =============== [PASSED] drm_test_fb_memcpy ================
[19:01:33] ============= [PASSED] drm_format_helper_test ==============
[19:01:33] ================= drm_format (18 subtests) =================
[19:01:33] [PASSED] drm_test_format_block_width_invalid
[19:01:33] [PASSED] drm_test_format_block_width_one_plane
[19:01:33] [PASSED] drm_test_format_block_width_two_plane
[19:01:33] [PASSED] drm_test_format_block_width_three_plane
[19:01:33] [PASSED] drm_test_format_block_width_tiled
[19:01:33] [PASSED] drm_test_format_block_height_invalid
[19:01:33] [PASSED] drm_test_format_block_height_one_plane
[19:01:33] [PASSED] drm_test_format_block_height_two_plane
[19:01:33] [PASSED] drm_test_format_block_height_three_plane
[19:01:33] [PASSED] drm_test_format_block_height_tiled
[19:01:33] [PASSED] drm_test_format_min_pitch_invalid
[19:01:33] [PASSED] drm_test_format_min_pitch_one_plane_8bpp
[19:01:33] [PASSED] drm_test_format_min_pitch_one_plane_16bpp
[19:01:33] [PASSED] drm_test_format_min_pitch_one_plane_24bpp
[19:01:33] [PASSED] drm_test_format_min_pitch_one_plane_32bpp
[19:01:33] [PASSED] drm_test_format_min_pitch_two_plane
[19:01:33] [PASSED] drm_test_format_min_pitch_three_plane_8bpp
[19:01:33] [PASSED] drm_test_format_min_pitch_tiled
[19:01:33] =================== [PASSED] drm_format ====================
[19:01:33] ============== drm_framebuffer (10 subtests) ===============
[19:01:33] ========== drm_test_framebuffer_check_src_coords  ==========
[19:01:33] [PASSED] Success: source fits into fb
[19:01:33] [PASSED] Fail: overflowing fb with x-axis coordinate
[19:01:33] [PASSED] Fail: overflowing fb with y-axis coordinate
[19:01:33] [PASSED] Fail: overflowing fb with source width
[19:01:33] [PASSED] Fail: overflowing fb with source height
[19:01:33] ====== [PASSED] drm_test_framebuffer_check_src_coords ======
[19:01:33] [PASSED] drm_test_framebuffer_cleanup
[19:01:33] =============== drm_test_framebuffer_create  ===============
[19:01:33] [PASSED] ABGR8888 normal sizes
[19:01:33] [PASSED] ABGR8888 max sizes
[19:01:33] [PASSED] ABGR8888 pitch greater than min required
[19:01:33] [PASSED] ABGR8888 pitch less than min required
[19:01:33] [PASSED] ABGR8888 Invalid width
[19:01:33] [PASSED] ABGR8888 Invalid buffer handle
[19:01:33] [PASSED] No pixel format
[19:01:33] [PASSED] ABGR8888 Width 0
[19:01:33] [PASSED] ABGR8888 Height 0
[19:01:33] [PASSED] ABGR8888 Out of bound height * pitch combination
[19:01:33] [PASSED] ABGR8888 Large buffer offset
[19:01:33] [PASSED] ABGR8888 Buffer offset for inexistent plane
[19:01:33] [PASSED] ABGR8888 Invalid flag
[19:01:33] [PASSED] ABGR8888 Set DRM_MODE_FB_MODIFIERS without modifiers
[19:01:33] [PASSED] ABGR8888 Valid buffer modifier
[19:01:33] [PASSED] ABGR8888 Invalid buffer modifier(DRM_FORMAT_MOD_SAMSUNG_64_32_TILE)
[19:01:33] [PASSED] ABGR8888 Extra pitches without DRM_MODE_FB_MODIFIERS
[19:01:33] [PASSED] ABGR8888 Extra pitches with DRM_MODE_FB_MODIFIERS
[19:01:33] [PASSED] NV12 Normal sizes
[19:01:33] [PASSED] NV12 Max sizes
[19:01:33] [PASSED] NV12 Invalid pitch
[19:01:33] [PASSED] NV12 Invalid modifier/missing DRM_MODE_FB_MODIFIERS flag
[19:01:33] [PASSED] NV12 different  modifier per-plane
[19:01:33] [PASSED] NV12 with DRM_FORMAT_MOD_SAMSUNG_64_32_TILE
[19:01:33] [PASSED] NV12 Valid modifiers without DRM_MODE_FB_MODIFIERS
[19:01:33] [PASSED] NV12 Modifier for inexistent plane
[19:01:33] [PASSED] NV12 Handle for inexistent plane
[19:01:33] [PASSED] NV12 Handle for inexistent plane without DRM_MODE_FB_MODIFIERS
[19:01:33] [PASSED] YVU420 DRM_MODE_FB_MODIFIERS set without modifier
[19:01:33] [PASSED] YVU420 Normal sizes
[19:01:33] [PASSED] YVU420 Max sizes
[19:01:33] [PASSED] YVU420 Invalid pitch
[19:01:33] [PASSED] YVU420 Different pitches
[19:01:33] [PASSED] YVU420 Different buffer offsets/pitches
[19:01:33] [PASSED] YVU420 Modifier set just for plane 0, without DRM_MODE_FB_MODIFIERS
[19:01:33] [PASSED] YVU420 Modifier set just for planes 0, 1, without DRM_MODE_FB_MODIFIERS
[19:01:33] [PASSED] YVU420 Modifier set just for plane 0, 1, with DRM_MODE_FB_MODIFIERS
[19:01:33] [PASSED] YVU420 Valid modifier
[19:01:33] [PASSED] YVU420 Different modifiers per plane
[19:01:33] [PASSED] YVU420 Modifier for inexistent plane
[19:01:33] [PASSED] YUV420_10BIT Invalid modifier(DRM_FORMAT_MOD_LINEAR)
[19:01:33] [PASSED] X0L2 Normal sizes
[19:01:33] [PASSED] X0L2 Max sizes
[19:01:33] [PASSED] X0L2 Invalid pitch
[19:01:33] [PASSED] X0L2 Pitch greater than minimum required
[19:01:33] [PASSED] X0L2 Handle for inexistent plane
[19:01:33] [PASSED] X0L2 Offset for inexistent plane, without DRM_MODE_FB_MODIFIERS set
[19:01:33] [PASSED] X0L2 Modifier without DRM_MODE_FB_MODIFIERS set
[19:01:33] [PASSED] X0L2 Valid modifier
[19:01:33] [PASSED] X0L2 Modifier for inexistent plane
[19:01:33] =========== [PASSED] drm_test_framebuffer_create ===========
[19:01:33] [PASSED] drm_test_framebuffer_free
[19:01:33] [PASSED] drm_test_framebuffer_init
[19:01:33] [PASSED] drm_test_framebuffer_init_bad_format
[19:01:33] [PASSED] drm_test_framebuffer_init_dev_mismatch
[19:01:33] [PASSED] drm_test_framebuffer_lookup
[19:01:33] [PASSED] drm_test_framebuffer_lookup_inexistent
[19:01:33] [PASSED] drm_test_framebuffer_modifiers_not_supported
[19:01:33] ================= [PASSED] drm_framebuffer =================
[19:01:33] ================ drm_gem_shmem (8 subtests) ================
[19:01:33] [PASSED] drm_gem_shmem_test_obj_create
[19:01:33] [PASSED] drm_gem_shmem_test_obj_create_private
[19:01:33] [PASSED] drm_gem_shmem_test_pin_pages
[19:01:33] [PASSED] drm_gem_shmem_test_vmap
[19:01:33] [PASSED] drm_gem_shmem_test_get_pages_sgt
[19:01:33] [PASSED] drm_gem_shmem_test_get_sg_table
[19:01:33] [PASSED] drm_gem_shmem_test_madvise
[19:01:33] [PASSED] drm_gem_shmem_test_purge
[19:01:33] ================== [PASSED] drm_gem_shmem ==================
[19:01:33] === drm_atomic_helper_connector_hdmi_check (27 subtests) ===
[19:01:33] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode
[19:01:33] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode_vic_1
[19:01:33] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode
[19:01:33] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode_vic_1
[19:01:33] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode
[19:01:33] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode_vic_1
[19:01:33] ====== drm_test_check_broadcast_rgb_cea_mode_yuv420  =======
[19:01:33] [PASSED] Automatic
[19:01:33] [PASSED] Full
[19:01:33] [PASSED] Limited 16:235
[19:01:33] == [PASSED] drm_test_check_broadcast_rgb_cea_mode_yuv420 ===
[19:01:33] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_changed
[19:01:33] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_not_changed
[19:01:33] [PASSED] drm_test_check_disable_connector
[19:01:33] [PASSED] drm_test_check_hdmi_funcs_reject_rate
[19:01:33] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_rgb
[19:01:33] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_yuv420
[19:01:33] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv422
[19:01:33] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv420
[19:01:33] [PASSED] drm_test_check_driver_unsupported_fallback_yuv420
[19:01:33] [PASSED] drm_test_check_output_bpc_crtc_mode_changed
[19:01:33] [PASSED] drm_test_check_output_bpc_crtc_mode_not_changed
[19:01:33] [PASSED] drm_test_check_output_bpc_dvi
[19:01:33] [PASSED] drm_test_check_output_bpc_format_vic_1
[19:01:33] [PASSED] drm_test_check_output_bpc_format_display_8bpc_only
[19:01:33] [PASSED] drm_test_check_output_bpc_format_display_rgb_only
[19:01:33] [PASSED] drm_test_check_output_bpc_format_driver_8bpc_only
[19:01:33] [PASSED] drm_test_check_output_bpc_format_driver_rgb_only
[19:01:33] [PASSED] drm_test_check_tmds_char_rate_rgb_8bpc
[19:01:33] [PASSED] drm_test_check_tmds_char_rate_rgb_10bpc
[19:01:33] [PASSED] drm_test_check_tmds_char_rate_rgb_12bpc
[19:01:33] ===== [PASSED] drm_atomic_helper_connector_hdmi_check ======
[19:01:33] === drm_atomic_helper_connector_hdmi_reset (6 subtests) ====
[19:01:33] [PASSED] drm_test_check_broadcast_rgb_value
[19:01:33] [PASSED] drm_test_check_bpc_8_value
[19:01:33] [PASSED] drm_test_check_bpc_10_value
[19:01:33] [PASSED] drm_test_check_bpc_12_value
[19:01:33] [PASSED] drm_test_check_format_value
[19:01:33] [PASSED] drm_test_check_tmds_char_value
[19:01:33] ===== [PASSED] drm_atomic_helper_connector_hdmi_reset ======
[19:01:33] = drm_atomic_helper_connector_hdmi_mode_valid (4 subtests) =
[19:01:33] [PASSED] drm_test_check_mode_valid
[19:01:33] [PASSED] drm_test_check_mode_valid_reject
[19:01:33] [PASSED] drm_test_check_mode_valid_reject_rate
[19:01:33] [PASSED] drm_test_check_mode_valid_reject_max_clock
[19:01:33] === [PASSED] drm_atomic_helper_connector_hdmi_mode_valid ===
[19:01:33] ================= drm_managed (2 subtests) =================
[19:01:33] [PASSED] drm_test_managed_release_action
[19:01:33] [PASSED] drm_test_managed_run_action
[19:01:33] =================== [PASSED] drm_managed ===================
[19:01:33] =================== drm_mm (6 subtests) ====================
[19:01:33] [PASSED] drm_test_mm_init
[19:01:33] [PASSED] drm_test_mm_debug
[19:01:33] [PASSED] drm_test_mm_align32
[19:01:33] [PASSED] drm_test_mm_align64
[19:01:33] [PASSED] drm_test_mm_lowest
[19:01:33] [PASSED] drm_test_mm_highest
[19:01:33] ===================== [PASSED] drm_mm ======================
[19:01:33] ============= drm_modes_analog_tv (5 subtests) =============
[19:01:33] [PASSED] drm_test_modes_analog_tv_mono_576i
[19:01:33] [PASSED] drm_test_modes_analog_tv_ntsc_480i
[19:01:33] [PASSED] drm_test_modes_analog_tv_ntsc_480i_inlined
[19:01:33] [PASSED] drm_test_modes_analog_tv_pal_576i
[19:01:33] [PASSED] drm_test_modes_analog_tv_pal_576i_inlined
[19:01:33] =============== [PASSED] drm_modes_analog_tv ===============
[19:01:33] ============== drm_plane_helper (2 subtests) ===============
[19:01:33] =============== drm_test_check_plane_state  ================
[19:01:33] [PASSED] clipping_simple
[19:01:33] [PASSED] clipping_rotate_reflect
[19:01:33] [PASSED] positioning_simple
[19:01:33] [PASSED] upscaling
[19:01:33] [PASSED] downscaling
[19:01:33] [PASSED] rounding1
[19:01:33] [PASSED] rounding2
[19:01:33] [PASSED] rounding3
[19:01:33] [PASSED] rounding4
[19:01:33] =========== [PASSED] drm_test_check_plane_state ============
[19:01:33] =========== drm_test_check_invalid_plane_state  ============
[19:01:33] [PASSED] positioning_invalid
[19:01:33] [PASSED] upscaling_invalid
[19:01:33] [PASSED] downscaling_invalid
[19:01:33] ======= [PASSED] drm_test_check_invalid_plane_state ========
[19:01:33] ================ [PASSED] drm_plane_helper =================
[19:01:33] ====== drm_connector_helper_tv_get_modes (1 subtest) =======
[19:01:33] ====== drm_test_connector_helper_tv_get_modes_check  =======
[19:01:33] [PASSED] None
[19:01:33] [PASSED] PAL
[19:01:33] [PASSED] NTSC
[19:01:33] [PASSED] Both, NTSC Default
[19:01:33] [PASSED] Both, PAL Default
[19:01:33] [PASSED] Both, NTSC Default, with PAL on command-line
[19:01:33] [PASSED] Both, PAL Default, with NTSC on command-line
[19:01:33] == [PASSED] drm_test_connector_helper_tv_get_modes_check ===
[19:01:33] ======== [PASSED] drm_connector_helper_tv_get_modes ========
[19:01:33] ================== drm_rect (9 subtests) ===================
[19:01:33] [PASSED] drm_test_rect_clip_scaled_div_by_zero
[19:01:33] [PASSED] drm_test_rect_clip_scaled_not_clipped
[19:01:33] [PASSED] drm_test_rect_clip_scaled_clipped
[19:01:33] [PASSED] drm_test_rect_clip_scaled_signed_vs_unsigned
[19:01:33] ================= drm_test_rect_intersect  =================
[19:01:33] [PASSED] top-left x bottom-right: 2x2+1+1 x 2x2+0+0
[19:01:33] [PASSED] top-right x bottom-left: 2x2+0+0 x 2x2+1-1
[19:01:33] [PASSED] bottom-left x top-right: 2x2+1-1 x 2x2+0+0
[19:01:33] [PASSED] bottom-right x top-left: 2x2+0+0 x 2x2+1+1
[19:01:33] [PASSED] right x left: 2x1+0+0 x 3x1+1+0
[19:01:33] [PASSED] left x right: 3x1+1+0 x 2x1+0+0
[19:01:33] [PASSED] up x bottom: 1x2+0+0 x 1x3+0-1
[19:01:33] [PASSED] bottom x up: 1x3+0-1 x 1x2+0+0
[19:01:33] [PASSED] touching corner: 1x1+0+0 x 2x2+1+1
[19:01:33] [PASSED] touching side: 1x1+0+0 x 1x1+1+0
[19:01:33] [PASSED] equal rects: 2x2+0+0 x 2x2+0+0
[19:01:33] [PASSED] inside another: 2x2+0+0 x 1x1+1+1
[19:01:33] [PASSED] far away: 1x1+0+0 x 1x1+3+6
[19:01:33] [PASSED] points intersecting: 0x0+5+10 x 0x0+5+10
[19:01:33] [PASSED] points not intersecting: 0x0+0+0 x 0x0+5+10
[19:01:33] ============= [PASSED] drm_test_rect_intersect =============
[19:01:33] ================ drm_test_rect_calc_hscale  ================
[19:01:33] [PASSED] normal use
[19:01:33] [PASSED] out of max range
[19:01:33] [PASSED] out of min range
[19:01:33] [PASSED] zero dst
[19:01:33] [PASSED] negative src
[19:01:33] [PASSED] negative dst
[19:01:33] ============ [PASSED] drm_test_rect_calc_hscale ============
[19:01:33] ================ drm_test_rect_calc_vscale  ================
[19:01:33] [PASSED] normal use
stty: 'standard input': Inappropriate ioctl for device
[19:01:33] [PASSED] out of max range
[19:01:33] [PASSED] out of min range
[19:01:33] [PASSED] zero dst
[19:01:33] [PASSED] negative src
[19:01:33] [PASSED] negative dst
[19:01:33] ============ [PASSED] drm_test_rect_calc_vscale ============
[19:01:33] ================== drm_test_rect_rotate  ===================
[19:01:33] [PASSED] reflect-x
[19:01:33] [PASSED] reflect-y
[19:01:33] [PASSED] rotate-0
[19:01:33] [PASSED] rotate-90
[19:01:33] [PASSED] rotate-180
[19:01:33] [PASSED] rotate-270
[19:01:33] ============== [PASSED] drm_test_rect_rotate ===============
[19:01:33] ================ drm_test_rect_rotate_inv  =================
[19:01:33] [PASSED] reflect-x
[19:01:33] [PASSED] reflect-y
[19:01:33] [PASSED] rotate-0
[19:01:33] [PASSED] rotate-90
[19:01:33] [PASSED] rotate-180
[19:01:33] [PASSED] rotate-270
[19:01:33] ============ [PASSED] drm_test_rect_rotate_inv =============
[19:01:33] ==================== [PASSED] drm_rect =====================
[19:01:33] ============ drm_sysfb_modeset_test (1 subtest) ============
[19:01:33] ============ drm_test_sysfb_build_fourcc_list  =============
[19:01:33] [PASSED] no native formats
[19:01:33] [PASSED] XRGB8888 as native format
[19:01:33] [PASSED] remove duplicates
[19:01:33] [PASSED] convert alpha formats
[19:01:33] [PASSED] random formats
[19:01:33] ======== [PASSED] drm_test_sysfb_build_fourcc_list =========
[19:01:33] ============= [PASSED] drm_sysfb_modeset_test ==============
[19:01:33] ============================================================
[19:01:33] Testing complete. Ran 622 tests: passed: 622
[19:01:33] Elapsed time: 26.609s total, 1.592s configuring, 24.595s building, 0.385s running

+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/ttm/tests/.kunitconfig
[19:01:33] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[19:01:35] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
[19:01:44] Starting KUnit Kernel (1/1)...
[19:01:44] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[19:01:44] ================= ttm_device (5 subtests) ==================
[19:01:44] [PASSED] ttm_device_init_basic
[19:01:44] [PASSED] ttm_device_init_multiple
[19:01:44] [PASSED] ttm_device_fini_basic
[19:01:44] [PASSED] ttm_device_init_no_vma_man
[19:01:44] ================== ttm_device_init_pools  ==================
[19:01:44] [PASSED] No DMA allocations, no DMA32 required
[19:01:44] [PASSED] DMA allocations, DMA32 required
[19:01:44] [PASSED] No DMA allocations, DMA32 required
[19:01:44] [PASSED] DMA allocations, no DMA32 required
[19:01:44] ============== [PASSED] ttm_device_init_pools ==============
[19:01:44] =================== [PASSED] ttm_device ====================
[19:01:44] ================== ttm_pool (8 subtests) ===================
[19:01:44] ================== ttm_pool_alloc_basic  ===================
[19:01:44] [PASSED] One page
[19:01:44] [PASSED] More than one page
[19:01:44] [PASSED] Above the allocation limit
[19:01:44] [PASSED] One page, with coherent DMA mappings enabled
[19:01:44] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[19:01:44] ============== [PASSED] ttm_pool_alloc_basic ===============
[19:01:44] ============== ttm_pool_alloc_basic_dma_addr  ==============
[19:01:44] [PASSED] One page
[19:01:44] [PASSED] More than one page
[19:01:44] [PASSED] Above the allocation limit
[19:01:44] [PASSED] One page, with coherent DMA mappings enabled
[19:01:44] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[19:01:44] ========== [PASSED] ttm_pool_alloc_basic_dma_addr ==========
[19:01:44] [PASSED] ttm_pool_alloc_order_caching_match
[19:01:44] [PASSED] ttm_pool_alloc_caching_mismatch
[19:01:44] [PASSED] ttm_pool_alloc_order_mismatch
[19:01:44] [PASSED] ttm_pool_free_dma_alloc
[19:01:44] [PASSED] ttm_pool_free_no_dma_alloc
[19:01:44] [PASSED] ttm_pool_fini_basic
[19:01:44] ==================== [PASSED] ttm_pool =====================
[19:01:44] ================ ttm_resource (8 subtests) =================
[19:01:44] ================= ttm_resource_init_basic  =================
[19:01:44] [PASSED] Init resource in TTM_PL_SYSTEM
[19:01:44] [PASSED] Init resource in TTM_PL_VRAM
[19:01:44] [PASSED] Init resource in a private placement
[19:01:44] [PASSED] Init resource in TTM_PL_SYSTEM, set placement flags
[19:01:44] ============= [PASSED] ttm_resource_init_basic =============
[19:01:44] [PASSED] ttm_resource_init_pinned
[19:01:44] [PASSED] ttm_resource_fini_basic
[19:01:44] [PASSED] ttm_resource_manager_init_basic
[19:01:44] [PASSED] ttm_resource_manager_usage_basic
[19:01:44] [PASSED] ttm_resource_manager_set_used_basic
[19:01:44] [PASSED] ttm_sys_man_alloc_basic
[19:01:44] [PASSED] ttm_sys_man_free_basic
[19:01:44] ================== [PASSED] ttm_resource ===================
[19:01:44] =================== ttm_tt (15 subtests) ===================
[19:01:44] ==================== ttm_tt_init_basic  ====================
[19:01:44] [PASSED] Page-aligned size
[19:01:44] [PASSED] Extra pages requested
[19:01:44] ================ [PASSED] ttm_tt_init_basic ================
[19:01:44] [PASSED] ttm_tt_init_misaligned
[19:01:44] [PASSED] ttm_tt_fini_basic
[19:01:44] [PASSED] ttm_tt_fini_sg
[19:01:44] [PASSED] ttm_tt_fini_shmem
[19:01:44] [PASSED] ttm_tt_create_basic
[19:01:44] [PASSED] ttm_tt_create_invalid_bo_type
[19:01:44] [PASSED] ttm_tt_create_ttm_exists
[19:01:44] [PASSED] ttm_tt_create_failed
[19:01:44] [PASSED] ttm_tt_destroy_basic
[19:01:44] [PASSED] ttm_tt_populate_null_ttm
[19:01:44] [PASSED] ttm_tt_populate_populated_ttm
[19:01:44] [PASSED] ttm_tt_unpopulate_basic
[19:01:44] [PASSED] ttm_tt_unpopulate_empty_ttm
[19:01:44] [PASSED] ttm_tt_swapin_basic
[19:01:44] ===================== [PASSED] ttm_tt ======================
[19:01:44] =================== ttm_bo (14 subtests) ===================
[19:01:44] =========== ttm_bo_reserve_optimistic_no_ticket  ===========
[19:01:44] [PASSED] Cannot be interrupted and sleeps
[19:01:44] [PASSED] Cannot be interrupted, locks straight away
[19:01:44] [PASSED] Can be interrupted, sleeps
[19:01:44] ======= [PASSED] ttm_bo_reserve_optimistic_no_ticket =======
[19:01:44] [PASSED] ttm_bo_reserve_locked_no_sleep
[19:01:44] [PASSED] ttm_bo_reserve_no_wait_ticket
[19:01:44] [PASSED] ttm_bo_reserve_double_resv
[19:01:44] [PASSED] ttm_bo_reserve_interrupted
[19:01:44] [PASSED] ttm_bo_reserve_deadlock
[19:01:44] [PASSED] ttm_bo_unreserve_basic
[19:01:44] [PASSED] ttm_bo_unreserve_pinned
[19:01:44] [PASSED] ttm_bo_unreserve_bulk
[19:01:44] [PASSED] ttm_bo_fini_basic
[19:01:44] [PASSED] ttm_bo_fini_shared_resv
[19:01:44] [PASSED] ttm_bo_pin_basic
[19:01:44] [PASSED] ttm_bo_pin_unpin_resource
[19:01:44] [PASSED] ttm_bo_multiple_pin_one_unpin
[19:01:44] ===================== [PASSED] ttm_bo ======================
[19:01:44] ============== ttm_bo_validate (21 subtests) ===============
[19:01:44] ============== ttm_bo_init_reserved_sys_man  ===============
[19:01:44] [PASSED] Buffer object for userspace
[19:01:44] [PASSED] Kernel buffer object
[19:01:44] [PASSED] Shared buffer object
[19:01:44] ========== [PASSED] ttm_bo_init_reserved_sys_man ===========
[19:01:44] ============== ttm_bo_init_reserved_mock_man  ==============
[19:01:44] [PASSED] Buffer object for userspace
[19:01:44] [PASSED] Kernel buffer object
[19:01:44] [PASSED] Shared buffer object
[19:01:44] ========== [PASSED] ttm_bo_init_reserved_mock_man ==========
[19:01:44] [PASSED] ttm_bo_init_reserved_resv
[19:01:44] ================== ttm_bo_validate_basic  ==================
[19:01:44] [PASSED] Buffer object for userspace
[19:01:44] [PASSED] Kernel buffer object
[19:01:44] [PASSED] Shared buffer object
[19:01:44] ============== [PASSED] ttm_bo_validate_basic ==============
[19:01:44] [PASSED] ttm_bo_validate_invalid_placement
[19:01:44] ============= ttm_bo_validate_same_placement  ==============
[19:01:44] [PASSED] System manager
[19:01:44] [PASSED] VRAM manager
[19:01:44] ========= [PASSED] ttm_bo_validate_same_placement ==========
[19:01:44] [PASSED] ttm_bo_validate_failed_alloc
[19:01:44] [PASSED] ttm_bo_validate_pinned
[19:01:44] [PASSED] ttm_bo_validate_busy_placement
[19:01:44] ================ ttm_bo_validate_multihop  =================
[19:01:44] [PASSED] Buffer object for userspace
[19:01:44] [PASSED] Kernel buffer object
[19:01:44] [PASSED] Shared buffer object
[19:01:44] ============ [PASSED] ttm_bo_validate_multihop =============
[19:01:44] ========== ttm_bo_validate_no_placement_signaled  ==========
[19:01:44] [PASSED] Buffer object in system domain, no page vector
[19:01:44] [PASSED] Buffer object in system domain with an existing page vector
[19:01:44] ====== [PASSED] ttm_bo_validate_no_placement_signaled ======
[19:01:44] ======== ttm_bo_validate_no_placement_not_signaled  ========
[19:01:44] [PASSED] Buffer object for userspace
[19:01:44] [PASSED] Kernel buffer object
[19:01:44] [PASSED] Shared buffer object
[19:01:44] ==== [PASSED] ttm_bo_validate_no_placement_not_signaled ====
[19:01:44] [PASSED] ttm_bo_validate_move_fence_signaled
[19:01:44] ========= ttm_bo_validate_move_fence_not_signaled  =========
[19:01:44] [PASSED] Waits for GPU
[19:01:44] [PASSED] Tries to lock straight away
[19:01:44] ===== [PASSED] ttm_bo_validate_move_fence_not_signaled =====
[19:01:44] [PASSED] ttm_bo_validate_happy_evict
[19:01:44] [PASSED] ttm_bo_validate_all_pinned_evict
[19:01:44] [PASSED] ttm_bo_validate_allowed_only_evict
[19:01:44] [PASSED] ttm_bo_validate_deleted_evict
[19:01:44] [PASSED] ttm_bo_validate_busy_domain_evict
[19:01:44] [PASSED] ttm_bo_validate_evict_gutting
[19:01:44] [PASSED] ttm_bo_validate_recrusive_evict
stty: 'standard input': Inappropriate ioctl for device
[19:01:44] ================= [PASSED] ttm_bo_validate =================
[19:01:44] ============================================================
[19:01:44] Testing complete. Ran 101 tests: passed: 101
[19:01:44] Elapsed time: 11.193s total, 1.612s configuring, 9.365s building, 0.188s running

+ cleanup
++ stat -c %u:%g /kernel
+ chown -R 1003:1003 /kernel



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

* ✗ CI.checksparse: warning for drm/i915/frontbuffer: Fix the intel_frontbuffer lifetime mess (rev2)
  2025-10-16 18:53 [PATCH v2 00/10] drm/i915/frontbuffer: Fix the intel_frontbuffer lifetime mess Ville Syrjala
                   ` (11 preceding siblings ...)
  2025-10-16 19:01 ` ✓ CI.KUnit: success " Patchwork
@ 2025-10-16 19:17 ` Patchwork
  2025-10-17 16:49 ` ✗ Xe.CI.Full: failure " Patchwork
  13 siblings, 0 replies; 20+ messages in thread
From: Patchwork @ 2025-10-16 19:17 UTC (permalink / raw)
  To: Ville Syrjala; +Cc: intel-xe

== Series Details ==

Series: drm/i915/frontbuffer: Fix the intel_frontbuffer lifetime mess (rev2)
URL   : https://patchwork.freedesktop.org/series/155471/
State : warning

== Summary ==

+ trap cleanup EXIT
+ KERNEL=/kernel
+ MT=/root/linux/maintainer-tools
+ git clone https://gitlab.freedesktop.org/drm/maintainer-tools /root/linux/maintainer-tools
Cloning into '/root/linux/maintainer-tools'...
warning: redirecting to https://gitlab.freedesktop.org/drm/maintainer-tools.git/
+ make -C /root/linux/maintainer-tools
make: Entering directory '/root/linux/maintainer-tools'
cc -O2 -g -Wextra -o remap-log remap-log.c
make: Leaving directory '/root/linux/maintainer-tools'
+ cd /kernel
+ git config --global --add safe.directory /kernel
+ /root/linux/maintainer-tools/dim sparse --fast e919806d9a23ee1c2611792492289a170be4cf9d
Sparse version: 0.6.4 (Ubuntu: 0.6.4-4ubuntu3)
Fast mode used, each commit won't be checked separately.
-
+drivers/gpu/drm/i915/display/intel_alpm.c: note: in included file:
+drivers/gpu/drm/i915/display/intel_cdclk.c: note: in included file:
+drivers/gpu/drm/i915/display/intel_ddi.c: note: in included file:
+drivers/gpu/drm/i915/display/intel_display_types.h:2042:24: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/display/intel_display_types.h:2042:24: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/display/intel_display_types.h:2042:24: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/display/intel_display_types.h:2042:24: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/display/intel_display_types.h:2042:24: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/display/intel_display_types.h:2042:24: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/display/intel_display_types.h:2042:24: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/display/intel_display_types.h:2042:24: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/display/intel_display_types.h:2042:24: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/display/intel_display_types.h:2042:24: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/display/intel_display_types.h:2042:24: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/display/intel_display_types.h:2042:24: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/display/intel_display_types.h:2042:24: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/display/intel_display_types.h:2042:24: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/display/intel_display_types.h:2042:24: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/display/intel_display_types.h:2042:24: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/display/intel_display_types.h:2055:24: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/display/intel_display_types.h:2055:24: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/display/intel_display_types.h:2055:24: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/display/intel_hdcp.c: note: in included file:
+drivers/gpu/drm/i915/display/intel_hotplug.c: note: in included file:
+drivers/gpu/drm/i915/display/intel_pps.c: note: in included file:
+drivers/gpu/drm/i915/display/intel_psr.c: note: in included file:
+drivers/gpu/drm/i915/gt/intel_reset.c:1569:12: warning: context imbalance in '_intel_gt_reset_lock' - different lock contexts for basic block
+drivers/gpu/drm/i915/gt/intel_sseu.c:598:17: error: too long token expansion
+drivers/gpu/drm/i915/i915_active.c:1062:16: warning: context imbalance in '__i915_active_fence_set' - different lock contexts for basic block
+drivers/gpu/drm/i915/i915_drm_client.c:92:9: error: incompatible types in comparison expression (different address spaces):
+drivers/gpu/drm/i915/i915_drm_client.c:92:9: error: incompatible types in comparison expression (different address spaces):
+drivers/gpu/drm/i915/i915_drm_client.c:92:9:    expected struct list_head const *list
+drivers/gpu/drm/i915/i915_drm_client.c:92:9:    got struct list_head [noderef] __rcu *pos
+drivers/gpu/drm/i915/i915_drm_client.c:92:9:    struct list_head *
+drivers/gpu/drm/i915/i915_drm_client.c:92:9:    struct list_head *
+drivers/gpu/drm/i915/i915_drm_client.c:92:9:    struct list_head [noderef] __rcu *
+drivers/gpu/drm/i915/i915_drm_client.c:92:9:    struct list_head [noderef] __rcu *
+drivers/gpu/drm/i915/i915_drm_client.c:92:9: warning: incorrect type in argument 1 (different address spaces)
+drivers/gpu/drm/i915/i915_gpu_error.c:692:3: warning: symbol 'guc_hw_reg_state' was not declared. Should it be static?
+drivers/gpu/drm/i915/i915_irq.c:465:9: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:465:9: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:473:16: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:473:16: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:478:9: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:478:9: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:478:9: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:516:9: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:516:9: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:524:16: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:524:16: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:529:9: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:529:9: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:529:9: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:573:9: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:573:9: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:576:15: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:576:15: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:580:9: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:580:9: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:587:9: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:587:9: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:587:9: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:587:9: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/intel_uncore.c:1928:1: warning: context imbalance in 'fwtable_read8' - unexpected unlock
+drivers/gpu/drm/i915/intel_uncore.c:1929:1: warning: context imbalance in 'fwtable_read16' - unexpected unlock
+drivers/gpu/drm/i915/intel_uncore.c:1930:1: warning: context imbalance in 'fwtable_read32' - unexpected unlock
+drivers/gpu/drm/i915/intel_uncore.c:1931:1: warning: context imbalance in 'fwtable_read64' - unexpected unlock
+drivers/gpu/drm/i915/intel_uncore.c:1996:1: warning: context imbalance in 'gen6_write8' - unexpected unlock
+drivers/gpu/drm/i915/intel_uncore.c:1997:1: warning: context imbalance in 'gen6_write16' - unexpected unlock
+drivers/gpu/drm/i915/intel_uncore.c:1998:1: warning: context imbalance in 'gen6_write32' - unexpected unlock
+drivers/gpu/drm/i915/intel_uncore.c:2018:1: warning: context imbalance in 'fwtable_write8' - unexpected unlock
+drivers/gpu/drm/i915/intel_uncore.c:2019:1: warning: context imbalance in 'fwtable_write16' - unexpected unlock
+drivers/gpu/drm/i915/intel_uncore.c:2020:1: warning: context imbalance in 'fwtable_write32' - unexpected unlock
+drivers/gpu/drm/i915/intel_wakeref.c:146:19: warning: context imbalance in 'wakeref_auto_timeout' - unexpected unlock

+ cleanup
++ stat -c %u:%g /kernel
+ chown -R 1003:1003 /kernel



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

* ✗ Xe.CI.Full: failure for drm/i915/frontbuffer: Fix the intel_frontbuffer lifetime mess (rev2)
  2025-10-16 18:53 [PATCH v2 00/10] drm/i915/frontbuffer: Fix the intel_frontbuffer lifetime mess Ville Syrjala
                   ` (12 preceding siblings ...)
  2025-10-16 19:17 ` ✗ CI.checksparse: warning " Patchwork
@ 2025-10-17 16:49 ` Patchwork
  13 siblings, 0 replies; 20+ messages in thread
From: Patchwork @ 2025-10-17 16:49 UTC (permalink / raw)
  To: Ville Syrjala; +Cc: intel-xe

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

== Series Details ==

Series: drm/i915/frontbuffer: Fix the intel_frontbuffer lifetime mess (rev2)
URL   : https://patchwork.freedesktop.org/series/155471/
State : failure

== Summary ==

CI Bug Log - changes from xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d_FULL -> xe-pw-155471v2_FULL
====================================================

Summary
-------

  **FAILURE**

  Serious unknown changes coming with xe-pw-155471v2_FULL absolutely need to be
  verified manually.
  
  If you think the reported changes have nothing to do with the changes
  introduced in xe-pw-155471v2_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.

  

Participating hosts (4 -> 4)
------------------------------

  No changes in participating hosts

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

  Here are the unknown changes that may have been introduced in xe-pw-155471v2_FULL:

### IGT changes ###

#### Possible regressions ####

  * igt@kms_cursor_legacy@torture-move:
    - shard-bmg:          [PASS][1] -> [DMESG-WARN][2] +1 other test dmesg-warn
   [1]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d/shard-bmg-4/igt@kms_cursor_legacy@torture-move.html
   [2]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-bmg-2/igt@kms_cursor_legacy@torture-move.html

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

  Here are the changes found in xe-pw-155471v2_FULL that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-0-hflip:
    - shard-adlp:         NOTRUN -> [SKIP][3] ([Intel XE#1124]) +12 other tests skip
   [3]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-2/igt@kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-0-hflip.html

  * igt@kms_big_fb@linear-32bpp-rotate-270:
    - shard-adlp:         NOTRUN -> [SKIP][4] ([Intel XE#316]) +2 other tests skip
   [4]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-8/igt@kms_big_fb@linear-32bpp-rotate-270.html

  * igt@kms_big_fb@x-tiled-16bpp-rotate-270:
    - shard-lnl:          NOTRUN -> [SKIP][5] ([Intel XE#1407]) +1 other test skip
   [5]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-lnl-4/igt@kms_big_fb@x-tiled-16bpp-rotate-270.html

  * igt@kms_big_fb@y-tiled-16bpp-rotate-180:
    - shard-lnl:          NOTRUN -> [SKIP][6] ([Intel XE#1124])
   [6]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-lnl-4/igt@kms_big_fb@y-tiled-16bpp-rotate-180.html

  * igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-180-hflip:
    - shard-adlp:         NOTRUN -> [DMESG-FAIL][7] ([Intel XE#4543]) +6 other tests dmesg-fail
   [7]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-2/igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-180-hflip.html

  * igt@kms_big_fb@yf-tiled-8bpp-rotate-180:
    - shard-bmg:          NOTRUN -> [SKIP][8] ([Intel XE#1124]) +1 other test skip
   [8]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-bmg-3/igt@kms_big_fb@yf-tiled-8bpp-rotate-180.html

  * igt@kms_big_fb@yf-tiled-max-hw-stride-64bpp-rotate-180-async-flip:
    - shard-dg2-set2:     NOTRUN -> [SKIP][9] ([Intel XE#1124])
   [9]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-dg2-436/igt@kms_big_fb@yf-tiled-max-hw-stride-64bpp-rotate-180-async-flip.html

  * igt@kms_bw@connected-linear-tiling-2-displays-3840x2160p:
    - shard-adlp:         NOTRUN -> [SKIP][10] ([Intel XE#2191]) +2 other tests skip
   [10]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-8/igt@kms_bw@connected-linear-tiling-2-displays-3840x2160p.html

  * igt@kms_bw@linear-tiling-3-displays-2160x1440p:
    - shard-dg2-set2:     NOTRUN -> [SKIP][11] ([Intel XE#367])
   [11]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-dg2-436/igt@kms_bw@linear-tiling-3-displays-2160x1440p.html

  * igt@kms_bw@linear-tiling-4-displays-1920x1080p:
    - shard-adlp:         NOTRUN -> [SKIP][12] ([Intel XE#367])
   [12]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-6/igt@kms_bw@linear-tiling-4-displays-1920x1080p.html

  * igt@kms_ccs@bad-pixel-format-y-tiled-gen12-mc-ccs:
    - shard-lnl:          NOTRUN -> [SKIP][13] ([Intel XE#2887]) +1 other test skip
   [13]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-lnl-4/igt@kms_ccs@bad-pixel-format-y-tiled-gen12-mc-ccs.html

  * igt@kms_ccs@bad-rotation-90-y-tiled-gen12-rc-ccs-cc:
    - shard-adlp:         NOTRUN -> [SKIP][14] ([Intel XE#455] / [Intel XE#787]) +25 other tests skip
   [14]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-9/igt@kms_ccs@bad-rotation-90-y-tiled-gen12-rc-ccs-cc.html

  * igt@kms_ccs@bad-rotation-90-y-tiled-gen12-rc-ccs-cc@pipe-a-hdmi-a-1:
    - shard-adlp:         NOTRUN -> [SKIP][15] ([Intel XE#787]) +38 other tests skip
   [15]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-9/igt@kms_ccs@bad-rotation-90-y-tiled-gen12-rc-ccs-cc@pipe-a-hdmi-a-1.html

  * igt@kms_ccs@crc-primary-basic-4-tiled-mtl-rc-ccs-cc@pipe-d-hdmi-a-6:
    - shard-dg2-set2:     NOTRUN -> [SKIP][16] ([Intel XE#787]) +20 other tests skip
   [16]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-dg2-436/igt@kms_ccs@crc-primary-basic-4-tiled-mtl-rc-ccs-cc@pipe-d-hdmi-a-6.html

  * igt@kms_ccs@crc-primary-rotation-180-4-tiled-bmg-ccs:
    - shard-adlp:         NOTRUN -> [SKIP][17] ([Intel XE#2907]) +3 other tests skip
   [17]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-9/igt@kms_ccs@crc-primary-rotation-180-4-tiled-bmg-ccs.html

  * igt@kms_ccs@missing-ccs-buffer-y-tiled-gen12-mc-ccs:
    - shard-dg2-set2:     NOTRUN -> [SKIP][18] ([Intel XE#455] / [Intel XE#787]) +5 other tests skip
   [18]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-dg2-463/igt@kms_ccs@missing-ccs-buffer-y-tiled-gen12-mc-ccs.html

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-d-dp-4:
    - shard-dg2-set2:     NOTRUN -> [INCOMPLETE][19] ([Intel XE#6168] / [i915#14968])
   [19]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-dg2-434/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-d-dp-4.html

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-d-hdmi-a-6:
    - shard-dg2-set2:     NOTRUN -> [DMESG-WARN][20] ([Intel XE#1727] / [Intel XE#3113])
   [20]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-dg2-434/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-d-hdmi-a-6.html

  * igt@kms_chamelium_color@ctm-0-25:
    - shard-adlp:         NOTRUN -> [SKIP][21] ([Intel XE#306]) +2 other tests skip
   [21]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-8/igt@kms_chamelium_color@ctm-0-25.html

  * igt@kms_chamelium_color@ctm-limited-range:
    - shard-bmg:          NOTRUN -> [SKIP][22] ([Intel XE#2325])
   [22]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-bmg-3/igt@kms_chamelium_color@ctm-limited-range.html

  * igt@kms_chamelium_color@ctm-negative:
    - shard-dg2-set2:     NOTRUN -> [SKIP][23] ([Intel XE#306])
   [23]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-dg2-436/igt@kms_chamelium_color@ctm-negative.html

  * igt@kms_chamelium_frames@hdmi-crc-nonplanar-formats:
    - shard-lnl:          NOTRUN -> [SKIP][24] ([Intel XE#373])
   [24]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-lnl-4/igt@kms_chamelium_frames@hdmi-crc-nonplanar-formats.html

  * igt@kms_chamelium_hpd@hdmi-hpd-fast:
    - shard-dg2-set2:     NOTRUN -> [SKIP][25] ([Intel XE#373])
   [25]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-dg2-463/igt@kms_chamelium_hpd@hdmi-hpd-fast.html

  * igt@kms_chamelium_hpd@vga-hpd-fast:
    - shard-adlp:         NOTRUN -> [SKIP][26] ([Intel XE#373]) +8 other tests skip
   [26]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-6/igt@kms_chamelium_hpd@vga-hpd-fast.html

  * igt@kms_content_protection@dp-mst-lic-type-0:
    - shard-adlp:         NOTRUN -> [SKIP][27] ([Intel XE#307])
   [27]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-8/igt@kms_content_protection@dp-mst-lic-type-0.html

  * igt@kms_content_protection@srm@pipe-a-dp-4:
    - shard-dg2-set2:     NOTRUN -> [FAIL][28] ([Intel XE#1178]) +1 other test fail
   [28]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-dg2-436/igt@kms_content_protection@srm@pipe-a-dp-4.html

  * igt@kms_content_protection@uevent:
    - shard-lnl:          NOTRUN -> [SKIP][29] ([Intel XE#3278])
   [29]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-lnl-4/igt@kms_content_protection@uevent.html

  * igt@kms_cursor_crc@cursor-random-32x32:
    - shard-dg2-set2:     NOTRUN -> [SKIP][30] ([Intel XE#455]) +1 other test skip
   [30]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-dg2-435/igt@kms_cursor_crc@cursor-random-32x32.html

  * igt@kms_cursor_crc@cursor-rapid-movement-32x32:
    - shard-lnl:          NOTRUN -> [SKIP][31] ([Intel XE#1424])
   [31]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-lnl-4/igt@kms_cursor_crc@cursor-rapid-movement-32x32.html

  * igt@kms_cursor_crc@cursor-sliding-512x512:
    - shard-adlp:         NOTRUN -> [SKIP][32] ([Intel XE#308])
   [32]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-2/igt@kms_cursor_crc@cursor-sliding-512x512.html

  * igt@kms_cursor_legacy@2x-long-flip-vs-cursor-atomic:
    - shard-bmg:          [PASS][33] -> [SKIP][34] ([Intel XE#2291]) +1 other test skip
   [33]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d/shard-bmg-1/igt@kms_cursor_legacy@2x-long-flip-vs-cursor-atomic.html
   [34]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-bmg-6/igt@kms_cursor_legacy@2x-long-flip-vs-cursor-atomic.html

  * igt@kms_cursor_legacy@cursorb-vs-flipa-atomic:
    - shard-lnl:          NOTRUN -> [SKIP][35] ([Intel XE#309])
   [35]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-lnl-4/igt@kms_cursor_legacy@cursorb-vs-flipa-atomic.html

  * igt@kms_cursor_legacy@short-busy-flip-before-cursor-toggle:
    - shard-adlp:         NOTRUN -> [SKIP][36] ([Intel XE#323])
   [36]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-8/igt@kms_cursor_legacy@short-busy-flip-before-cursor-toggle.html

  * igt@kms_dp_aux_dev:
    - shard-bmg:          [PASS][37] -> [SKIP][38] ([Intel XE#3009])
   [37]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d/shard-bmg-1/igt@kms_dp_aux_dev.html
   [38]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-bmg-6/igt@kms_dp_aux_dev.html

  * igt@kms_dp_link_training@uhbr-sst:
    - shard-adlp:         NOTRUN -> [SKIP][39] ([Intel XE#4356])
   [39]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-6/igt@kms_dp_link_training@uhbr-sst.html

  * igt@kms_dp_linktrain_fallback@dp-fallback:
    - shard-adlp:         NOTRUN -> [SKIP][40] ([Intel XE#4331]) +1 other test skip
   [40]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-9/igt@kms_dp_linktrain_fallback@dp-fallback.html

  * igt@kms_fbc_dirty_rect@fbc-dirty-rectangle-out-visible-area:
    - shard-adlp:         NOTRUN -> [SKIP][41] ([Intel XE#4422])
   [41]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-6/igt@kms_fbc_dirty_rect@fbc-dirty-rectangle-out-visible-area.html

  * igt@kms_flip@2x-flip-vs-dpms-on-nop:
    - shard-bmg:          [PASS][42] -> [SKIP][43] ([Intel XE#2316]) +10 other tests skip
   [42]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d/shard-bmg-1/igt@kms_flip@2x-flip-vs-dpms-on-nop.html
   [43]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-bmg-6/igt@kms_flip@2x-flip-vs-dpms-on-nop.html

  * igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ad-hdmi-a6-dp4:
    - shard-dg2-set2:     [PASS][44] -> [FAIL][45] ([Intel XE#301]) +1 other test fail
   [44]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d/shard-dg2-435/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ad-hdmi-a6-dp4.html
   [45]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-dg2-434/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ad-hdmi-a6-dp4.html

  * igt@kms_flip@2x-flip-vs-suspend@ad-hdmi-a6-dp4:
    - shard-dg2-set2:     [PASS][46] -> [INCOMPLETE][47] ([Intel XE#2049] / [Intel XE#2597]) +1 other test incomplete
   [46]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d/shard-dg2-466/igt@kms_flip@2x-flip-vs-suspend@ad-hdmi-a6-dp4.html
   [47]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-dg2-436/igt@kms_flip@2x-flip-vs-suspend@ad-hdmi-a6-dp4.html

  * igt@kms_flip@2x-plain-flip-fb-recreate-interruptible:
    - shard-adlp:         NOTRUN -> [SKIP][48] ([Intel XE#310]) +2 other tests skip
   [48]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-6/igt@kms_flip@2x-plain-flip-fb-recreate-interruptible.html

  * igt@kms_flip@flip-vs-dpms-on-nop-interruptible:
    - shard-adlp:         [PASS][49] -> [DMESG-WARN][50] ([Intel XE#4543]) +4 other tests dmesg-warn
   [49]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d/shard-adlp-2/igt@kms_flip@flip-vs-dpms-on-nop-interruptible.html
   [50]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-1/igt@kms_flip@flip-vs-dpms-on-nop-interruptible.html

  * igt@kms_flip@flip-vs-expired-vblank-interruptible@b-edp1:
    - shard-lnl:          [PASS][51] -> [FAIL][52] ([Intel XE#301]) +1 other test fail
   [51]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d/shard-lnl-7/igt@kms_flip@flip-vs-expired-vblank-interruptible@b-edp1.html
   [52]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-lnl-4/igt@kms_flip@flip-vs-expired-vblank-interruptible@b-edp1.html

  * igt@kms_flip@flip-vs-expired-vblank-interruptible@d-hdmi-a1:
    - shard-adlp:         NOTRUN -> [DMESG-WARN][53] ([Intel XE#4543]) +15 other tests dmesg-warn
   [53]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-6/igt@kms_flip@flip-vs-expired-vblank-interruptible@d-hdmi-a1.html

  * igt@kms_flip@flip-vs-rmfb-interruptible:
    - shard-adlp:         [PASS][54] -> [DMESG-WARN][55] ([Intel XE#4543] / [Intel XE#5208])
   [54]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d/shard-adlp-1/igt@kms_flip@flip-vs-rmfb-interruptible.html
   [55]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-2/igt@kms_flip@flip-vs-rmfb-interruptible.html

  * igt@kms_flip@flip-vs-suspend-interruptible:
    - shard-adlp:         [PASS][56] -> [DMESG-WARN][57] ([Intel XE#2953] / [Intel XE#4173] / [Intel XE#4543])
   [56]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d/shard-adlp-8/igt@kms_flip@flip-vs-suspend-interruptible.html
   [57]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-1/igt@kms_flip@flip-vs-suspend-interruptible.html
    - shard-bmg:          [PASS][58] -> [INCOMPLETE][59] ([Intel XE#2049] / [Intel XE#2597]) +1 other test incomplete
   [58]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d/shard-bmg-6/igt@kms_flip@flip-vs-suspend-interruptible.html
   [59]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-bmg-1/igt@kms_flip@flip-vs-suspend-interruptible.html

  * igt@kms_flip@flip-vs-suspend-interruptible@a-hdmi-a1:
    - shard-adlp:         [PASS][60] -> [DMESG-WARN][61] ([Intel XE#2953] / [Intel XE#4173]) +2 other tests dmesg-warn
   [60]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d/shard-adlp-8/igt@kms_flip@flip-vs-suspend-interruptible@a-hdmi-a1.html
   [61]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-1/igt@kms_flip@flip-vs-suspend-interruptible@a-hdmi-a1.html

  * igt@kms_flip_scaled_crc@flip-64bpp-xtile-to-32bpp-xtile-upscaling:
    - shard-lnl:          NOTRUN -> [FAIL][62] ([Intel XE#4683]) +1 other test fail
   [62]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-lnl-4/igt@kms_flip_scaled_crc@flip-64bpp-xtile-to-32bpp-xtile-upscaling.html

  * igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytile-downscaling:
    - shard-adlp:         NOTRUN -> [DMESG-FAIL][63] ([Intel XE#4543] / [Intel XE#4921]) +1 other test dmesg-fail
   [63]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-6/igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytile-downscaling.html

  * igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytilercccs-downscaling@pipe-a-valid-mode:
    - shard-adlp:         NOTRUN -> [SKIP][64] ([Intel XE#455]) +15 other tests skip
   [64]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-8/igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytilercccs-downscaling@pipe-a-valid-mode.html

  * igt@kms_flip_tiling@flip-change-tiling@pipe-c-hdmi-a-1-y-to-y:
    - shard-adlp:         [PASS][65] -> [FAIL][66] ([Intel XE#1874])
   [65]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d/shard-adlp-2/igt@kms_flip_tiling@flip-change-tiling@pipe-c-hdmi-a-1-y-to-y.html
   [66]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-6/igt@kms_flip_tiling@flip-change-tiling@pipe-c-hdmi-a-1-y-to-y.html

  * igt@kms_frontbuffer_tracking@drrs-1p-pri-indfb-multidraw:
    - shard-dg2-set2:     NOTRUN -> [SKIP][67] ([Intel XE#651]) +9 other tests skip
   [67]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-dg2-435/igt@kms_frontbuffer_tracking@drrs-1p-pri-indfb-multidraw.html

  * igt@kms_frontbuffer_tracking@drrs-1p-primscrn-shrfb-pgflip-blt:
    - shard-adlp:         NOTRUN -> [SKIP][68] ([Intel XE#651]) +12 other tests skip
   [68]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-8/igt@kms_frontbuffer_tracking@drrs-1p-primscrn-shrfb-pgflip-blt.html

  * igt@kms_frontbuffer_tracking@drrs-2p-primscrn-cur-indfb-draw-mmap-wc:
    - shard-bmg:          NOTRUN -> [SKIP][69] ([Intel XE#2311]) +1 other test skip
   [69]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-bmg-3/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-cur-indfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@drrs-2p-primscrn-cur-indfb-draw-render:
    - shard-adlp:         NOTRUN -> [SKIP][70] ([Intel XE#656]) +39 other tests skip
   [70]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-8/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-cur-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-fullscreen:
    - shard-bmg:          NOTRUN -> [SKIP][71] ([Intel XE#5390]) +1 other test skip
   [71]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-bmg-3/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-fullscreen.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-tiling-4:
    - shard-adlp:         NOTRUN -> [SKIP][72] ([Intel XE#1151])
   [72]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-6/igt@kms_frontbuffer_tracking@fbcdrrs-tiling-4.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-cur-indfb-onoff:
    - shard-bmg:          NOTRUN -> [SKIP][73] ([Intel XE#2313]) +1 other test skip
   [73]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-bmg-3/igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-cur-indfb-onoff.html

  * igt@kms_frontbuffer_tracking@psr-1p-primscrn-shrfb-plflip-blt:
    - shard-adlp:         NOTRUN -> [SKIP][74] ([Intel XE#653]) +10 other tests skip
   [74]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-2/igt@kms_frontbuffer_tracking@psr-1p-primscrn-shrfb-plflip-blt.html

  * igt@kms_frontbuffer_tracking@psr-2p-scndscrn-pri-shrfb-draw-blt:
    - shard-dg2-set2:     NOTRUN -> [SKIP][75] ([Intel XE#653]) +6 other tests skip
   [75]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-dg2-436/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-pri-shrfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@psr-2p-scndscrn-pri-shrfb-draw-render:
    - shard-lnl:          NOTRUN -> [SKIP][76] ([Intel XE#656]) +3 other tests skip
   [76]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-lnl-4/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-pri-shrfb-draw-render.html

  * igt@kms_hdr@invalid-metadata-sizes:
    - shard-bmg:          [PASS][77] -> [SKIP][78] ([Intel XE#1503])
   [77]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d/shard-bmg-1/igt@kms_hdr@invalid-metadata-sizes.html
   [78]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-bmg-6/igt@kms_hdr@invalid-metadata-sizes.html

  * igt@kms_hdr@static-toggle:
    - shard-lnl:          NOTRUN -> [SKIP][79] ([Intel XE#1503])
   [79]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-lnl-4/igt@kms_hdr@static-toggle.html

  * igt@kms_joiner@basic-max-non-joiner:
    - shard-adlp:         NOTRUN -> [SKIP][80] ([Intel XE#4298])
   [80]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-8/igt@kms_joiner@basic-max-non-joiner.html

  * igt@kms_joiner@switch-modeset-ultra-joiner-big-joiner:
    - shard-adlp:         NOTRUN -> [SKIP][81] ([Intel XE#2925])
   [81]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-6/igt@kms_joiner@switch-modeset-ultra-joiner-big-joiner.html

  * igt@kms_plane_multiple@2x-tiling-y:
    - shard-adlp:         NOTRUN -> [SKIP][82] ([Intel XE#4596])
   [82]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-6/igt@kms_plane_multiple@2x-tiling-y.html

  * igt@kms_plane_multiple@2x-tiling-yf:
    - shard-dg2-set2:     NOTRUN -> [SKIP][83] ([Intel XE#5021])
   [83]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-dg2-463/igt@kms_plane_multiple@2x-tiling-yf.html

  * igt@kms_plane_multiple@tiling-y:
    - shard-bmg:          NOTRUN -> [SKIP][84] ([Intel XE#5020])
   [84]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-bmg-3/igt@kms_plane_multiple@tiling-y.html

  * igt@kms_plane_scaling@2x-scaler-multi-pipe:
    - shard-adlp:         NOTRUN -> [SKIP][85] ([Intel XE#309]) +5 other tests skip
   [85]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-8/igt@kms_plane_scaling@2x-scaler-multi-pipe.html

  * igt@kms_pm_dc@dc5-retention-flops:
    - shard-adlp:         NOTRUN -> [SKIP][86] ([Intel XE#3309])
   [86]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-6/igt@kms_pm_dc@dc5-retention-flops.html

  * igt@kms_pm_dc@dc6-psr:
    - shard-bmg:          NOTRUN -> [SKIP][87] ([Intel XE#2392])
   [87]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-bmg-3/igt@kms_pm_dc@dc6-psr.html

  * igt@kms_pm_rpm@dpms-non-lpsp:
    - shard-adlp:         NOTRUN -> [SKIP][88] ([Intel XE#836]) +1 other test skip
   [88]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-2/igt@kms_pm_rpm@dpms-non-lpsp.html

  * igt@kms_psr2_sf@fbc-pr-cursor-plane-move-continuous-sf:
    - shard-lnl:          NOTRUN -> [SKIP][89] ([Intel XE#1406] / [Intel XE#2893])
   [89]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-lnl-4/igt@kms_psr2_sf@fbc-pr-cursor-plane-move-continuous-sf.html

  * igt@kms_psr2_sf@fbc-psr2-cursor-plane-move-continuous-sf:
    - shard-adlp:         NOTRUN -> [SKIP][90] ([Intel XE#1406] / [Intel XE#1489]) +7 other tests skip
   [90]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-8/igt@kms_psr2_sf@fbc-psr2-cursor-plane-move-continuous-sf.html

  * igt@kms_psr2_su@page_flip-p010:
    - shard-adlp:         NOTRUN -> [SKIP][91] ([Intel XE#1122] / [Intel XE#1406] / [Intel XE#5580]) +1 other test skip
   [91]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-2/igt@kms_psr2_su@page_flip-p010.html

  * igt@kms_psr@fbc-pr-sprite-render:
    - shard-lnl:          NOTRUN -> [SKIP][92] ([Intel XE#1406])
   [92]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-lnl-4/igt@kms_psr@fbc-pr-sprite-render.html

  * igt@kms_psr@fbc-psr2-primary-render:
    - shard-dg2-set2:     NOTRUN -> [SKIP][93] ([Intel XE#1406] / [Intel XE#2850] / [Intel XE#929])
   [93]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-dg2-436/igt@kms_psr@fbc-psr2-primary-render.html

  * igt@kms_psr@psr-cursor-plane-onoff:
    - shard-adlp:         NOTRUN -> [SKIP][94] ([Intel XE#1406] / [Intel XE#2850] / [Intel XE#929]) +10 other tests skip
   [94]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-8/igt@kms_psr@psr-cursor-plane-onoff.html

  * igt@kms_rotation_crc@primary-rotation-90:
    - shard-adlp:         NOTRUN -> [SKIP][95] ([Intel XE#3414]) +3 other tests skip
   [95]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-2/igt@kms_rotation_crc@primary-rotation-90.html

  * igt@kms_vrr@cmrr@pipe-a-edp-1:
    - shard-lnl:          [PASS][96] -> [FAIL][97] ([Intel XE#4459]) +1 other test fail
   [96]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d/shard-lnl-1/igt@kms_vrr@cmrr@pipe-a-edp-1.html
   [97]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-lnl-2/igt@kms_vrr@cmrr@pipe-a-edp-1.html

  * igt@xe_ccs@ctrl-surf-copy:
    - shard-adlp:         NOTRUN -> [SKIP][98] ([Intel XE#455] / [Intel XE#488] / [Intel XE#5607]) +1 other test skip
   [98]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-2/igt@xe_ccs@ctrl-surf-copy.html

  * igt@xe_compute@ccs-mode-compute-kernel:
    - shard-lnl:          NOTRUN -> [SKIP][99] ([Intel XE#1447])
   [99]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-lnl-4/igt@xe_compute@ccs-mode-compute-kernel.html

  * igt@xe_compute_preempt@compute-preempt-many-all-ram:
    - shard-adlp:         NOTRUN -> [SKIP][100] ([Intel XE#6360])
   [100]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-8/igt@xe_compute_preempt@compute-preempt-many-all-ram.html

  * igt@xe_copy_basic@mem-copy-linear-0x3fff:
    - shard-dg2-set2:     NOTRUN -> [SKIP][101] ([Intel XE#1123])
   [101]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-dg2-436/igt@xe_copy_basic@mem-copy-linear-0x3fff.html

  * igt@xe_copy_basic@mem-set-linear-0x369:
    - shard-adlp:         NOTRUN -> [SKIP][102] ([Intel XE#1126]) +2 other tests skip
   [102]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-2/igt@xe_copy_basic@mem-set-linear-0x369.html

  * igt@xe_eu_stall@non-blocking-re-enable:
    - shard-adlp:         NOTRUN -> [SKIP][103] ([Intel XE#5626]) +1 other test skip
   [103]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-8/igt@xe_eu_stall@non-blocking-re-enable.html

  * igt@xe_eudebug@basic-vm-bind:
    - shard-lnl:          NOTRUN -> [SKIP][104] ([Intel XE#4837])
   [104]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-lnl-4/igt@xe_eudebug@basic-vm-bind.html

  * igt@xe_eudebug@discovery-race-vmbind:
    - shard-adlp:         NOTRUN -> [SKIP][105] ([Intel XE#4837] / [Intel XE#5565]) +12 other tests skip
   [105]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-8/igt@xe_eudebug@discovery-race-vmbind.html

  * igt@xe_eudebug@vm-bind-clear-faultable:
    - shard-dg2-set2:     NOTRUN -> [SKIP][106] ([Intel XE#4837]) +4 other tests skip
   [106]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-dg2-436/igt@xe_eudebug@vm-bind-clear-faultable.html

  * igt@xe_evict@evict-beng-small-multi-vm-cm:
    - shard-lnl:          NOTRUN -> [SKIP][107] ([Intel XE#688])
   [107]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-lnl-4/igt@xe_evict@evict-beng-small-multi-vm-cm.html

  * igt@xe_evict@evict-large-multi-vm:
    - shard-adlp:         NOTRUN -> [SKIP][108] ([Intel XE#261] / [Intel XE#5564]) +3 other tests skip
   [108]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-2/igt@xe_evict@evict-large-multi-vm.html

  * igt@xe_evict@evict-mixed-many-threads-large:
    - shard-adlp:         NOTRUN -> [SKIP][109] ([Intel XE#261]) +1 other test skip
   [109]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-8/igt@xe_evict@evict-mixed-many-threads-large.html

  * igt@xe_evict@evict-small-multi-vm:
    - shard-adlp:         NOTRUN -> [SKIP][110] ([Intel XE#261] / [Intel XE#5564] / [Intel XE#688]) +1 other test skip
   [110]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-8/igt@xe_evict@evict-small-multi-vm.html

  * igt@xe_evict@evict-small-multi-vm-cm:
    - shard-adlp:         NOTRUN -> [SKIP][111] ([Intel XE#261] / [Intel XE#688])
   [111]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-9/igt@xe_evict@evict-small-multi-vm-cm.html

  * igt@xe_evict_ccs@evict-overcommit-standalone-nofree-reopen:
    - shard-adlp:         NOTRUN -> [SKIP][112] ([Intel XE#688]) +1 other test skip
   [112]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-6/igt@xe_evict_ccs@evict-overcommit-standalone-nofree-reopen.html

  * igt@xe_exec_basic@multigpu-many-execqueues-many-vm-bindexecqueue-userptr-invalidate-race:
    - shard-adlp:         NOTRUN -> [SKIP][113] ([Intel XE#1392] / [Intel XE#5575]) +8 other tests skip
   [113]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-6/igt@xe_exec_basic@multigpu-many-execqueues-many-vm-bindexecqueue-userptr-invalidate-race.html

  * igt@xe_exec_basic@multigpu-many-execqueues-many-vm-null:
    - shard-bmg:          NOTRUN -> [SKIP][114] ([Intel XE#2322])
   [114]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-bmg-3/igt@xe_exec_basic@multigpu-many-execqueues-many-vm-null.html

  * igt@xe_exec_basic@multigpu-no-exec-null:
    - shard-lnl:          NOTRUN -> [SKIP][115] ([Intel XE#1392]) +1 other test skip
   [115]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-lnl-4/igt@xe_exec_basic@multigpu-no-exec-null.html

  * igt@xe_exec_fault_mode@many-bindexecqueue-userptr-imm:
    - shard-adlp:         NOTRUN -> [SKIP][116] ([Intel XE#288] / [Intel XE#5561]) +23 other tests skip
   [116]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-9/igt@xe_exec_fault_mode@many-bindexecqueue-userptr-imm.html

  * igt@xe_exec_fault_mode@twice-userptr-prefetch:
    - shard-dg2-set2:     NOTRUN -> [SKIP][117] ([Intel XE#288]) +6 other tests skip
   [117]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-dg2-436/igt@xe_exec_fault_mode@twice-userptr-prefetch.html

  * igt@xe_exec_system_allocator@process-many-execqueues-mmap-nomemset:
    - shard-adlp:         NOTRUN -> [SKIP][118] ([Intel XE#4915]) +254 other tests skip
   [118]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-8/igt@xe_exec_system_allocator@process-many-execqueues-mmap-nomemset.html

  * igt@xe_exec_system_allocator@threads-many-large-execqueues-mmap-huge-nomemset:
    - shard-bmg:          NOTRUN -> [SKIP][119] ([Intel XE#4943])
   [119]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-bmg-3/igt@xe_exec_system_allocator@threads-many-large-execqueues-mmap-huge-nomemset.html

  * igt@xe_exec_system_allocator@threads-many-large-mmap-shared-remap-dontunmap-eocheck:
    - shard-dg2-set2:     NOTRUN -> [SKIP][120] ([Intel XE#4915]) +59 other tests skip
   [120]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-dg2-436/igt@xe_exec_system_allocator@threads-many-large-mmap-shared-remap-dontunmap-eocheck.html

  * igt@xe_exec_system_allocator@threads-shared-vm-many-stride-mmap-free-huge-nomemset:
    - shard-lnl:          NOTRUN -> [SKIP][121] ([Intel XE#4943]) +1 other test skip
   [121]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-lnl-4/igt@xe_exec_system_allocator@threads-shared-vm-many-stride-mmap-free-huge-nomemset.html

  * igt@xe_live_ktest@xe_migrate@xe_validate_ccs_kunit:
    - shard-adlp:         NOTRUN -> [SKIP][122] ([Intel XE#2229] / [Intel XE#5488])
   [122]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-8/igt@xe_live_ktest@xe_migrate@xe_validate_ccs_kunit.html

  * igt@xe_mmap@pci-membarrier-bad-object:
    - shard-adlp:         NOTRUN -> [SKIP][123] ([Intel XE#5100])
   [123]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-6/igt@xe_mmap@pci-membarrier-bad-object.html

  * igt@xe_mmap@vram:
    - shard-adlp:         NOTRUN -> [SKIP][124] ([Intel XE#1008] / [Intel XE#5591])
   [124]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-2/igt@xe_mmap@vram.html

  * igt@xe_oa@invalid-oa-exponent:
    - shard-dg2-set2:     NOTRUN -> [SKIP][125] ([Intel XE#3573])
   [125]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-dg2-436/igt@xe_oa@invalid-oa-exponent.html

  * igt@xe_oa@privileged-forked-access-vaddr:
    - shard-adlp:         NOTRUN -> [SKIP][126] ([Intel XE#3573]) +5 other tests skip
   [126]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-2/igt@xe_oa@privileged-forked-access-vaddr.html

  * igt@xe_pat@display-vs-wb-transient:
    - shard-adlp:         NOTRUN -> [SKIP][127] ([Intel XE#1337] / [Intel XE#5572])
   [127]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-8/igt@xe_pat@display-vs-wb-transient.html

  * igt@xe_pat@pat-index-xelp:
    - shard-lnl:          NOTRUN -> [SKIP][128] ([Intel XE#977])
   [128]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-lnl-4/igt@xe_pat@pat-index-xelp.html

  * igt@xe_peer2peer@read:
    - shard-adlp:         NOTRUN -> [SKIP][129] ([Intel XE#1061] / [Intel XE#5568])
   [129]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-2/igt@xe_peer2peer@read.html

  * igt@xe_peer2peer@write:
    - shard-lnl:          NOTRUN -> [SKIP][130] ([Intel XE#1061])
   [130]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-lnl-4/igt@xe_peer2peer@write.html

  * igt@xe_pm@s3-vm-bind-userptr:
    - shard-lnl:          NOTRUN -> [SKIP][131] ([Intel XE#584])
   [131]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-lnl-4/igt@xe_pm@s3-vm-bind-userptr.html

  * igt@xe_pm@s4-vm-bind-prefetch:
    - shard-adlp:         NOTRUN -> [FAIL][132] ([Intel XE#6339])
   [132]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-2/igt@xe_pm@s4-vm-bind-prefetch.html

  * igt@xe_pmu@fn-engine-activity-load:
    - shard-lnl:          NOTRUN -> [SKIP][133] ([Intel XE#4650])
   [133]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-lnl-4/igt@xe_pmu@fn-engine-activity-load.html

  * igt@xe_pxp@display-black-pxp-fb:
    - shard-adlp:         NOTRUN -> [SKIP][134] ([Intel XE#4733])
   [134]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-8/igt@xe_pxp@display-black-pxp-fb.html

  * igt@xe_pxp@pxp-stale-bo-bind-post-termination-irq:
    - shard-adlp:         NOTRUN -> [SKIP][135] ([Intel XE#4733] / [Intel XE#5594]) +1 other test skip
   [135]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-6/igt@xe_pxp@pxp-stale-bo-bind-post-termination-irq.html

  * igt@xe_query@multigpu-query-cs-cycles:
    - shard-adlp:         NOTRUN -> [SKIP][136] ([Intel XE#944]) +3 other tests skip
   [136]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-9/igt@xe_query@multigpu-query-cs-cycles.html

  * igt@xe_query@multigpu-query-uc-fw-version-guc:
    - shard-lnl:          NOTRUN -> [SKIP][137] ([Intel XE#944])
   [137]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-lnl-4/igt@xe_query@multigpu-query-uc-fw-version-guc.html

  * igt@xe_render_copy@render-stress-0-copies:
    - shard-dg2-set2:     NOTRUN -> [SKIP][138] ([Intel XE#4814])
   [138]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-dg2-436/igt@xe_render_copy@render-stress-0-copies.html

  * igt@xe_render_copy@render-stress-2-copies:
    - shard-adlp:         NOTRUN -> [SKIP][139] ([Intel XE#4814] / [Intel XE#5614])
   [139]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-8/igt@xe_render_copy@render-stress-2-copies.html

  * igt@xe_spin_batch@spin-mem-copy:
    - shard-adlp:         NOTRUN -> [SKIP][140] ([Intel XE#4821])
   [140]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-2/igt@xe_spin_batch@spin-mem-copy.html

  * igt@xe_sriov_auto_provisioning@resources-released-on-vfs-disabling:
    - shard-dg2-set2:     NOTRUN -> [SKIP][141] ([Intel XE#4130])
   [141]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-dg2-436/igt@xe_sriov_auto_provisioning@resources-released-on-vfs-disabling.html

  
#### Possible fixes ####

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs@pipe-b-dp-4:
    - shard-dg2-set2:     [INCOMPLETE][142] ([Intel XE#1727] / [Intel XE#3113] / [Intel XE#4345] / [Intel XE#6168]) -> [PASS][143] +1 other test pass
   [142]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d/shard-dg2-434/igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs@pipe-b-dp-4.html
   [143]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-dg2-436/igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs@pipe-b-dp-4.html

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-a-dp-4:
    - shard-dg2-set2:     [INCOMPLETE][144] ([Intel XE#1727] / [Intel XE#2705] / [Intel XE#3113] / [Intel XE#4212] / [Intel XE#4522]) -> [PASS][145]
   [144]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d/shard-dg2-464/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-a-dp-4.html
   [145]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-dg2-434/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-a-dp-4.html

  * igt@kms_cursor_legacy@cursorb-vs-flipa-atomic-transitions-varying-size:
    - shard-bmg:          [SKIP][146] ([Intel XE#2291]) -> [PASS][147] +1 other test pass
   [146]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d/shard-bmg-6/igt@kms_cursor_legacy@cursorb-vs-flipa-atomic-transitions-varying-size.html
   [147]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-bmg-8/igt@kms_cursor_legacy@cursorb-vs-flipa-atomic-transitions-varying-size.html

  * igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions:
    - shard-bmg:          [FAIL][148] ([Intel XE#1475]) -> [PASS][149]
   [148]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d/shard-bmg-5/igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions.html
   [149]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-bmg-8/igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions.html

  * igt@kms_flip@2x-busy-flip:
    - shard-bmg:          [SKIP][150] ([Intel XE#2316]) -> [PASS][151]
   [150]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d/shard-bmg-6/igt@kms_flip@2x-busy-flip.html
   [151]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-bmg-8/igt@kms_flip@2x-busy-flip.html

  * igt@kms_flip@flip-vs-expired-vblank@c-edp1:
    - shard-lnl:          [FAIL][152] ([Intel XE#301] / [Intel XE#3149]) -> [PASS][153] +1 other test pass
   [152]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d/shard-lnl-3/igt@kms_flip@flip-vs-expired-vblank@c-edp1.html
   [153]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-lnl-4/igt@kms_flip@flip-vs-expired-vblank@c-edp1.html

  * igt@kms_flip@flip-vs-suspend@d-dp4:
    - shard-dg2-set2:     [INCOMPLETE][154] ([Intel XE#2049] / [Intel XE#2597]) -> [PASS][155] +1 other test pass
   [154]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d/shard-dg2-435/igt@kms_flip@flip-vs-suspend@d-dp4.html
   [155]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-dg2-435/igt@kms_flip@flip-vs-suspend@d-dp4.html

  * igt@kms_flip@plain-flip-interruptible@b-hdmi-a1:
    - shard-adlp:         [DMESG-WARN][156] ([Intel XE#4543]) -> [PASS][157] +4 other tests pass
   [156]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d/shard-adlp-8/igt@kms_flip@plain-flip-interruptible@b-hdmi-a1.html
   [157]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-1/igt@kms_flip@plain-flip-interruptible@b-hdmi-a1.html

  * igt@kms_flip_tiling@flip-change-tiling@pipe-c-hdmi-a-1-y-to-x:
    - shard-adlp:         [FAIL][158] ([Intel XE#1874]) -> [PASS][159]
   [158]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d/shard-adlp-2/igt@kms_flip_tiling@flip-change-tiling@pipe-c-hdmi-a-1-y-to-x.html
   [159]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-6/igt@kms_flip_tiling@flip-change-tiling@pipe-c-hdmi-a-1-y-to-x.html

  * igt@kms_hdr@static-toggle-dpms:
    - shard-bmg:          [SKIP][160] ([Intel XE#1503]) -> [PASS][161]
   [160]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d/shard-bmg-6/igt@kms_hdr@static-toggle-dpms.html
   [161]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-bmg-1/igt@kms_hdr@static-toggle-dpms.html

  * igt@kms_joiner@invalid-modeset-force-big-joiner:
    - shard-bmg:          [SKIP][162] ([Intel XE#3012]) -> [PASS][163]
   [162]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d/shard-bmg-6/igt@kms_joiner@invalid-modeset-force-big-joiner.html
   [163]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-bmg-1/igt@kms_joiner@invalid-modeset-force-big-joiner.html

  * igt@kms_plane_multiple@2x-tiling-x:
    - shard-bmg:          [SKIP][164] ([Intel XE#4596]) -> [PASS][165]
   [164]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d/shard-bmg-6/igt@kms_plane_multiple@2x-tiling-x.html
   [165]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-bmg-1/igt@kms_plane_multiple@2x-tiling-x.html

  * igt@kms_psr_stress_test@flip-primary-invalidate-overlay:
    - shard-lnl:          [SKIP][166] ([Intel XE#1406] / [Intel XE#4692]) -> [PASS][167]
   [166]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d/shard-lnl-3/igt@kms_psr_stress_test@flip-primary-invalidate-overlay.html
   [167]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-lnl-4/igt@kms_psr_stress_test@flip-primary-invalidate-overlay.html

  * igt@xe_evict@evict-beng-mixed-many-threads-small:
    - shard-bmg:          [INCOMPLETE][168] ([Intel XE#6321]) -> [PASS][169]
   [168]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d/shard-bmg-3/igt@xe_evict@evict-beng-mixed-many-threads-small.html
   [169]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-bmg-4/igt@xe_evict@evict-beng-mixed-many-threads-small.html

  * igt@xe_pm@s2idle-vm-bind-prefetch:
    - shard-adlp:         [DMESG-WARN][170] ([Intel XE#2953] / [Intel XE#4173] / [Intel XE#4504]) -> [PASS][171]
   [170]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d/shard-adlp-9/igt@xe_pm@s2idle-vm-bind-prefetch.html
   [171]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-adlp-9/igt@xe_pm@s2idle-vm-bind-prefetch.html

  
#### Warnings ####

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs:
    - shard-dg2-set2:     [INCOMPLETE][172] ([Intel XE#1727] / [Intel XE#2705] / [Intel XE#3113] / [Intel XE#4212] / [Intel XE#4345] / [Intel XE#4522]) -> [INCOMPLETE][173] ([Intel XE#1727] / [Intel XE#3113] / [Intel XE#4345] / [Intel XE#6168])
   [172]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d/shard-dg2-464/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs.html
   [173]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-dg2-434/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs.html

  * igt@kms_content_protection@lic-type-0:
    - shard-bmg:          [FAIL][174] ([Intel XE#1178]) -> [SKIP][175] ([Intel XE#2341])
   [174]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d/shard-bmg-1/igt@kms_content_protection@lic-type-0.html
   [175]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-bmg-6/igt@kms_content_protection@lic-type-0.html

  * igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-pri-indfb-draw-mmap-wc:
    - shard-bmg:          [SKIP][176] ([Intel XE#2312]) -> [SKIP][177] ([Intel XE#2311]) +6 other tests skip
   [176]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d/shard-bmg-6/igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-pri-indfb-draw-mmap-wc.html
   [177]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-bmg-1/igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-pri-indfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-draw-blt:
    - shard-bmg:          [SKIP][178] ([Intel XE#2312]) -> [SKIP][179] ([Intel XE#5390]) +3 other tests skip
   [178]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d/shard-bmg-6/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-draw-blt.html
   [179]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-bmg-8/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-shrfb-pgflip-blt:
    - shard-bmg:          [SKIP][180] ([Intel XE#5390]) -> [SKIP][181] ([Intel XE#2312]) +4 other tests skip
   [180]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d/shard-bmg-1/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-shrfb-pgflip-blt.html
   [181]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-bmg-6/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-shrfb-pgflip-blt.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-spr-indfb-draw-render:
    - shard-bmg:          [SKIP][182] ([Intel XE#2311]) -> [SKIP][183] ([Intel XE#2312]) +11 other tests skip
   [182]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d/shard-bmg-1/igt@kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-spr-indfb-draw-render.html
   [183]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-bmg-6/igt@kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-spr-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-indfb-pgflip-blt:
    - shard-bmg:          [SKIP][184] ([Intel XE#2312]) -> [SKIP][185] ([Intel XE#2313]) +3 other tests skip
   [184]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d/shard-bmg-6/igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-indfb-pgflip-blt.html
   [185]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-bmg-1/igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-indfb-pgflip-blt.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-spr-indfb-draw-blt:
    - shard-bmg:          [SKIP][186] ([Intel XE#2313]) -> [SKIP][187] ([Intel XE#2312]) +8 other tests skip
   [186]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d/shard-bmg-1/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-spr-indfb-draw-blt.html
   [187]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-bmg-6/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-spr-indfb-draw-blt.html

  * igt@kms_hdr@brightness-with-hdr:
    - shard-bmg:          [SKIP][188] ([Intel XE#3544]) -> [SKIP][189] ([Intel XE#3374] / [Intel XE#3544])
   [188]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d/shard-bmg-5/igt@kms_hdr@brightness-with-hdr.html
   [189]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-bmg-8/igt@kms_hdr@brightness-with-hdr.html

  * igt@kms_plane_multiple@2x-tiling-y:
    - shard-bmg:          [SKIP][190] ([Intel XE#5021]) -> [SKIP][191] ([Intel XE#4596])
   [190]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d/shard-bmg-1/igt@kms_plane_multiple@2x-tiling-y.html
   [191]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-bmg-6/igt@kms_plane_multiple@2x-tiling-y.html

  * igt@kms_tiled_display@basic-test-pattern-with-chamelium:
    - shard-bmg:          [SKIP][192] ([Intel XE#2426]) -> [SKIP][193] ([Intel XE#2509])
   [192]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d/shard-bmg-6/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html
   [193]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-bmg-1/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html

  * igt@xe_fault_injection@probe-fail-guc-xe_guc_ct_send_recv:
    - shard-bmg:          [ABORT][194] ([Intel XE#4917] / [Intel XE#5466] / [Intel XE#5530]) -> [ABORT][195] ([Intel XE#5466] / [Intel XE#5530])
   [194]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d/shard-bmg-6/igt@xe_fault_injection@probe-fail-guc-xe_guc_ct_send_recv.html
   [195]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/shard-bmg-8/igt@xe_fault_injection@probe-fail-guc-xe_guc_ct_send_recv.html

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

  [Intel XE#1008]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1008
  [Intel XE#1061]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1061
  [Intel XE#1122]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1122
  [Intel XE#1123]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1123
  [Intel XE#1124]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1124
  [Intel XE#1126]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1126
  [Intel XE#1151]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1151
  [Intel XE#1178]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1178
  [Intel XE#1337]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1337
  [Intel XE#1392]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1392
  [Intel XE#1406]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1406
  [Intel XE#1407]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1407
  [Intel XE#1424]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1424
  [Intel XE#1447]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1447
  [Intel XE#1475]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1475
  [Intel XE#1489]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1489
  [Intel XE#1503]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1503
  [Intel XE#1727]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1727
  [Intel XE#1874]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1874
  [Intel XE#2049]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2049
  [Intel XE#2191]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2191
  [Intel XE#2229]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2229
  [Intel XE#2291]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2291
  [Intel XE#2311]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2311
  [Intel XE#2312]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2312
  [Intel XE#2313]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2313
  [Intel XE#2316]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2316
  [Intel XE#2322]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2322
  [Intel XE#2325]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2325
  [Intel XE#2341]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2341
  [Intel XE#2392]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2392
  [Intel XE#2426]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2426
  [Intel XE#2509]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2509
  [Intel XE#2597]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2597
  [Intel XE#261]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/261
  [Intel XE#2705]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2705
  [Intel XE#2850]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2850
  [Intel XE#288]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/288
  [Intel XE#2887]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2887
  [Intel XE#2893]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2893
  [Intel XE#2907]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2907
  [Intel XE#2925]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2925
  [Intel XE#2953]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2953
  [Intel XE#3009]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3009
  [Intel XE#301]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/301
  [Intel XE#3012]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3012
  [Intel XE#306]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/306
  [Intel XE#307]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/307
  [Intel XE#308]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/308
  [Intel XE#309]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/309
  [Intel XE#310]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/310
  [Intel XE#3113]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3113
  [Intel XE#3149]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3149
  [Intel XE#316]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/316
  [Intel XE#323]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/323
  [Intel XE#3278]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3278
  [Intel XE#3309]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3309
  [Intel XE#3374]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3374
  [Intel XE#3414]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3414
  [Intel XE#3544]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3544
  [Intel XE#3573]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3573
  [Intel XE#367]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/367
  [Intel XE#373]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/373
  [Intel XE#4130]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4130
  [Intel XE#4173]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4173
  [Intel XE#4212]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4212
  [Intel XE#4298]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4298
  [Intel XE#4331]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4331
  [Intel XE#4345]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4345
  [Intel XE#4356]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4356
  [Intel XE#4422]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4422
  [Intel XE#4459]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4459
  [Intel XE#4504]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4504
  [Intel XE#4522]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4522
  [Intel XE#4543]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4543
  [Intel XE#455]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/455
  [Intel XE#4596]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4596
  [Intel XE#4650]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4650
  [Intel XE#4683]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4683
  [Intel XE#4692]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4692
  [Intel XE#4733]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4733
  [Intel XE#4814]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4814
  [Intel XE#4821]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4821
  [Intel XE#4837]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4837
  [Intel XE#488]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/488
  [Intel XE#4915]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4915
  [Intel XE#4917]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4917
  [Intel XE#4921]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4921
  [Intel XE#4943]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4943
  [Intel XE#5020]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5020
  [Intel XE#5021]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5021
  [Intel XE#5100]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5100
  [Intel XE#5191]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5191
  [Intel XE#5208]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5208
  [Intel XE#5300]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5300
  [Intel XE#5390]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5390
  [Intel XE#5466]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5466
  [Intel XE#5488]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5488
  [Intel XE#5530]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5530
  [Intel XE#5561]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5561
  [Intel XE#5564]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5564
  [Intel XE#5565]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5565
  [Intel XE#5568]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5568
  [Intel XE#5572]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5572
  [Intel XE#5575]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5575
  [Intel XE#5580]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5580
  [Intel XE#5591]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5591
  [Intel XE#5594]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5594
  [Intel XE#5607]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5607
  [Intel XE#5614]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5614
  [Intel XE#5626]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5626
  [Intel XE#5786]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5786
  [Intel XE#584]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/584
  [Intel XE#6168]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6168
  [Intel XE#6281]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6281
  [Intel XE#6312]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6312
  [Intel XE#6321]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6321
  [Intel XE#6339]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6339
  [Intel XE#6360]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6360
  [Intel XE#6376]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6376
  [Intel XE#6377]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6377
  [Intel XE#651]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/651
  [Intel XE#653]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/653
  [Intel XE#656]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/656
  [Intel XE#688]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/688
  [Intel XE#787]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/787
  [Intel XE#836]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/836
  [Intel XE#929]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/929
  [Intel XE#944]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/944
  [Intel XE#977]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/977
  [i915#14968]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14968


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

  * Linux: xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d -> xe-pw-155471v2

  IGT_8588: 8588
  xe-3934-e919806d9a23ee1c2611792492289a170be4cf9d: e919806d9a23ee1c2611792492289a170be4cf9d
  xe-pw-155471v2: 155471v2

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-155471v2/index.html

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

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

* Re: [PATCH v2 09/10] drm/i915/frontbuffer: Fix intel_frontbuffer lifetime handling
  2025-10-16 18:54 ` [PATCH v2 09/10] drm/i915/frontbuffer: Fix intel_frontbuffer lifetime handling Ville Syrjala
@ 2025-10-29 13:51   ` Jani Nikula
  2025-10-29 15:00     ` Jani Nikula
  0 siblings, 1 reply; 20+ messages in thread
From: Jani Nikula @ 2025-10-29 13:51 UTC (permalink / raw)
  To: Ville Syrjala, intel-gfx; +Cc: intel-xe

On Thu, 16 Oct 2025, Ville Syrjala <ville.syrjala@linux.intel.com> wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
>
> The current attempted split between xe/i915 vs. display
> for intel_frontbuffer is a mess:
> - the i915 rcu leaks through the interface to the display side
> - the obj->frontbuffer write-side is now protected by a display
>   specific spinlock even though the actual obj->framebuffer
>   pointer lives in a i915 specific structure
> - the kref is getting poked directly from both sides
> - i915_active is still on the display side
>
> Clean up the mess by moving everything about the frontbuffer
> lifetime management to the i915/xe side:
> - the rcu usage is now completely contained in i915
> - frontbuffer_lock is moved into i915
> - kref is on the i915/xe side (xe needs the refcount as well
>   due to intel_frontbuffer_queue_flush()->intel_frontbuffer_ref())
> - the bo (and its refcounting) is no longer on the display side
> - i915_active is contained in i915
>
> I was pondering whether we could do this in some kind of smaller
> steps, and perhaps we could, but it would probably have to start
> with a bunch of reverts (which for sure won't go cleanly anymore).
> So not convinced it's worth the hassle.

It's a PITA to review, that's for sure. :p

I'm not particularly fond of embedding struct intel_frontbuffer inside
struct i915_frontbuffer and struct xe_frontbuffer, because it means i915
and xe will need to know the struct intel_frontbuffer definition. If we
can't live with the embedding long term, we'll probably need opaque
pointers back and forth.

That said, I think the overall change here is net positive, and makes
life much easier. We don't have to fix everything at once, so let's go
with this.

I didn't spot any obvious issues, but my confidence level with the
review is super low. :(

I guess the alternatives are to just go with that, trusting CI, or give
me more time to review. I'm fine either way, as I can trust you to step
up if it goes crashing down. ;)

BR,
Jani.

PS. I think patches 1-2 are fine with the acks alone.

>
> Acked-by: Jani Nikula <jani.nikula@intel.com>
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> ---
>  drivers/gpu/drm/i915/Makefile                 |   1 +
>  drivers/gpu/drm/i915/display/intel_bo.c       |  34 ++++--
>  drivers/gpu/drm/i915/display/intel_bo.h       |   6 +-
>  .../gpu/drm/i915/display/intel_display_core.h |   3 -
>  .../drm/i915/display/intel_display_driver.c   |   1 -
>  .../gpu/drm/i915/display/intel_frontbuffer.c  |  89 ++-------------
>  .../gpu/drm/i915/display/intel_frontbuffer.h  |  13 +--
>  drivers/gpu/drm/i915/gem/i915_gem_object.c    |  12 +-
>  .../i915/gem/i915_gem_object_frontbuffer.c    | 103 ++++++++++++++++++
>  .../i915/gem/i915_gem_object_frontbuffer.h    |  48 +++-----
>  .../gpu/drm/i915/gem/i915_gem_object_types.h  |   2 +-
>  drivers/gpu/drm/i915/i915_drv.h               |   2 +
>  drivers/gpu/drm/i915/i915_gem.c               |   2 +
>  drivers/gpu/drm/i915/i915_vma.c               |   6 +-
>  .../gpu/drm/xe/compat-i915-headers/i915_vma.h |   2 -
>  drivers/gpu/drm/xe/display/intel_bo.c         |  52 ++++++++-
>  16 files changed, 227 insertions(+), 149 deletions(-)
>  create mode 100644 drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.c
>
> diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
> index aa2f0fd95117..717e57205c85 100644
> --- a/drivers/gpu/drm/i915/Makefile
> +++ b/drivers/gpu/drm/i915/Makefile
> @@ -155,6 +155,7 @@ gem-y += \
>  	gem/i915_gem_lmem.o \
>  	gem/i915_gem_mman.o \
>  	gem/i915_gem_object.o \
> +	gem/i915_gem_object_frontbuffer.o \
>  	gem/i915_gem_pages.o \
>  	gem/i915_gem_phys.o \
>  	gem/i915_gem_pm.o \
> diff --git a/drivers/gpu/drm/i915/display/intel_bo.c b/drivers/gpu/drm/i915/display/intel_bo.c
> index 2792aca7bc22..f3687eb63467 100644
> --- a/drivers/gpu/drm/i915/display/intel_bo.c
> +++ b/drivers/gpu/drm/i915/display/intel_bo.c
> @@ -39,20 +39,40 @@ int intel_bo_read_from_page(struct drm_gem_object *obj, u64 offset, void *dst, i
>  	return i915_gem_object_read_from_page(to_intel_bo(obj), offset, dst, size);
>  }
>  
> -struct intel_frontbuffer *intel_bo_get_frontbuffer(struct drm_gem_object *obj)
> +struct intel_frontbuffer *intel_bo_frontbuffer_get(struct drm_gem_object *_obj)
>  {
> -	return i915_gem_object_get_frontbuffer(to_intel_bo(obj));
> +	struct drm_i915_gem_object *obj = to_intel_bo(_obj);
> +	struct i915_frontbuffer *front;
> +
> +	front = i915_gem_object_frontbuffer_get(obj);
> +	if (!front)
> +		return NULL;
> +
> +	return &front->base;
> +}
> +
> +void intel_bo_frontbuffer_ref(struct intel_frontbuffer *_front)
> +{
> +	struct i915_frontbuffer *front =
> +		container_of(_front, typeof(*front), base);
> +
> +	i915_gem_object_frontbuffer_ref(front);
>  }
>  
> -struct intel_frontbuffer *intel_bo_set_frontbuffer(struct drm_gem_object *obj,
> -						   struct intel_frontbuffer *front)
> +void intel_bo_frontbuffer_put(struct intel_frontbuffer *_front)
>  {
> -	return i915_gem_object_set_frontbuffer(to_intel_bo(obj), front);
> +	struct i915_frontbuffer *front =
> +		container_of(_front, typeof(*front), base);
> +
> +	return i915_gem_object_frontbuffer_put(front);
>  }
>  
> -void intel_bo_frontbuffer_flush_for_display(struct intel_frontbuffer *front)
> +void intel_bo_frontbuffer_flush_for_display(struct intel_frontbuffer *_front)
>  {
> -	i915_gem_object_flush_if_display(to_intel_bo(front->obj));
> +	struct i915_frontbuffer *front =
> +		container_of(_front, typeof(*front), base);
> +
> +	i915_gem_object_flush_if_display(front->obj);
>  }
>  
>  void intel_bo_describe(struct seq_file *m, struct drm_gem_object *obj)
> diff --git a/drivers/gpu/drm/i915/display/intel_bo.h b/drivers/gpu/drm/i915/display/intel_bo.h
> index 08247bf36d40..fc05f680dc76 100644
> --- a/drivers/gpu/drm/i915/display/intel_bo.h
> +++ b/drivers/gpu/drm/i915/display/intel_bo.h
> @@ -19,9 +19,9 @@ bool intel_bo_is_protected(struct drm_gem_object *obj);
>  int intel_bo_fb_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma);
>  int intel_bo_read_from_page(struct drm_gem_object *obj, u64 offset, void *dst, int size);
>  
> -struct intel_frontbuffer *intel_bo_get_frontbuffer(struct drm_gem_object *obj);
> -struct intel_frontbuffer *intel_bo_set_frontbuffer(struct drm_gem_object *obj,
> -						   struct intel_frontbuffer *front);
> +struct intel_frontbuffer *intel_bo_frontbuffer_get(struct drm_gem_object *obj);
> +void intel_bo_frontbuffer_ref(struct intel_frontbuffer *front);
> +void intel_bo_frontbuffer_put(struct intel_frontbuffer *front);
>  void intel_bo_frontbuffer_flush_for_display(struct intel_frontbuffer *front);
>  
>  void intel_bo_describe(struct seq_file *m, struct drm_gem_object *obj);
> diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h b/drivers/gpu/drm/i915/display/intel_display_core.h
> index 13576d07c999..34d578e2cc25 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_core.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_core.h
> @@ -141,9 +141,6 @@ struct intel_dpll_global {
>  };
>  
>  struct intel_frontbuffer_tracking {
> -	/* protects obj->frontbuffer (write-side) */
> -	spinlock_t frontbuffer_lock;
> -
>  	/* protects busy_bits */
>  	spinlock_t lock;
>  
> diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c b/drivers/gpu/drm/i915/display/intel_display_driver.c
> index ac684f8c5d40..f84a0b26b7a6 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_driver.c
> +++ b/drivers/gpu/drm/i915/display/intel_display_driver.c
> @@ -184,7 +184,6 @@ void intel_display_driver_early_probe(struct intel_display *display)
>  	if (!HAS_DISPLAY(display))
>  		return;
>  
> -	spin_lock_init(&display->fb_tracking.frontbuffer_lock);
>  	spin_lock_init(&display->fb_tracking.lock);
>  	mutex_init(&display->backlight.lock);
>  	mutex_init(&display->audio.mutex);
> diff --git a/drivers/gpu/drm/i915/display/intel_frontbuffer.c b/drivers/gpu/drm/i915/display/intel_frontbuffer.c
> index 5d627eac07bd..4761e116e442 100644
> --- a/drivers/gpu/drm/i915/display/intel_frontbuffer.c
> +++ b/drivers/gpu/drm/i915/display/intel_frontbuffer.c
> @@ -57,8 +57,6 @@
>  
>  #include <drm/drm_gem.h>
>  
> -#include "i915_active.h"
> -#include "i915_vma.h"
>  #include "intel_bo.h"
>  #include "intel_display_trace.h"
>  #include "intel_display_types.h"
> @@ -167,7 +165,7 @@ void __intel_fb_flush(struct intel_frontbuffer *front,
>  
>  static void intel_frontbuffer_ref(struct intel_frontbuffer *front)
>  {
> -	kref_get(&front->ref);
> +	intel_bo_frontbuffer_ref(front);
>  }
>  
>  static void intel_frontbuffer_flush_work(struct work_struct *work)
> @@ -196,89 +194,26 @@ void intel_frontbuffer_queue_flush(struct intel_frontbuffer *front)
>  		intel_frontbuffer_put(front);
>  }
>  
> -static int frontbuffer_active(struct i915_active *ref)
> +void intel_frontbuffer_init(struct intel_frontbuffer *front, struct drm_device *drm)
>  {
> -	struct intel_frontbuffer *front =
> -		container_of(ref, typeof(*front), write);
> -
> -	kref_get(&front->ref);
> -	return 0;
> -}
> -
> -static void frontbuffer_retire(struct i915_active *ref)
> -{
> -	struct intel_frontbuffer *front =
> -		container_of(ref, typeof(*front), write);
> -
> -	intel_frontbuffer_flush(front, ORIGIN_CS);
> -	intel_frontbuffer_put(front);
> -}
> -
> -static void frontbuffer_release(struct kref *ref)
> -	__releases(&front->display->fb_tracking.frontbuffer_lock)
> -{
> -	struct intel_frontbuffer *ret, *front =
> -		container_of(ref, typeof(*front), ref);
> -	struct intel_display *display = front->display;
> -	struct drm_gem_object *obj = front->obj;
> -
> -	drm_WARN_ON(display->drm, atomic_read(&front->bits));
> -
> -	i915_ggtt_clear_scanout(to_intel_bo(obj));
> -
> -	ret = intel_bo_set_frontbuffer(obj, NULL);
> -	drm_WARN_ON(display->drm, ret);
> -	spin_unlock(&display->fb_tracking.frontbuffer_lock);
> -
> -	i915_active_fini(&front->write);
> -
> -	drm_gem_object_put(obj);
> -	kfree_rcu(front, rcu);
> -}
> -
> -struct intel_frontbuffer *
> -intel_frontbuffer_get(struct drm_gem_object *obj)
> -{
> -	struct intel_display *display = to_intel_display(obj->dev);
> -	struct intel_frontbuffer *front, *cur;
> -
> -	front = intel_bo_get_frontbuffer(obj);
> -	if (front)
> -		return front;
> -
> -	front = kmalloc(sizeof(*front), GFP_KERNEL);
> -	if (!front)
> -		return NULL;
> -
> -	drm_gem_object_get(obj);
> -
> -	front->obj = obj;
> -	front->display = display;
> -	kref_init(&front->ref);
> +	front->display = to_intel_display(drm);
>  	atomic_set(&front->bits, 0);
> -	i915_active_init(&front->write,
> -			 frontbuffer_active,
> -			 frontbuffer_retire,
> -			 I915_ACTIVE_RETIRE_SLEEPS);
>  	INIT_WORK(&front->flush_work, intel_frontbuffer_flush_work);
> +}
>  
> -	spin_lock(&display->fb_tracking.frontbuffer_lock);
> -	cur = intel_bo_set_frontbuffer(obj, front);
> -	spin_unlock(&display->fb_tracking.frontbuffer_lock);
> +void intel_frontbuffer_fini(struct intel_frontbuffer *front)
> +{
> +	drm_WARN_ON(front->display->drm, atomic_read(&front->bits));
> +}
>  
> -	if (cur != front) {
> -		drm_gem_object_put(obj);
> -		kfree(front);
> -	}
> -
> -	return cur;
> +struct intel_frontbuffer *intel_frontbuffer_get(struct drm_gem_object *obj)
> +{
> +	return intel_bo_frontbuffer_get(obj);
>  }
>  
>  void intel_frontbuffer_put(struct intel_frontbuffer *front)
>  {
> -	kref_put_lock(&front->ref,
> -		      frontbuffer_release,
> -		      &front->display->fb_tracking.frontbuffer_lock);
> +	intel_bo_frontbuffer_put(front);
>  }
>  
>  /**
> diff --git a/drivers/gpu/drm/i915/display/intel_frontbuffer.h b/drivers/gpu/drm/i915/display/intel_frontbuffer.h
> index ff2a6ac75a34..22677acb4c06 100644
> --- a/drivers/gpu/drm/i915/display/intel_frontbuffer.h
> +++ b/drivers/gpu/drm/i915/display/intel_frontbuffer.h
> @@ -26,10 +26,9 @@
>  
>  #include <linux/atomic.h>
>  #include <linux/bits.h>
> -#include <linux/kref.h>
> -
> -#include "i915_active_types.h"
> +#include <linux/workqueue_types.h>
>  
> +struct drm_device;
>  struct drm_gem_object;
>  struct intel_display;
>  
> @@ -42,13 +41,8 @@ enum fb_op_origin {
>  };
>  
>  struct intel_frontbuffer {
> -	struct kref ref;
>  	struct intel_display *display;
>  	atomic_t bits;
> -	struct i915_active write;
> -	struct drm_gem_object *obj;
> -	struct rcu_head rcu;
> -
>  	struct work_struct flush_work;
>  };
>  
> @@ -141,4 +135,7 @@ void intel_frontbuffer_track(struct intel_frontbuffer *old,
>  			     struct intel_frontbuffer *new,
>  			     unsigned int frontbuffer_bits);
>  
> +void intel_frontbuffer_init(struct intel_frontbuffer *front, struct drm_device *drm);
> +void intel_frontbuffer_fini(struct intel_frontbuffer *front);
> +
>  #endif /* __INTEL_FRONTBUFFER_H__ */
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.c b/drivers/gpu/drm/i915/gem/i915_gem_object.c
> index 478011e5ecb3..36680eddf88e 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_object.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_object.c
> @@ -476,24 +476,24 @@ static void i915_gem_free_object(struct drm_gem_object *gem_obj)
>  void __i915_gem_object_flush_frontbuffer(struct drm_i915_gem_object *obj,
>  					 enum fb_op_origin origin)
>  {
> -	struct intel_frontbuffer *front;
> +	struct i915_frontbuffer *front;
>  
>  	front = i915_gem_object_get_frontbuffer(obj);
>  	if (front) {
> -		intel_frontbuffer_flush(front, origin);
> -		intel_frontbuffer_put(front);
> +		intel_frontbuffer_flush(&front->base, origin);
> +		i915_gem_object_frontbuffer_put(front);
>  	}
>  }
>  
>  void __i915_gem_object_invalidate_frontbuffer(struct drm_i915_gem_object *obj,
>  					      enum fb_op_origin origin)
>  {
> -	struct intel_frontbuffer *front;
> +	struct i915_frontbuffer *front;
>  
>  	front = i915_gem_object_get_frontbuffer(obj);
>  	if (front) {
> -		intel_frontbuffer_invalidate(front, origin);
> -		intel_frontbuffer_put(front);
> +		intel_frontbuffer_invalidate(&front->base, origin);
> +		i915_gem_object_frontbuffer_put(front);
>  	}
>  }
>  
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.c b/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.c
> new file mode 100644
> index 000000000000..7ef89613c025
> --- /dev/null
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.c
> @@ -0,0 +1,103 @@
> +// SPDX-License-Identifier: MIT
> +/* Copyright © 2025 Intel Corporation */
> +
> +#include "i915_drv.h"
> +#include "i915_gem_object_frontbuffer.h"
> +
> +static int frontbuffer_active(struct i915_active *ref)
> +{
> +	struct i915_frontbuffer *front =
> +		container_of(ref, typeof(*front), write);
> +
> +	kref_get(&front->ref);
> +	return 0;
> +}
> +
> +static void frontbuffer_retire(struct i915_active *ref)
> +{
> +	struct i915_frontbuffer *front =
> +		container_of(ref, typeof(*front), write);
> +
> +	intel_frontbuffer_flush(&front->base, ORIGIN_CS);
> +	i915_gem_object_frontbuffer_put(front);
> +}
> +
> +struct i915_frontbuffer *
> +i915_gem_object_frontbuffer_get(struct drm_i915_gem_object *obj)
> +{
> +	struct drm_i915_private *i915 = to_i915(obj->base.dev);
> +	struct i915_frontbuffer *front, *cur;
> +
> +	front = i915_gem_object_get_frontbuffer(obj);
> +	if (front)
> +		return front;
> +
> +	front = kmalloc(sizeof(*front), GFP_KERNEL);
> +	if (!front)
> +		return NULL;
> +
> +	intel_frontbuffer_init(&front->base, &i915->drm);
> +
> +	kref_init(&front->ref);
> +	i915_gem_object_get(obj);
> +	front->obj = obj;
> +
> +	i915_active_init(&front->write,
> +			 frontbuffer_active,
> +			 frontbuffer_retire,
> +			 I915_ACTIVE_RETIRE_SLEEPS);
> +
> +	spin_lock(&i915->frontbuffer_lock);
> +	if (rcu_access_pointer(obj->frontbuffer)) {
> +		cur = rcu_dereference_protected(obj->frontbuffer, true);
> +		kref_get(&cur->ref);
> +	} else {
> +		cur = front;
> +		rcu_assign_pointer(obj->frontbuffer, front);
> +	}
> +	spin_unlock(&i915->frontbuffer_lock);
> +
> +	if (cur != front) {
> +		i915_gem_object_put(obj);
> +		intel_frontbuffer_fini(&front->base);
> +		kfree(front);
> +	}
> +
> +	return cur;
> +}
> +
> +void i915_gem_object_frontbuffer_ref(struct i915_frontbuffer *front)
> +{
> +	kref_get(&front->ref);
> +}
> +
> +static void frontbuffer_release(struct kref *ref)
> +	__releases(&i915->frontbuffer_lock)
> +{
> +	struct i915_frontbuffer *front =
> +		container_of(ref, typeof(*front), ref);
> +	struct drm_i915_gem_object *obj = front->obj;
> +	struct drm_i915_private *i915 = to_i915(obj->base.dev);
> +
> +	i915_ggtt_clear_scanout(obj);
> +
> +	RCU_INIT_POINTER(obj->frontbuffer, NULL);
> +
> +	spin_unlock(&i915->frontbuffer_lock);
> +
> +	i915_active_fini(&front->write);
> +
> +	i915_gem_object_put(obj);
> +
> +	intel_frontbuffer_fini(&front->base);
> +
> +	kfree_rcu(front, rcu);
> +}
> +
> +void i915_gem_object_frontbuffer_put(struct i915_frontbuffer *front)
> +{
> +	struct drm_i915_private *i915 = to_i915(front->obj->base.dev);
> +
> +	kref_put_lock(&front->ref, frontbuffer_release,
> +		      &i915->frontbuffer_lock);
> +}
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.h b/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.h
> index 1ec382c43aee..385f7e8049b8 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.h
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.h
> @@ -12,6 +12,14 @@
>  #include "display/intel_frontbuffer.h"
>  #include "i915_gem_object_types.h"
>  
> +struct i915_frontbuffer {
> +	struct intel_frontbuffer base;
> +	struct drm_i915_gem_object *obj;
> +	struct i915_active write;
> +	struct rcu_head rcu;
> +	struct kref ref;
> +};
> +
>  void __i915_gem_object_flush_frontbuffer(struct drm_i915_gem_object *obj,
>  					 enum fb_op_origin origin);
>  void __i915_gem_object_invalidate_frontbuffer(struct drm_i915_gem_object *obj,
> @@ -33,6 +41,10 @@ i915_gem_object_invalidate_frontbuffer(struct drm_i915_gem_object *obj,
>  		__i915_gem_object_invalidate_frontbuffer(obj, origin);
>  }
>  
> +struct i915_frontbuffer *i915_gem_object_frontbuffer_get(struct drm_i915_gem_object *obj);
> +void i915_gem_object_frontbuffer_ref(struct i915_frontbuffer *front);
> +void i915_gem_object_frontbuffer_put(struct i915_frontbuffer *front);
> +
>  /**
>   * i915_gem_object_get_frontbuffer - Get the object's frontbuffer
>   * @obj: The object whose frontbuffer to get.
> @@ -42,10 +54,10 @@ i915_gem_object_invalidate_frontbuffer(struct drm_i915_gem_object *obj,
>   *
>   * Return: pointer to object's frontbuffer is such exists or NULL
>   */
> -static inline struct intel_frontbuffer *
> +static inline struct i915_frontbuffer *
>  i915_gem_object_get_frontbuffer(const struct drm_i915_gem_object *obj)
>  {
> -	struct intel_frontbuffer *front;
> +	struct i915_frontbuffer *front;
>  
>  	if (likely(!rcu_access_pointer(obj->frontbuffer)))
>  		return NULL;
> @@ -62,41 +74,11 @@ i915_gem_object_get_frontbuffer(const struct drm_i915_gem_object *obj)
>  		if (likely(front == rcu_access_pointer(obj->frontbuffer)))
>  			break;
>  
> -		intel_frontbuffer_put(front);
> +		i915_gem_object_frontbuffer_put(front);
>  	} while (1);
>  	rcu_read_unlock();
>  
>  	return front;
>  }
>  
> -/**
> - * i915_gem_object_set_frontbuffer - Set the object's frontbuffer
> - * @obj: The object whose frontbuffer to set.
> - * @front: The frontbuffer to set
> - *
> - * Set object's frontbuffer pointer. If frontbuffer is already set for the
> - * object keep it and return it's pointer to the caller. Please note that RCU
> - * mechanism is used to handle e.g. ongoing removal of frontbuffer pointer. This
> - * function is protected by i915->display->fb_tracking.frontbuffer_lock
> - *
> - * Return: pointer to frontbuffer which was set.
> - */
> -static inline struct intel_frontbuffer *
> -i915_gem_object_set_frontbuffer(struct drm_i915_gem_object *obj,
> -				struct intel_frontbuffer *front)
> -{
> -	struct intel_frontbuffer *cur = front;
> -
> -	if (!front) {
> -		RCU_INIT_POINTER(obj->frontbuffer, NULL);
> -	} else if (rcu_access_pointer(obj->frontbuffer)) {
> -		cur = rcu_dereference_protected(obj->frontbuffer, true);
> -		kref_get(&cur->ref);
> -	} else {
> -		rcu_assign_pointer(obj->frontbuffer, front);
> -	}
> -
> -	return cur;
> -}
> -
>  #endif
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object_types.h b/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
> index 64600aa8227f..465ce94aee76 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
> @@ -574,7 +574,7 @@ struct drm_i915_gem_object {
>  	 */
>  	u16 write_domain;
>  
> -	struct intel_frontbuffer __rcu *frontbuffer;
> +	struct i915_frontbuffer __rcu *frontbuffer;
>  
>  	/** Current tiling stride for the object, if it's tiled. */
>  	unsigned int tiling_and_stride;
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index 95f9ddf22ce4..5381a934a671 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -311,6 +311,8 @@ struct drm_i915_private {
>  		struct file *mmap_singleton;
>  	} gem;
>  
> +	spinlock_t frontbuffer_lock; /* protects obj->frontbuffer (write-side) */
> +
>  	struct intel_pxp *pxp;
>  
>  	struct i915_pmu pmu;
> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> index e14a0c3db999..39b747c3e223 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -1298,6 +1298,8 @@ void i915_gem_init_early(struct drm_i915_private *dev_priv)
>  {
>  	i915_gem_init__mm(dev_priv);
>  	i915_gem_init__contexts(dev_priv);
> +
> +	spin_lock_init(&dev_priv->frontbuffer_lock);
>  }
>  
>  void i915_gem_cleanup_early(struct drm_i915_private *dev_priv)
> diff --git a/drivers/gpu/drm/i915/i915_vma.c b/drivers/gpu/drm/i915/i915_vma.c
> index 25e97031d76e..cb36daaa101d 100644
> --- a/drivers/gpu/drm/i915/i915_vma.c
> +++ b/drivers/gpu/drm/i915/i915_vma.c
> @@ -1990,13 +1990,13 @@ int _i915_vma_move_to_active(struct i915_vma *vma,
>  	}
>  
>  	if (flags & EXEC_OBJECT_WRITE) {
> -		struct intel_frontbuffer *front;
> +		struct i915_frontbuffer *front;
>  
>  		front = i915_gem_object_get_frontbuffer(obj);
>  		if (unlikely(front)) {
> -			if (intel_frontbuffer_invalidate(front, ORIGIN_CS))
> +			if (intel_frontbuffer_invalidate(&front->base, ORIGIN_CS))
>  				i915_active_add_request(&front->write, rq);
> -			intel_frontbuffer_put(front);
> +			i915_gem_object_frontbuffer_put(front);
>  		}
>  	}
>  
> diff --git a/drivers/gpu/drm/xe/compat-i915-headers/i915_vma.h b/drivers/gpu/drm/xe/compat-i915-headers/i915_vma.h
> index 4465c40f8134..b17e3bab23d5 100644
> --- a/drivers/gpu/drm/xe/compat-i915-headers/i915_vma.h
> +++ b/drivers/gpu/drm/xe/compat-i915-headers/i915_vma.h
> @@ -26,8 +26,6 @@ struct i915_vma {
>  	struct xe_ggtt_node *node;
>  };
>  
> -#define i915_ggtt_clear_scanout(bo) do { } while (0)
> -
>  #define i915_vma_fence_id(vma) -1
>  
>  static inline u32 i915_ggtt_offset(const struct i915_vma *vma)
> diff --git a/drivers/gpu/drm/xe/display/intel_bo.c b/drivers/gpu/drm/xe/display/intel_bo.c
> index 2437c00a2d3e..bad2243b9114 100644
> --- a/drivers/gpu/drm/xe/display/intel_bo.c
> +++ b/drivers/gpu/drm/xe/display/intel_bo.c
> @@ -5,6 +5,7 @@
>  
>  #include "xe_bo.h"
>  #include "intel_bo.h"
> +#include "intel_frontbuffer.h"
>  
>  bool intel_bo_is_tiled(struct drm_gem_object *obj)
>  {
> @@ -40,15 +41,56 @@ int intel_bo_read_from_page(struct drm_gem_object *obj, u64 offset, void *dst, i
>  	return xe_bo_read(bo, offset, dst, size);
>  }
>  
> -struct intel_frontbuffer *intel_bo_get_frontbuffer(struct drm_gem_object *obj)
> +struct xe_frontbuffer {
> +	struct intel_frontbuffer base;
> +	struct drm_gem_object *obj;
> +	struct kref ref;
> +};
> +
> +struct intel_frontbuffer *intel_bo_frontbuffer_get(struct drm_gem_object *obj)
>  {
> -	return NULL;
> +	struct xe_frontbuffer *front;
> +
> +	front = kmalloc(sizeof(*front), GFP_KERNEL);
> +	if (!front)
> +		return NULL;
> +
> +	intel_frontbuffer_init(&front->base, obj->dev);
> +
> +	kref_init(&front->ref);
> +
> +	drm_gem_object_get(obj);
> +	front->obj = obj;
> +
> +	return &front->base;
>  }
>  
> -struct intel_frontbuffer *intel_bo_set_frontbuffer(struct drm_gem_object *obj,
> -						   struct intel_frontbuffer *front)
> +void intel_bo_frontbuffer_ref(struct intel_frontbuffer *_front)
>  {
> -	return front;
> +	struct xe_frontbuffer *front =
> +		container_of(_front, typeof(*front), base);
> +
> +	kref_get(&front->ref);
> +}
> +
> +static void frontbuffer_release(struct kref *ref)
> +{
> +	struct xe_frontbuffer *front =
> +		container_of(ref, typeof(*front), ref);
> +
> +	intel_frontbuffer_fini(&front->base);
> +
> +	drm_gem_object_put(front->obj);
> +
> +	kfree(front);
> +}
> +
> +void intel_bo_frontbuffer_put(struct intel_frontbuffer *_front)
> +{
> +	struct xe_frontbuffer *front =
> +		container_of(_front, typeof(*front), base);
> +
> +	kref_put(&front->ref, frontbuffer_release);
>  }
>  
>  void intel_bo_frontbuffer_flush_for_display(struct intel_frontbuffer *front)

-- 
Jani Nikula, Intel

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

* Re: [PATCH v2 09/10] drm/i915/frontbuffer: Fix intel_frontbuffer lifetime handling
  2025-10-29 13:51   ` Jani Nikula
@ 2025-10-29 15:00     ` Jani Nikula
  2025-11-06 13:48       ` Jani Nikula
  0 siblings, 1 reply; 20+ messages in thread
From: Jani Nikula @ 2025-10-29 15:00 UTC (permalink / raw)
  To: Ville Syrjala, intel-gfx; +Cc: intel-xe

On Wed, 29 Oct 2025, Jani Nikula <jani.nikula@intel.com> wrote:
> On Thu, 16 Oct 2025, Ville Syrjala <ville.syrjala@linux.intel.com> wrote:
>> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
>>
>> The current attempted split between xe/i915 vs. display
>> for intel_frontbuffer is a mess:
>> - the i915 rcu leaks through the interface to the display side
>> - the obj->frontbuffer write-side is now protected by a display
>>   specific spinlock even though the actual obj->framebuffer
>>   pointer lives in a i915 specific structure
>> - the kref is getting poked directly from both sides
>> - i915_active is still on the display side
>>
>> Clean up the mess by moving everything about the frontbuffer
>> lifetime management to the i915/xe side:
>> - the rcu usage is now completely contained in i915
>> - frontbuffer_lock is moved into i915
>> - kref is on the i915/xe side (xe needs the refcount as well
>>   due to intel_frontbuffer_queue_flush()->intel_frontbuffer_ref())
>> - the bo (and its refcounting) is no longer on the display side
>> - i915_active is contained in i915
>>
>> I was pondering whether we could do this in some kind of smaller
>> steps, and perhaps we could, but it would probably have to start
>> with a bunch of reverts (which for sure won't go cleanly anymore).
>> So not convinced it's worth the hassle.
>
> It's a PITA to review, that's for sure. :p
>
> I'm not particularly fond of embedding struct intel_frontbuffer inside
> struct i915_frontbuffer and struct xe_frontbuffer, because it means i915
> and xe will need to know the struct intel_frontbuffer definition. If we
> can't live with the embedding long term, we'll probably need opaque
> pointers back and forth.
>
> That said, I think the overall change here is net positive, and makes
> life much easier. We don't have to fix everything at once, so let's go
> with this.
>
> I didn't spot any obvious issues, but my confidence level with the
> review is super low. :(
>
> I guess the alternatives are to just go with that, trusting CI, or give
> me more time to review. I'm fine either way, as I can trust you to step
> up if it goes crashing down. ;)

One approach is to send 1-8 first, get CI, get them merged, and then do
9-10 separately, to get separate CI. Maybe? *shrug*

>
> BR,
> Jani.
>
> PS. I think patches 1-2 are fine with the acks alone.
>
>>
>> Acked-by: Jani Nikula <jani.nikula@intel.com>
>> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
>> ---
>>  drivers/gpu/drm/i915/Makefile                 |   1 +
>>  drivers/gpu/drm/i915/display/intel_bo.c       |  34 ++++--
>>  drivers/gpu/drm/i915/display/intel_bo.h       |   6 +-
>>  .../gpu/drm/i915/display/intel_display_core.h |   3 -
>>  .../drm/i915/display/intel_display_driver.c   |   1 -
>>  .../gpu/drm/i915/display/intel_frontbuffer.c  |  89 ++-------------
>>  .../gpu/drm/i915/display/intel_frontbuffer.h  |  13 +--
>>  drivers/gpu/drm/i915/gem/i915_gem_object.c    |  12 +-
>>  .../i915/gem/i915_gem_object_frontbuffer.c    | 103 ++++++++++++++++++
>>  .../i915/gem/i915_gem_object_frontbuffer.h    |  48 +++-----
>>  .../gpu/drm/i915/gem/i915_gem_object_types.h  |   2 +-
>>  drivers/gpu/drm/i915/i915_drv.h               |   2 +
>>  drivers/gpu/drm/i915/i915_gem.c               |   2 +
>>  drivers/gpu/drm/i915/i915_vma.c               |   6 +-
>>  .../gpu/drm/xe/compat-i915-headers/i915_vma.h |   2 -
>>  drivers/gpu/drm/xe/display/intel_bo.c         |  52 ++++++++-
>>  16 files changed, 227 insertions(+), 149 deletions(-)
>>  create mode 100644 drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.c
>>
>> diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
>> index aa2f0fd95117..717e57205c85 100644
>> --- a/drivers/gpu/drm/i915/Makefile
>> +++ b/drivers/gpu/drm/i915/Makefile
>> @@ -155,6 +155,7 @@ gem-y += \
>>  	gem/i915_gem_lmem.o \
>>  	gem/i915_gem_mman.o \
>>  	gem/i915_gem_object.o \
>> +	gem/i915_gem_object_frontbuffer.o \
>>  	gem/i915_gem_pages.o \
>>  	gem/i915_gem_phys.o \
>>  	gem/i915_gem_pm.o \
>> diff --git a/drivers/gpu/drm/i915/display/intel_bo.c b/drivers/gpu/drm/i915/display/intel_bo.c
>> index 2792aca7bc22..f3687eb63467 100644
>> --- a/drivers/gpu/drm/i915/display/intel_bo.c
>> +++ b/drivers/gpu/drm/i915/display/intel_bo.c
>> @@ -39,20 +39,40 @@ int intel_bo_read_from_page(struct drm_gem_object *obj, u64 offset, void *dst, i
>>  	return i915_gem_object_read_from_page(to_intel_bo(obj), offset, dst, size);
>>  }
>>  
>> -struct intel_frontbuffer *intel_bo_get_frontbuffer(struct drm_gem_object *obj)
>> +struct intel_frontbuffer *intel_bo_frontbuffer_get(struct drm_gem_object *_obj)
>>  {
>> -	return i915_gem_object_get_frontbuffer(to_intel_bo(obj));
>> +	struct drm_i915_gem_object *obj = to_intel_bo(_obj);
>> +	struct i915_frontbuffer *front;
>> +
>> +	front = i915_gem_object_frontbuffer_get(obj);
>> +	if (!front)
>> +		return NULL;
>> +
>> +	return &front->base;
>> +}
>> +
>> +void intel_bo_frontbuffer_ref(struct intel_frontbuffer *_front)
>> +{
>> +	struct i915_frontbuffer *front =
>> +		container_of(_front, typeof(*front), base);
>> +
>> +	i915_gem_object_frontbuffer_ref(front);
>>  }
>>  
>> -struct intel_frontbuffer *intel_bo_set_frontbuffer(struct drm_gem_object *obj,
>> -						   struct intel_frontbuffer *front)
>> +void intel_bo_frontbuffer_put(struct intel_frontbuffer *_front)
>>  {
>> -	return i915_gem_object_set_frontbuffer(to_intel_bo(obj), front);
>> +	struct i915_frontbuffer *front =
>> +		container_of(_front, typeof(*front), base);
>> +
>> +	return i915_gem_object_frontbuffer_put(front);
>>  }
>>  
>> -void intel_bo_frontbuffer_flush_for_display(struct intel_frontbuffer *front)
>> +void intel_bo_frontbuffer_flush_for_display(struct intel_frontbuffer *_front)
>>  {
>> -	i915_gem_object_flush_if_display(to_intel_bo(front->obj));
>> +	struct i915_frontbuffer *front =
>> +		container_of(_front, typeof(*front), base);
>> +
>> +	i915_gem_object_flush_if_display(front->obj);
>>  }
>>  
>>  void intel_bo_describe(struct seq_file *m, struct drm_gem_object *obj)
>> diff --git a/drivers/gpu/drm/i915/display/intel_bo.h b/drivers/gpu/drm/i915/display/intel_bo.h
>> index 08247bf36d40..fc05f680dc76 100644
>> --- a/drivers/gpu/drm/i915/display/intel_bo.h
>> +++ b/drivers/gpu/drm/i915/display/intel_bo.h
>> @@ -19,9 +19,9 @@ bool intel_bo_is_protected(struct drm_gem_object *obj);
>>  int intel_bo_fb_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma);
>>  int intel_bo_read_from_page(struct drm_gem_object *obj, u64 offset, void *dst, int size);
>>  
>> -struct intel_frontbuffer *intel_bo_get_frontbuffer(struct drm_gem_object *obj);
>> -struct intel_frontbuffer *intel_bo_set_frontbuffer(struct drm_gem_object *obj,
>> -						   struct intel_frontbuffer *front);
>> +struct intel_frontbuffer *intel_bo_frontbuffer_get(struct drm_gem_object *obj);
>> +void intel_bo_frontbuffer_ref(struct intel_frontbuffer *front);
>> +void intel_bo_frontbuffer_put(struct intel_frontbuffer *front);
>>  void intel_bo_frontbuffer_flush_for_display(struct intel_frontbuffer *front);
>>  
>>  void intel_bo_describe(struct seq_file *m, struct drm_gem_object *obj);
>> diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h b/drivers/gpu/drm/i915/display/intel_display_core.h
>> index 13576d07c999..34d578e2cc25 100644
>> --- a/drivers/gpu/drm/i915/display/intel_display_core.h
>> +++ b/drivers/gpu/drm/i915/display/intel_display_core.h
>> @@ -141,9 +141,6 @@ struct intel_dpll_global {
>>  };
>>  
>>  struct intel_frontbuffer_tracking {
>> -	/* protects obj->frontbuffer (write-side) */
>> -	spinlock_t frontbuffer_lock;
>> -
>>  	/* protects busy_bits */
>>  	spinlock_t lock;
>>  
>> diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c b/drivers/gpu/drm/i915/display/intel_display_driver.c
>> index ac684f8c5d40..f84a0b26b7a6 100644
>> --- a/drivers/gpu/drm/i915/display/intel_display_driver.c
>> +++ b/drivers/gpu/drm/i915/display/intel_display_driver.c
>> @@ -184,7 +184,6 @@ void intel_display_driver_early_probe(struct intel_display *display)
>>  	if (!HAS_DISPLAY(display))
>>  		return;
>>  
>> -	spin_lock_init(&display->fb_tracking.frontbuffer_lock);
>>  	spin_lock_init(&display->fb_tracking.lock);
>>  	mutex_init(&display->backlight.lock);
>>  	mutex_init(&display->audio.mutex);
>> diff --git a/drivers/gpu/drm/i915/display/intel_frontbuffer.c b/drivers/gpu/drm/i915/display/intel_frontbuffer.c
>> index 5d627eac07bd..4761e116e442 100644
>> --- a/drivers/gpu/drm/i915/display/intel_frontbuffer.c
>> +++ b/drivers/gpu/drm/i915/display/intel_frontbuffer.c
>> @@ -57,8 +57,6 @@
>>  
>>  #include <drm/drm_gem.h>
>>  
>> -#include "i915_active.h"
>> -#include "i915_vma.h"
>>  #include "intel_bo.h"
>>  #include "intel_display_trace.h"
>>  #include "intel_display_types.h"
>> @@ -167,7 +165,7 @@ void __intel_fb_flush(struct intel_frontbuffer *front,
>>  
>>  static void intel_frontbuffer_ref(struct intel_frontbuffer *front)
>>  {
>> -	kref_get(&front->ref);
>> +	intel_bo_frontbuffer_ref(front);
>>  }
>>  
>>  static void intel_frontbuffer_flush_work(struct work_struct *work)
>> @@ -196,89 +194,26 @@ void intel_frontbuffer_queue_flush(struct intel_frontbuffer *front)
>>  		intel_frontbuffer_put(front);
>>  }
>>  
>> -static int frontbuffer_active(struct i915_active *ref)
>> +void intel_frontbuffer_init(struct intel_frontbuffer *front, struct drm_device *drm)
>>  {
>> -	struct intel_frontbuffer *front =
>> -		container_of(ref, typeof(*front), write);
>> -
>> -	kref_get(&front->ref);
>> -	return 0;
>> -}
>> -
>> -static void frontbuffer_retire(struct i915_active *ref)
>> -{
>> -	struct intel_frontbuffer *front =
>> -		container_of(ref, typeof(*front), write);
>> -
>> -	intel_frontbuffer_flush(front, ORIGIN_CS);
>> -	intel_frontbuffer_put(front);
>> -}
>> -
>> -static void frontbuffer_release(struct kref *ref)
>> -	__releases(&front->display->fb_tracking.frontbuffer_lock)
>> -{
>> -	struct intel_frontbuffer *ret, *front =
>> -		container_of(ref, typeof(*front), ref);
>> -	struct intel_display *display = front->display;
>> -	struct drm_gem_object *obj = front->obj;
>> -
>> -	drm_WARN_ON(display->drm, atomic_read(&front->bits));
>> -
>> -	i915_ggtt_clear_scanout(to_intel_bo(obj));
>> -
>> -	ret = intel_bo_set_frontbuffer(obj, NULL);
>> -	drm_WARN_ON(display->drm, ret);
>> -	spin_unlock(&display->fb_tracking.frontbuffer_lock);
>> -
>> -	i915_active_fini(&front->write);
>> -
>> -	drm_gem_object_put(obj);
>> -	kfree_rcu(front, rcu);
>> -}
>> -
>> -struct intel_frontbuffer *
>> -intel_frontbuffer_get(struct drm_gem_object *obj)
>> -{
>> -	struct intel_display *display = to_intel_display(obj->dev);
>> -	struct intel_frontbuffer *front, *cur;
>> -
>> -	front = intel_bo_get_frontbuffer(obj);
>> -	if (front)
>> -		return front;
>> -
>> -	front = kmalloc(sizeof(*front), GFP_KERNEL);
>> -	if (!front)
>> -		return NULL;
>> -
>> -	drm_gem_object_get(obj);
>> -
>> -	front->obj = obj;
>> -	front->display = display;
>> -	kref_init(&front->ref);
>> +	front->display = to_intel_display(drm);
>>  	atomic_set(&front->bits, 0);
>> -	i915_active_init(&front->write,
>> -			 frontbuffer_active,
>> -			 frontbuffer_retire,
>> -			 I915_ACTIVE_RETIRE_SLEEPS);
>>  	INIT_WORK(&front->flush_work, intel_frontbuffer_flush_work);
>> +}
>>  
>> -	spin_lock(&display->fb_tracking.frontbuffer_lock);
>> -	cur = intel_bo_set_frontbuffer(obj, front);
>> -	spin_unlock(&display->fb_tracking.frontbuffer_lock);
>> +void intel_frontbuffer_fini(struct intel_frontbuffer *front)
>> +{
>> +	drm_WARN_ON(front->display->drm, atomic_read(&front->bits));
>> +}
>>  
>> -	if (cur != front) {
>> -		drm_gem_object_put(obj);
>> -		kfree(front);
>> -	}
>> -
>> -	return cur;
>> +struct intel_frontbuffer *intel_frontbuffer_get(struct drm_gem_object *obj)
>> +{
>> +	return intel_bo_frontbuffer_get(obj);
>>  }
>>  
>>  void intel_frontbuffer_put(struct intel_frontbuffer *front)
>>  {
>> -	kref_put_lock(&front->ref,
>> -		      frontbuffer_release,
>> -		      &front->display->fb_tracking.frontbuffer_lock);
>> +	intel_bo_frontbuffer_put(front);
>>  }
>>  
>>  /**
>> diff --git a/drivers/gpu/drm/i915/display/intel_frontbuffer.h b/drivers/gpu/drm/i915/display/intel_frontbuffer.h
>> index ff2a6ac75a34..22677acb4c06 100644
>> --- a/drivers/gpu/drm/i915/display/intel_frontbuffer.h
>> +++ b/drivers/gpu/drm/i915/display/intel_frontbuffer.h
>> @@ -26,10 +26,9 @@
>>  
>>  #include <linux/atomic.h>
>>  #include <linux/bits.h>
>> -#include <linux/kref.h>
>> -
>> -#include "i915_active_types.h"
>> +#include <linux/workqueue_types.h>
>>  
>> +struct drm_device;
>>  struct drm_gem_object;
>>  struct intel_display;
>>  
>> @@ -42,13 +41,8 @@ enum fb_op_origin {
>>  };
>>  
>>  struct intel_frontbuffer {
>> -	struct kref ref;
>>  	struct intel_display *display;
>>  	atomic_t bits;
>> -	struct i915_active write;
>> -	struct drm_gem_object *obj;
>> -	struct rcu_head rcu;
>> -
>>  	struct work_struct flush_work;
>>  };
>>  
>> @@ -141,4 +135,7 @@ void intel_frontbuffer_track(struct intel_frontbuffer *old,
>>  			     struct intel_frontbuffer *new,
>>  			     unsigned int frontbuffer_bits);
>>  
>> +void intel_frontbuffer_init(struct intel_frontbuffer *front, struct drm_device *drm);
>> +void intel_frontbuffer_fini(struct intel_frontbuffer *front);
>> +
>>  #endif /* __INTEL_FRONTBUFFER_H__ */
>> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.c b/drivers/gpu/drm/i915/gem/i915_gem_object.c
>> index 478011e5ecb3..36680eddf88e 100644
>> --- a/drivers/gpu/drm/i915/gem/i915_gem_object.c
>> +++ b/drivers/gpu/drm/i915/gem/i915_gem_object.c
>> @@ -476,24 +476,24 @@ static void i915_gem_free_object(struct drm_gem_object *gem_obj)
>>  void __i915_gem_object_flush_frontbuffer(struct drm_i915_gem_object *obj,
>>  					 enum fb_op_origin origin)
>>  {
>> -	struct intel_frontbuffer *front;
>> +	struct i915_frontbuffer *front;
>>  
>>  	front = i915_gem_object_get_frontbuffer(obj);
>>  	if (front) {
>> -		intel_frontbuffer_flush(front, origin);
>> -		intel_frontbuffer_put(front);
>> +		intel_frontbuffer_flush(&front->base, origin);
>> +		i915_gem_object_frontbuffer_put(front);
>>  	}
>>  }
>>  
>>  void __i915_gem_object_invalidate_frontbuffer(struct drm_i915_gem_object *obj,
>>  					      enum fb_op_origin origin)
>>  {
>> -	struct intel_frontbuffer *front;
>> +	struct i915_frontbuffer *front;
>>  
>>  	front = i915_gem_object_get_frontbuffer(obj);
>>  	if (front) {
>> -		intel_frontbuffer_invalidate(front, origin);
>> -		intel_frontbuffer_put(front);
>> +		intel_frontbuffer_invalidate(&front->base, origin);
>> +		i915_gem_object_frontbuffer_put(front);
>>  	}
>>  }
>>  
>> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.c b/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.c
>> new file mode 100644
>> index 000000000000..7ef89613c025
>> --- /dev/null
>> +++ b/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.c
>> @@ -0,0 +1,103 @@
>> +// SPDX-License-Identifier: MIT
>> +/* Copyright © 2025 Intel Corporation */
>> +
>> +#include "i915_drv.h"
>> +#include "i915_gem_object_frontbuffer.h"
>> +
>> +static int frontbuffer_active(struct i915_active *ref)
>> +{
>> +	struct i915_frontbuffer *front =
>> +		container_of(ref, typeof(*front), write);
>> +
>> +	kref_get(&front->ref);
>> +	return 0;
>> +}
>> +
>> +static void frontbuffer_retire(struct i915_active *ref)
>> +{
>> +	struct i915_frontbuffer *front =
>> +		container_of(ref, typeof(*front), write);
>> +
>> +	intel_frontbuffer_flush(&front->base, ORIGIN_CS);
>> +	i915_gem_object_frontbuffer_put(front);
>> +}
>> +
>> +struct i915_frontbuffer *
>> +i915_gem_object_frontbuffer_get(struct drm_i915_gem_object *obj)
>> +{
>> +	struct drm_i915_private *i915 = to_i915(obj->base.dev);
>> +	struct i915_frontbuffer *front, *cur;
>> +
>> +	front = i915_gem_object_get_frontbuffer(obj);
>> +	if (front)
>> +		return front;
>> +
>> +	front = kmalloc(sizeof(*front), GFP_KERNEL);
>> +	if (!front)
>> +		return NULL;
>> +
>> +	intel_frontbuffer_init(&front->base, &i915->drm);
>> +
>> +	kref_init(&front->ref);
>> +	i915_gem_object_get(obj);
>> +	front->obj = obj;
>> +
>> +	i915_active_init(&front->write,
>> +			 frontbuffer_active,
>> +			 frontbuffer_retire,
>> +			 I915_ACTIVE_RETIRE_SLEEPS);
>> +
>> +	spin_lock(&i915->frontbuffer_lock);
>> +	if (rcu_access_pointer(obj->frontbuffer)) {
>> +		cur = rcu_dereference_protected(obj->frontbuffer, true);
>> +		kref_get(&cur->ref);
>> +	} else {
>> +		cur = front;
>> +		rcu_assign_pointer(obj->frontbuffer, front);
>> +	}
>> +	spin_unlock(&i915->frontbuffer_lock);
>> +
>> +	if (cur != front) {
>> +		i915_gem_object_put(obj);
>> +		intel_frontbuffer_fini(&front->base);
>> +		kfree(front);
>> +	}
>> +
>> +	return cur;
>> +}
>> +
>> +void i915_gem_object_frontbuffer_ref(struct i915_frontbuffer *front)
>> +{
>> +	kref_get(&front->ref);
>> +}
>> +
>> +static void frontbuffer_release(struct kref *ref)
>> +	__releases(&i915->frontbuffer_lock)
>> +{
>> +	struct i915_frontbuffer *front =
>> +		container_of(ref, typeof(*front), ref);
>> +	struct drm_i915_gem_object *obj = front->obj;
>> +	struct drm_i915_private *i915 = to_i915(obj->base.dev);
>> +
>> +	i915_ggtt_clear_scanout(obj);
>> +
>> +	RCU_INIT_POINTER(obj->frontbuffer, NULL);
>> +
>> +	spin_unlock(&i915->frontbuffer_lock);
>> +
>> +	i915_active_fini(&front->write);
>> +
>> +	i915_gem_object_put(obj);
>> +
>> +	intel_frontbuffer_fini(&front->base);
>> +
>> +	kfree_rcu(front, rcu);
>> +}
>> +
>> +void i915_gem_object_frontbuffer_put(struct i915_frontbuffer *front)
>> +{
>> +	struct drm_i915_private *i915 = to_i915(front->obj->base.dev);
>> +
>> +	kref_put_lock(&front->ref, frontbuffer_release,
>> +		      &i915->frontbuffer_lock);
>> +}
>> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.h b/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.h
>> index 1ec382c43aee..385f7e8049b8 100644
>> --- a/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.h
>> +++ b/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.h
>> @@ -12,6 +12,14 @@
>>  #include "display/intel_frontbuffer.h"
>>  #include "i915_gem_object_types.h"
>>  
>> +struct i915_frontbuffer {
>> +	struct intel_frontbuffer base;
>> +	struct drm_i915_gem_object *obj;
>> +	struct i915_active write;
>> +	struct rcu_head rcu;
>> +	struct kref ref;
>> +};
>> +
>>  void __i915_gem_object_flush_frontbuffer(struct drm_i915_gem_object *obj,
>>  					 enum fb_op_origin origin);
>>  void __i915_gem_object_invalidate_frontbuffer(struct drm_i915_gem_object *obj,
>> @@ -33,6 +41,10 @@ i915_gem_object_invalidate_frontbuffer(struct drm_i915_gem_object *obj,
>>  		__i915_gem_object_invalidate_frontbuffer(obj, origin);
>>  }
>>  
>> +struct i915_frontbuffer *i915_gem_object_frontbuffer_get(struct drm_i915_gem_object *obj);
>> +void i915_gem_object_frontbuffer_ref(struct i915_frontbuffer *front);
>> +void i915_gem_object_frontbuffer_put(struct i915_frontbuffer *front);
>> +
>>  /**
>>   * i915_gem_object_get_frontbuffer - Get the object's frontbuffer
>>   * @obj: The object whose frontbuffer to get.
>> @@ -42,10 +54,10 @@ i915_gem_object_invalidate_frontbuffer(struct drm_i915_gem_object *obj,
>>   *
>>   * Return: pointer to object's frontbuffer is such exists or NULL
>>   */
>> -static inline struct intel_frontbuffer *
>> +static inline struct i915_frontbuffer *
>>  i915_gem_object_get_frontbuffer(const struct drm_i915_gem_object *obj)
>>  {
>> -	struct intel_frontbuffer *front;
>> +	struct i915_frontbuffer *front;
>>  
>>  	if (likely(!rcu_access_pointer(obj->frontbuffer)))
>>  		return NULL;
>> @@ -62,41 +74,11 @@ i915_gem_object_get_frontbuffer(const struct drm_i915_gem_object *obj)
>>  		if (likely(front == rcu_access_pointer(obj->frontbuffer)))
>>  			break;
>>  
>> -		intel_frontbuffer_put(front);
>> +		i915_gem_object_frontbuffer_put(front);
>>  	} while (1);
>>  	rcu_read_unlock();
>>  
>>  	return front;
>>  }
>>  
>> -/**
>> - * i915_gem_object_set_frontbuffer - Set the object's frontbuffer
>> - * @obj: The object whose frontbuffer to set.
>> - * @front: The frontbuffer to set
>> - *
>> - * Set object's frontbuffer pointer. If frontbuffer is already set for the
>> - * object keep it and return it's pointer to the caller. Please note that RCU
>> - * mechanism is used to handle e.g. ongoing removal of frontbuffer pointer. This
>> - * function is protected by i915->display->fb_tracking.frontbuffer_lock
>> - *
>> - * Return: pointer to frontbuffer which was set.
>> - */
>> -static inline struct intel_frontbuffer *
>> -i915_gem_object_set_frontbuffer(struct drm_i915_gem_object *obj,
>> -				struct intel_frontbuffer *front)
>> -{
>> -	struct intel_frontbuffer *cur = front;
>> -
>> -	if (!front) {
>> -		RCU_INIT_POINTER(obj->frontbuffer, NULL);
>> -	} else if (rcu_access_pointer(obj->frontbuffer)) {
>> -		cur = rcu_dereference_protected(obj->frontbuffer, true);
>> -		kref_get(&cur->ref);
>> -	} else {
>> -		rcu_assign_pointer(obj->frontbuffer, front);
>> -	}
>> -
>> -	return cur;
>> -}
>> -
>>  #endif
>> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object_types.h b/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
>> index 64600aa8227f..465ce94aee76 100644
>> --- a/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
>> +++ b/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
>> @@ -574,7 +574,7 @@ struct drm_i915_gem_object {
>>  	 */
>>  	u16 write_domain;
>>  
>> -	struct intel_frontbuffer __rcu *frontbuffer;
>> +	struct i915_frontbuffer __rcu *frontbuffer;
>>  
>>  	/** Current tiling stride for the object, if it's tiled. */
>>  	unsigned int tiling_and_stride;
>> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
>> index 95f9ddf22ce4..5381a934a671 100644
>> --- a/drivers/gpu/drm/i915/i915_drv.h
>> +++ b/drivers/gpu/drm/i915/i915_drv.h
>> @@ -311,6 +311,8 @@ struct drm_i915_private {
>>  		struct file *mmap_singleton;
>>  	} gem;
>>  
>> +	spinlock_t frontbuffer_lock; /* protects obj->frontbuffer (write-side) */
>> +
>>  	struct intel_pxp *pxp;
>>  
>>  	struct i915_pmu pmu;
>> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
>> index e14a0c3db999..39b747c3e223 100644
>> --- a/drivers/gpu/drm/i915/i915_gem.c
>> +++ b/drivers/gpu/drm/i915/i915_gem.c
>> @@ -1298,6 +1298,8 @@ void i915_gem_init_early(struct drm_i915_private *dev_priv)
>>  {
>>  	i915_gem_init__mm(dev_priv);
>>  	i915_gem_init__contexts(dev_priv);
>> +
>> +	spin_lock_init(&dev_priv->frontbuffer_lock);
>>  }
>>  
>>  void i915_gem_cleanup_early(struct drm_i915_private *dev_priv)
>> diff --git a/drivers/gpu/drm/i915/i915_vma.c b/drivers/gpu/drm/i915/i915_vma.c
>> index 25e97031d76e..cb36daaa101d 100644
>> --- a/drivers/gpu/drm/i915/i915_vma.c
>> +++ b/drivers/gpu/drm/i915/i915_vma.c
>> @@ -1990,13 +1990,13 @@ int _i915_vma_move_to_active(struct i915_vma *vma,
>>  	}
>>  
>>  	if (flags & EXEC_OBJECT_WRITE) {
>> -		struct intel_frontbuffer *front;
>> +		struct i915_frontbuffer *front;
>>  
>>  		front = i915_gem_object_get_frontbuffer(obj);
>>  		if (unlikely(front)) {
>> -			if (intel_frontbuffer_invalidate(front, ORIGIN_CS))
>> +			if (intel_frontbuffer_invalidate(&front->base, ORIGIN_CS))
>>  				i915_active_add_request(&front->write, rq);
>> -			intel_frontbuffer_put(front);
>> +			i915_gem_object_frontbuffer_put(front);
>>  		}
>>  	}
>>  
>> diff --git a/drivers/gpu/drm/xe/compat-i915-headers/i915_vma.h b/drivers/gpu/drm/xe/compat-i915-headers/i915_vma.h
>> index 4465c40f8134..b17e3bab23d5 100644
>> --- a/drivers/gpu/drm/xe/compat-i915-headers/i915_vma.h
>> +++ b/drivers/gpu/drm/xe/compat-i915-headers/i915_vma.h
>> @@ -26,8 +26,6 @@ struct i915_vma {
>>  	struct xe_ggtt_node *node;
>>  };
>>  
>> -#define i915_ggtt_clear_scanout(bo) do { } while (0)
>> -
>>  #define i915_vma_fence_id(vma) -1
>>  
>>  static inline u32 i915_ggtt_offset(const struct i915_vma *vma)
>> diff --git a/drivers/gpu/drm/xe/display/intel_bo.c b/drivers/gpu/drm/xe/display/intel_bo.c
>> index 2437c00a2d3e..bad2243b9114 100644
>> --- a/drivers/gpu/drm/xe/display/intel_bo.c
>> +++ b/drivers/gpu/drm/xe/display/intel_bo.c
>> @@ -5,6 +5,7 @@
>>  
>>  #include "xe_bo.h"
>>  #include "intel_bo.h"
>> +#include "intel_frontbuffer.h"
>>  
>>  bool intel_bo_is_tiled(struct drm_gem_object *obj)
>>  {
>> @@ -40,15 +41,56 @@ int intel_bo_read_from_page(struct drm_gem_object *obj, u64 offset, void *dst, i
>>  	return xe_bo_read(bo, offset, dst, size);
>>  }
>>  
>> -struct intel_frontbuffer *intel_bo_get_frontbuffer(struct drm_gem_object *obj)
>> +struct xe_frontbuffer {
>> +	struct intel_frontbuffer base;
>> +	struct drm_gem_object *obj;
>> +	struct kref ref;
>> +};
>> +
>> +struct intel_frontbuffer *intel_bo_frontbuffer_get(struct drm_gem_object *obj)
>>  {
>> -	return NULL;
>> +	struct xe_frontbuffer *front;
>> +
>> +	front = kmalloc(sizeof(*front), GFP_KERNEL);
>> +	if (!front)
>> +		return NULL;
>> +
>> +	intel_frontbuffer_init(&front->base, obj->dev);
>> +
>> +	kref_init(&front->ref);
>> +
>> +	drm_gem_object_get(obj);
>> +	front->obj = obj;
>> +
>> +	return &front->base;
>>  }
>>  
>> -struct intel_frontbuffer *intel_bo_set_frontbuffer(struct drm_gem_object *obj,
>> -						   struct intel_frontbuffer *front)
>> +void intel_bo_frontbuffer_ref(struct intel_frontbuffer *_front)
>>  {
>> -	return front;
>> +	struct xe_frontbuffer *front =
>> +		container_of(_front, typeof(*front), base);
>> +
>> +	kref_get(&front->ref);
>> +}
>> +
>> +static void frontbuffer_release(struct kref *ref)
>> +{
>> +	struct xe_frontbuffer *front =
>> +		container_of(ref, typeof(*front), ref);
>> +
>> +	intel_frontbuffer_fini(&front->base);
>> +
>> +	drm_gem_object_put(front->obj);
>> +
>> +	kfree(front);
>> +}
>> +
>> +void intel_bo_frontbuffer_put(struct intel_frontbuffer *_front)
>> +{
>> +	struct xe_frontbuffer *front =
>> +		container_of(_front, typeof(*front), base);
>> +
>> +	kref_put(&front->ref, frontbuffer_release);
>>  }
>>  
>>  void intel_bo_frontbuffer_flush_for_display(struct intel_frontbuffer *front)

-- 
Jani Nikula, Intel

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

* Re: [PATCH v2 09/10] drm/i915/frontbuffer: Fix intel_frontbuffer lifetime handling
  2025-10-29 15:00     ` Jani Nikula
@ 2025-11-06 13:48       ` Jani Nikula
  2025-11-06 14:27         ` Ville Syrjälä
  0 siblings, 1 reply; 20+ messages in thread
From: Jani Nikula @ 2025-11-06 13:48 UTC (permalink / raw)
  To: Ville Syrjala, intel-gfx; +Cc: intel-xe

On Wed, 29 Oct 2025, Jani Nikula <jani.nikula@intel.com> wrote:
> On Wed, 29 Oct 2025, Jani Nikula <jani.nikula@intel.com> wrote:
>> On Thu, 16 Oct 2025, Ville Syrjala <ville.syrjala@linux.intel.com> wrote:
>>> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
>>>
>>> The current attempted split between xe/i915 vs. display
>>> for intel_frontbuffer is a mess:
>>> - the i915 rcu leaks through the interface to the display side
>>> - the obj->frontbuffer write-side is now protected by a display
>>>   specific spinlock even though the actual obj->framebuffer
>>>   pointer lives in a i915 specific structure
>>> - the kref is getting poked directly from both sides
>>> - i915_active is still on the display side
>>>
>>> Clean up the mess by moving everything about the frontbuffer
>>> lifetime management to the i915/xe side:
>>> - the rcu usage is now completely contained in i915
>>> - frontbuffer_lock is moved into i915
>>> - kref is on the i915/xe side (xe needs the refcount as well
>>>   due to intel_frontbuffer_queue_flush()->intel_frontbuffer_ref())
>>> - the bo (and its refcounting) is no longer on the display side
>>> - i915_active is contained in i915
>>>
>>> I was pondering whether we could do this in some kind of smaller
>>> steps, and perhaps we could, but it would probably have to start
>>> with a bunch of reverts (which for sure won't go cleanly anymore).
>>> So not convinced it's worth the hassle.
>>
>> It's a PITA to review, that's for sure. :p
>>
>> I'm not particularly fond of embedding struct intel_frontbuffer inside
>> struct i915_frontbuffer and struct xe_frontbuffer, because it means i915
>> and xe will need to know the struct intel_frontbuffer definition. If we
>> can't live with the embedding long term, we'll probably need opaque
>> pointers back and forth.
>>
>> That said, I think the overall change here is net positive, and makes
>> life much easier. We don't have to fix everything at once, so let's go
>> with this.
>>
>> I didn't spot any obvious issues, but my confidence level with the
>> review is super low. :(
>>
>> I guess the alternatives are to just go with that, trusting CI, or give
>> me more time to review. I'm fine either way, as I can trust you to step
>> up if it goes crashing down. ;)
>
> One approach is to send 1-8 first, get CI, get them merged, and then do
> 9-10 separately, to get separate CI. Maybe? *shrug*

Any conclusions on this? Just merge the whole thing as-is rather than
let it go stale...?

BR,
Jani.


>
>>
>> BR,
>> Jani.
>>
>> PS. I think patches 1-2 are fine with the acks alone.
>>
>>>
>>> Acked-by: Jani Nikula <jani.nikula@intel.com>
>>> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
>>> ---
>>>  drivers/gpu/drm/i915/Makefile                 |   1 +
>>>  drivers/gpu/drm/i915/display/intel_bo.c       |  34 ++++--
>>>  drivers/gpu/drm/i915/display/intel_bo.h       |   6 +-
>>>  .../gpu/drm/i915/display/intel_display_core.h |   3 -
>>>  .../drm/i915/display/intel_display_driver.c   |   1 -
>>>  .../gpu/drm/i915/display/intel_frontbuffer.c  |  89 ++-------------
>>>  .../gpu/drm/i915/display/intel_frontbuffer.h  |  13 +--
>>>  drivers/gpu/drm/i915/gem/i915_gem_object.c    |  12 +-
>>>  .../i915/gem/i915_gem_object_frontbuffer.c    | 103 ++++++++++++++++++
>>>  .../i915/gem/i915_gem_object_frontbuffer.h    |  48 +++-----
>>>  .../gpu/drm/i915/gem/i915_gem_object_types.h  |   2 +-
>>>  drivers/gpu/drm/i915/i915_drv.h               |   2 +
>>>  drivers/gpu/drm/i915/i915_gem.c               |   2 +
>>>  drivers/gpu/drm/i915/i915_vma.c               |   6 +-
>>>  .../gpu/drm/xe/compat-i915-headers/i915_vma.h |   2 -
>>>  drivers/gpu/drm/xe/display/intel_bo.c         |  52 ++++++++-
>>>  16 files changed, 227 insertions(+), 149 deletions(-)
>>>  create mode 100644 drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.c
>>>
>>> diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
>>> index aa2f0fd95117..717e57205c85 100644
>>> --- a/drivers/gpu/drm/i915/Makefile
>>> +++ b/drivers/gpu/drm/i915/Makefile
>>> @@ -155,6 +155,7 @@ gem-y += \
>>>  	gem/i915_gem_lmem.o \
>>>  	gem/i915_gem_mman.o \
>>>  	gem/i915_gem_object.o \
>>> +	gem/i915_gem_object_frontbuffer.o \
>>>  	gem/i915_gem_pages.o \
>>>  	gem/i915_gem_phys.o \
>>>  	gem/i915_gem_pm.o \
>>> diff --git a/drivers/gpu/drm/i915/display/intel_bo.c b/drivers/gpu/drm/i915/display/intel_bo.c
>>> index 2792aca7bc22..f3687eb63467 100644
>>> --- a/drivers/gpu/drm/i915/display/intel_bo.c
>>> +++ b/drivers/gpu/drm/i915/display/intel_bo.c
>>> @@ -39,20 +39,40 @@ int intel_bo_read_from_page(struct drm_gem_object *obj, u64 offset, void *dst, i
>>>  	return i915_gem_object_read_from_page(to_intel_bo(obj), offset, dst, size);
>>>  }
>>>  
>>> -struct intel_frontbuffer *intel_bo_get_frontbuffer(struct drm_gem_object *obj)
>>> +struct intel_frontbuffer *intel_bo_frontbuffer_get(struct drm_gem_object *_obj)
>>>  {
>>> -	return i915_gem_object_get_frontbuffer(to_intel_bo(obj));
>>> +	struct drm_i915_gem_object *obj = to_intel_bo(_obj);
>>> +	struct i915_frontbuffer *front;
>>> +
>>> +	front = i915_gem_object_frontbuffer_get(obj);
>>> +	if (!front)
>>> +		return NULL;
>>> +
>>> +	return &front->base;
>>> +}
>>> +
>>> +void intel_bo_frontbuffer_ref(struct intel_frontbuffer *_front)
>>> +{
>>> +	struct i915_frontbuffer *front =
>>> +		container_of(_front, typeof(*front), base);
>>> +
>>> +	i915_gem_object_frontbuffer_ref(front);
>>>  }
>>>  
>>> -struct intel_frontbuffer *intel_bo_set_frontbuffer(struct drm_gem_object *obj,
>>> -						   struct intel_frontbuffer *front)
>>> +void intel_bo_frontbuffer_put(struct intel_frontbuffer *_front)
>>>  {
>>> -	return i915_gem_object_set_frontbuffer(to_intel_bo(obj), front);
>>> +	struct i915_frontbuffer *front =
>>> +		container_of(_front, typeof(*front), base);
>>> +
>>> +	return i915_gem_object_frontbuffer_put(front);
>>>  }
>>>  
>>> -void intel_bo_frontbuffer_flush_for_display(struct intel_frontbuffer *front)
>>> +void intel_bo_frontbuffer_flush_for_display(struct intel_frontbuffer *_front)
>>>  {
>>> -	i915_gem_object_flush_if_display(to_intel_bo(front->obj));
>>> +	struct i915_frontbuffer *front =
>>> +		container_of(_front, typeof(*front), base);
>>> +
>>> +	i915_gem_object_flush_if_display(front->obj);
>>>  }
>>>  
>>>  void intel_bo_describe(struct seq_file *m, struct drm_gem_object *obj)
>>> diff --git a/drivers/gpu/drm/i915/display/intel_bo.h b/drivers/gpu/drm/i915/display/intel_bo.h
>>> index 08247bf36d40..fc05f680dc76 100644
>>> --- a/drivers/gpu/drm/i915/display/intel_bo.h
>>> +++ b/drivers/gpu/drm/i915/display/intel_bo.h
>>> @@ -19,9 +19,9 @@ bool intel_bo_is_protected(struct drm_gem_object *obj);
>>>  int intel_bo_fb_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma);
>>>  int intel_bo_read_from_page(struct drm_gem_object *obj, u64 offset, void *dst, int size);
>>>  
>>> -struct intel_frontbuffer *intel_bo_get_frontbuffer(struct drm_gem_object *obj);
>>> -struct intel_frontbuffer *intel_bo_set_frontbuffer(struct drm_gem_object *obj,
>>> -						   struct intel_frontbuffer *front);
>>> +struct intel_frontbuffer *intel_bo_frontbuffer_get(struct drm_gem_object *obj);
>>> +void intel_bo_frontbuffer_ref(struct intel_frontbuffer *front);
>>> +void intel_bo_frontbuffer_put(struct intel_frontbuffer *front);
>>>  void intel_bo_frontbuffer_flush_for_display(struct intel_frontbuffer *front);
>>>  
>>>  void intel_bo_describe(struct seq_file *m, struct drm_gem_object *obj);
>>> diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h b/drivers/gpu/drm/i915/display/intel_display_core.h
>>> index 13576d07c999..34d578e2cc25 100644
>>> --- a/drivers/gpu/drm/i915/display/intel_display_core.h
>>> +++ b/drivers/gpu/drm/i915/display/intel_display_core.h
>>> @@ -141,9 +141,6 @@ struct intel_dpll_global {
>>>  };
>>>  
>>>  struct intel_frontbuffer_tracking {
>>> -	/* protects obj->frontbuffer (write-side) */
>>> -	spinlock_t frontbuffer_lock;
>>> -
>>>  	/* protects busy_bits */
>>>  	spinlock_t lock;
>>>  
>>> diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c b/drivers/gpu/drm/i915/display/intel_display_driver.c
>>> index ac684f8c5d40..f84a0b26b7a6 100644
>>> --- a/drivers/gpu/drm/i915/display/intel_display_driver.c
>>> +++ b/drivers/gpu/drm/i915/display/intel_display_driver.c
>>> @@ -184,7 +184,6 @@ void intel_display_driver_early_probe(struct intel_display *display)
>>>  	if (!HAS_DISPLAY(display))
>>>  		return;
>>>  
>>> -	spin_lock_init(&display->fb_tracking.frontbuffer_lock);
>>>  	spin_lock_init(&display->fb_tracking.lock);
>>>  	mutex_init(&display->backlight.lock);
>>>  	mutex_init(&display->audio.mutex);
>>> diff --git a/drivers/gpu/drm/i915/display/intel_frontbuffer.c b/drivers/gpu/drm/i915/display/intel_frontbuffer.c
>>> index 5d627eac07bd..4761e116e442 100644
>>> --- a/drivers/gpu/drm/i915/display/intel_frontbuffer.c
>>> +++ b/drivers/gpu/drm/i915/display/intel_frontbuffer.c
>>> @@ -57,8 +57,6 @@
>>>  
>>>  #include <drm/drm_gem.h>
>>>  
>>> -#include "i915_active.h"
>>> -#include "i915_vma.h"
>>>  #include "intel_bo.h"
>>>  #include "intel_display_trace.h"
>>>  #include "intel_display_types.h"
>>> @@ -167,7 +165,7 @@ void __intel_fb_flush(struct intel_frontbuffer *front,
>>>  
>>>  static void intel_frontbuffer_ref(struct intel_frontbuffer *front)
>>>  {
>>> -	kref_get(&front->ref);
>>> +	intel_bo_frontbuffer_ref(front);
>>>  }
>>>  
>>>  static void intel_frontbuffer_flush_work(struct work_struct *work)
>>> @@ -196,89 +194,26 @@ void intel_frontbuffer_queue_flush(struct intel_frontbuffer *front)
>>>  		intel_frontbuffer_put(front);
>>>  }
>>>  
>>> -static int frontbuffer_active(struct i915_active *ref)
>>> +void intel_frontbuffer_init(struct intel_frontbuffer *front, struct drm_device *drm)
>>>  {
>>> -	struct intel_frontbuffer *front =
>>> -		container_of(ref, typeof(*front), write);
>>> -
>>> -	kref_get(&front->ref);
>>> -	return 0;
>>> -}
>>> -
>>> -static void frontbuffer_retire(struct i915_active *ref)
>>> -{
>>> -	struct intel_frontbuffer *front =
>>> -		container_of(ref, typeof(*front), write);
>>> -
>>> -	intel_frontbuffer_flush(front, ORIGIN_CS);
>>> -	intel_frontbuffer_put(front);
>>> -}
>>> -
>>> -static void frontbuffer_release(struct kref *ref)
>>> -	__releases(&front->display->fb_tracking.frontbuffer_lock)
>>> -{
>>> -	struct intel_frontbuffer *ret, *front =
>>> -		container_of(ref, typeof(*front), ref);
>>> -	struct intel_display *display = front->display;
>>> -	struct drm_gem_object *obj = front->obj;
>>> -
>>> -	drm_WARN_ON(display->drm, atomic_read(&front->bits));
>>> -
>>> -	i915_ggtt_clear_scanout(to_intel_bo(obj));
>>> -
>>> -	ret = intel_bo_set_frontbuffer(obj, NULL);
>>> -	drm_WARN_ON(display->drm, ret);
>>> -	spin_unlock(&display->fb_tracking.frontbuffer_lock);
>>> -
>>> -	i915_active_fini(&front->write);
>>> -
>>> -	drm_gem_object_put(obj);
>>> -	kfree_rcu(front, rcu);
>>> -}
>>> -
>>> -struct intel_frontbuffer *
>>> -intel_frontbuffer_get(struct drm_gem_object *obj)
>>> -{
>>> -	struct intel_display *display = to_intel_display(obj->dev);
>>> -	struct intel_frontbuffer *front, *cur;
>>> -
>>> -	front = intel_bo_get_frontbuffer(obj);
>>> -	if (front)
>>> -		return front;
>>> -
>>> -	front = kmalloc(sizeof(*front), GFP_KERNEL);
>>> -	if (!front)
>>> -		return NULL;
>>> -
>>> -	drm_gem_object_get(obj);
>>> -
>>> -	front->obj = obj;
>>> -	front->display = display;
>>> -	kref_init(&front->ref);
>>> +	front->display = to_intel_display(drm);
>>>  	atomic_set(&front->bits, 0);
>>> -	i915_active_init(&front->write,
>>> -			 frontbuffer_active,
>>> -			 frontbuffer_retire,
>>> -			 I915_ACTIVE_RETIRE_SLEEPS);
>>>  	INIT_WORK(&front->flush_work, intel_frontbuffer_flush_work);
>>> +}
>>>  
>>> -	spin_lock(&display->fb_tracking.frontbuffer_lock);
>>> -	cur = intel_bo_set_frontbuffer(obj, front);
>>> -	spin_unlock(&display->fb_tracking.frontbuffer_lock);
>>> +void intel_frontbuffer_fini(struct intel_frontbuffer *front)
>>> +{
>>> +	drm_WARN_ON(front->display->drm, atomic_read(&front->bits));
>>> +}
>>>  
>>> -	if (cur != front) {
>>> -		drm_gem_object_put(obj);
>>> -		kfree(front);
>>> -	}
>>> -
>>> -	return cur;
>>> +struct intel_frontbuffer *intel_frontbuffer_get(struct drm_gem_object *obj)
>>> +{
>>> +	return intel_bo_frontbuffer_get(obj);
>>>  }
>>>  
>>>  void intel_frontbuffer_put(struct intel_frontbuffer *front)
>>>  {
>>> -	kref_put_lock(&front->ref,
>>> -		      frontbuffer_release,
>>> -		      &front->display->fb_tracking.frontbuffer_lock);
>>> +	intel_bo_frontbuffer_put(front);
>>>  }
>>>  
>>>  /**
>>> diff --git a/drivers/gpu/drm/i915/display/intel_frontbuffer.h b/drivers/gpu/drm/i915/display/intel_frontbuffer.h
>>> index ff2a6ac75a34..22677acb4c06 100644
>>> --- a/drivers/gpu/drm/i915/display/intel_frontbuffer.h
>>> +++ b/drivers/gpu/drm/i915/display/intel_frontbuffer.h
>>> @@ -26,10 +26,9 @@
>>>  
>>>  #include <linux/atomic.h>
>>>  #include <linux/bits.h>
>>> -#include <linux/kref.h>
>>> -
>>> -#include "i915_active_types.h"
>>> +#include <linux/workqueue_types.h>
>>>  
>>> +struct drm_device;
>>>  struct drm_gem_object;
>>>  struct intel_display;
>>>  
>>> @@ -42,13 +41,8 @@ enum fb_op_origin {
>>>  };
>>>  
>>>  struct intel_frontbuffer {
>>> -	struct kref ref;
>>>  	struct intel_display *display;
>>>  	atomic_t bits;
>>> -	struct i915_active write;
>>> -	struct drm_gem_object *obj;
>>> -	struct rcu_head rcu;
>>> -
>>>  	struct work_struct flush_work;
>>>  };
>>>  
>>> @@ -141,4 +135,7 @@ void intel_frontbuffer_track(struct intel_frontbuffer *old,
>>>  			     struct intel_frontbuffer *new,
>>>  			     unsigned int frontbuffer_bits);
>>>  
>>> +void intel_frontbuffer_init(struct intel_frontbuffer *front, struct drm_device *drm);
>>> +void intel_frontbuffer_fini(struct intel_frontbuffer *front);
>>> +
>>>  #endif /* __INTEL_FRONTBUFFER_H__ */
>>> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.c b/drivers/gpu/drm/i915/gem/i915_gem_object.c
>>> index 478011e5ecb3..36680eddf88e 100644
>>> --- a/drivers/gpu/drm/i915/gem/i915_gem_object.c
>>> +++ b/drivers/gpu/drm/i915/gem/i915_gem_object.c
>>> @@ -476,24 +476,24 @@ static void i915_gem_free_object(struct drm_gem_object *gem_obj)
>>>  void __i915_gem_object_flush_frontbuffer(struct drm_i915_gem_object *obj,
>>>  					 enum fb_op_origin origin)
>>>  {
>>> -	struct intel_frontbuffer *front;
>>> +	struct i915_frontbuffer *front;
>>>  
>>>  	front = i915_gem_object_get_frontbuffer(obj);
>>>  	if (front) {
>>> -		intel_frontbuffer_flush(front, origin);
>>> -		intel_frontbuffer_put(front);
>>> +		intel_frontbuffer_flush(&front->base, origin);
>>> +		i915_gem_object_frontbuffer_put(front);
>>>  	}
>>>  }
>>>  
>>>  void __i915_gem_object_invalidate_frontbuffer(struct drm_i915_gem_object *obj,
>>>  					      enum fb_op_origin origin)
>>>  {
>>> -	struct intel_frontbuffer *front;
>>> +	struct i915_frontbuffer *front;
>>>  
>>>  	front = i915_gem_object_get_frontbuffer(obj);
>>>  	if (front) {
>>> -		intel_frontbuffer_invalidate(front, origin);
>>> -		intel_frontbuffer_put(front);
>>> +		intel_frontbuffer_invalidate(&front->base, origin);
>>> +		i915_gem_object_frontbuffer_put(front);
>>>  	}
>>>  }
>>>  
>>> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.c b/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.c
>>> new file mode 100644
>>> index 000000000000..7ef89613c025
>>> --- /dev/null
>>> +++ b/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.c
>>> @@ -0,0 +1,103 @@
>>> +// SPDX-License-Identifier: MIT
>>> +/* Copyright © 2025 Intel Corporation */
>>> +
>>> +#include "i915_drv.h"
>>> +#include "i915_gem_object_frontbuffer.h"
>>> +
>>> +static int frontbuffer_active(struct i915_active *ref)
>>> +{
>>> +	struct i915_frontbuffer *front =
>>> +		container_of(ref, typeof(*front), write);
>>> +
>>> +	kref_get(&front->ref);
>>> +	return 0;
>>> +}
>>> +
>>> +static void frontbuffer_retire(struct i915_active *ref)
>>> +{
>>> +	struct i915_frontbuffer *front =
>>> +		container_of(ref, typeof(*front), write);
>>> +
>>> +	intel_frontbuffer_flush(&front->base, ORIGIN_CS);
>>> +	i915_gem_object_frontbuffer_put(front);
>>> +}
>>> +
>>> +struct i915_frontbuffer *
>>> +i915_gem_object_frontbuffer_get(struct drm_i915_gem_object *obj)
>>> +{
>>> +	struct drm_i915_private *i915 = to_i915(obj->base.dev);
>>> +	struct i915_frontbuffer *front, *cur;
>>> +
>>> +	front = i915_gem_object_get_frontbuffer(obj);
>>> +	if (front)
>>> +		return front;
>>> +
>>> +	front = kmalloc(sizeof(*front), GFP_KERNEL);
>>> +	if (!front)
>>> +		return NULL;
>>> +
>>> +	intel_frontbuffer_init(&front->base, &i915->drm);
>>> +
>>> +	kref_init(&front->ref);
>>> +	i915_gem_object_get(obj);
>>> +	front->obj = obj;
>>> +
>>> +	i915_active_init(&front->write,
>>> +			 frontbuffer_active,
>>> +			 frontbuffer_retire,
>>> +			 I915_ACTIVE_RETIRE_SLEEPS);
>>> +
>>> +	spin_lock(&i915->frontbuffer_lock);
>>> +	if (rcu_access_pointer(obj->frontbuffer)) {
>>> +		cur = rcu_dereference_protected(obj->frontbuffer, true);
>>> +		kref_get(&cur->ref);
>>> +	} else {
>>> +		cur = front;
>>> +		rcu_assign_pointer(obj->frontbuffer, front);
>>> +	}
>>> +	spin_unlock(&i915->frontbuffer_lock);
>>> +
>>> +	if (cur != front) {
>>> +		i915_gem_object_put(obj);
>>> +		intel_frontbuffer_fini(&front->base);
>>> +		kfree(front);
>>> +	}
>>> +
>>> +	return cur;
>>> +}
>>> +
>>> +void i915_gem_object_frontbuffer_ref(struct i915_frontbuffer *front)
>>> +{
>>> +	kref_get(&front->ref);
>>> +}
>>> +
>>> +static void frontbuffer_release(struct kref *ref)
>>> +	__releases(&i915->frontbuffer_lock)
>>> +{
>>> +	struct i915_frontbuffer *front =
>>> +		container_of(ref, typeof(*front), ref);
>>> +	struct drm_i915_gem_object *obj = front->obj;
>>> +	struct drm_i915_private *i915 = to_i915(obj->base.dev);
>>> +
>>> +	i915_ggtt_clear_scanout(obj);
>>> +
>>> +	RCU_INIT_POINTER(obj->frontbuffer, NULL);
>>> +
>>> +	spin_unlock(&i915->frontbuffer_lock);
>>> +
>>> +	i915_active_fini(&front->write);
>>> +
>>> +	i915_gem_object_put(obj);
>>> +
>>> +	intel_frontbuffer_fini(&front->base);
>>> +
>>> +	kfree_rcu(front, rcu);
>>> +}
>>> +
>>> +void i915_gem_object_frontbuffer_put(struct i915_frontbuffer *front)
>>> +{
>>> +	struct drm_i915_private *i915 = to_i915(front->obj->base.dev);
>>> +
>>> +	kref_put_lock(&front->ref, frontbuffer_release,
>>> +		      &i915->frontbuffer_lock);
>>> +}
>>> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.h b/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.h
>>> index 1ec382c43aee..385f7e8049b8 100644
>>> --- a/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.h
>>> +++ b/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.h
>>> @@ -12,6 +12,14 @@
>>>  #include "display/intel_frontbuffer.h"
>>>  #include "i915_gem_object_types.h"
>>>  
>>> +struct i915_frontbuffer {
>>> +	struct intel_frontbuffer base;
>>> +	struct drm_i915_gem_object *obj;
>>> +	struct i915_active write;
>>> +	struct rcu_head rcu;
>>> +	struct kref ref;
>>> +};
>>> +
>>>  void __i915_gem_object_flush_frontbuffer(struct drm_i915_gem_object *obj,
>>>  					 enum fb_op_origin origin);
>>>  void __i915_gem_object_invalidate_frontbuffer(struct drm_i915_gem_object *obj,
>>> @@ -33,6 +41,10 @@ i915_gem_object_invalidate_frontbuffer(struct drm_i915_gem_object *obj,
>>>  		__i915_gem_object_invalidate_frontbuffer(obj, origin);
>>>  }
>>>  
>>> +struct i915_frontbuffer *i915_gem_object_frontbuffer_get(struct drm_i915_gem_object *obj);
>>> +void i915_gem_object_frontbuffer_ref(struct i915_frontbuffer *front);
>>> +void i915_gem_object_frontbuffer_put(struct i915_frontbuffer *front);
>>> +
>>>  /**
>>>   * i915_gem_object_get_frontbuffer - Get the object's frontbuffer
>>>   * @obj: The object whose frontbuffer to get.
>>> @@ -42,10 +54,10 @@ i915_gem_object_invalidate_frontbuffer(struct drm_i915_gem_object *obj,
>>>   *
>>>   * Return: pointer to object's frontbuffer is such exists or NULL
>>>   */
>>> -static inline struct intel_frontbuffer *
>>> +static inline struct i915_frontbuffer *
>>>  i915_gem_object_get_frontbuffer(const struct drm_i915_gem_object *obj)
>>>  {
>>> -	struct intel_frontbuffer *front;
>>> +	struct i915_frontbuffer *front;
>>>  
>>>  	if (likely(!rcu_access_pointer(obj->frontbuffer)))
>>>  		return NULL;
>>> @@ -62,41 +74,11 @@ i915_gem_object_get_frontbuffer(const struct drm_i915_gem_object *obj)
>>>  		if (likely(front == rcu_access_pointer(obj->frontbuffer)))
>>>  			break;
>>>  
>>> -		intel_frontbuffer_put(front);
>>> +		i915_gem_object_frontbuffer_put(front);
>>>  	} while (1);
>>>  	rcu_read_unlock();
>>>  
>>>  	return front;
>>>  }
>>>  
>>> -/**
>>> - * i915_gem_object_set_frontbuffer - Set the object's frontbuffer
>>> - * @obj: The object whose frontbuffer to set.
>>> - * @front: The frontbuffer to set
>>> - *
>>> - * Set object's frontbuffer pointer. If frontbuffer is already set for the
>>> - * object keep it and return it's pointer to the caller. Please note that RCU
>>> - * mechanism is used to handle e.g. ongoing removal of frontbuffer pointer. This
>>> - * function is protected by i915->display->fb_tracking.frontbuffer_lock
>>> - *
>>> - * Return: pointer to frontbuffer which was set.
>>> - */
>>> -static inline struct intel_frontbuffer *
>>> -i915_gem_object_set_frontbuffer(struct drm_i915_gem_object *obj,
>>> -				struct intel_frontbuffer *front)
>>> -{
>>> -	struct intel_frontbuffer *cur = front;
>>> -
>>> -	if (!front) {
>>> -		RCU_INIT_POINTER(obj->frontbuffer, NULL);
>>> -	} else if (rcu_access_pointer(obj->frontbuffer)) {
>>> -		cur = rcu_dereference_protected(obj->frontbuffer, true);
>>> -		kref_get(&cur->ref);
>>> -	} else {
>>> -		rcu_assign_pointer(obj->frontbuffer, front);
>>> -	}
>>> -
>>> -	return cur;
>>> -}
>>> -
>>>  #endif
>>> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object_types.h b/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
>>> index 64600aa8227f..465ce94aee76 100644
>>> --- a/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
>>> +++ b/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
>>> @@ -574,7 +574,7 @@ struct drm_i915_gem_object {
>>>  	 */
>>>  	u16 write_domain;
>>>  
>>> -	struct intel_frontbuffer __rcu *frontbuffer;
>>> +	struct i915_frontbuffer __rcu *frontbuffer;
>>>  
>>>  	/** Current tiling stride for the object, if it's tiled. */
>>>  	unsigned int tiling_and_stride;
>>> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
>>> index 95f9ddf22ce4..5381a934a671 100644
>>> --- a/drivers/gpu/drm/i915/i915_drv.h
>>> +++ b/drivers/gpu/drm/i915/i915_drv.h
>>> @@ -311,6 +311,8 @@ struct drm_i915_private {
>>>  		struct file *mmap_singleton;
>>>  	} gem;
>>>  
>>> +	spinlock_t frontbuffer_lock; /* protects obj->frontbuffer (write-side) */
>>> +
>>>  	struct intel_pxp *pxp;
>>>  
>>>  	struct i915_pmu pmu;
>>> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
>>> index e14a0c3db999..39b747c3e223 100644
>>> --- a/drivers/gpu/drm/i915/i915_gem.c
>>> +++ b/drivers/gpu/drm/i915/i915_gem.c
>>> @@ -1298,6 +1298,8 @@ void i915_gem_init_early(struct drm_i915_private *dev_priv)
>>>  {
>>>  	i915_gem_init__mm(dev_priv);
>>>  	i915_gem_init__contexts(dev_priv);
>>> +
>>> +	spin_lock_init(&dev_priv->frontbuffer_lock);
>>>  }
>>>  
>>>  void i915_gem_cleanup_early(struct drm_i915_private *dev_priv)
>>> diff --git a/drivers/gpu/drm/i915/i915_vma.c b/drivers/gpu/drm/i915/i915_vma.c
>>> index 25e97031d76e..cb36daaa101d 100644
>>> --- a/drivers/gpu/drm/i915/i915_vma.c
>>> +++ b/drivers/gpu/drm/i915/i915_vma.c
>>> @@ -1990,13 +1990,13 @@ int _i915_vma_move_to_active(struct i915_vma *vma,
>>>  	}
>>>  
>>>  	if (flags & EXEC_OBJECT_WRITE) {
>>> -		struct intel_frontbuffer *front;
>>> +		struct i915_frontbuffer *front;
>>>  
>>>  		front = i915_gem_object_get_frontbuffer(obj);
>>>  		if (unlikely(front)) {
>>> -			if (intel_frontbuffer_invalidate(front, ORIGIN_CS))
>>> +			if (intel_frontbuffer_invalidate(&front->base, ORIGIN_CS))
>>>  				i915_active_add_request(&front->write, rq);
>>> -			intel_frontbuffer_put(front);
>>> +			i915_gem_object_frontbuffer_put(front);
>>>  		}
>>>  	}
>>>  
>>> diff --git a/drivers/gpu/drm/xe/compat-i915-headers/i915_vma.h b/drivers/gpu/drm/xe/compat-i915-headers/i915_vma.h
>>> index 4465c40f8134..b17e3bab23d5 100644
>>> --- a/drivers/gpu/drm/xe/compat-i915-headers/i915_vma.h
>>> +++ b/drivers/gpu/drm/xe/compat-i915-headers/i915_vma.h
>>> @@ -26,8 +26,6 @@ struct i915_vma {
>>>  	struct xe_ggtt_node *node;
>>>  };
>>>  
>>> -#define i915_ggtt_clear_scanout(bo) do { } while (0)
>>> -
>>>  #define i915_vma_fence_id(vma) -1
>>>  
>>>  static inline u32 i915_ggtt_offset(const struct i915_vma *vma)
>>> diff --git a/drivers/gpu/drm/xe/display/intel_bo.c b/drivers/gpu/drm/xe/display/intel_bo.c
>>> index 2437c00a2d3e..bad2243b9114 100644
>>> --- a/drivers/gpu/drm/xe/display/intel_bo.c
>>> +++ b/drivers/gpu/drm/xe/display/intel_bo.c
>>> @@ -5,6 +5,7 @@
>>>  
>>>  #include "xe_bo.h"
>>>  #include "intel_bo.h"
>>> +#include "intel_frontbuffer.h"
>>>  
>>>  bool intel_bo_is_tiled(struct drm_gem_object *obj)
>>>  {
>>> @@ -40,15 +41,56 @@ int intel_bo_read_from_page(struct drm_gem_object *obj, u64 offset, void *dst, i
>>>  	return xe_bo_read(bo, offset, dst, size);
>>>  }
>>>  
>>> -struct intel_frontbuffer *intel_bo_get_frontbuffer(struct drm_gem_object *obj)
>>> +struct xe_frontbuffer {
>>> +	struct intel_frontbuffer base;
>>> +	struct drm_gem_object *obj;
>>> +	struct kref ref;
>>> +};
>>> +
>>> +struct intel_frontbuffer *intel_bo_frontbuffer_get(struct drm_gem_object *obj)
>>>  {
>>> -	return NULL;
>>> +	struct xe_frontbuffer *front;
>>> +
>>> +	front = kmalloc(sizeof(*front), GFP_KERNEL);
>>> +	if (!front)
>>> +		return NULL;
>>> +
>>> +	intel_frontbuffer_init(&front->base, obj->dev);
>>> +
>>> +	kref_init(&front->ref);
>>> +
>>> +	drm_gem_object_get(obj);
>>> +	front->obj = obj;
>>> +
>>> +	return &front->base;
>>>  }
>>>  
>>> -struct intel_frontbuffer *intel_bo_set_frontbuffer(struct drm_gem_object *obj,
>>> -						   struct intel_frontbuffer *front)
>>> +void intel_bo_frontbuffer_ref(struct intel_frontbuffer *_front)
>>>  {
>>> -	return front;
>>> +	struct xe_frontbuffer *front =
>>> +		container_of(_front, typeof(*front), base);
>>> +
>>> +	kref_get(&front->ref);
>>> +}
>>> +
>>> +static void frontbuffer_release(struct kref *ref)
>>> +{
>>> +	struct xe_frontbuffer *front =
>>> +		container_of(ref, typeof(*front), ref);
>>> +
>>> +	intel_frontbuffer_fini(&front->base);
>>> +
>>> +	drm_gem_object_put(front->obj);
>>> +
>>> +	kfree(front);
>>> +}
>>> +
>>> +void intel_bo_frontbuffer_put(struct intel_frontbuffer *_front)
>>> +{
>>> +	struct xe_frontbuffer *front =
>>> +		container_of(_front, typeof(*front), base);
>>> +
>>> +	kref_put(&front->ref, frontbuffer_release);
>>>  }
>>>  
>>>  void intel_bo_frontbuffer_flush_for_display(struct intel_frontbuffer *front)

-- 
Jani Nikula, Intel

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

* Re: [PATCH v2 09/10] drm/i915/frontbuffer: Fix intel_frontbuffer lifetime handling
  2025-11-06 13:48       ` Jani Nikula
@ 2025-11-06 14:27         ` Ville Syrjälä
  2025-11-07 18:45           ` Ville Syrjälä
  0 siblings, 1 reply; 20+ messages in thread
From: Ville Syrjälä @ 2025-11-06 14:27 UTC (permalink / raw)
  To: Jani Nikula; +Cc: intel-gfx, intel-xe

On Thu, Nov 06, 2025 at 03:48:25PM +0200, Jani Nikula wrote:
> On Wed, 29 Oct 2025, Jani Nikula <jani.nikula@intel.com> wrote:
> > On Wed, 29 Oct 2025, Jani Nikula <jani.nikula@intel.com> wrote:
> >> On Thu, 16 Oct 2025, Ville Syrjala <ville.syrjala@linux.intel.com> wrote:
> >>> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
> >>>
> >>> The current attempted split between xe/i915 vs. display
> >>> for intel_frontbuffer is a mess:
> >>> - the i915 rcu leaks through the interface to the display side
> >>> - the obj->frontbuffer write-side is now protected by a display
> >>>   specific spinlock even though the actual obj->framebuffer
> >>>   pointer lives in a i915 specific structure
> >>> - the kref is getting poked directly from both sides
> >>> - i915_active is still on the display side
> >>>
> >>> Clean up the mess by moving everything about the frontbuffer
> >>> lifetime management to the i915/xe side:
> >>> - the rcu usage is now completely contained in i915
> >>> - frontbuffer_lock is moved into i915
> >>> - kref is on the i915/xe side (xe needs the refcount as well
> >>>   due to intel_frontbuffer_queue_flush()->intel_frontbuffer_ref())
> >>> - the bo (and its refcounting) is no longer on the display side
> >>> - i915_active is contained in i915
> >>>
> >>> I was pondering whether we could do this in some kind of smaller
> >>> steps, and perhaps we could, but it would probably have to start
> >>> with a bunch of reverts (which for sure won't go cleanly anymore).
> >>> So not convinced it's worth the hassle.
> >>
> >> It's a PITA to review, that's for sure. :p
> >>
> >> I'm not particularly fond of embedding struct intel_frontbuffer inside
> >> struct i915_frontbuffer and struct xe_frontbuffer, because it means i915
> >> and xe will need to know the struct intel_frontbuffer definition. If we
> >> can't live with the embedding long term, we'll probably need opaque
> >> pointers back and forth.
> >>
> >> That said, I think the overall change here is net positive, and makes
> >> life much easier. We don't have to fix everything at once, so let's go
> >> with this.
> >>
> >> I didn't spot any obvious issues, but my confidence level with the
> >> review is super low. :(
> >>
> >> I guess the alternatives are to just go with that, trusting CI, or give
> >> me more time to review. I'm fine either way, as I can trust you to step
> >> up if it goes crashing down. ;)
> >
> > One approach is to send 1-8 first, get CI, get them merged, and then do
> > 9-10 separately, to get separate CI. Maybe? *shrug*
> 
> Any conclusions on this? Just merge the whole thing as-is rather than
> let it go stale...?

I think we could just merge as is. Pretty sure I didn't have any
real functional changes in there.

> 
> BR,
> Jani.
> 
> 
> >
> >>
> >> BR,
> >> Jani.
> >>
> >> PS. I think patches 1-2 are fine with the acks alone.
> >>
> >>>
> >>> Acked-by: Jani Nikula <jani.nikula@intel.com>
> >>> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> >>> ---
> >>>  drivers/gpu/drm/i915/Makefile                 |   1 +
> >>>  drivers/gpu/drm/i915/display/intel_bo.c       |  34 ++++--
> >>>  drivers/gpu/drm/i915/display/intel_bo.h       |   6 +-
> >>>  .../gpu/drm/i915/display/intel_display_core.h |   3 -
> >>>  .../drm/i915/display/intel_display_driver.c   |   1 -
> >>>  .../gpu/drm/i915/display/intel_frontbuffer.c  |  89 ++-------------
> >>>  .../gpu/drm/i915/display/intel_frontbuffer.h  |  13 +--
> >>>  drivers/gpu/drm/i915/gem/i915_gem_object.c    |  12 +-
> >>>  .../i915/gem/i915_gem_object_frontbuffer.c    | 103 ++++++++++++++++++
> >>>  .../i915/gem/i915_gem_object_frontbuffer.h    |  48 +++-----
> >>>  .../gpu/drm/i915/gem/i915_gem_object_types.h  |   2 +-
> >>>  drivers/gpu/drm/i915/i915_drv.h               |   2 +
> >>>  drivers/gpu/drm/i915/i915_gem.c               |   2 +
> >>>  drivers/gpu/drm/i915/i915_vma.c               |   6 +-
> >>>  .../gpu/drm/xe/compat-i915-headers/i915_vma.h |   2 -
> >>>  drivers/gpu/drm/xe/display/intel_bo.c         |  52 ++++++++-
> >>>  16 files changed, 227 insertions(+), 149 deletions(-)
> >>>  create mode 100644 drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.c
> >>>
> >>> diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
> >>> index aa2f0fd95117..717e57205c85 100644
> >>> --- a/drivers/gpu/drm/i915/Makefile
> >>> +++ b/drivers/gpu/drm/i915/Makefile
> >>> @@ -155,6 +155,7 @@ gem-y += \
> >>>  	gem/i915_gem_lmem.o \
> >>>  	gem/i915_gem_mman.o \
> >>>  	gem/i915_gem_object.o \
> >>> +	gem/i915_gem_object_frontbuffer.o \
> >>>  	gem/i915_gem_pages.o \
> >>>  	gem/i915_gem_phys.o \
> >>>  	gem/i915_gem_pm.o \
> >>> diff --git a/drivers/gpu/drm/i915/display/intel_bo.c b/drivers/gpu/drm/i915/display/intel_bo.c
> >>> index 2792aca7bc22..f3687eb63467 100644
> >>> --- a/drivers/gpu/drm/i915/display/intel_bo.c
> >>> +++ b/drivers/gpu/drm/i915/display/intel_bo.c
> >>> @@ -39,20 +39,40 @@ int intel_bo_read_from_page(struct drm_gem_object *obj, u64 offset, void *dst, i
> >>>  	return i915_gem_object_read_from_page(to_intel_bo(obj), offset, dst, size);
> >>>  }
> >>>  
> >>> -struct intel_frontbuffer *intel_bo_get_frontbuffer(struct drm_gem_object *obj)
> >>> +struct intel_frontbuffer *intel_bo_frontbuffer_get(struct drm_gem_object *_obj)
> >>>  {
> >>> -	return i915_gem_object_get_frontbuffer(to_intel_bo(obj));
> >>> +	struct drm_i915_gem_object *obj = to_intel_bo(_obj);
> >>> +	struct i915_frontbuffer *front;
> >>> +
> >>> +	front = i915_gem_object_frontbuffer_get(obj);
> >>> +	if (!front)
> >>> +		return NULL;
> >>> +
> >>> +	return &front->base;
> >>> +}
> >>> +
> >>> +void intel_bo_frontbuffer_ref(struct intel_frontbuffer *_front)
> >>> +{
> >>> +	struct i915_frontbuffer *front =
> >>> +		container_of(_front, typeof(*front), base);
> >>> +
> >>> +	i915_gem_object_frontbuffer_ref(front);
> >>>  }
> >>>  
> >>> -struct intel_frontbuffer *intel_bo_set_frontbuffer(struct drm_gem_object *obj,
> >>> -						   struct intel_frontbuffer *front)
> >>> +void intel_bo_frontbuffer_put(struct intel_frontbuffer *_front)
> >>>  {
> >>> -	return i915_gem_object_set_frontbuffer(to_intel_bo(obj), front);
> >>> +	struct i915_frontbuffer *front =
> >>> +		container_of(_front, typeof(*front), base);
> >>> +
> >>> +	return i915_gem_object_frontbuffer_put(front);
> >>>  }
> >>>  
> >>> -void intel_bo_frontbuffer_flush_for_display(struct intel_frontbuffer *front)
> >>> +void intel_bo_frontbuffer_flush_for_display(struct intel_frontbuffer *_front)
> >>>  {
> >>> -	i915_gem_object_flush_if_display(to_intel_bo(front->obj));
> >>> +	struct i915_frontbuffer *front =
> >>> +		container_of(_front, typeof(*front), base);
> >>> +
> >>> +	i915_gem_object_flush_if_display(front->obj);
> >>>  }
> >>>  
> >>>  void intel_bo_describe(struct seq_file *m, struct drm_gem_object *obj)
> >>> diff --git a/drivers/gpu/drm/i915/display/intel_bo.h b/drivers/gpu/drm/i915/display/intel_bo.h
> >>> index 08247bf36d40..fc05f680dc76 100644
> >>> --- a/drivers/gpu/drm/i915/display/intel_bo.h
> >>> +++ b/drivers/gpu/drm/i915/display/intel_bo.h
> >>> @@ -19,9 +19,9 @@ bool intel_bo_is_protected(struct drm_gem_object *obj);
> >>>  int intel_bo_fb_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma);
> >>>  int intel_bo_read_from_page(struct drm_gem_object *obj, u64 offset, void *dst, int size);
> >>>  
> >>> -struct intel_frontbuffer *intel_bo_get_frontbuffer(struct drm_gem_object *obj);
> >>> -struct intel_frontbuffer *intel_bo_set_frontbuffer(struct drm_gem_object *obj,
> >>> -						   struct intel_frontbuffer *front);
> >>> +struct intel_frontbuffer *intel_bo_frontbuffer_get(struct drm_gem_object *obj);
> >>> +void intel_bo_frontbuffer_ref(struct intel_frontbuffer *front);
> >>> +void intel_bo_frontbuffer_put(struct intel_frontbuffer *front);
> >>>  void intel_bo_frontbuffer_flush_for_display(struct intel_frontbuffer *front);
> >>>  
> >>>  void intel_bo_describe(struct seq_file *m, struct drm_gem_object *obj);
> >>> diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h b/drivers/gpu/drm/i915/display/intel_display_core.h
> >>> index 13576d07c999..34d578e2cc25 100644
> >>> --- a/drivers/gpu/drm/i915/display/intel_display_core.h
> >>> +++ b/drivers/gpu/drm/i915/display/intel_display_core.h
> >>> @@ -141,9 +141,6 @@ struct intel_dpll_global {
> >>>  };
> >>>  
> >>>  struct intel_frontbuffer_tracking {
> >>> -	/* protects obj->frontbuffer (write-side) */
> >>> -	spinlock_t frontbuffer_lock;
> >>> -
> >>>  	/* protects busy_bits */
> >>>  	spinlock_t lock;
> >>>  
> >>> diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c b/drivers/gpu/drm/i915/display/intel_display_driver.c
> >>> index ac684f8c5d40..f84a0b26b7a6 100644
> >>> --- a/drivers/gpu/drm/i915/display/intel_display_driver.c
> >>> +++ b/drivers/gpu/drm/i915/display/intel_display_driver.c
> >>> @@ -184,7 +184,6 @@ void intel_display_driver_early_probe(struct intel_display *display)
> >>>  	if (!HAS_DISPLAY(display))
> >>>  		return;
> >>>  
> >>> -	spin_lock_init(&display->fb_tracking.frontbuffer_lock);
> >>>  	spin_lock_init(&display->fb_tracking.lock);
> >>>  	mutex_init(&display->backlight.lock);
> >>>  	mutex_init(&display->audio.mutex);
> >>> diff --git a/drivers/gpu/drm/i915/display/intel_frontbuffer.c b/drivers/gpu/drm/i915/display/intel_frontbuffer.c
> >>> index 5d627eac07bd..4761e116e442 100644
> >>> --- a/drivers/gpu/drm/i915/display/intel_frontbuffer.c
> >>> +++ b/drivers/gpu/drm/i915/display/intel_frontbuffer.c
> >>> @@ -57,8 +57,6 @@
> >>>  
> >>>  #include <drm/drm_gem.h>
> >>>  
> >>> -#include "i915_active.h"
> >>> -#include "i915_vma.h"
> >>>  #include "intel_bo.h"
> >>>  #include "intel_display_trace.h"
> >>>  #include "intel_display_types.h"
> >>> @@ -167,7 +165,7 @@ void __intel_fb_flush(struct intel_frontbuffer *front,
> >>>  
> >>>  static void intel_frontbuffer_ref(struct intel_frontbuffer *front)
> >>>  {
> >>> -	kref_get(&front->ref);
> >>> +	intel_bo_frontbuffer_ref(front);
> >>>  }
> >>>  
> >>>  static void intel_frontbuffer_flush_work(struct work_struct *work)
> >>> @@ -196,89 +194,26 @@ void intel_frontbuffer_queue_flush(struct intel_frontbuffer *front)
> >>>  		intel_frontbuffer_put(front);
> >>>  }
> >>>  
> >>> -static int frontbuffer_active(struct i915_active *ref)
> >>> +void intel_frontbuffer_init(struct intel_frontbuffer *front, struct drm_device *drm)
> >>>  {
> >>> -	struct intel_frontbuffer *front =
> >>> -		container_of(ref, typeof(*front), write);
> >>> -
> >>> -	kref_get(&front->ref);
> >>> -	return 0;
> >>> -}
> >>> -
> >>> -static void frontbuffer_retire(struct i915_active *ref)
> >>> -{
> >>> -	struct intel_frontbuffer *front =
> >>> -		container_of(ref, typeof(*front), write);
> >>> -
> >>> -	intel_frontbuffer_flush(front, ORIGIN_CS);
> >>> -	intel_frontbuffer_put(front);
> >>> -}
> >>> -
> >>> -static void frontbuffer_release(struct kref *ref)
> >>> -	__releases(&front->display->fb_tracking.frontbuffer_lock)
> >>> -{
> >>> -	struct intel_frontbuffer *ret, *front =
> >>> -		container_of(ref, typeof(*front), ref);
> >>> -	struct intel_display *display = front->display;
> >>> -	struct drm_gem_object *obj = front->obj;
> >>> -
> >>> -	drm_WARN_ON(display->drm, atomic_read(&front->bits));
> >>> -
> >>> -	i915_ggtt_clear_scanout(to_intel_bo(obj));
> >>> -
> >>> -	ret = intel_bo_set_frontbuffer(obj, NULL);
> >>> -	drm_WARN_ON(display->drm, ret);
> >>> -	spin_unlock(&display->fb_tracking.frontbuffer_lock);
> >>> -
> >>> -	i915_active_fini(&front->write);
> >>> -
> >>> -	drm_gem_object_put(obj);
> >>> -	kfree_rcu(front, rcu);
> >>> -}
> >>> -
> >>> -struct intel_frontbuffer *
> >>> -intel_frontbuffer_get(struct drm_gem_object *obj)
> >>> -{
> >>> -	struct intel_display *display = to_intel_display(obj->dev);
> >>> -	struct intel_frontbuffer *front, *cur;
> >>> -
> >>> -	front = intel_bo_get_frontbuffer(obj);
> >>> -	if (front)
> >>> -		return front;
> >>> -
> >>> -	front = kmalloc(sizeof(*front), GFP_KERNEL);
> >>> -	if (!front)
> >>> -		return NULL;
> >>> -
> >>> -	drm_gem_object_get(obj);
> >>> -
> >>> -	front->obj = obj;
> >>> -	front->display = display;
> >>> -	kref_init(&front->ref);
> >>> +	front->display = to_intel_display(drm);
> >>>  	atomic_set(&front->bits, 0);
> >>> -	i915_active_init(&front->write,
> >>> -			 frontbuffer_active,
> >>> -			 frontbuffer_retire,
> >>> -			 I915_ACTIVE_RETIRE_SLEEPS);
> >>>  	INIT_WORK(&front->flush_work, intel_frontbuffer_flush_work);
> >>> +}
> >>>  
> >>> -	spin_lock(&display->fb_tracking.frontbuffer_lock);
> >>> -	cur = intel_bo_set_frontbuffer(obj, front);
> >>> -	spin_unlock(&display->fb_tracking.frontbuffer_lock);
> >>> +void intel_frontbuffer_fini(struct intel_frontbuffer *front)
> >>> +{
> >>> +	drm_WARN_ON(front->display->drm, atomic_read(&front->bits));
> >>> +}
> >>>  
> >>> -	if (cur != front) {
> >>> -		drm_gem_object_put(obj);
> >>> -		kfree(front);
> >>> -	}
> >>> -
> >>> -	return cur;
> >>> +struct intel_frontbuffer *intel_frontbuffer_get(struct drm_gem_object *obj)
> >>> +{
> >>> +	return intel_bo_frontbuffer_get(obj);
> >>>  }
> >>>  
> >>>  void intel_frontbuffer_put(struct intel_frontbuffer *front)
> >>>  {
> >>> -	kref_put_lock(&front->ref,
> >>> -		      frontbuffer_release,
> >>> -		      &front->display->fb_tracking.frontbuffer_lock);
> >>> +	intel_bo_frontbuffer_put(front);
> >>>  }
> >>>  
> >>>  /**
> >>> diff --git a/drivers/gpu/drm/i915/display/intel_frontbuffer.h b/drivers/gpu/drm/i915/display/intel_frontbuffer.h
> >>> index ff2a6ac75a34..22677acb4c06 100644
> >>> --- a/drivers/gpu/drm/i915/display/intel_frontbuffer.h
> >>> +++ b/drivers/gpu/drm/i915/display/intel_frontbuffer.h
> >>> @@ -26,10 +26,9 @@
> >>>  
> >>>  #include <linux/atomic.h>
> >>>  #include <linux/bits.h>
> >>> -#include <linux/kref.h>
> >>> -
> >>> -#include "i915_active_types.h"
> >>> +#include <linux/workqueue_types.h>
> >>>  
> >>> +struct drm_device;
> >>>  struct drm_gem_object;
> >>>  struct intel_display;
> >>>  
> >>> @@ -42,13 +41,8 @@ enum fb_op_origin {
> >>>  };
> >>>  
> >>>  struct intel_frontbuffer {
> >>> -	struct kref ref;
> >>>  	struct intel_display *display;
> >>>  	atomic_t bits;
> >>> -	struct i915_active write;
> >>> -	struct drm_gem_object *obj;
> >>> -	struct rcu_head rcu;
> >>> -
> >>>  	struct work_struct flush_work;
> >>>  };
> >>>  
> >>> @@ -141,4 +135,7 @@ void intel_frontbuffer_track(struct intel_frontbuffer *old,
> >>>  			     struct intel_frontbuffer *new,
> >>>  			     unsigned int frontbuffer_bits);
> >>>  
> >>> +void intel_frontbuffer_init(struct intel_frontbuffer *front, struct drm_device *drm);
> >>> +void intel_frontbuffer_fini(struct intel_frontbuffer *front);
> >>> +
> >>>  #endif /* __INTEL_FRONTBUFFER_H__ */
> >>> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.c b/drivers/gpu/drm/i915/gem/i915_gem_object.c
> >>> index 478011e5ecb3..36680eddf88e 100644
> >>> --- a/drivers/gpu/drm/i915/gem/i915_gem_object.c
> >>> +++ b/drivers/gpu/drm/i915/gem/i915_gem_object.c
> >>> @@ -476,24 +476,24 @@ static void i915_gem_free_object(struct drm_gem_object *gem_obj)
> >>>  void __i915_gem_object_flush_frontbuffer(struct drm_i915_gem_object *obj,
> >>>  					 enum fb_op_origin origin)
> >>>  {
> >>> -	struct intel_frontbuffer *front;
> >>> +	struct i915_frontbuffer *front;
> >>>  
> >>>  	front = i915_gem_object_get_frontbuffer(obj);
> >>>  	if (front) {
> >>> -		intel_frontbuffer_flush(front, origin);
> >>> -		intel_frontbuffer_put(front);
> >>> +		intel_frontbuffer_flush(&front->base, origin);
> >>> +		i915_gem_object_frontbuffer_put(front);
> >>>  	}
> >>>  }
> >>>  
> >>>  void __i915_gem_object_invalidate_frontbuffer(struct drm_i915_gem_object *obj,
> >>>  					      enum fb_op_origin origin)
> >>>  {
> >>> -	struct intel_frontbuffer *front;
> >>> +	struct i915_frontbuffer *front;
> >>>  
> >>>  	front = i915_gem_object_get_frontbuffer(obj);
> >>>  	if (front) {
> >>> -		intel_frontbuffer_invalidate(front, origin);
> >>> -		intel_frontbuffer_put(front);
> >>> +		intel_frontbuffer_invalidate(&front->base, origin);
> >>> +		i915_gem_object_frontbuffer_put(front);
> >>>  	}
> >>>  }
> >>>  
> >>> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.c b/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.c
> >>> new file mode 100644
> >>> index 000000000000..7ef89613c025
> >>> --- /dev/null
> >>> +++ b/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.c
> >>> @@ -0,0 +1,103 @@
> >>> +// SPDX-License-Identifier: MIT
> >>> +/* Copyright © 2025 Intel Corporation */
> >>> +
> >>> +#include "i915_drv.h"
> >>> +#include "i915_gem_object_frontbuffer.h"
> >>> +
> >>> +static int frontbuffer_active(struct i915_active *ref)
> >>> +{
> >>> +	struct i915_frontbuffer *front =
> >>> +		container_of(ref, typeof(*front), write);
> >>> +
> >>> +	kref_get(&front->ref);
> >>> +	return 0;
> >>> +}
> >>> +
> >>> +static void frontbuffer_retire(struct i915_active *ref)
> >>> +{
> >>> +	struct i915_frontbuffer *front =
> >>> +		container_of(ref, typeof(*front), write);
> >>> +
> >>> +	intel_frontbuffer_flush(&front->base, ORIGIN_CS);
> >>> +	i915_gem_object_frontbuffer_put(front);
> >>> +}
> >>> +
> >>> +struct i915_frontbuffer *
> >>> +i915_gem_object_frontbuffer_get(struct drm_i915_gem_object *obj)
> >>> +{
> >>> +	struct drm_i915_private *i915 = to_i915(obj->base.dev);
> >>> +	struct i915_frontbuffer *front, *cur;
> >>> +
> >>> +	front = i915_gem_object_get_frontbuffer(obj);
> >>> +	if (front)
> >>> +		return front;
> >>> +
> >>> +	front = kmalloc(sizeof(*front), GFP_KERNEL);
> >>> +	if (!front)
> >>> +		return NULL;
> >>> +
> >>> +	intel_frontbuffer_init(&front->base, &i915->drm);
> >>> +
> >>> +	kref_init(&front->ref);
> >>> +	i915_gem_object_get(obj);
> >>> +	front->obj = obj;
> >>> +
> >>> +	i915_active_init(&front->write,
> >>> +			 frontbuffer_active,
> >>> +			 frontbuffer_retire,
> >>> +			 I915_ACTIVE_RETIRE_SLEEPS);
> >>> +
> >>> +	spin_lock(&i915->frontbuffer_lock);
> >>> +	if (rcu_access_pointer(obj->frontbuffer)) {
> >>> +		cur = rcu_dereference_protected(obj->frontbuffer, true);
> >>> +		kref_get(&cur->ref);
> >>> +	} else {
> >>> +		cur = front;
> >>> +		rcu_assign_pointer(obj->frontbuffer, front);
> >>> +	}
> >>> +	spin_unlock(&i915->frontbuffer_lock);
> >>> +
> >>> +	if (cur != front) {
> >>> +		i915_gem_object_put(obj);
> >>> +		intel_frontbuffer_fini(&front->base);
> >>> +		kfree(front);
> >>> +	}
> >>> +
> >>> +	return cur;
> >>> +}
> >>> +
> >>> +void i915_gem_object_frontbuffer_ref(struct i915_frontbuffer *front)
> >>> +{
> >>> +	kref_get(&front->ref);
> >>> +}
> >>> +
> >>> +static void frontbuffer_release(struct kref *ref)
> >>> +	__releases(&i915->frontbuffer_lock)
> >>> +{
> >>> +	struct i915_frontbuffer *front =
> >>> +		container_of(ref, typeof(*front), ref);
> >>> +	struct drm_i915_gem_object *obj = front->obj;
> >>> +	struct drm_i915_private *i915 = to_i915(obj->base.dev);
> >>> +
> >>> +	i915_ggtt_clear_scanout(obj);
> >>> +
> >>> +	RCU_INIT_POINTER(obj->frontbuffer, NULL);
> >>> +
> >>> +	spin_unlock(&i915->frontbuffer_lock);
> >>> +
> >>> +	i915_active_fini(&front->write);
> >>> +
> >>> +	i915_gem_object_put(obj);
> >>> +
> >>> +	intel_frontbuffer_fini(&front->base);
> >>> +
> >>> +	kfree_rcu(front, rcu);
> >>> +}
> >>> +
> >>> +void i915_gem_object_frontbuffer_put(struct i915_frontbuffer *front)
> >>> +{
> >>> +	struct drm_i915_private *i915 = to_i915(front->obj->base.dev);
> >>> +
> >>> +	kref_put_lock(&front->ref, frontbuffer_release,
> >>> +		      &i915->frontbuffer_lock);
> >>> +}
> >>> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.h b/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.h
> >>> index 1ec382c43aee..385f7e8049b8 100644
> >>> --- a/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.h
> >>> +++ b/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.h
> >>> @@ -12,6 +12,14 @@
> >>>  #include "display/intel_frontbuffer.h"
> >>>  #include "i915_gem_object_types.h"
> >>>  
> >>> +struct i915_frontbuffer {
> >>> +	struct intel_frontbuffer base;
> >>> +	struct drm_i915_gem_object *obj;
> >>> +	struct i915_active write;
> >>> +	struct rcu_head rcu;
> >>> +	struct kref ref;
> >>> +};
> >>> +
> >>>  void __i915_gem_object_flush_frontbuffer(struct drm_i915_gem_object *obj,
> >>>  					 enum fb_op_origin origin);
> >>>  void __i915_gem_object_invalidate_frontbuffer(struct drm_i915_gem_object *obj,
> >>> @@ -33,6 +41,10 @@ i915_gem_object_invalidate_frontbuffer(struct drm_i915_gem_object *obj,
> >>>  		__i915_gem_object_invalidate_frontbuffer(obj, origin);
> >>>  }
> >>>  
> >>> +struct i915_frontbuffer *i915_gem_object_frontbuffer_get(struct drm_i915_gem_object *obj);
> >>> +void i915_gem_object_frontbuffer_ref(struct i915_frontbuffer *front);
> >>> +void i915_gem_object_frontbuffer_put(struct i915_frontbuffer *front);
> >>> +
> >>>  /**
> >>>   * i915_gem_object_get_frontbuffer - Get the object's frontbuffer
> >>>   * @obj: The object whose frontbuffer to get.
> >>> @@ -42,10 +54,10 @@ i915_gem_object_invalidate_frontbuffer(struct drm_i915_gem_object *obj,
> >>>   *
> >>>   * Return: pointer to object's frontbuffer is such exists or NULL
> >>>   */
> >>> -static inline struct intel_frontbuffer *
> >>> +static inline struct i915_frontbuffer *
> >>>  i915_gem_object_get_frontbuffer(const struct drm_i915_gem_object *obj)
> >>>  {
> >>> -	struct intel_frontbuffer *front;
> >>> +	struct i915_frontbuffer *front;
> >>>  
> >>>  	if (likely(!rcu_access_pointer(obj->frontbuffer)))
> >>>  		return NULL;
> >>> @@ -62,41 +74,11 @@ i915_gem_object_get_frontbuffer(const struct drm_i915_gem_object *obj)
> >>>  		if (likely(front == rcu_access_pointer(obj->frontbuffer)))
> >>>  			break;
> >>>  
> >>> -		intel_frontbuffer_put(front);
> >>> +		i915_gem_object_frontbuffer_put(front);
> >>>  	} while (1);
> >>>  	rcu_read_unlock();
> >>>  
> >>>  	return front;
> >>>  }
> >>>  
> >>> -/**
> >>> - * i915_gem_object_set_frontbuffer - Set the object's frontbuffer
> >>> - * @obj: The object whose frontbuffer to set.
> >>> - * @front: The frontbuffer to set
> >>> - *
> >>> - * Set object's frontbuffer pointer. If frontbuffer is already set for the
> >>> - * object keep it and return it's pointer to the caller. Please note that RCU
> >>> - * mechanism is used to handle e.g. ongoing removal of frontbuffer pointer. This
> >>> - * function is protected by i915->display->fb_tracking.frontbuffer_lock
> >>> - *
> >>> - * Return: pointer to frontbuffer which was set.
> >>> - */
> >>> -static inline struct intel_frontbuffer *
> >>> -i915_gem_object_set_frontbuffer(struct drm_i915_gem_object *obj,
> >>> -				struct intel_frontbuffer *front)
> >>> -{
> >>> -	struct intel_frontbuffer *cur = front;
> >>> -
> >>> -	if (!front) {
> >>> -		RCU_INIT_POINTER(obj->frontbuffer, NULL);
> >>> -	} else if (rcu_access_pointer(obj->frontbuffer)) {
> >>> -		cur = rcu_dereference_protected(obj->frontbuffer, true);
> >>> -		kref_get(&cur->ref);
> >>> -	} else {
> >>> -		rcu_assign_pointer(obj->frontbuffer, front);
> >>> -	}
> >>> -
> >>> -	return cur;
> >>> -}
> >>> -
> >>>  #endif
> >>> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object_types.h b/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
> >>> index 64600aa8227f..465ce94aee76 100644
> >>> --- a/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
> >>> +++ b/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
> >>> @@ -574,7 +574,7 @@ struct drm_i915_gem_object {
> >>>  	 */
> >>>  	u16 write_domain;
> >>>  
> >>> -	struct intel_frontbuffer __rcu *frontbuffer;
> >>> +	struct i915_frontbuffer __rcu *frontbuffer;
> >>>  
> >>>  	/** Current tiling stride for the object, if it's tiled. */
> >>>  	unsigned int tiling_and_stride;
> >>> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> >>> index 95f9ddf22ce4..5381a934a671 100644
> >>> --- a/drivers/gpu/drm/i915/i915_drv.h
> >>> +++ b/drivers/gpu/drm/i915/i915_drv.h
> >>> @@ -311,6 +311,8 @@ struct drm_i915_private {
> >>>  		struct file *mmap_singleton;
> >>>  	} gem;
> >>>  
> >>> +	spinlock_t frontbuffer_lock; /* protects obj->frontbuffer (write-side) */
> >>> +
> >>>  	struct intel_pxp *pxp;
> >>>  
> >>>  	struct i915_pmu pmu;
> >>> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> >>> index e14a0c3db999..39b747c3e223 100644
> >>> --- a/drivers/gpu/drm/i915/i915_gem.c
> >>> +++ b/drivers/gpu/drm/i915/i915_gem.c
> >>> @@ -1298,6 +1298,8 @@ void i915_gem_init_early(struct drm_i915_private *dev_priv)
> >>>  {
> >>>  	i915_gem_init__mm(dev_priv);
> >>>  	i915_gem_init__contexts(dev_priv);
> >>> +
> >>> +	spin_lock_init(&dev_priv->frontbuffer_lock);
> >>>  }
> >>>  
> >>>  void i915_gem_cleanup_early(struct drm_i915_private *dev_priv)
> >>> diff --git a/drivers/gpu/drm/i915/i915_vma.c b/drivers/gpu/drm/i915/i915_vma.c
> >>> index 25e97031d76e..cb36daaa101d 100644
> >>> --- a/drivers/gpu/drm/i915/i915_vma.c
> >>> +++ b/drivers/gpu/drm/i915/i915_vma.c
> >>> @@ -1990,13 +1990,13 @@ int _i915_vma_move_to_active(struct i915_vma *vma,
> >>>  	}
> >>>  
> >>>  	if (flags & EXEC_OBJECT_WRITE) {
> >>> -		struct intel_frontbuffer *front;
> >>> +		struct i915_frontbuffer *front;
> >>>  
> >>>  		front = i915_gem_object_get_frontbuffer(obj);
> >>>  		if (unlikely(front)) {
> >>> -			if (intel_frontbuffer_invalidate(front, ORIGIN_CS))
> >>> +			if (intel_frontbuffer_invalidate(&front->base, ORIGIN_CS))
> >>>  				i915_active_add_request(&front->write, rq);
> >>> -			intel_frontbuffer_put(front);
> >>> +			i915_gem_object_frontbuffer_put(front);
> >>>  		}
> >>>  	}
> >>>  
> >>> diff --git a/drivers/gpu/drm/xe/compat-i915-headers/i915_vma.h b/drivers/gpu/drm/xe/compat-i915-headers/i915_vma.h
> >>> index 4465c40f8134..b17e3bab23d5 100644
> >>> --- a/drivers/gpu/drm/xe/compat-i915-headers/i915_vma.h
> >>> +++ b/drivers/gpu/drm/xe/compat-i915-headers/i915_vma.h
> >>> @@ -26,8 +26,6 @@ struct i915_vma {
> >>>  	struct xe_ggtt_node *node;
> >>>  };
> >>>  
> >>> -#define i915_ggtt_clear_scanout(bo) do { } while (0)
> >>> -
> >>>  #define i915_vma_fence_id(vma) -1
> >>>  
> >>>  static inline u32 i915_ggtt_offset(const struct i915_vma *vma)
> >>> diff --git a/drivers/gpu/drm/xe/display/intel_bo.c b/drivers/gpu/drm/xe/display/intel_bo.c
> >>> index 2437c00a2d3e..bad2243b9114 100644
> >>> --- a/drivers/gpu/drm/xe/display/intel_bo.c
> >>> +++ b/drivers/gpu/drm/xe/display/intel_bo.c
> >>> @@ -5,6 +5,7 @@
> >>>  
> >>>  #include "xe_bo.h"
> >>>  #include "intel_bo.h"
> >>> +#include "intel_frontbuffer.h"
> >>>  
> >>>  bool intel_bo_is_tiled(struct drm_gem_object *obj)
> >>>  {
> >>> @@ -40,15 +41,56 @@ int intel_bo_read_from_page(struct drm_gem_object *obj, u64 offset, void *dst, i
> >>>  	return xe_bo_read(bo, offset, dst, size);
> >>>  }
> >>>  
> >>> -struct intel_frontbuffer *intel_bo_get_frontbuffer(struct drm_gem_object *obj)
> >>> +struct xe_frontbuffer {
> >>> +	struct intel_frontbuffer base;
> >>> +	struct drm_gem_object *obj;
> >>> +	struct kref ref;
> >>> +};
> >>> +
> >>> +struct intel_frontbuffer *intel_bo_frontbuffer_get(struct drm_gem_object *obj)
> >>>  {
> >>> -	return NULL;
> >>> +	struct xe_frontbuffer *front;
> >>> +
> >>> +	front = kmalloc(sizeof(*front), GFP_KERNEL);
> >>> +	if (!front)
> >>> +		return NULL;
> >>> +
> >>> +	intel_frontbuffer_init(&front->base, obj->dev);
> >>> +
> >>> +	kref_init(&front->ref);
> >>> +
> >>> +	drm_gem_object_get(obj);
> >>> +	front->obj = obj;
> >>> +
> >>> +	return &front->base;
> >>>  }
> >>>  
> >>> -struct intel_frontbuffer *intel_bo_set_frontbuffer(struct drm_gem_object *obj,
> >>> -						   struct intel_frontbuffer *front)
> >>> +void intel_bo_frontbuffer_ref(struct intel_frontbuffer *_front)
> >>>  {
> >>> -	return front;
> >>> +	struct xe_frontbuffer *front =
> >>> +		container_of(_front, typeof(*front), base);
> >>> +
> >>> +	kref_get(&front->ref);
> >>> +}
> >>> +
> >>> +static void frontbuffer_release(struct kref *ref)
> >>> +{
> >>> +	struct xe_frontbuffer *front =
> >>> +		container_of(ref, typeof(*front), ref);
> >>> +
> >>> +	intel_frontbuffer_fini(&front->base);
> >>> +
> >>> +	drm_gem_object_put(front->obj);
> >>> +
> >>> +	kfree(front);
> >>> +}
> >>> +
> >>> +void intel_bo_frontbuffer_put(struct intel_frontbuffer *_front)
> >>> +{
> >>> +	struct xe_frontbuffer *front =
> >>> +		container_of(_front, typeof(*front), base);
> >>> +
> >>> +	kref_put(&front->ref, frontbuffer_release);
> >>>  }
> >>>  
> >>>  void intel_bo_frontbuffer_flush_for_display(struct intel_frontbuffer *front)
> 
> -- 
> Jani Nikula, Intel

-- 
Ville Syrjälä
Intel

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

* Re: [PATCH v2 09/10] drm/i915/frontbuffer: Fix intel_frontbuffer lifetime handling
  2025-11-06 14:27         ` Ville Syrjälä
@ 2025-11-07 18:45           ` Ville Syrjälä
  0 siblings, 0 replies; 20+ messages in thread
From: Ville Syrjälä @ 2025-11-07 18:45 UTC (permalink / raw)
  To: Jani Nikula; +Cc: intel-gfx, intel-xe

On Thu, Nov 06, 2025 at 04:27:42PM +0200, Ville Syrjälä wrote:
> On Thu, Nov 06, 2025 at 03:48:25PM +0200, Jani Nikula wrote:
> > On Wed, 29 Oct 2025, Jani Nikula <jani.nikula@intel.com> wrote:
> > > On Wed, 29 Oct 2025, Jani Nikula <jani.nikula@intel.com> wrote:
> > >> On Thu, 16 Oct 2025, Ville Syrjala <ville.syrjala@linux.intel.com> wrote:
> > >>> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
> > >>>
> > >>> The current attempted split between xe/i915 vs. display
> > >>> for intel_frontbuffer is a mess:
> > >>> - the i915 rcu leaks through the interface to the display side
> > >>> - the obj->frontbuffer write-side is now protected by a display
> > >>>   specific spinlock even though the actual obj->framebuffer
> > >>>   pointer lives in a i915 specific structure
> > >>> - the kref is getting poked directly from both sides
> > >>> - i915_active is still on the display side
> > >>>
> > >>> Clean up the mess by moving everything about the frontbuffer
> > >>> lifetime management to the i915/xe side:
> > >>> - the rcu usage is now completely contained in i915
> > >>> - frontbuffer_lock is moved into i915
> > >>> - kref is on the i915/xe side (xe needs the refcount as well
> > >>>   due to intel_frontbuffer_queue_flush()->intel_frontbuffer_ref())
> > >>> - the bo (and its refcounting) is no longer on the display side
> > >>> - i915_active is contained in i915
> > >>>
> > >>> I was pondering whether we could do this in some kind of smaller
> > >>> steps, and perhaps we could, but it would probably have to start
> > >>> with a bunch of reverts (which for sure won't go cleanly anymore).
> > >>> So not convinced it's worth the hassle.
> > >>
> > >> It's a PITA to review, that's for sure. :p
> > >>
> > >> I'm not particularly fond of embedding struct intel_frontbuffer inside
> > >> struct i915_frontbuffer and struct xe_frontbuffer, because it means i915
> > >> and xe will need to know the struct intel_frontbuffer definition. If we
> > >> can't live with the embedding long term, we'll probably need opaque
> > >> pointers back and forth.
> > >>
> > >> That said, I think the overall change here is net positive, and makes
> > >> life much easier. We don't have to fix everything at once, so let's go
> > >> with this.
> > >>
> > >> I didn't spot any obvious issues, but my confidence level with the
> > >> review is super low. :(
> > >>
> > >> I guess the alternatives are to just go with that, trusting CI, or give
> > >> me more time to review. I'm fine either way, as I can trust you to step
> > >> up if it goes crashing down. ;)
> > >
> > > One approach is to send 1-8 first, get CI, get them merged, and then do
> > > 9-10 separately, to get separate CI. Maybe? *shrug*
> > 
> > Any conclusions on this? Just merge the whole thing as-is rather than
> > let it go stale...?
> 
> I think we could just merge as is. Pretty sure I didn't have any
> real functional changes in there.

Merged the whole thing. Thanks for the review.

-- 
Ville Syrjälä
Intel

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

end of thread, other threads:[~2025-11-07 18:45 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-10-16 18:53 [PATCH v2 00/10] drm/i915/frontbuffer: Fix the intel_frontbuffer lifetime mess Ville Syrjala
2025-10-16 18:53 ` [PATCH v2 01/10] drm/i915/overlay: Drop the DIRTYFB flush Ville Syrjala
2025-10-16 18:54 ` [PATCH v2 02/10] drm/i915/overlay: Switch to intel_frontbuffer_flip() Ville Syrjala
2025-10-16 18:54 ` [PATCH v2 03/10] drm/i915/frontbuffer: Nuke intel_frontbuffer_flip_{prepare, complete}() Ville Syrjala
2025-10-16 18:54 ` [PATCH v2 04/10] drm/i915/frontbuffer: Turn intel_bo_flush_if_display() into a frontbuffer operation Ville Syrjala
2025-10-16 18:54 ` [PATCH v2 05/10] drm/i915/frontbuffer: Handle the dirtyfb cache flush inside intel_frontbuffer_flush() Ville Syrjala
2025-10-16 18:54 ` [PATCH v2 06/10] drm/i915/frontbuffef: Split fb_tracking.lock into two Ville Syrjala
2025-10-16 18:54 ` [PATCH v2 07/10] drm/i915/frontbuffer: Extract intel_frontbuffer_ref() Ville Syrjala
2025-10-16 18:54 ` [PATCH v2 08/10] drm/i915/frontbuffer: Add intel_frontbuffer::display Ville Syrjala
2025-10-16 18:54 ` [PATCH v2 09/10] drm/i915/frontbuffer: Fix intel_frontbuffer lifetime handling Ville Syrjala
2025-10-29 13:51   ` Jani Nikula
2025-10-29 15:00     ` Jani Nikula
2025-11-06 13:48       ` Jani Nikula
2025-11-06 14:27         ` Ville Syrjälä
2025-11-07 18:45           ` Ville Syrjälä
2025-10-16 18:54 ` [PATCH v2 10/10] drm/i915/gem: s/i915_gem_object_get_frontbuffer/i915_gem_object_frontbuffer_lookup/ Ville Syrjala
2025-10-16 19:00 ` ✗ CI.checkpatch: warning for drm/i915/frontbuffer: Fix the intel_frontbuffer lifetime mess (rev2) Patchwork
2025-10-16 19:01 ` ✓ CI.KUnit: success " Patchwork
2025-10-16 19:17 ` ✗ CI.checksparse: warning " Patchwork
2025-10-17 16:49 ` ✗ Xe.CI.Full: failure " Patchwork

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).