Intel-XE Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/5] drm/xe/mmio_gem: fix fault handler and destroy path
@ 2026-05-26 12:51 Ilia Levi
  2026-05-26 12:51 ` [PATCH v2 1/5] drm/xe/mmio_gem: use write-back mapping for dummy page Ilia Levi
                   ` (8 more replies)
  0 siblings, 9 replies; 20+ messages in thread
From: Ilia Levi @ 2026-05-26 12:51 UTC (permalink / raw)
  To: intel-xe; +Cc: ilia.levi, koby.elbaz, shuicheng.lin, thomas.hellstrom

This series fixes several issues in xe_mmio_gem, introduced by
1ffcf8b8ae8a ("drm/xe: Support for mmap-ing mmio regions"):
split VMA fault handling, a rb-tree leak on destroy, dummy page
accumulation, and use-after-free / MMIO access after destroy.

v2:
- New patch 1/5: fix dummy page WB/UC aliasing (Sashiko)
- Patch 2/5: no longer modifies xe_mmio_gem_vm_fault_dummy_page() (handled by 1/5)
- Patch 3/5: unchanged
- Patch 4/5: compute pfn inside scoped_guard
- Patch 5/5: adapt to xe_mmio_gem_vm_fault_dummy_page() signature change, fix "objecthas" typo

Ilia Levi (4):
  drm/xe/mmio_gem: use write-back mapping for dummy page
  drm/xe/mmio_gem: fix fault handling for split VMA
  drm/xe/mmio_gem: cache the dummy page per object
  drm/xe/mmio_gem: fix destroy flow

Shuicheng Lin (1):
  drm/xe/mmio_gem: Revoke drm_vma_node on xe_mmio_gem destroy

 drivers/gpu/drm/xe/xe_mmio_gem.c | 97 +++++++++++++++++++-------------
 drivers/gpu/drm/xe/xe_mmio_gem.h |  2 +-
 2 files changed, 60 insertions(+), 39 deletions(-)

-- 
2.43.0


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

* [PATCH v2 1/5] drm/xe/mmio_gem: use write-back mapping for dummy page
  2026-05-26 12:51 [PATCH v2 0/5] drm/xe/mmio_gem: fix fault handler and destroy path Ilia Levi
@ 2026-05-26 12:51 ` Ilia Levi
  2026-05-26 12:51 ` [PATCH v2 2/5] drm/xe/mmio_gem: fix fault handling for split VMA Ilia Levi
                   ` (7 subsequent siblings)
  8 siblings, 0 replies; 20+ messages in thread
From: Ilia Levi @ 2026-05-26 12:51 UTC (permalink / raw)
  To: intel-xe; +Cc: ilia.levi, koby.elbaz, shuicheng.lin, thomas.hellstrom, Sashiko

Currently vmf_insert_pfn() maps the dummy page as UC, inheriting the
VMA's page protection which was set for the real MMIO region. This
conflicts with the direct map's WB mapping of the same page, creating a
cache type alias which is architecturally undefined on x86.

Use vmf_insert_pfn_prot() with a WB pgprot instead. Also simplify to
fault in the requested page instead of the whole VMA.

Fixes: 1ffcf8b8ae8a ("drm/xe: Support for mmap-ing mmio regions")
Reported-by: Sashiko <sashiko-bot@kernel.org>
Closes: https://sashiko.dev/#/patchset/20260525125801.975038-6-ilia.levi%40intel.com
Assisted-by: GitHub-Copilot:claude-opus-4.6
Signed-off-by: Ilia Levi <ilia.levi@intel.com>
---
 drivers/gpu/drm/xe/xe_mmio_gem.c | 19 +++++--------------
 1 file changed, 5 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_mmio_gem.c b/drivers/gpu/drm/xe/xe_mmio_gem.c
index 8c803ef233cc..c22a38e5616b 100644
--- a/drivers/gpu/drm/xe/xe_mmio_gem.c
+++ b/drivers/gpu/drm/xe/xe_mmio_gem.c
@@ -162,14 +162,13 @@ static void xe_mmio_gem_release_dummy_page(struct drm_device *dev, void *res)
 	__free_page((struct page *)res);
 }
 
-static vm_fault_t xe_mmio_gem_vm_fault_dummy_page(struct vm_area_struct *vma)
+static vm_fault_t xe_mmio_gem_vm_fault_dummy_page(struct vm_fault *vmf)
 {
+	struct vm_area_struct *vma = vmf->vma;
 	struct drm_gem_object *base = vma->vm_private_data;
 	struct drm_device *dev = base->dev;
-	vm_fault_t ret = VM_FAULT_NOPAGE;
 	struct page *page;
 	unsigned long pfn;
-	unsigned long i;
 
 	page = alloc_page(GFP_KERNEL | __GFP_ZERO);
 	if (!page)
@@ -180,16 +179,8 @@ static vm_fault_t xe_mmio_gem_vm_fault_dummy_page(struct vm_area_struct *vma)
 
 	pfn = page_to_pfn(page);
 
-	/* Map the entire VMA to the same dummy page */
-	for (i = 0; i < base->size; i += PAGE_SIZE) {
-		unsigned long addr = vma->vm_start + i;
-
-		ret = vmf_insert_pfn(vma, addr, pfn);
-		if (ret & VM_FAULT_ERROR)
-			break;
-	}
-
-	return ret;
+	return vmf_insert_pfn_prot(vma, vmf->address, pfn,
+				   vm_get_page_prot(vma->vm_flags));
 }
 
 static vm_fault_t xe_mmio_gem_vm_fault(struct vm_fault *vmf)
@@ -209,7 +200,7 @@ static vm_fault_t xe_mmio_gem_vm_fault(struct vm_fault *vmf)
 		 * It is assumed the userspace will receive the notification via some
 		 * other channel (e.g. drm uevent).
 		 */
-		return xe_mmio_gem_vm_fault_dummy_page(vma);
+		return xe_mmio_gem_vm_fault_dummy_page(vmf);
 	}
 
 	for (i = 0; i < base->size; i += PAGE_SIZE) {
-- 
2.43.0


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

* [PATCH v2 2/5] drm/xe/mmio_gem: fix fault handling for split VMA
  2026-05-26 12:51 [PATCH v2 0/5] drm/xe/mmio_gem: fix fault handler and destroy path Ilia Levi
  2026-05-26 12:51 ` [PATCH v2 1/5] drm/xe/mmio_gem: use write-back mapping for dummy page Ilia Levi
@ 2026-05-26 12:51 ` Ilia Levi
  2026-07-15 13:05   ` Matthew Auld
  2026-05-26 12:51 ` [PATCH v2 3/5] drm/xe/mmio_gem: Revoke drm_vma_node on xe_mmio_gem destroy Ilia Levi
                   ` (6 subsequent siblings)
  8 siblings, 1 reply; 20+ messages in thread
From: Ilia Levi @ 2026-05-26 12:51 UTC (permalink / raw)
  To: intel-xe; +Cc: ilia.levi, koby.elbaz, shuicheng.lin, thomas.hellstrom

The fault handler currently assumes it always operates on a VMA spanning
the entire GEM object. This does not hold when the VMA has been split,
e.g. by a partial munmap or mprotect. In that case the handler may map
wrong physical pages or cause SIGBUS.

Change the fault handler to map only the GEM subrange corresponding to
the VMA, and do not set vm_pgoff to zero. Many DRM drivers do this
because helpers like dma_mmap_pages() interpret vm_pgoff as an
intra-buffer page offset; leaving the DRM fake offset there would break
these helpers. Those drivers can get away with zeroing it because they
map eagerly -- all PTEs are established before mmap returns, so vm_pgoff
is never consulted again. This driver does not use such helpers and
defers mapping to the fault handler, where vm_pgoff must be preserved:
when the kernel splits a VMA it adjusts vm_pgoff, and the fault handler
subtracts the GEM object's fake mmap offset to recover the page offset
within the object.

Fixes: 1ffcf8b8ae8a ("drm/xe: Support for mmap-ing mmio regions")
Assisted-by: GitHub-Copilot:claude-opus-4.6
Signed-off-by: Ilia Levi <ilia.levi@intel.com>
---
 drivers/gpu/drm/xe/xe_mmio_gem.c | 18 +++++++++++-------
 1 file changed, 11 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_mmio_gem.c b/drivers/gpu/drm/xe/xe_mmio_gem.c
index c22a38e5616b..15e884ad3f1c 100644
--- a/drivers/gpu/drm/xe/xe_mmio_gem.c
+++ b/drivers/gpu/drm/xe/xe_mmio_gem.c
@@ -37,6 +37,7 @@ static vm_fault_t xe_mmio_gem_vm_fault(struct vm_fault *);
 struct xe_mmio_gem {
 	struct drm_gem_object base;
 	phys_addr_t phys_addr;
+	unsigned long pgoff;
 };
 
 static const struct vm_operations_struct vm_ops = {
@@ -92,6 +93,8 @@ struct xe_mmio_gem *xe_mmio_gem_create(struct xe_device *xe, struct drm_file *fi
 	if (err)
 		goto free_gem;
 
+	obj->pgoff = drm_vma_node_start(&base->vma_node);
+
 	err = drm_vma_node_allow(&base->vma_node, file);
 	if (err)
 		goto free_gem;
@@ -147,8 +150,6 @@ static int xe_mmio_gem_mmap(struct drm_gem_object *base, struct vm_area_struct *
 	if ((vma->vm_flags & VM_SHARED) == 0)
 		return -EINVAL;
 
-	/* Set vm_pgoff (used as a fake buffer offset by DRM) to 0 */
-	vma->vm_pgoff = 0;
 	vma->vm_page_prot = pgprot_noncached(vm_get_page_prot(vma->vm_flags));
 	vm_flags_set(vma, VM_IO | VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP |
 		     VM_DONTCOPY | VM_NORESERVE);
@@ -190,7 +191,8 @@ static vm_fault_t xe_mmio_gem_vm_fault(struct vm_fault *vmf)
 	struct xe_mmio_gem *obj = to_xe_mmio_gem(base);
 	struct drm_device *dev = base->dev;
 	vm_fault_t ret = VM_FAULT_NOPAGE;
-	unsigned long i;
+	unsigned long addr, pfn;
+	unsigned long pgoff;
 	int idx;
 
 	if (!drm_dev_enter(dev, &idx)) {
@@ -203,13 +205,15 @@ static vm_fault_t xe_mmio_gem_vm_fault(struct vm_fault *vmf)
 		return xe_mmio_gem_vm_fault_dummy_page(vmf);
 	}
 
-	for (i = 0; i < base->size; i += PAGE_SIZE) {
-		unsigned long addr = vma->vm_start + i;
-		unsigned long phys_addr = obj->phys_addr + i;
+	pgoff = vma->vm_pgoff - obj->pgoff;
+	pfn = PHYS_PFN(obj->phys_addr) + pgoff;
 
-		ret = vmf_insert_pfn(vma, addr, PHYS_PFN(phys_addr));
+	for (addr = vma->vm_start; addr < vma->vm_end; addr += PAGE_SIZE) {
+		ret = vmf_insert_pfn(vma, addr, pfn);
 		if (ret & VM_FAULT_ERROR)
 			break;
+
+		pfn++;
 	}
 
 	drm_dev_exit(idx);
-- 
2.43.0


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

* [PATCH v2 3/5] drm/xe/mmio_gem: Revoke drm_vma_node on xe_mmio_gem destroy
  2026-05-26 12:51 [PATCH v2 0/5] drm/xe/mmio_gem: fix fault handler and destroy path Ilia Levi
  2026-05-26 12:51 ` [PATCH v2 1/5] drm/xe/mmio_gem: use write-back mapping for dummy page Ilia Levi
  2026-05-26 12:51 ` [PATCH v2 2/5] drm/xe/mmio_gem: fix fault handling for split VMA Ilia Levi
@ 2026-05-26 12:51 ` Ilia Levi
  2026-05-26 12:51 ` [PATCH v2 4/5] drm/xe/mmio_gem: cache the dummy page per object Ilia Levi
                   ` (5 subsequent siblings)
  8 siblings, 0 replies; 20+ messages in thread
From: Ilia Levi @ 2026-05-26 12:51 UTC (permalink / raw)
  To: intel-xe; +Cc: ilia.levi, koby.elbaz, shuicheng.lin, thomas.hellstrom

From: Shuicheng Lin <shuicheng.lin@intel.com>

xe_mmio_gem_create() calls drm_vma_node_allow() but nothing ever calls
drm_vma_node_revoke(). The drm_vma_offset_file rb-tree entry allocated
by drm_vma_node_allow() is not freed by drm_gem_object_release(), so
it is leaked on every create/destroy cycle.

Add a struct drm_file * parameter to xe_mmio_gem_destroy() and call
drm_vma_node_revoke() from there, mirroring the drm_vma_node_allow()
call in xe_mmio_gem_create().

The xe_mmio_gem helpers currently have no in-tree users; this prevents
a latent leak once they are used.

Fixes: 1ffcf8b8ae8a ("drm/xe: Support for mmap-ing mmio regions")
Suggested-by: Ilia Levi <ilia.levi@intel.com>
Assisted-by: Claude:claude-opus-4.6
Signed-off-by: Shuicheng Lin <shuicheng.lin@intel.com>
Reviewed-by: Ilia Levi <ilia.levi@intel.com>
---
 drivers/gpu/drm/xe/xe_mmio_gem.c | 4 +++-
 drivers/gpu/drm/xe/xe_mmio_gem.h | 2 +-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_mmio_gem.c b/drivers/gpu/drm/xe/xe_mmio_gem.c
index 15e884ad3f1c..330ba3552e12 100644
--- a/drivers/gpu/drm/xe/xe_mmio_gem.c
+++ b/drivers/gpu/drm/xe/xe_mmio_gem.c
@@ -131,14 +131,16 @@ static void xe_mmio_gem_free(struct drm_gem_object *base)
 /**
  * xe_mmio_gem_destroy - Destroy the GEM object that exposes an MMIO region
  * @gem: the GEM object to destroy
+ * @file: DRM file descriptor previously passed to xe_mmio_gem_create()
  *
  * This function releases resources associated with the GEM object created by
  * xe_mmio_gem_create().
  *
  * See: "Exposing MMIO regions to userspace"
  */
-void xe_mmio_gem_destroy(struct xe_mmio_gem *gem)
+void xe_mmio_gem_destroy(struct xe_mmio_gem *gem, struct drm_file *file)
 {
+	drm_vma_node_revoke(&gem->base.vma_node, file);
 	xe_mmio_gem_free(&gem->base);
 }
 
diff --git a/drivers/gpu/drm/xe/xe_mmio_gem.h b/drivers/gpu/drm/xe/xe_mmio_gem.h
index 4b76d5586ebb..80d7795f07c8 100644
--- a/drivers/gpu/drm/xe/xe_mmio_gem.h
+++ b/drivers/gpu/drm/xe/xe_mmio_gem.h
@@ -15,6 +15,6 @@ struct xe_mmio_gem;
 struct xe_mmio_gem *xe_mmio_gem_create(struct xe_device *xe, struct drm_file *file,
 				       phys_addr_t phys_addr, size_t size);
 u64 xe_mmio_gem_mmap_offset(struct xe_mmio_gem *gem);
-void xe_mmio_gem_destroy(struct xe_mmio_gem *gem);
+void xe_mmio_gem_destroy(struct xe_mmio_gem *gem, struct drm_file *file);
 
 #endif /* _XE_MMIO_GEM_H_ */
-- 
2.43.0


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

* [PATCH v2 4/5] drm/xe/mmio_gem: cache the dummy page per object
  2026-05-26 12:51 [PATCH v2 0/5] drm/xe/mmio_gem: fix fault handler and destroy path Ilia Levi
                   ` (2 preceding siblings ...)
  2026-05-26 12:51 ` [PATCH v2 3/5] drm/xe/mmio_gem: Revoke drm_vma_node on xe_mmio_gem destroy Ilia Levi
@ 2026-05-26 12:51 ` Ilia Levi
  2026-05-26 12:51 ` [PATCH v2 5/5] drm/xe/mmio_gem: fix destroy flow Ilia Levi
                   ` (4 subsequent siblings)
  8 siblings, 0 replies; 20+ messages in thread
From: Ilia Levi @ 2026-05-26 12:51 UTC (permalink / raw)
  To: intel-xe; +Cc: ilia.levi, koby.elbaz, shuicheng.lin, thomas.hellstrom

Currently, when the fault handler provides a dummy page, it
allocates a new one on every invocation and ties its lifetime to
the drm_device via drmm_add_action_or_reset(). Concurrent faults
after hot-unplug therefore accumulate pages that persist until
device teardown.

Cache a single dummy page in the xe_mmio_gem object; a mutex
serializes its allocation. Free it with the object.

Assisted-by: GitHub-Copilot:claude-opus-4.6
Signed-off-by: Ilia Levi <ilia.levi@intel.com>
---
 drivers/gpu/drm/xe/xe_mmio_gem.c | 31 +++++++++++++++----------------
 1 file changed, 15 insertions(+), 16 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_mmio_gem.c b/drivers/gpu/drm/xe/xe_mmio_gem.c
index 330ba3552e12..2f2ebc4fd901 100644
--- a/drivers/gpu/drm/xe/xe_mmio_gem.c
+++ b/drivers/gpu/drm/xe/xe_mmio_gem.c
@@ -7,7 +7,6 @@
 
 #include <drm/drm_drv.h>
 #include <drm/drm_gem.h>
-#include <drm/drm_managed.h>
 
 #include "xe_device_types.h"
 
@@ -38,6 +37,8 @@ struct xe_mmio_gem {
 	struct drm_gem_object base;
 	phys_addr_t phys_addr;
 	unsigned long pgoff;
+	struct mutex dummy_page_lock; /* protects dummy page allocation */
+	struct page *dummy_page;
 };
 
 static const struct vm_operations_struct vm_ops = {
@@ -86,6 +87,7 @@ struct xe_mmio_gem *xe_mmio_gem_create(struct xe_device *xe, struct drm_file *fi
 	base = &obj->base;
 	base->funcs = &xe_mmio_gem_funcs;
 	obj->phys_addr = phys_addr;
+	mutex_init(&obj->dummy_page_lock);
 
 	drm_gem_private_object_init(&xe->drm, base, size);
 
@@ -124,6 +126,9 @@ static void xe_mmio_gem_free(struct drm_gem_object *base)
 {
 	struct xe_mmio_gem *obj = to_xe_mmio_gem(base);
 
+	if (obj->dummy_page)
+		__free_page(obj->dummy_page);
+	mutex_destroy(&obj->dummy_page_lock);
 	drm_gem_object_release(base);
 	kfree(obj);
 }
@@ -160,27 +165,21 @@ static int xe_mmio_gem_mmap(struct drm_gem_object *base, struct vm_area_struct *
 	return 0;
 }
 
-static void xe_mmio_gem_release_dummy_page(struct drm_device *dev, void *res)
-{
-	__free_page((struct page *)res);
-}
-
 static vm_fault_t xe_mmio_gem_vm_fault_dummy_page(struct vm_fault *vmf)
 {
 	struct vm_area_struct *vma = vmf->vma;
 	struct drm_gem_object *base = vma->vm_private_data;
-	struct drm_device *dev = base->dev;
-	struct page *page;
+	struct xe_mmio_gem *obj = to_xe_mmio_gem(base);
 	unsigned long pfn;
 
-	page = alloc_page(GFP_KERNEL | __GFP_ZERO);
-	if (!page)
-		return VM_FAULT_OOM;
-
-	if (drmm_add_action_or_reset(dev, xe_mmio_gem_release_dummy_page, page))
-		return VM_FAULT_OOM;
-
-	pfn = page_to_pfn(page);
+	scoped_guard(mutex, &obj->dummy_page_lock) {
+		if (!obj->dummy_page) {
+			obj->dummy_page = alloc_page(GFP_KERNEL | __GFP_ZERO);
+			if (!obj->dummy_page)
+				return VM_FAULT_OOM;
+		}
+		pfn = page_to_pfn(obj->dummy_page);
+	}
 
 	return vmf_insert_pfn_prot(vma, vmf->address, pfn,
 				   vm_get_page_prot(vma->vm_flags));
-- 
2.43.0


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

* [PATCH v2 5/5] drm/xe/mmio_gem: fix destroy flow
  2026-05-26 12:51 [PATCH v2 0/5] drm/xe/mmio_gem: fix fault handler and destroy path Ilia Levi
                   ` (3 preceding siblings ...)
  2026-05-26 12:51 ` [PATCH v2 4/5] drm/xe/mmio_gem: cache the dummy page per object Ilia Levi
@ 2026-05-26 12:51 ` Ilia Levi
  2026-07-16 15:22   ` Matthew Auld
  2026-05-26 12:58 ` ✓ CI.KUnit: success for drm/xe/mmio_gem: fix fault handler and destroy path (rev2) Patchwork
                   ` (3 subsequent siblings)
  8 siblings, 1 reply; 20+ messages in thread
From: Ilia Levi @ 2026-05-26 12:51 UTC (permalink / raw)
  To: intel-xe; +Cc: ilia.levi, koby.elbaz, shuicheng.lin, thomas.hellstrom

xe_mmio_gem_destroy() currently frees the GEM object directly, bypassing
reference counting.  Since existing VMAs hold a reference and the fault
handler accesses the object through vma->vm_private_data, this is
use-after-free.  Additionally, nothing prevents the fault handler from
installing PTEs to the real MMIO after destroy.

Use SRCU to ensure the fault handler sees the 'destroyed' flag
(mirroring the drm_dev_enter/exit pattern for hot-unplug), then zap
existing PTEs to prevent continued access to the real MMIO. Use
drm_gem_object_put() to respect the reference count.

Fixes: 1ffcf8b8ae8a ("drm/xe: Support for mmap-ing mmio regions")
Assisted-by: GitHub-Copilot:claude-opus-4.6
Signed-off-by: Ilia Levi <ilia.levi@intel.com>
---
 drivers/gpu/drm/xe/xe_mmio_gem.c | 27 ++++++++++++++++++++++++++-
 1 file changed, 26 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/xe/xe_mmio_gem.c b/drivers/gpu/drm/xe/xe_mmio_gem.c
index 2f2ebc4fd901..b91704c51a93 100644
--- a/drivers/gpu/drm/xe/xe_mmio_gem.c
+++ b/drivers/gpu/drm/xe/xe_mmio_gem.c
@@ -5,11 +5,15 @@
 
 #include "xe_mmio_gem.h"
 
+#include <linux/srcu.h>
+
 #include <drm/drm_drv.h>
 #include <drm/drm_gem.h>
 
 #include "xe_device_types.h"
 
+DEFINE_STATIC_SRCU(xe_mmio_gem_srcu);
+
 /**
  * DOC: Exposing MMIO regions to userspace
  *
@@ -39,6 +43,7 @@ struct xe_mmio_gem {
 	unsigned long pgoff;
 	struct mutex dummy_page_lock; /* protects dummy page allocation */
 	struct page *dummy_page;
+	bool destroyed;
 };
 
 static const struct vm_operations_struct vm_ops = {
@@ -145,8 +150,23 @@ static void xe_mmio_gem_free(struct drm_gem_object *base)
  */
 void xe_mmio_gem_destroy(struct xe_mmio_gem *gem, struct drm_file *file)
 {
+	struct drm_gem_object *base = &gem->base;
+	struct drm_device *dev = base->dev;
+
 	drm_vma_node_revoke(&gem->base.vma_node, file);
-	xe_mmio_gem_free(&gem->base);
+
+	gem->destroyed = true;
+	synchronize_srcu(&xe_mmio_gem_srcu);
+
+	/*
+	 * At this point every subsequent fault handler will see that the
+	 * object has been destroyed and provide the dummy page.
+	 * Now just zap existing PTEs to prevent continued access to the real
+	 * MMIO.
+	 */
+	drm_vma_node_unmap(&base->vma_node, dev->anon_inode->i_mapping);
+
+	drm_gem_object_put(base);
 }
 
 static int xe_mmio_gem_mmap(struct drm_gem_object *base, struct vm_area_struct *vma)
@@ -196,6 +216,11 @@ static vm_fault_t xe_mmio_gem_vm_fault(struct vm_fault *vmf)
 	unsigned long pgoff;
 	int idx;
 
+	guard(srcu)(&xe_mmio_gem_srcu);
+
+	if (obj->destroyed)
+		return xe_mmio_gem_vm_fault_dummy_page(vmf);
+
 	if (!drm_dev_enter(dev, &idx)) {
 		/*
 		 * Provide a dummy page to avoid SIGBUS for events such as hot-unplug.
-- 
2.43.0


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

* ✓ CI.KUnit: success for drm/xe/mmio_gem: fix fault handler and destroy path (rev2)
  2026-05-26 12:51 [PATCH v2 0/5] drm/xe/mmio_gem: fix fault handler and destroy path Ilia Levi
                   ` (4 preceding siblings ...)
  2026-05-26 12:51 ` [PATCH v2 5/5] drm/xe/mmio_gem: fix destroy flow Ilia Levi
@ 2026-05-26 12:58 ` Patchwork
  2026-05-26 13:42 ` ✓ Xe.CI.BAT: " Patchwork
                   ` (2 subsequent siblings)
  8 siblings, 0 replies; 20+ messages in thread
From: Patchwork @ 2026-05-26 12:58 UTC (permalink / raw)
  To: Ilia Levi; +Cc: intel-xe

== Series Details ==

Series: drm/xe/mmio_gem: fix fault handler and destroy path (rev2)
URL   : https://patchwork.freedesktop.org/series/167217/
State : success

== Summary ==

+ trap cleanup EXIT
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig
[12:57:04] Configuring KUnit Kernel ...
Generating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[12:57: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
[12:57:40] Starting KUnit Kernel (1/1)...
[12:57:40] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[12:57:40] ================== guc_buf (11 subtests) ===================
[12:57:40] [PASSED] test_smallest
[12:57:40] [PASSED] test_largest
[12:57:40] [PASSED] test_granular
[12:57:40] [PASSED] test_unique
[12:57:40] [PASSED] test_overlap
[12:57:40] [PASSED] test_reusable
[12:57:40] [PASSED] test_too_big
[12:57:40] [PASSED] test_flush
[12:57:40] [PASSED] test_lookup
[12:57:40] [PASSED] test_data
[12:57:40] [PASSED] test_class
[12:57:40] ===================== [PASSED] guc_buf =====================
[12:57:40] =================== guc_dbm (7 subtests) ===================
[12:57:40] [PASSED] test_empty
[12:57:40] [PASSED] test_default
[12:57:40] ======================== test_size  ========================
[12:57:40] [PASSED] 4
[12:57:40] [PASSED] 8
[12:57:40] [PASSED] 32
[12:57:40] [PASSED] 256
[12:57:40] ==================== [PASSED] test_size ====================
[12:57:40] ======================= test_reuse  ========================
[12:57:40] [PASSED] 4
[12:57:40] [PASSED] 8
[12:57:40] [PASSED] 32
[12:57:40] [PASSED] 256
[12:57:40] =================== [PASSED] test_reuse ====================
[12:57:40] =================== test_range_overlap  ====================
[12:57:40] [PASSED] 4
[12:57:40] [PASSED] 8
[12:57:40] [PASSED] 32
[12:57:40] [PASSED] 256
[12:57:40] =============== [PASSED] test_range_overlap ================
[12:57:40] =================== test_range_compact  ====================
[12:57:40] [PASSED] 4
[12:57:40] [PASSED] 8
[12:57:40] [PASSED] 32
[12:57:40] [PASSED] 256
[12:57:40] =============== [PASSED] test_range_compact ================
[12:57:40] ==================== test_range_spare  =====================
[12:57:40] [PASSED] 4
[12:57:40] [PASSED] 8
[12:57:40] [PASSED] 32
[12:57:40] [PASSED] 256
[12:57:40] ================ [PASSED] test_range_spare =================
[12:57:40] ===================== [PASSED] guc_dbm =====================
[12:57:40] =================== guc_idm (6 subtests) ===================
[12:57:40] [PASSED] bad_init
[12:57:40] [PASSED] no_init
[12:57:40] [PASSED] init_fini
[12:57:40] [PASSED] check_used
[12:57:40] [PASSED] check_quota
[12:57:40] [PASSED] check_all
[12:57:40] ===================== [PASSED] guc_idm =====================
[12:57:40] ================== no_relay (3 subtests) ===================
[12:57:40] [PASSED] xe_drops_guc2pf_if_not_ready
[12:57:40] [PASSED] xe_drops_guc2vf_if_not_ready
[12:57:40] [PASSED] xe_rejects_send_if_not_ready
[12:57:40] ==================== [PASSED] no_relay =====================
[12:57:40] ================== pf_relay (14 subtests) ==================
[12:57:40] [PASSED] pf_rejects_guc2pf_too_short
[12:57:40] [PASSED] pf_rejects_guc2pf_too_long
[12:57:40] [PASSED] pf_rejects_guc2pf_no_payload
[12:57:40] [PASSED] pf_fails_no_payload
[12:57:40] [PASSED] pf_fails_bad_origin
[12:57:40] [PASSED] pf_fails_bad_type
[12:57:40] [PASSED] pf_txn_reports_error
[12:57:40] [PASSED] pf_txn_sends_pf2guc
[12:57:40] [PASSED] pf_sends_pf2guc
[12:57:40] [SKIPPED] pf_loopback_nop
[12:57:40] [SKIPPED] pf_loopback_echo
[12:57:40] [SKIPPED] pf_loopback_fail
[12:57:40] [SKIPPED] pf_loopback_busy
[12:57:40] [SKIPPED] pf_loopback_retry
[12:57:40] ==================== [PASSED] pf_relay =====================
[12:57:40] ================== vf_relay (3 subtests) ===================
[12:57:40] [PASSED] vf_rejects_guc2vf_too_short
[12:57:40] [PASSED] vf_rejects_guc2vf_too_long
[12:57:40] [PASSED] vf_rejects_guc2vf_no_payload
[12:57:40] ==================== [PASSED] vf_relay =====================
[12:57:40] ================ pf_gt_config (9 subtests) =================
[12:57:40] [PASSED] fair_contexts_1vf
[12:57:40] [PASSED] fair_doorbells_1vf
[12:57:40] [PASSED] fair_ggtt_1vf
[12:57:40] ====================== fair_vram_1vf  ======================
[12:57:40] [PASSED] 3.50 GiB
[12:57:40] [PASSED] 11.5 GiB
[12:57:40] [PASSED] 15.5 GiB
[12:57:40] [PASSED] 31.5 GiB
[12:57:40] [PASSED] 63.5 GiB
[12:57:40] [PASSED] 1.91 GiB
[12:57:40] ================== [PASSED] fair_vram_1vf ==================
[12:57:40] ================ fair_vram_1vf_admin_only  =================
[12:57:40] [PASSED] 3.50 GiB
[12:57:40] [PASSED] 11.5 GiB
[12:57:40] [PASSED] 15.5 GiB
[12:57:40] [PASSED] 31.5 GiB
[12:57:40] [PASSED] 63.5 GiB
[12:57:40] [PASSED] 1.91 GiB
[12:57:40] ============ [PASSED] fair_vram_1vf_admin_only =============
[12:57:40] ====================== fair_contexts  ======================
[12:57:40] [PASSED] 1 VF
[12:57:40] [PASSED] 2 VFs
[12:57:40] [PASSED] 3 VFs
[12:57:40] [PASSED] 4 VFs
[12:57:40] [PASSED] 5 VFs
[12:57:40] [PASSED] 6 VFs
[12:57:40] [PASSED] 7 VFs
[12:57:40] [PASSED] 8 VFs
[12:57:40] [PASSED] 9 VFs
[12:57:40] [PASSED] 10 VFs
[12:57:40] [PASSED] 11 VFs
[12:57:40] [PASSED] 12 VFs
[12:57:40] [PASSED] 13 VFs
[12:57:40] [PASSED] 14 VFs
[12:57:40] [PASSED] 15 VFs
[12:57:40] [PASSED] 16 VFs
[12:57:40] [PASSED] 17 VFs
[12:57:40] [PASSED] 18 VFs
[12:57:40] [PASSED] 19 VFs
[12:57:40] [PASSED] 20 VFs
[12:57:40] [PASSED] 21 VFs
[12:57:40] [PASSED] 22 VFs
[12:57:40] [PASSED] 23 VFs
[12:57:40] [PASSED] 24 VFs
[12:57:40] [PASSED] 25 VFs
[12:57:40] [PASSED] 26 VFs
[12:57:40] [PASSED] 27 VFs
[12:57:40] [PASSED] 28 VFs
[12:57:40] [PASSED] 29 VFs
[12:57:40] [PASSED] 30 VFs
[12:57:40] [PASSED] 31 VFs
[12:57:40] [PASSED] 32 VFs
[12:57:40] [PASSED] 33 VFs
[12:57:40] [PASSED] 34 VFs
[12:57:40] [PASSED] 35 VFs
[12:57:40] [PASSED] 36 VFs
[12:57:40] [PASSED] 37 VFs
[12:57:40] [PASSED] 38 VFs
[12:57:40] [PASSED] 39 VFs
[12:57:40] [PASSED] 40 VFs
[12:57:40] [PASSED] 41 VFs
[12:57:40] [PASSED] 42 VFs
[12:57:40] [PASSED] 43 VFs
[12:57:40] [PASSED] 44 VFs
[12:57:40] [PASSED] 45 VFs
[12:57:40] [PASSED] 46 VFs
[12:57:40] [PASSED] 47 VFs
[12:57:40] [PASSED] 48 VFs
[12:57:40] [PASSED] 49 VFs
[12:57:40] [PASSED] 50 VFs
[12:57:40] [PASSED] 51 VFs
[12:57:40] [PASSED] 52 VFs
[12:57:40] [PASSED] 53 VFs
[12:57:40] [PASSED] 54 VFs
[12:57:40] [PASSED] 55 VFs
[12:57:40] [PASSED] 56 VFs
[12:57:40] [PASSED] 57 VFs
[12:57:40] [PASSED] 58 VFs
[12:57:40] [PASSED] 59 VFs
[12:57:40] [PASSED] 60 VFs
[12:57:40] [PASSED] 61 VFs
[12:57:40] [PASSED] 62 VFs
[12:57:40] [PASSED] 63 VFs
[12:57:40] ================== [PASSED] fair_contexts ==================
[12:57:40] ===================== fair_doorbells  ======================
[12:57:40] [PASSED] 1 VF
[12:57:40] [PASSED] 2 VFs
[12:57:40] [PASSED] 3 VFs
[12:57:40] [PASSED] 4 VFs
[12:57:40] [PASSED] 5 VFs
[12:57:40] [PASSED] 6 VFs
[12:57:40] [PASSED] 7 VFs
[12:57:40] [PASSED] 8 VFs
[12:57:40] [PASSED] 9 VFs
[12:57:40] [PASSED] 10 VFs
[12:57:40] [PASSED] 11 VFs
[12:57:40] [PASSED] 12 VFs
[12:57:40] [PASSED] 13 VFs
[12:57:40] [PASSED] 14 VFs
[12:57:40] [PASSED] 15 VFs
[12:57:40] [PASSED] 16 VFs
[12:57:40] [PASSED] 17 VFs
[12:57:40] [PASSED] 18 VFs
[12:57:40] [PASSED] 19 VFs
[12:57:40] [PASSED] 20 VFs
[12:57:40] [PASSED] 21 VFs
[12:57:40] [PASSED] 22 VFs
[12:57:40] [PASSED] 23 VFs
[12:57:40] [PASSED] 24 VFs
[12:57:40] [PASSED] 25 VFs
[12:57:40] [PASSED] 26 VFs
[12:57:40] [PASSED] 27 VFs
[12:57:40] [PASSED] 28 VFs
[12:57:40] [PASSED] 29 VFs
[12:57:40] [PASSED] 30 VFs
[12:57:40] [PASSED] 31 VFs
[12:57:40] [PASSED] 32 VFs
[12:57:40] [PASSED] 33 VFs
[12:57:40] [PASSED] 34 VFs
[12:57:40] [PASSED] 35 VFs
[12:57:40] [PASSED] 36 VFs
[12:57:40] [PASSED] 37 VFs
[12:57:40] [PASSED] 38 VFs
[12:57:40] [PASSED] 39 VFs
[12:57:40] [PASSED] 40 VFs
[12:57:40] [PASSED] 41 VFs
[12:57:40] [PASSED] 42 VFs
[12:57:40] [PASSED] 43 VFs
[12:57:40] [PASSED] 44 VFs
[12:57:40] [PASSED] 45 VFs
[12:57:40] [PASSED] 46 VFs
[12:57:40] [PASSED] 47 VFs
[12:57:40] [PASSED] 48 VFs
[12:57:40] [PASSED] 49 VFs
[12:57:40] [PASSED] 50 VFs
[12:57:40] [PASSED] 51 VFs
[12:57:40] [PASSED] 52 VFs
[12:57:40] [PASSED] 53 VFs
[12:57:40] [PASSED] 54 VFs
[12:57:40] [PASSED] 55 VFs
[12:57:40] [PASSED] 56 VFs
[12:57:40] [PASSED] 57 VFs
[12:57:40] [PASSED] 58 VFs
[12:57:40] [PASSED] 59 VFs
[12:57:40] [PASSED] 60 VFs
[12:57:40] [PASSED] 61 VFs
[12:57:40] [PASSED] 62 VFs
[12:57:40] [PASSED] 63 VFs
[12:57:40] ================= [PASSED] fair_doorbells ==================
[12:57:40] ======================== fair_ggtt  ========================
[12:57:40] [PASSED] 1 VF
[12:57:40] [PASSED] 2 VFs
[12:57:40] [PASSED] 3 VFs
[12:57:40] [PASSED] 4 VFs
[12:57:40] [PASSED] 5 VFs
[12:57:40] [PASSED] 6 VFs
[12:57:40] [PASSED] 7 VFs
[12:57:40] [PASSED] 8 VFs
[12:57:40] [PASSED] 9 VFs
[12:57:40] [PASSED] 10 VFs
[12:57:40] [PASSED] 11 VFs
[12:57:40] [PASSED] 12 VFs
[12:57:40] [PASSED] 13 VFs
[12:57:40] [PASSED] 14 VFs
[12:57:40] [PASSED] 15 VFs
[12:57:40] [PASSED] 16 VFs
[12:57:40] [PASSED] 17 VFs
[12:57:40] [PASSED] 18 VFs
[12:57:40] [PASSED] 19 VFs
[12:57:40] [PASSED] 20 VFs
[12:57:40] [PASSED] 21 VFs
[12:57:40] [PASSED] 22 VFs
[12:57:40] [PASSED] 23 VFs
[12:57:40] [PASSED] 24 VFs
[12:57:40] [PASSED] 25 VFs
[12:57:40] [PASSED] 26 VFs
[12:57:40] [PASSED] 27 VFs
[12:57:40] [PASSED] 28 VFs
[12:57:40] [PASSED] 29 VFs
[12:57:40] [PASSED] 30 VFs
[12:57:40] [PASSED] 31 VFs
[12:57:40] [PASSED] 32 VFs
[12:57:40] [PASSED] 33 VFs
[12:57:40] [PASSED] 34 VFs
[12:57:40] [PASSED] 35 VFs
[12:57:40] [PASSED] 36 VFs
[12:57:40] [PASSED] 37 VFs
[12:57:40] [PASSED] 38 VFs
[12:57:40] [PASSED] 39 VFs
[12:57:40] [PASSED] 40 VFs
[12:57:40] [PASSED] 41 VFs
[12:57:40] [PASSED] 42 VFs
[12:57:40] [PASSED] 43 VFs
[12:57:40] [PASSED] 44 VFs
[12:57:40] [PASSED] 45 VFs
[12:57:40] [PASSED] 46 VFs
[12:57:40] [PASSED] 47 VFs
[12:57:40] [PASSED] 48 VFs
[12:57:40] [PASSED] 49 VFs
[12:57:40] [PASSED] 50 VFs
[12:57:40] [PASSED] 51 VFs
[12:57:40] [PASSED] 52 VFs
[12:57:40] [PASSED] 53 VFs
[12:57:40] [PASSED] 54 VFs
[12:57:40] [PASSED] 55 VFs
[12:57:40] [PASSED] 56 VFs
[12:57:40] [PASSED] 57 VFs
[12:57:40] [PASSED] 58 VFs
[12:57:40] [PASSED] 59 VFs
[12:57:40] [PASSED] 60 VFs
[12:57:40] [PASSED] 61 VFs
[12:57:40] [PASSED] 62 VFs
[12:57:40] [PASSED] 63 VFs
[12:57:40] ==================== [PASSED] fair_ggtt ====================
[12:57:40] ======================== fair_vram  ========================
[12:57:40] [PASSED] 1 VF
[12:57:40] [PASSED] 2 VFs
[12:57:40] [PASSED] 3 VFs
[12:57:40] [PASSED] 4 VFs
[12:57:40] [PASSED] 5 VFs
[12:57:40] [PASSED] 6 VFs
[12:57:40] [PASSED] 7 VFs
[12:57:40] [PASSED] 8 VFs
[12:57:40] [PASSED] 9 VFs
[12:57:40] [PASSED] 10 VFs
[12:57:40] [PASSED] 11 VFs
[12:57:40] [PASSED] 12 VFs
[12:57:40] [PASSED] 13 VFs
[12:57:40] [PASSED] 14 VFs
[12:57:40] [PASSED] 15 VFs
[12:57:40] [PASSED] 16 VFs
[12:57:40] [PASSED] 17 VFs
[12:57:40] [PASSED] 18 VFs
[12:57:40] [PASSED] 19 VFs
[12:57:40] [PASSED] 20 VFs
[12:57:40] [PASSED] 21 VFs
[12:57:40] [PASSED] 22 VFs
[12:57:40] [PASSED] 23 VFs
[12:57:40] [PASSED] 24 VFs
[12:57:40] [PASSED] 25 VFs
[12:57:40] [PASSED] 26 VFs
[12:57:40] [PASSED] 27 VFs
[12:57:40] [PASSED] 28 VFs
[12:57:40] [PASSED] 29 VFs
[12:57:40] [PASSED] 30 VFs
[12:57:40] [PASSED] 31 VFs
[12:57:40] [PASSED] 32 VFs
[12:57:40] [PASSED] 33 VFs
[12:57:40] [PASSED] 34 VFs
[12:57:40] [PASSED] 35 VFs
[12:57:40] [PASSED] 36 VFs
[12:57:40] [PASSED] 37 VFs
[12:57:40] [PASSED] 38 VFs
[12:57:40] [PASSED] 39 VFs
[12:57:40] [PASSED] 40 VFs
[12:57:40] [PASSED] 41 VFs
[12:57:40] [PASSED] 42 VFs
[12:57:40] [PASSED] 43 VFs
[12:57:40] [PASSED] 44 VFs
[12:57:40] [PASSED] 45 VFs
[12:57:40] [PASSED] 46 VFs
[12:57:40] [PASSED] 47 VFs
[12:57:40] [PASSED] 48 VFs
[12:57:40] [PASSED] 49 VFs
[12:57:40] [PASSED] 50 VFs
[12:57:40] [PASSED] 51 VFs
[12:57:40] [PASSED] 52 VFs
[12:57:40] [PASSED] 53 VFs
[12:57:40] [PASSED] 54 VFs
[12:57:40] [PASSED] 55 VFs
[12:57:40] [PASSED] 56 VFs
[12:57:40] [PASSED] 57 VFs
[12:57:40] [PASSED] 58 VFs
[12:57:40] [PASSED] 59 VFs
[12:57:40] [PASSED] 60 VFs
[12:57:40] [PASSED] 61 VFs
[12:57:40] [PASSED] 62 VFs
[12:57:40] [PASSED] 63 VFs
[12:57:40] ==================== [PASSED] fair_vram ====================
[12:57:40] ================== [PASSED] pf_gt_config ===================
[12:57:40] ===================== lmtt (1 subtest) =====================
[12:57:40] ======================== test_ops  =========================
[12:57:40] [PASSED] 2-level
[12:57:40] [PASSED] multi-level
[12:57:40] ==================== [PASSED] test_ops =====================
[12:57:40] ====================== [PASSED] lmtt =======================
[12:57:40] ================= pf_service (11 subtests) =================
[12:57:40] [PASSED] pf_negotiate_any
[12:57:40] [PASSED] pf_negotiate_base_match
[12:57:40] [PASSED] pf_negotiate_base_newer
[12:57:40] [PASSED] pf_negotiate_base_next
[12:57:40] [SKIPPED] pf_negotiate_base_older
[12:57:40] [PASSED] pf_negotiate_base_prev
[12:57:40] [PASSED] pf_negotiate_latest_match
[12:57:40] [PASSED] pf_negotiate_latest_newer
[12:57:40] [PASSED] pf_negotiate_latest_next
[12:57:40] [SKIPPED] pf_negotiate_latest_older
[12:57:40] [SKIPPED] pf_negotiate_latest_prev
[12:57:40] =================== [PASSED] pf_service ====================
[12:57:40] ================= xe_guc_g2g (2 subtests) ==================
[12:57:40] ============== xe_live_guc_g2g_kunit_default  ==============
[12:57:40] ========= [SKIPPED] xe_live_guc_g2g_kunit_default ==========
[12:57:40] ============== xe_live_guc_g2g_kunit_allmem  ===============
[12:57:40] ========== [SKIPPED] xe_live_guc_g2g_kunit_allmem ==========
[12:57:40] =================== [SKIPPED] xe_guc_g2g ===================
[12:57:40] =================== xe_mocs (2 subtests) ===================
[12:57:40] ================ xe_live_mocs_kernel_kunit  ================
[12:57:40] =========== [SKIPPED] xe_live_mocs_kernel_kunit ============
[12:57:40] ================ xe_live_mocs_reset_kunit  =================
[12:57:40] ============ [SKIPPED] xe_live_mocs_reset_kunit ============
[12:57:40] ==================== [SKIPPED] xe_mocs =====================
[12:57:40] ================= xe_migrate (2 subtests) ==================
[12:57:40] ================= xe_migrate_sanity_kunit  =================
[12:57:40] ============ [SKIPPED] xe_migrate_sanity_kunit =============
[12:57:40] ================== xe_validate_ccs_kunit  ==================
[12:57:40] ============= [SKIPPED] xe_validate_ccs_kunit ==============
[12:57:40] =================== [SKIPPED] xe_migrate ===================
[12:57:40] ================== xe_dma_buf (1 subtest) ==================
[12:57:40] ==================== xe_dma_buf_kunit  =====================
[12:57:40] ================ [SKIPPED] xe_dma_buf_kunit ================
[12:57:40] =================== [SKIPPED] xe_dma_buf ===================
[12:57:40] ================= xe_bo_shrink (1 subtest) =================
[12:57:40] =================== xe_bo_shrink_kunit  ====================
[12:57:40] =============== [SKIPPED] xe_bo_shrink_kunit ===============
[12:57:40] ================== [SKIPPED] xe_bo_shrink ==================
[12:57:40] ==================== xe_bo (2 subtests) ====================
[12:57:40] ================== xe_ccs_migrate_kunit  ===================
[12:57:40] ============== [SKIPPED] xe_ccs_migrate_kunit ==============
[12:57:40] ==================== xe_bo_evict_kunit  ====================
[12:57:40] =============== [SKIPPED] xe_bo_evict_kunit ================
[12:57:40] ===================== [SKIPPED] xe_bo ======================
[12:57:40] ==================== args (13 subtests) ====================
[12:57:40] [PASSED] count_args_test
[12:57:40] [PASSED] call_args_example
[12:57:40] [PASSED] call_args_test
[12:57:40] [PASSED] drop_first_arg_example
[12:57:40] [PASSED] drop_first_arg_test
[12:57:40] [PASSED] first_arg_example
[12:57:40] [PASSED] first_arg_test
[12:57:40] [PASSED] last_arg_example
[12:57:40] [PASSED] last_arg_test
[12:57:40] [PASSED] pick_arg_example
[12:57:40] [PASSED] if_args_example
[12:57:40] [PASSED] if_args_test
[12:57:40] [PASSED] sep_comma_example
[12:57:40] ====================== [PASSED] args =======================
[12:57:40] =================== xe_pci (3 subtests) ====================
[12:57:40] ==================== check_graphics_ip  ====================
[12:57:40] [PASSED] 12.00 Xe_LP
[12:57:40] [PASSED] 12.10 Xe_LP+
[12:57:40] [PASSED] 12.55 Xe_HPG
[12:57:40] [PASSED] 12.60 Xe_HPC
[12:57:40] [PASSED] 12.70 Xe_LPG
[12:57:40] [PASSED] 12.71 Xe_LPG
[12:57:40] [PASSED] 12.74 Xe_LPG+
[12:57:40] [PASSED] 20.01 Xe2_HPG
[12:57:40] [PASSED] 20.02 Xe2_HPG
[12:57:40] [PASSED] 20.04 Xe2_LPG
[12:57:40] [PASSED] 30.00 Xe3_LPG
[12:57:40] [PASSED] 30.01 Xe3_LPG
[12:57:40] [PASSED] 30.03 Xe3_LPG
[12:57:40] [PASSED] 30.04 Xe3_LPG
[12:57:40] [PASSED] 30.05 Xe3_LPG
[12:57:40] [PASSED] 35.10 Xe3p_LPG
[12:57:40] [PASSED] 35.11 Xe3p_XPC
[12:57:40] ================ [PASSED] check_graphics_ip ================
[12:57:40] ===================== check_media_ip  ======================
[12:57:40] [PASSED] 12.00 Xe_M
[12:57:40] [PASSED] 12.55 Xe_HPM
[12:57:40] [PASSED] 13.00 Xe_LPM+
[12:57:40] [PASSED] 13.01 Xe2_HPM
[12:57:40] [PASSED] 20.00 Xe2_LPM
[12:57:40] [PASSED] 30.00 Xe3_LPM
[12:57:40] [PASSED] 30.02 Xe3_LPM
[12:57:40] [PASSED] 35.00 Xe3p_LPM
[12:57:40] [PASSED] 35.03 Xe3p_HPM
[12:57:40] ================= [PASSED] check_media_ip ==================
[12:57:40] =================== check_platform_desc  ===================
[12:57:40] [PASSED] 0x9A60 (TIGERLAKE)
[12:57:40] [PASSED] 0x9A68 (TIGERLAKE)
[12:57:40] [PASSED] 0x9A70 (TIGERLAKE)
[12:57:40] [PASSED] 0x9A40 (TIGERLAKE)
[12:57:40] [PASSED] 0x9A49 (TIGERLAKE)
[12:57:40] [PASSED] 0x9A59 (TIGERLAKE)
[12:57:40] [PASSED] 0x9A78 (TIGERLAKE)
[12:57:40] [PASSED] 0x9AC0 (TIGERLAKE)
[12:57:40] [PASSED] 0x9AC9 (TIGERLAKE)
[12:57:40] [PASSED] 0x9AD9 (TIGERLAKE)
[12:57:40] [PASSED] 0x9AF8 (TIGERLAKE)
[12:57:40] [PASSED] 0x4C80 (ROCKETLAKE)
[12:57:40] [PASSED] 0x4C8A (ROCKETLAKE)
[12:57:40] [PASSED] 0x4C8B (ROCKETLAKE)
[12:57:40] [PASSED] 0x4C8C (ROCKETLAKE)
[12:57:40] [PASSED] 0x4C90 (ROCKETLAKE)
[12:57:40] [PASSED] 0x4C9A (ROCKETLAKE)
[12:57:40] [PASSED] 0x4680 (ALDERLAKE_S)
[12:57:40] [PASSED] 0x4682 (ALDERLAKE_S)
[12:57:40] [PASSED] 0x4688 (ALDERLAKE_S)
[12:57:40] [PASSED] 0x468A (ALDERLAKE_S)
[12:57:40] [PASSED] 0x468B (ALDERLAKE_S)
[12:57:40] [PASSED] 0x4690 (ALDERLAKE_S)
[12:57:40] [PASSED] 0x4692 (ALDERLAKE_S)
[12:57:40] [PASSED] 0x4693 (ALDERLAKE_S)
[12:57:40] [PASSED] 0x46A0 (ALDERLAKE_P)
[12:57:40] [PASSED] 0x46A1 (ALDERLAKE_P)
[12:57:40] [PASSED] 0x46A2 (ALDERLAKE_P)
[12:57:40] [PASSED] 0x46A3 (ALDERLAKE_P)
[12:57:40] [PASSED] 0x46A6 (ALDERLAKE_P)
[12:57:40] [PASSED] 0x46A8 (ALDERLAKE_P)
[12:57:40] [PASSED] 0x46AA (ALDERLAKE_P)
[12:57:40] [PASSED] 0x462A (ALDERLAKE_P)
[12:57:40] [PASSED] 0x4626 (ALDERLAKE_P)
[12:57:40] [PASSED] 0x4628 (ALDERLAKE_P)
[12:57:40] [PASSED] 0x46B0 (ALDERLAKE_P)
[12:57:40] [PASSED] 0x46B1 (ALDERLAKE_P)
[12:57:40] [PASSED] 0x46B2 (ALDERLAKE_P)
[12:57:40] [PASSED] 0x46B3 (ALDERLAKE_P)
[12:57:40] [PASSED] 0x46C0 (ALDERLAKE_P)
[12:57:40] [PASSED] 0x46C1 (ALDERLAKE_P)
[12:57:40] [PASSED] 0x46C2 (ALDERLAKE_P)
[12:57:40] [PASSED] 0x46C3 (ALDERLAKE_P)
[12:57:40] [PASSED] 0x46D0 (ALDERLAKE_N)
[12:57:40] [PASSED] 0x46D1 (ALDERLAKE_N)
[12:57:40] [PASSED] 0x46D2 (ALDERLAKE_N)
[12:57:40] [PASSED] 0x46D3 (ALDERLAKE_N)
[12:57:40] [PASSED] 0x46D4 (ALDERLAKE_N)
[12:57:40] [PASSED] 0xA721 (ALDERLAKE_P)
[12:57:40] [PASSED] 0xA7A1 (ALDERLAKE_P)
[12:57:40] [PASSED] 0xA7A9 (ALDERLAKE_P)
[12:57:40] [PASSED] 0xA7AC (ALDERLAKE_P)
[12:57:40] [PASSED] 0xA7AD (ALDERLAKE_P)
[12:57:40] [PASSED] 0xA720 (ALDERLAKE_P)
[12:57:40] [PASSED] 0xA7A0 (ALDERLAKE_P)
[12:57:40] [PASSED] 0xA7A8 (ALDERLAKE_P)
[12:57:40] [PASSED] 0xA7AA (ALDERLAKE_P)
[12:57:40] [PASSED] 0xA7AB (ALDERLAKE_P)
[12:57:40] [PASSED] 0xA780 (ALDERLAKE_S)
[12:57:40] [PASSED] 0xA781 (ALDERLAKE_S)
[12:57:40] [PASSED] 0xA782 (ALDERLAKE_S)
[12:57:40] [PASSED] 0xA783 (ALDERLAKE_S)
[12:57:40] [PASSED] 0xA788 (ALDERLAKE_S)
[12:57:40] [PASSED] 0xA789 (ALDERLAKE_S)
[12:57:40] [PASSED] 0xA78A (ALDERLAKE_S)
[12:57:40] [PASSED] 0xA78B (ALDERLAKE_S)
[12:57:40] [PASSED] 0x4905 (DG1)
[12:57:40] [PASSED] 0x4906 (DG1)
[12:57:40] [PASSED] 0x4907 (DG1)
[12:57:40] [PASSED] 0x4908 (DG1)
[12:57:40] [PASSED] 0x4909 (DG1)
[12:57:40] [PASSED] 0x56C0 (DG2)
[12:57:40] [PASSED] 0x56C2 (DG2)
[12:57:40] [PASSED] 0x56C1 (DG2)
[12:57:40] [PASSED] 0x7D51 (METEORLAKE)
[12:57:40] [PASSED] 0x7DD1 (METEORLAKE)
[12:57:40] [PASSED] 0x7D41 (METEORLAKE)
[12:57:40] [PASSED] 0x7D67 (METEORLAKE)
[12:57:40] [PASSED] 0xB640 (METEORLAKE)
[12:57:40] [PASSED] 0x56A0 (DG2)
[12:57:40] [PASSED] 0x56A1 (DG2)
[12:57:40] [PASSED] 0x56A2 (DG2)
[12:57:40] [PASSED] 0x56BE (DG2)
[12:57:40] [PASSED] 0x56BF (DG2)
[12:57:40] [PASSED] 0x5690 (DG2)
[12:57:40] [PASSED] 0x5691 (DG2)
[12:57:40] [PASSED] 0x5692 (DG2)
[12:57:40] [PASSED] 0x56A5 (DG2)
[12:57:40] [PASSED] 0x56A6 (DG2)
[12:57:40] [PASSED] 0x56B0 (DG2)
[12:57:40] [PASSED] 0x56B1 (DG2)
[12:57:40] [PASSED] 0x56BA (DG2)
[12:57:40] [PASSED] 0x56BB (DG2)
[12:57:40] [PASSED] 0x56BC (DG2)
[12:57:40] [PASSED] 0x56BD (DG2)
[12:57:40] [PASSED] 0x5693 (DG2)
[12:57:40] [PASSED] 0x5694 (DG2)
[12:57:40] [PASSED] 0x5695 (DG2)
[12:57:40] [PASSED] 0x56A3 (DG2)
[12:57:40] [PASSED] 0x56A4 (DG2)
[12:57:40] [PASSED] 0x56B2 (DG2)
[12:57:40] [PASSED] 0x56B3 (DG2)
[12:57:40] [PASSED] 0x5696 (DG2)
[12:57:40] [PASSED] 0x5697 (DG2)
[12:57:40] [PASSED] 0xB69 (PVC)
[12:57:40] [PASSED] 0xB6E (PVC)
[12:57:40] [PASSED] 0xBD4 (PVC)
[12:57:40] [PASSED] 0xBD5 (PVC)
[12:57:40] [PASSED] 0xBD6 (PVC)
[12:57:40] [PASSED] 0xBD7 (PVC)
[12:57:40] [PASSED] 0xBD8 (PVC)
[12:57:40] [PASSED] 0xBD9 (PVC)
[12:57:40] [PASSED] 0xBDA (PVC)
[12:57:40] [PASSED] 0xBDB (PVC)
[12:57:40] [PASSED] 0xBE0 (PVC)
[12:57:40] [PASSED] 0xBE1 (PVC)
[12:57:40] [PASSED] 0xBE5 (PVC)
[12:57:40] [PASSED] 0x7D40 (METEORLAKE)
[12:57:40] [PASSED] 0x7D45 (METEORLAKE)
[12:57:40] [PASSED] 0x7D55 (METEORLAKE)
[12:57:40] [PASSED] 0x7D60 (METEORLAKE)
[12:57:40] [PASSED] 0x7DD5 (METEORLAKE)
[12:57:40] [PASSED] 0x6420 (LUNARLAKE)
[12:57:40] [PASSED] 0x64A0 (LUNARLAKE)
[12:57:40] [PASSED] 0x64B0 (LUNARLAKE)
[12:57:40] [PASSED] 0xE202 (BATTLEMAGE)
[12:57:40] [PASSED] 0xE209 (BATTLEMAGE)
[12:57:40] [PASSED] 0xE20B (BATTLEMAGE)
[12:57:40] [PASSED] 0xE20C (BATTLEMAGE)
[12:57:40] [PASSED] 0xE20D (BATTLEMAGE)
[12:57:40] [PASSED] 0xE210 (BATTLEMAGE)
[12:57:40] [PASSED] 0xE211 (BATTLEMAGE)
[12:57:40] [PASSED] 0xE212 (BATTLEMAGE)
[12:57:40] [PASSED] 0xE216 (BATTLEMAGE)
[12:57:40] [PASSED] 0xE220 (BATTLEMAGE)
[12:57:40] [PASSED] 0xE221 (BATTLEMAGE)
[12:57:40] [PASSED] 0xE222 (BATTLEMAGE)
[12:57:40] [PASSED] 0xE223 (BATTLEMAGE)
[12:57:40] [PASSED] 0xB080 (PANTHERLAKE)
[12:57:40] [PASSED] 0xB081 (PANTHERLAKE)
[12:57:40] [PASSED] 0xB082 (PANTHERLAKE)
[12:57:40] [PASSED] 0xB083 (PANTHERLAKE)
[12:57:40] [PASSED] 0xB084 (PANTHERLAKE)
[12:57:40] [PASSED] 0xB085 (PANTHERLAKE)
[12:57:40] [PASSED] 0xB086 (PANTHERLAKE)
[12:57:40] [PASSED] 0xB087 (PANTHERLAKE)
[12:57:40] [PASSED] 0xB08F (PANTHERLAKE)
[12:57:40] [PASSED] 0xB090 (PANTHERLAKE)
[12:57:40] [PASSED] 0xB0A0 (PANTHERLAKE)
[12:57:40] [PASSED] 0xB0B0 (PANTHERLAKE)
[12:57:40] [PASSED] 0xFD80 (PANTHERLAKE)
[12:57:40] [PASSED] 0xFD81 (PANTHERLAKE)
[12:57:40] [PASSED] 0xD740 (NOVALAKE_S)
[12:57:40] [PASSED] 0xD741 (NOVALAKE_S)
[12:57:40] [PASSED] 0xD742 (NOVALAKE_S)
[12:57:40] [PASSED] 0xD743 (NOVALAKE_S)
[12:57:40] [PASSED] 0xD744 (NOVALAKE_S)
[12:57:40] [PASSED] 0xD745 (NOVALAKE_S)
[12:57:40] [PASSED] 0x674C (CRESCENTISLAND)
[12:57:40] [PASSED] 0x674D (CRESCENTISLAND)
[12:57:40] [PASSED] 0x674E (CRESCENTISLAND)
[12:57:40] [PASSED] 0x674F (CRESCENTISLAND)
[12:57:40] [PASSED] 0x6750 (CRESCENTISLAND)
[12:57:40] [PASSED] 0xD750 (NOVALAKE_P)
[12:57:40] [PASSED] 0xD751 (NOVALAKE_P)
[12:57:40] [PASSED] 0xD752 (NOVALAKE_P)
[12:57:40] [PASSED] 0xD753 (NOVALAKE_P)
[12:57:40] [PASSED] 0xD754 (NOVALAKE_P)
[12:57:40] [PASSED] 0xD755 (NOVALAKE_P)
[12:57:40] [PASSED] 0xD756 (NOVALAKE_P)
[12:57:40] [PASSED] 0xD757 (NOVALAKE_P)
[12:57:40] [PASSED] 0xD75F (NOVALAKE_P)
[12:57:40] =============== [PASSED] check_platform_desc ===============
[12:57:40] ===================== [PASSED] xe_pci ======================
[12:57:40] =================== xe_rtp (3 subtests) ====================
[12:57:40] =================== xe_rtp_rules_tests  ====================
[12:57:40] [PASSED] no
[12:57:40] [PASSED] yes
[12:57:40] [PASSED] no-and-no
[12:57:40] [PASSED] no-and-yes
[12:57:40] [PASSED] yes-and-no
[12:57:40] [PASSED] yes-and-yes
[12:57:40] [PASSED] no-or-no
[12:57:40] [PASSED] no-or-yes
[12:57:40] [PASSED] yes-or-no
[12:57:40] [PASSED] yes-or-yes
[12:57:40] [PASSED] no-yes-or-yes-no
[12:57:40] [PASSED] no-yes-or-yes-yes
[12:57:40] [PASSED] yes-yes-or-no-yes
[12:57:40] [PASSED] yes-yes-or-yes-yes
[12:57:40] [PASSED] no-no-or-yes-or-no
[12:57:40] [PASSED] or
[12:57:40] [PASSED] or-yes
[12:57:40] [PASSED] or-no
[12:57:40] [PASSED] yes-or
[12:57:40] [PASSED] no-or
[12:57:40] [PASSED] no-or-or-yes
[12:57:40] [PASSED] yes-or-or-no
[12:57:40] [PASSED] no-or-or-no
[12:57:40] [PASSED] missing-context-engine-class
[12:57:40] [PASSED] missing-context-engine-class-or-yes
[12:57:40] [PASSED] missing-context-engine-class-or-or-yes
[12:57:40] =============== [PASSED] xe_rtp_rules_tests ================
[12:57:40] =============== xe_rtp_process_to_sr_tests  ================
[12:57:40] [PASSED] coalesce-same-reg
[12:57:40] [PASSED] no-match-no-add
[12:57:40] [PASSED] two-regs-two-entries
[12:57:40] [PASSED] clr-one-set-other
[12:57:40] [PASSED] set-field
[12:57:40] [PASSED] conflict-duplicate
[12:57:40] [PASSED] conflict-not-disjoint
[12:57:40] [PASSED] conflict-reg-type
[12:57:40] [PASSED] bad-mcr-reg-forced-to-regular
[12:57:40] [PASSED] bad-regular-reg-forced-to-mcr
[12:57:40] =========== [PASSED] xe_rtp_process_to_sr_tests ============
[12:57:40] ================== xe_rtp_process_tests  ===================
[12:57:40] [PASSED] active1
[12:57:40] [PASSED] active2
[12:57:40] [PASSED] active-inactive
[12:57:40] [PASSED] inactive-active
[12:57:40] [PASSED] inactive-active-inactive
[12:57:40] [PASSED] inactive-inactive-inactive
[12:57:40] ============== [PASSED] xe_rtp_process_tests ===============
[12:57:40] ===================== [PASSED] xe_rtp ======================
[12:57:40] ==================== xe_wa (1 subtest) =====================
[12:57:40] ======================== xe_wa_gt  =========================
[12:57:40] [PASSED] TIGERLAKE B0
[12:57:40] [PASSED] DG1 A0
[12:57:40] [PASSED] DG1 B0
[12:57:40] [PASSED] ALDERLAKE_S A0
[12:57:40] [PASSED] ALDERLAKE_S B0
[12:57:40] [PASSED] ALDERLAKE_S C0
[12:57:40] [PASSED] ALDERLAKE_S D0
[12:57:40] [PASSED] ALDERLAKE_P A0
[12:57:40] [PASSED] ALDERLAKE_P B0
[12:57:40] [PASSED] ALDERLAKE_P C0
[12:57:40] [PASSED] ALDERLAKE_S RPLS D0
[12:57:40] [PASSED] ALDERLAKE_P RPLU E0
[12:57:40] [PASSED] DG2 G10 C0
[12:57:40] [PASSED] DG2 G11 B1
[12:57:40] [PASSED] DG2 G12 A1
[12:57:40] [PASSED] METEORLAKE 12.70(Xe_LPG) A0 13.00(Xe_LPM+) A0
[12:57:40] [PASSED] METEORLAKE 12.71(Xe_LPG) A0 13.00(Xe_LPM+) A0
[12:57:40] [PASSED] METEORLAKE 12.74(Xe_LPG+) A0 13.00(Xe_LPM+) A0
[12:57:40] [PASSED] LUNARLAKE 20.04(Xe2_LPG) A0 20.00(Xe2_LPM) A0
[12:57:40] [PASSED] LUNARLAKE 20.04(Xe2_LPG) B0 20.00(Xe2_LPM) A0
[12:57:40] [PASSED] BATTLEMAGE 20.01(Xe2_HPG) A0 13.01(Xe2_HPM) A1
[12:57:40] [PASSED] PANTHERLAKE 30.00(Xe3_LPG) A0 30.00(Xe3_LPM) A0
[12:57:40] ==================== [PASSED] xe_wa_gt =====================
[12:57:40] ====================== [PASSED] xe_wa ======================
[12:57:40] ============================================================
[12:57:40] Testing complete. Ran 624 tests: passed: 606, skipped: 18
[12:57:40] Elapsed time: 36.260s total, 4.285s configuring, 31.309s building, 0.650s running

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

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

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



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

* ✓ Xe.CI.BAT: success for drm/xe/mmio_gem: fix fault handler and destroy path (rev2)
  2026-05-26 12:51 [PATCH v2 0/5] drm/xe/mmio_gem: fix fault handler and destroy path Ilia Levi
                   ` (5 preceding siblings ...)
  2026-05-26 12:58 ` ✓ CI.KUnit: success for drm/xe/mmio_gem: fix fault handler and destroy path (rev2) Patchwork
@ 2026-05-26 13:42 ` Patchwork
  2026-05-26 15:20 ` ✓ Xe.CI.FULL: " Patchwork
  2026-07-16 15:55 ` [PATCH v2 0/5] drm/xe/mmio_gem: fix fault handler and destroy path Matthew Auld
  8 siblings, 0 replies; 20+ messages in thread
From: Patchwork @ 2026-05-26 13:42 UTC (permalink / raw)
  To: Ilia Levi; +Cc: intel-xe

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

== Series Details ==

Series: drm/xe/mmio_gem: fix fault handler and destroy path (rev2)
URL   : https://patchwork.freedesktop.org/series/167217/
State : success

== Summary ==

CI Bug Log - changes from xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0_BAT -> xe-pw-167217v2_BAT
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  

Participating hosts (13 -> 13)
------------------------------

  No changes in participating hosts


Changes
-------

  No changes found


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

  * Linux: xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0 -> xe-pw-167217v2

  IGT_8937: 8937
  xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0: 5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0
  xe-pw-167217v2: 167217v2

== Logs ==

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

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

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

* ✓ Xe.CI.FULL: success for drm/xe/mmio_gem: fix fault handler and destroy path (rev2)
  2026-05-26 12:51 [PATCH v2 0/5] drm/xe/mmio_gem: fix fault handler and destroy path Ilia Levi
                   ` (6 preceding siblings ...)
  2026-05-26 13:42 ` ✓ Xe.CI.BAT: " Patchwork
@ 2026-05-26 15:20 ` Patchwork
  2026-07-16 15:55 ` [PATCH v2 0/5] drm/xe/mmio_gem: fix fault handler and destroy path Matthew Auld
  8 siblings, 0 replies; 20+ messages in thread
From: Patchwork @ 2026-05-26 15:20 UTC (permalink / raw)
  To: Ilia Levi; +Cc: intel-xe

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

== Series Details ==

Series: drm/xe/mmio_gem: fix fault handler and destroy path (rev2)
URL   : https://patchwork.freedesktop.org/series/167217/
State : success

== Summary ==

CI Bug Log - changes from xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0_FULL -> xe-pw-167217v2_FULL
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  

Participating hosts (2 -> 2)
------------------------------

  No changes in participating hosts

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

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

### IGT changes ###

#### Issues hit ####

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

  * igt@kms_big_fb@4-tiled-32bpp-rotate-270:
    - shard-bmg:          NOTRUN -> [SKIP][2] ([Intel XE#2327])
   [2]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-4/igt@kms_big_fb@4-tiled-32bpp-rotate-270.html

  * igt@kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-180-hflip-async-flip:
    - shard-lnl:          NOTRUN -> [SKIP][3] ([Intel XE#3658] / [Intel XE#7360])
   [3]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-180-hflip-async-flip.html

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

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

  * igt@kms_bw@connected-linear-tiling-2-displays-target-3840x2160p:
    - shard-lnl:          NOTRUN -> [SKIP][6] ([Intel XE#7679])
   [6]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@kms_bw@connected-linear-tiling-2-displays-target-3840x2160p.html

  * igt@kms_ccs@ccs-on-another-bo-4-tiled-mtl-mc-ccs:
    - shard-bmg:          NOTRUN -> [SKIP][7] ([Intel XE#2887]) +1 other test skip
   [7]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-4/igt@kms_ccs@ccs-on-another-bo-4-tiled-mtl-mc-ccs.html

  * igt@kms_ccs@crc-primary-basic-4-tiled-dg2-rc-ccs-cc:
    - shard-lnl:          NOTRUN -> [SKIP][8] ([Intel XE#2887]) +3 other tests skip
   [8]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@kms_ccs@crc-primary-basic-4-tiled-dg2-rc-ccs-cc.html

  * igt@kms_chamelium_audio@hdmi-audio-edid:
    - shard-bmg:          NOTRUN -> [SKIP][9] ([Intel XE#2252])
   [9]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-4/igt@kms_chamelium_audio@hdmi-audio-edid.html

  * igt@kms_chamelium_color@ctm-0-75:
    - shard-lnl:          NOTRUN -> [SKIP][10] ([Intel XE#306] / [Intel XE#7358]) +1 other test skip
   [10]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@kms_chamelium_color@ctm-0-75.html

  * igt@kms_chamelium_frames@hdmi-aspect-ratio:
    - shard-lnl:          NOTRUN -> [SKIP][11] ([Intel XE#373])
   [11]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@kms_chamelium_frames@hdmi-aspect-ratio.html

  * igt@kms_content_protection@dp-mst-type-1:
    - shard-lnl:          NOTRUN -> [SKIP][12] ([Intel XE#307] / [Intel XE#6974])
   [12]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@kms_content_protection@dp-mst-type-1.html

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

  * igt@kms_cursor_crc@cursor-rapid-movement-256x85:
    - shard-lnl:          NOTRUN -> [SKIP][14] ([Intel XE#1424])
   [14]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@kms_cursor_crc@cursor-rapid-movement-256x85.html

  * igt@kms_cursor_legacy@2x-long-flip-vs-cursor-atomic:
    - shard-lnl:          NOTRUN -> [SKIP][15] ([Intel XE#309] / [Intel XE#7343])
   [15]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@kms_cursor_legacy@2x-long-flip-vs-cursor-atomic.html

  * igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions-varying-size:
    - shard-lnl:          NOTRUN -> [SKIP][16] ([Intel XE#323] / [Intel XE#6035])
   [16]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions-varying-size.html

  * igt@kms_dsc@dsc-with-formats:
    - shard-lnl:          NOTRUN -> [SKIP][17] ([Intel XE#2244])
   [17]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@kms_dsc@dsc-with-formats.html

  * igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@bc-dp2-hdmi-a3:
    - shard-bmg:          NOTRUN -> [FAIL][18] ([Intel XE#3321]) +1 other test fail
   [18]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-4/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@bc-dp2-hdmi-a3.html

  * igt@kms_flip@2x-plain-flip-fb-recreate:
    - shard-lnl:          NOTRUN -> [SKIP][19] ([Intel XE#1421]) +1 other test skip
   [19]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@kms_flip@2x-plain-flip-fb-recreate.html

  * igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-32bpp-yftileccs-upscaling:
    - shard-lnl:          NOTRUN -> [SKIP][20] ([Intel XE#7178] / [Intel XE#7351])
   [20]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-32bpp-yftileccs-upscaling.html

  * igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytilegen12rcccs-downscaling:
    - shard-bmg:          NOTRUN -> [SKIP][21] ([Intel XE#7178] / [Intel XE#7351])
   [21]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-4/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytilegen12rcccs-downscaling.html

  * igt@kms_force_connector_basic@force-edid:
    - shard-lnl:          NOTRUN -> [SKIP][22] ([Intel XE#352])
   [22]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@kms_force_connector_basic@force-edid.html

  * igt@kms_frontbuffer_tracking@drrs-1p-primscrn-shrfb-plflip-blt:
    - shard-lnl:          NOTRUN -> [SKIP][23] ([Intel XE#6312] / [Intel XE#651]) +3 other tests skip
   [23]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@kms_frontbuffer_tracking@drrs-1p-primscrn-shrfb-plflip-blt.html

  * igt@kms_frontbuffer_tracking@drrs-2p-pri-indfb-multidraw:
    - shard-bmg:          NOTRUN -> [SKIP][24] ([Intel XE#2311]) +5 other tests skip
   [24]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-4/igt@kms_frontbuffer_tracking@drrs-2p-pri-indfb-multidraw.html

  * igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-pri-shrfb-draw-blt:
    - shard-lnl:          NOTRUN -> [SKIP][25] ([Intel XE#656] / [Intel XE#7905]) +7 other tests skip
   [25]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-pri-shrfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@drrs-abgr161616f-draw-blt:
    - shard-bmg:          NOTRUN -> [SKIP][26] ([Intel XE#7061] / [Intel XE#7356]) +1 other test skip
   [26]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-4/igt@kms_frontbuffer_tracking@drrs-abgr161616f-draw-blt.html

  * igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-draw-render:
    - shard-bmg:          NOTRUN -> [SKIP][27] ([Intel XE#4141])
   [27]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-4/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@fbcdrrshdr-1p-primscrn-indfb-pgflip-blt:
    - shard-lnl:          NOTRUN -> [SKIP][28] ([Intel XE#6312]) +1 other test skip
   [28]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@kms_frontbuffer_tracking@fbcdrrshdr-1p-primscrn-indfb-pgflip-blt.html

  * igt@kms_frontbuffer_tracking@fbcdrrshdr-abgr161616f-draw-mmap-wc:
    - shard-lnl:          NOTRUN -> [SKIP][29] ([Intel XE#7061])
   [29]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@kms_frontbuffer_tracking@fbcdrrshdr-abgr161616f-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@fbcdrrshdr-tiling-y:
    - shard-lnl:          NOTRUN -> [SKIP][30] ([Intel XE#7399])
   [30]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@kms_frontbuffer_tracking@fbcdrrshdr-tiling-y.html

  * igt@kms_frontbuffer_tracking@fbcpsrhdr-2p-primscrn-indfb-plflip-blt:
    - shard-bmg:          NOTRUN -> [SKIP][31] ([Intel XE#2313]) +2 other tests skip
   [31]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-4/igt@kms_frontbuffer_tracking@fbcpsrhdr-2p-primscrn-indfb-plflip-blt.html

  * igt@kms_frontbuffer_tracking@fbcpsrhdr-rgb565-draw-blt:
    - shard-lnl:          NOTRUN -> [SKIP][32] ([Intel XE#7865]) +7 other tests skip
   [32]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@kms_frontbuffer_tracking@fbcpsrhdr-rgb565-draw-blt.html

  * igt@kms_frontbuffer_tracking@psrhdr-2p-scndscrn-cur-indfb-onoff:
    - shard-lnl:          NOTRUN -> [SKIP][33] ([Intel XE#7905]) +10 other tests skip
   [33]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@kms_frontbuffer_tracking@psrhdr-2p-scndscrn-cur-indfb-onoff.html

  * igt@kms_multipipe_modeset@basic-max-pipe-crc-check:
    - shard-lnl:          NOTRUN -> [SKIP][34] ([Intel XE#7591])
   [34]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@kms_multipipe_modeset@basic-max-pipe-crc-check.html

  * igt@kms_plane@pixel-format-4-tiled-dg2-mc-ccs-modifier-source-clamping:
    - shard-bmg:          NOTRUN -> [SKIP][35] ([Intel XE#7283])
   [35]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-4/igt@kms_plane@pixel-format-4-tiled-dg2-mc-ccs-modifier-source-clamping.html

  * igt@kms_plane@pixel-format-x-tiled-modifier@pipe-b-plane-5:
    - shard-bmg:          NOTRUN -> [SKIP][36] ([Intel XE#7130]) +1 other test skip
   [36]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-4/igt@kms_plane@pixel-format-x-tiled-modifier@pipe-b-plane-5.html

  * igt@kms_plane@pixel-format-y-tiled-gen12-rc-ccs-cc-modifier:
    - shard-lnl:          NOTRUN -> [SKIP][37] ([Intel XE#7283])
   [37]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@kms_plane@pixel-format-y-tiled-gen12-rc-ccs-cc-modifier.html

  * igt@kms_plane_lowres@tiling-yf:
    - shard-lnl:          NOTRUN -> [SKIP][38] ([Intel XE#599])
   [38]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@kms_plane_lowres@tiling-yf.html

  * igt@kms_psr2_sf@fbc-psr2-primary-plane-update-sf-dmg-area:
    - shard-lnl:          NOTRUN -> [SKIP][39] ([Intel XE#2893] / [Intel XE#4608] / [Intel XE#7304])
   [39]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@kms_psr2_sf@fbc-psr2-primary-plane-update-sf-dmg-area.html

  * igt@kms_psr2_sf@fbc-psr2-primary-plane-update-sf-dmg-area@pipe-a-edp-1:
    - shard-lnl:          NOTRUN -> [SKIP][40] ([Intel XE#4608])
   [40]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@kms_psr2_sf@fbc-psr2-primary-plane-update-sf-dmg-area@pipe-a-edp-1.html

  * igt@kms_psr2_sf@fbc-psr2-primary-plane-update-sf-dmg-area@pipe-b-edp-1:
    - shard-lnl:          NOTRUN -> [SKIP][41] ([Intel XE#4608] / [Intel XE#7304])
   [41]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@kms_psr2_sf@fbc-psr2-primary-plane-update-sf-dmg-area@pipe-b-edp-1.html

  * igt@kms_psr2_sf@pr-overlay-plane-update-sf-dmg-area:
    - shard-lnl:          NOTRUN -> [SKIP][42] ([Intel XE#2893] / [Intel XE#7304])
   [42]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@kms_psr2_sf@pr-overlay-plane-update-sf-dmg-area.html

  * igt@kms_psr@fbc-psr2-primary-blt:
    - shard-lnl:          NOTRUN -> [SKIP][43] ([Intel XE#1406] / [Intel XE#7345])
   [43]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@kms_psr@fbc-psr2-primary-blt.html

  * igt@kms_psr@fbc-psr2-primary-blt@edp-1:
    - shard-lnl:          NOTRUN -> [SKIP][44] ([Intel XE#1406] / [Intel XE#4609])
   [44]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@kms_psr@fbc-psr2-primary-blt@edp-1.html

  * igt@kms_psr@pr-sprite-blt:
    - shard-lnl:          NOTRUN -> [SKIP][45] ([Intel XE#1406])
   [45]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@kms_psr@pr-sprite-blt.html

  * igt@kms_setmode@invalid-clone-exclusive-crtc:
    - shard-bmg:          NOTRUN -> [SKIP][46] ([Intel XE#1435])
   [46]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-4/igt@kms_setmode@invalid-clone-exclusive-crtc.html

  * igt@kms_setmode@invalid-clone-single-crtc-stealing:
    - shard-lnl:          NOTRUN -> [SKIP][47] ([Intel XE#1435])
   [47]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@kms_setmode@invalid-clone-single-crtc-stealing.html

  * igt@kms_vrr@seamless-rr-switch-drrs:
    - shard-lnl:          NOTRUN -> [SKIP][48] ([Intel XE#1499])
   [48]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@kms_vrr@seamless-rr-switch-drrs.html

  * igt@kms_vrr@seamless-rr-switch-virtual@pipe-a-edp-1:
    - shard-lnl:          [PASS][49] -> [FAIL][50] ([Intel XE#2142]) +1 other test fail
   [49]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-lnl-1/igt@kms_vrr@seamless-rr-switch-virtual@pipe-a-edp-1.html
   [50]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-2/igt@kms_vrr@seamless-rr-switch-virtual@pipe-a-edp-1.html

  * igt@xe_eudebug_online@pagefault-read-stress:
    - shard-lnl:          NOTRUN -> [SKIP][51] ([Intel XE#7636]) +3 other tests skip
   [51]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@xe_eudebug_online@pagefault-read-stress.html

  * igt@xe_evict@evict-mixed-threads-large:
    - shard-lnl:          NOTRUN -> [SKIP][52] ([Intel XE#6540] / [Intel XE#688]) +3 other tests skip
   [52]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@xe_evict@evict-mixed-threads-large.html

  * igt@xe_evict@evict-small-multi-queue-priority-cm:
    - shard-bmg:          NOTRUN -> [SKIP][53] ([Intel XE#7140])
   [53]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-4/igt@xe_evict@evict-small-multi-queue-priority-cm.html

  * igt@xe_exec_balancer@many-execqueues-virtual-userptr-invalidate-race:
    - shard-lnl:          NOTRUN -> [SKIP][54] ([Intel XE#7482]) +4 other tests skip
   [54]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@xe_exec_balancer@many-execqueues-virtual-userptr-invalidate-race.html

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

  * igt@xe_exec_fault_mode@many-execqueues-multi-queue-userptr:
    - shard-lnl:          NOTRUN -> [SKIP][56] ([Intel XE#7136]) +3 other tests skip
   [56]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@xe_exec_fault_mode@many-execqueues-multi-queue-userptr.html

  * igt@xe_exec_fault_mode@twice-multi-queue-userptr-invalidate-prefetch:
    - shard-bmg:          NOTRUN -> [SKIP][57] ([Intel XE#7136])
   [57]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-4/igt@xe_exec_fault_mode@twice-multi-queue-userptr-invalidate-prefetch.html

  * igt@xe_exec_multi_queue@few-execs-preempt-mode-fault-close-fd:
    - shard-lnl:          NOTRUN -> [SKIP][58] ([Intel XE#6874]) +6 other tests skip
   [58]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@xe_exec_multi_queue@few-execs-preempt-mode-fault-close-fd.html

  * igt@xe_exec_multi_queue@many-queues-userptr-invalidate:
    - shard-bmg:          NOTRUN -> [SKIP][59] ([Intel XE#6874]) +1 other test skip
   [59]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-4/igt@xe_exec_multi_queue@many-queues-userptr-invalidate.html

  * igt@xe_exec_threads@threads-multi-queue-mixed-userptr-invalidate:
    - shard-lnl:          NOTRUN -> [SKIP][60] ([Intel XE#7138]) +2 other tests skip
   [60]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@xe_exec_threads@threads-multi-queue-mixed-userptr-invalidate.html

  * igt@xe_gpgpu_fill@offset-4x4:
    - shard-lnl:          NOTRUN -> [SKIP][61] ([Intel XE#7954])
   [61]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@xe_gpgpu_fill@offset-4x4.html

  * igt@xe_multigpu_svm@mgpu-latency-prefetch:
    - shard-lnl:          NOTRUN -> [SKIP][62] ([Intel XE#6964])
   [62]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@xe_multigpu_svm@mgpu-latency-prefetch.html

  * igt@xe_page_reclaim@boundary-split:
    - shard-bmg:          NOTRUN -> [SKIP][63] ([Intel XE#7793])
   [63]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-4/igt@xe_page_reclaim@boundary-split.html

  * igt@xe_pm@s3-exec-after:
    - shard-lnl:          NOTRUN -> [SKIP][64] ([Intel XE#584] / [Intel XE#7369])
   [64]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@xe_pm@s3-exec-after.html

  * igt@xe_query@multigpu-query-invalid-cs-cycles:
    - shard-lnl:          NOTRUN -> [SKIP][65] ([Intel XE#944])
   [65]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@xe_query@multigpu-query-invalid-cs-cycles.html

  * igt@xe_sriov_scheduling@equal-throughput:
    - shard-lnl:          NOTRUN -> [SKIP][66] ([Intel XE#4351] / [Intel XE#7357])
   [66]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@xe_sriov_scheduling@equal-throughput.html

  
#### Possible fixes ####

  * igt@kms_flip@flip-vs-expired-vblank-interruptible:
    - shard-bmg:          [FAIL][67] ([Intel XE#3321]) -> [PASS][68] +1 other test pass
   [67]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-bmg-1/igt@kms_flip@flip-vs-expired-vblank-interruptible.html
   [68]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-5/igt@kms_flip@flip-vs-expired-vblank-interruptible.html

  * igt@kms_flip@flip-vs-expired-vblank-interruptible@b-edp1:
    - shard-lnl:          [FAIL][69] ([Intel XE#301]) -> [PASS][70]
   [69]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-lnl-5/igt@kms_flip@flip-vs-expired-vblank-interruptible@b-edp1.html
   [70]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@kms_flip@flip-vs-expired-vblank-interruptible@b-edp1.html

  * igt@kms_flip@flip-vs-expired-vblank-interruptible@c-edp1:
    - shard-lnl:          [FAIL][71] ([Intel XE#301] / [Intel XE#3149]) -> [PASS][72]
   [71]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-lnl-5/igt@kms_flip@flip-vs-expired-vblank-interruptible@c-edp1.html
   [72]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@kms_flip@flip-vs-expired-vblank-interruptible@c-edp1.html

  * igt@kms_flip@plain-flip-fb-recreate:
    - shard-bmg:          [DMESG-FAIL][73] ([Intel XE#5545] / [Intel XE#7774]) -> [PASS][74] +1 other test pass
   [73]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-bmg-2/igt@kms_flip@plain-flip-fb-recreate.html
   [74]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-6/igt@kms_flip@plain-flip-fb-recreate.html

  * igt@kms_hdr@invalid-hdr:
    - shard-bmg:          [SKIP][75] ([Intel XE#1503]) -> [PASS][76]
   [75]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-bmg-5/igt@kms_hdr@invalid-hdr.html
   [76]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-8/igt@kms_hdr@invalid-hdr.html

  * igt@kms_hdr@invalid-hdr@pipe-a-hdmi-a-3-xrgb2101010:
    - shard-bmg:          [SKIP][77] ([Intel XE#7922]) -> [PASS][78] +1 other test pass
   [77]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-bmg-5/igt@kms_hdr@invalid-hdr@pipe-a-hdmi-a-3-xrgb2101010.html
   [78]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-8/igt@kms_hdr@invalid-hdr@pipe-a-hdmi-a-3-xrgb2101010.html

  * igt@kms_hdr@static-swap@pipe-a-hdmi-a-3-xrgb2101010:
    - shard-bmg:          [SKIP][79] ([Intel XE#7915]) -> [PASS][80] +3 other tests pass
   [79]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-bmg-1/igt@kms_hdr@static-swap@pipe-a-hdmi-a-3-xrgb2101010.html
   [80]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-5/igt@kms_hdr@static-swap@pipe-a-hdmi-a-3-xrgb2101010.html

  * igt@kms_vrr@flipline:
    - shard-lnl:          [FAIL][81] ([Intel XE#4227] / [Intel XE#7397]) -> [PASS][82] +1 other test pass
   [81]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-lnl-1/igt@kms_vrr@flipline.html
   [82]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-1/igt@kms_vrr@flipline.html

  * igt@xe_exec_system_allocator@process-many-malloc-race-nomemset:
    - shard-bmg:          [SKIP][83] ([Intel XE#6703]) -> [PASS][84] +115 other tests pass
   [83]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-bmg-2/igt@xe_exec_system_allocator@process-many-malloc-race-nomemset.html
   [84]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-6/igt@xe_exec_system_allocator@process-many-malloc-race-nomemset.html

  * igt@xe_exec_system_allocator@process-many-stride-mmap-shared-remap-dontunmap:
    - shard-bmg:          [SKIP][85] ([Intel XE#6557] / [Intel XE#6703]) -> [PASS][86] +1 other test pass
   [85]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-bmg-2/igt@xe_exec_system_allocator@process-many-stride-mmap-shared-remap-dontunmap.html
   [86]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-6/igt@xe_exec_system_allocator@process-many-stride-mmap-shared-remap-dontunmap.html

  * igt@xe_oa@sysctl-defaults:
    - shard-bmg:          [ABORT][87] ([Intel XE#5545] / [Intel XE#7893]) -> [PASS][88]
   [87]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-bmg-2/igt@xe_oa@sysctl-defaults.html
   [88]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-4/igt@xe_oa@sysctl-defaults.html

  
#### Warnings ####

  * igt@kms_big_fb@y-tiled-64bpp-rotate-270:
    - shard-bmg:          [SKIP][89] ([Intel XE#6703]) -> [SKIP][90] ([Intel XE#1124]) +2 other tests skip
   [89]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-bmg-2/igt@kms_big_fb@y-tiled-64bpp-rotate-270.html
   [90]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-6/igt@kms_big_fb@y-tiled-64bpp-rotate-270.html

  * igt@kms_bw@connected-linear-tiling-2-displays-target-3840x2160p:
    - shard-bmg:          [SKIP][91] ([Intel XE#6703]) -> [SKIP][92] ([Intel XE#7679])
   [91]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-bmg-2/igt@kms_bw@connected-linear-tiling-2-displays-target-3840x2160p.html
   [92]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-6/igt@kms_bw@connected-linear-tiling-2-displays-target-3840x2160p.html

  * igt@kms_ccs@crc-primary-basic-4-tiled-dg2-rc-ccs-cc:
    - shard-bmg:          [SKIP][93] ([Intel XE#6703]) -> [SKIP][94] ([Intel XE#2887]) +2 other tests skip
   [93]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-bmg-2/igt@kms_ccs@crc-primary-basic-4-tiled-dg2-rc-ccs-cc.html
   [94]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-6/igt@kms_ccs@crc-primary-basic-4-tiled-dg2-rc-ccs-cc.html

  * igt@kms_chamelium_color@ctm-0-25:
    - shard-bmg:          [SKIP][95] ([Intel XE#6703]) -> [SKIP][96] ([Intel XE#2325] / [Intel XE#7358]) +1 other test skip
   [95]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-bmg-2/igt@kms_chamelium_color@ctm-0-25.html
   [96]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-6/igt@kms_chamelium_color@ctm-0-25.html

  * igt@kms_chamelium_frames@hdmi-aspect-ratio:
    - shard-bmg:          [SKIP][97] ([Intel XE#6703]) -> [SKIP][98] ([Intel XE#2252])
   [97]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-bmg-2/igt@kms_chamelium_frames@hdmi-aspect-ratio.html
   [98]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-6/igt@kms_chamelium_frames@hdmi-aspect-ratio.html

  * igt@kms_content_protection@dp-mst-type-1:
    - shard-bmg:          [SKIP][99] ([Intel XE#6703]) -> [SKIP][100] ([Intel XE#2390] / [Intel XE#6974])
   [99]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-bmg-2/igt@kms_content_protection@dp-mst-type-1.html
   [100]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-6/igt@kms_content_protection@dp-mst-type-1.html

  * igt@kms_cursor_crc@cursor-rapid-movement-256x85:
    - shard-bmg:          [SKIP][101] ([Intel XE#6557] / [Intel XE#6703]) -> [SKIP][102] ([Intel XE#2320])
   [101]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-bmg-2/igt@kms_cursor_crc@cursor-rapid-movement-256x85.html
   [102]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-6/igt@kms_cursor_crc@cursor-rapid-movement-256x85.html

  * igt@kms_cursor_legacy@cursorb-vs-flipb-atomic-transitions:
    - shard-lnl:          [SKIP][103] ([Intel XE#309] / [Intel XE#7343]) -> [SKIP][104] ([Intel XE#309] / [Intel XE#7343] / [Intel XE#7935])
   [103]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-lnl-4/igt@kms_cursor_legacy@cursorb-vs-flipb-atomic-transitions.html
   [104]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-8/igt@kms_cursor_legacy@cursorb-vs-flipb-atomic-transitions.html

  * igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions-varying-size:
    - shard-bmg:          [SKIP][105] ([Intel XE#6703]) -> [SKIP][106] ([Intel XE#2286] / [Intel XE#6035])
   [105]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-bmg-2/igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions-varying-size.html
   [106]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-6/igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions-varying-size.html

  * igt@kms_dsc@dsc-with-formats:
    - shard-bmg:          [SKIP][107] ([Intel XE#6703]) -> [SKIP][108] ([Intel XE#2244])
   [107]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-bmg-2/igt@kms_dsc@dsc-with-formats.html
   [108]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-6/igt@kms_dsc@dsc-with-formats.html

  * igt@kms_flip@flip-vs-expired-vblank-interruptible:
    - shard-lnl:          [FAIL][109] ([Intel XE#301] / [Intel XE#3149]) -> [FAIL][110] ([Intel XE#301])
   [109]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-lnl-5/igt@kms_flip@flip-vs-expired-vblank-interruptible.html
   [110]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-lnl-3/igt@kms_flip@flip-vs-expired-vblank-interruptible.html

  * igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-32bpp-yftileccs-upscaling:
    - shard-bmg:          [SKIP][111] ([Intel XE#6703]) -> [SKIP][112] ([Intel XE#7178] / [Intel XE#7351])
   [111]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-bmg-2/igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-32bpp-yftileccs-upscaling.html
   [112]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-6/igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-32bpp-yftileccs-upscaling.html

  * igt@kms_frontbuffer_tracking@fbcdrrshdr-1p-primscrn-indfb-pgflip-blt:
    - shard-bmg:          [SKIP][113] ([Intel XE#6703]) -> [SKIP][114] ([Intel XE#2311]) +11 other tests skip
   [113]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-bmg-2/igt@kms_frontbuffer_tracking@fbcdrrshdr-1p-primscrn-indfb-pgflip-blt.html
   [114]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-6/igt@kms_frontbuffer_tracking@fbcdrrshdr-1p-primscrn-indfb-pgflip-blt.html

  * igt@kms_frontbuffer_tracking@fbcdrrshdr-abgr161616f-draw-mmap-wc:
    - shard-bmg:          [SKIP][115] ([Intel XE#6703]) -> [SKIP][116] ([Intel XE#7061])
   [115]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-bmg-2/igt@kms_frontbuffer_tracking@fbcdrrshdr-abgr161616f-draw-mmap-wc.html
   [116]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-6/igt@kms_frontbuffer_tracking@fbcdrrshdr-abgr161616f-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@pipe-fbc-rte:
    - shard-bmg:          [SKIP][117] ([Intel XE#6703]) -> [SKIP][118] ([Intel XE#4141])
   [117]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-bmg-2/igt@kms_frontbuffer_tracking@pipe-fbc-rte.html
   [118]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-6/igt@kms_frontbuffer_tracking@pipe-fbc-rte.html

  * igt@kms_frontbuffer_tracking@psrhdr-1p-primscrn-shrfb-plflip-blt:
    - shard-bmg:          [SKIP][119] ([Intel XE#6703]) -> [SKIP][120] ([Intel XE#2313]) +9 other tests skip
   [119]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-bmg-2/igt@kms_frontbuffer_tracking@psrhdr-1p-primscrn-shrfb-plflip-blt.html
   [120]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-6/igt@kms_frontbuffer_tracking@psrhdr-1p-primscrn-shrfb-plflip-blt.html

  * igt@kms_hdr@brightness-with-hdr:
    - shard-bmg:          [SKIP][121] ([Intel XE#3544] / [Intel XE#7916]) -> [SKIP][122] ([Intel XE#3544] / [Intel XE#7915] / [Intel XE#7916])
   [121]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-bmg-4/igt@kms_hdr@brightness-with-hdr.html
   [122]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-1/igt@kms_hdr@brightness-with-hdr.html

  * igt@kms_hdr@brightness-with-hdr@pipe-a-hdmi-a-3-xrgb16161616f:
    - shard-bmg:          [SKIP][123] ([Intel XE#7916]) -> [SKIP][124] ([Intel XE#7915]) +1 other test skip
   [123]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-bmg-4/igt@kms_hdr@brightness-with-hdr@pipe-a-hdmi-a-3-xrgb16161616f.html
   [124]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-1/igt@kms_hdr@brightness-with-hdr@pipe-a-hdmi-a-3-xrgb16161616f.html

  * igt@kms_multipipe_modeset@basic-max-pipe-crc-check:
    - shard-bmg:          [SKIP][125] ([Intel XE#6703]) -> [SKIP][126] ([Intel XE#7591])
   [125]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-bmg-2/igt@kms_multipipe_modeset@basic-max-pipe-crc-check.html
   [126]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-6/igt@kms_multipipe_modeset@basic-max-pipe-crc-check.html

  * igt@kms_plane@pixel-format-y-tiled-gen12-rc-ccs-cc-modifier:
    - shard-bmg:          [SKIP][127] ([Intel XE#6703]) -> [SKIP][128] ([Intel XE#7283])
   [127]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-bmg-2/igt@kms_plane@pixel-format-y-tiled-gen12-rc-ccs-cc-modifier.html
   [128]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-6/igt@kms_plane@pixel-format-y-tiled-gen12-rc-ccs-cc-modifier.html

  * igt@kms_plane_lowres@tiling-yf:
    - shard-bmg:          [SKIP][129] ([Intel XE#6703]) -> [SKIP][130] ([Intel XE#2393])
   [129]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-bmg-2/igt@kms_plane_lowres@tiling-yf.html
   [130]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-6/igt@kms_plane_lowres@tiling-yf.html

  * igt@kms_pm_rpm@modeset-lpsp-stress-no-wait:
    - shard-bmg:          [SKIP][131] ([Intel XE#6703]) -> [SKIP][132] ([Intel XE#1439] / [Intel XE#3141] / [Intel XE#7383] / [Intel XE#836])
   [131]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-bmg-2/igt@kms_pm_rpm@modeset-lpsp-stress-no-wait.html
   [132]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-6/igt@kms_pm_rpm@modeset-lpsp-stress-no-wait.html

  * igt@kms_psr2_sf@fbc-psr2-primary-plane-update-sf-dmg-area:
    - shard-bmg:          [SKIP][133] ([Intel XE#6703]) -> [SKIP][134] ([Intel XE#1489])
   [133]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-bmg-2/igt@kms_psr2_sf@fbc-psr2-primary-plane-update-sf-dmg-area.html
   [134]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-6/igt@kms_psr2_sf@fbc-psr2-primary-plane-update-sf-dmg-area.html

  * igt@kms_psr@fbc-psr-dpms:
    - shard-bmg:          [SKIP][135] ([Intel XE#6703]) -> [SKIP][136] ([Intel XE#2234] / [Intel XE#2850]) +1 other test skip
   [135]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-bmg-2/igt@kms_psr@fbc-psr-dpms.html
   [136]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-6/igt@kms_psr@fbc-psr-dpms.html

  * igt@kms_tiled_display@basic-test-pattern:
    - shard-bmg:          [FAIL][137] ([Intel XE#1729] / [Intel XE#7424]) -> [SKIP][138] ([Intel XE#2426] / [Intel XE#5848])
   [137]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-bmg-10/igt@kms_tiled_display@basic-test-pattern.html
   [138]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-9/igt@kms_tiled_display@basic-test-pattern.html

  * igt@kms_tiled_display@basic-test-pattern-with-chamelium:
    - shard-bmg:          [SKIP][139] ([Intel XE#2509] / [Intel XE#7437]) -> [SKIP][140] ([Intel XE#2426] / [Intel XE#5848])
   [139]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-bmg-2/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html
   [140]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-1/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html

  * igt@kms_vrr@seamless-rr-switch-drrs:
    - shard-bmg:          [SKIP][141] ([Intel XE#6703]) -> [SKIP][142] ([Intel XE#1499])
   [141]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-bmg-2/igt@kms_vrr@seamless-rr-switch-drrs.html
   [142]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-6/igt@kms_vrr@seamless-rr-switch-drrs.html

  * igt@xe_eudebug@basic-vm-access-parameters-faultable:
    - shard-bmg:          [SKIP][143] ([Intel XE#6703]) -> [SKIP][144] ([Intel XE#7636]) +2 other tests skip
   [143]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-bmg-2/igt@xe_eudebug@basic-vm-access-parameters-faultable.html
   [144]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-6/igt@xe_eudebug@basic-vm-access-parameters-faultable.html

  * igt@xe_evict@evict-small-multi-queue:
    - shard-bmg:          [SKIP][145] ([Intel XE#6703]) -> [SKIP][146] ([Intel XE#7140])
   [145]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-bmg-2/igt@xe_evict@evict-small-multi-queue.html
   [146]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-6/igt@xe_evict@evict-small-multi-queue.html

  * igt@xe_exec_basic@multigpu-once-userptr-invalidate-race:
    - shard-bmg:          [SKIP][147] ([Intel XE#6703]) -> [SKIP][148] ([Intel XE#2322] / [Intel XE#7372]) +1 other test skip
   [147]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-bmg-2/igt@xe_exec_basic@multigpu-once-userptr-invalidate-race.html
   [148]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-6/igt@xe_exec_basic@multigpu-once-userptr-invalidate-race.html

  * igt@xe_exec_fault_mode@many-execqueues-multi-queue-userptr:
    - shard-bmg:          [SKIP][149] ([Intel XE#6703]) -> [SKIP][150] ([Intel XE#7136]) +2 other tests skip
   [149]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-bmg-2/igt@xe_exec_fault_mode@many-execqueues-multi-queue-userptr.html
   [150]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-6/igt@xe_exec_fault_mode@many-execqueues-multi-queue-userptr.html

  * igt@xe_exec_multi_queue@one-queue-preempt-mode-close-fd-smem:
    - shard-bmg:          [SKIP][151] ([Intel XE#6703]) -> [SKIP][152] ([Intel XE#6874]) +5 other tests skip
   [151]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-bmg-2/igt@xe_exec_multi_queue@one-queue-preempt-mode-close-fd-smem.html
   [152]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-6/igt@xe_exec_multi_queue@one-queue-preempt-mode-close-fd-smem.html

  * igt@xe_exec_threads@threads-multi-queue-userptr:
    - shard-bmg:          [SKIP][153] ([Intel XE#6703]) -> [SKIP][154] ([Intel XE#7138])
   [153]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-bmg-2/igt@xe_exec_threads@threads-multi-queue-userptr.html
   [154]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-6/igt@xe_exec_threads@threads-multi-queue-userptr.html

  * igt@xe_gpgpu_fill@offset-4x4:
    - shard-bmg:          [SKIP][155] ([Intel XE#6703]) -> [SKIP][156] ([Intel XE#7954])
   [155]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-bmg-2/igt@xe_gpgpu_fill@offset-4x4.html
   [156]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-6/igt@xe_gpgpu_fill@offset-4x4.html

  * igt@xe_pxp@display-pxp-fb:
    - shard-bmg:          [SKIP][157] ([Intel XE#6703]) -> [SKIP][158] ([Intel XE#4733] / [Intel XE#7417])
   [157]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-bmg-2/igt@xe_pxp@display-pxp-fb.html
   [158]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-6/igt@xe_pxp@display-pxp-fb.html

  * igt@xe_query@multigpu-query-invalid-cs-cycles:
    - shard-bmg:          [SKIP][159] ([Intel XE#6703]) -> [SKIP][160] ([Intel XE#944])
   [159]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0/shard-bmg-2/igt@xe_query@multigpu-query-invalid-cs-cycles.html
   [160]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167217v2/shard-bmg-6/igt@xe_query@multigpu-query-invalid-cs-cycles.html

  
  [Intel XE#1124]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1124
  [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#1421]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1421
  [Intel XE#1424]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1424
  [Intel XE#1435]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1435
  [Intel XE#1439]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1439
  [Intel XE#1489]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1489
  [Intel XE#1499]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1499
  [Intel XE#1503]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1503
  [Intel XE#1729]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1729
  [Intel XE#2142]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2142
  [Intel XE#2234]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2234
  [Intel XE#2244]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2244
  [Intel XE#2252]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2252
  [Intel XE#2286]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2286
  [Intel XE#2311]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2311
  [Intel XE#2313]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2313
  [Intel XE#2320]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2320
  [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#2327]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2327
  [Intel XE#2390]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2390
  [Intel XE#2393]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2393
  [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#2850]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2850
  [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#301]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/301
  [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#309]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/309
  [Intel XE#3141]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3141
  [Intel XE#3149]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3149
  [Intel XE#323]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/323
  [Intel XE#3321]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3321
  [Intel XE#352]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/352
  [Intel XE#3544]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3544
  [Intel XE#3658]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3658
  [Intel XE#373]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/373
  [Intel XE#4141]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4141
  [Intel XE#4227]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4227
  [Intel XE#4351]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4351
  [Intel XE#4608]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4608
  [Intel XE#4609]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4609
  [Intel XE#4733]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4733
  [Intel XE#5545]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5545
  [Intel XE#584]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/584
  [Intel XE#5848]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5848
  [Intel XE#599]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/599
  [Intel XE#6035]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6035
  [Intel XE#6312]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6312
  [Intel XE#651]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/651
  [Intel XE#6540]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6540
  [Intel XE#6557]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6557
  [Intel XE#656]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/656
  [Intel XE#6703]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6703
  [Intel XE#6874]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6874
  [Intel XE#688]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/688
  [Intel XE#6964]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6964
  [Intel XE#6974]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6974
  [Intel XE#7061]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7061
  [Intel XE#7130]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7130
  [Intel XE#7136]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7136
  [Intel XE#7138]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7138
  [Intel XE#7140]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7140
  [Intel XE#7178]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7178
  [Intel XE#7283]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7283
  [Intel XE#7304]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7304
  [Intel XE#7343]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7343
  [Intel XE#7345]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7345
  [Intel XE#7351]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7351
  [Intel XE#7356]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7356
  [Intel XE#7357]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7357
  [Intel XE#7358]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7358
  [Intel XE#7360]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7360
  [Intel XE#7369]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7369
  [Intel XE#7372]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7372
  [Intel XE#7383]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7383
  [Intel XE#7397]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7397
  [Intel XE#7399]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7399
  [Intel XE#7417]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7417
  [Intel XE#7424]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7424
  [Intel XE#7437]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7437
  [Intel XE#7482]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7482
  [Intel XE#7591]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7591
  [Intel XE#7636]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7636
  [Intel XE#7642]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7642
  [Intel XE#7679]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7679
  [Intel XE#7774]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7774
  [Intel XE#7793]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7793
  [Intel XE#7865]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7865
  [Intel XE#7893]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7893
  [Intel XE#7905]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7905
  [Intel XE#7915]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7915
  [Intel XE#7916]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7916
  [Intel XE#7922]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7922
  [Intel XE#7935]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7935
  [Intel XE#7954]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7954
  [Intel XE#836]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/836
  [Intel XE#944]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/944


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

  * Linux: xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0 -> xe-pw-167217v2

  IGT_8937: 8937
  xe-5130-5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0: 5fb5a9a63cf5ece68e0eeb6fa397da27712bccf0
  xe-pw-167217v2: 167217v2

== Logs ==

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

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

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

* Re: [PATCH v2 2/5] drm/xe/mmio_gem: fix fault handling for split VMA
  2026-05-26 12:51 ` [PATCH v2 2/5] drm/xe/mmio_gem: fix fault handling for split VMA Ilia Levi
@ 2026-07-15 13:05   ` Matthew Auld
  2026-07-21  3:20     ` Matthew Brost
  0 siblings, 1 reply; 20+ messages in thread
From: Matthew Auld @ 2026-07-15 13:05 UTC (permalink / raw)
  To: Ilia Levi, intel-xe; +Cc: koby.elbaz, shuicheng.lin, thomas.hellstrom

Hi,

On 26/05/2026 13:51, Ilia Levi wrote:
> The fault handler currently assumes it always operates on a VMA spanning
> the entire GEM object. This does not hold when the VMA has been split,
> e.g. by a partial munmap or mprotect. In that case the handler may map
> wrong physical pages or cause SIGBUS.
> 
> Change the fault handler to map only the GEM subrange corresponding to
> the VMA, and do not set vm_pgoff to zero. Many DRM drivers do this
> because helpers like dma_mmap_pages() interpret vm_pgoff as an
> intra-buffer page offset; leaving the DRM fake offset there would break
> these helpers. Those drivers can get away with zeroing it because they
> map eagerly -- all PTEs are established before mmap returns, so vm_pgoff
> is never consulted again. This driver does not use such helpers and
> defers mapping to the fault handler, where vm_pgoff must be preserved:
> when the kernel splits a VMA it adjusts vm_pgoff, and the fault handler
> subtracts the GEM object's fake mmap offset to recover the page offset
> within the object.
> 
> Fixes: 1ffcf8b8ae8a ("drm/xe: Support for mmap-ing mmio regions")
> Assisted-by: GitHub-Copilot:claude-opus-4.6
> Signed-off-by: Ilia Levi <ilia.levi@intel.com>

Would it work if we did something like:

+static int xe_mmio_gem_vm_may_split(struct vm_area_struct *vma, 
unsigned long addr)
+{
+       return -EINVAL;
+}
+
  static const struct vm_operations_struct vm_ops = {
         .open = drm_gem_vm_open,
         .close = drm_gem_vm_close,
         .fault = xe_mmio_gem_vm_fault,
+       .may_split = xe_mmio_gem_vm_may_split,
  };

?

I don't think partial unmap or similar is really a real use case for 
this type of special mapping. IMO if we can just reject that would be 
simplest? What do you think here?

> ---
>   drivers/gpu/drm/xe/xe_mmio_gem.c | 18 +++++++++++-------
>   1 file changed, 11 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/gpu/drm/xe/xe_mmio_gem.c b/drivers/gpu/drm/xe/xe_mmio_gem.c
> index c22a38e5616b..15e884ad3f1c 100644
> --- a/drivers/gpu/drm/xe/xe_mmio_gem.c
> +++ b/drivers/gpu/drm/xe/xe_mmio_gem.c
> @@ -37,6 +37,7 @@ static vm_fault_t xe_mmio_gem_vm_fault(struct vm_fault *);
>   struct xe_mmio_gem {
>   	struct drm_gem_object base;
>   	phys_addr_t phys_addr;
> +	unsigned long pgoff;
>   };
>   
>   static const struct vm_operations_struct vm_ops = {
> @@ -92,6 +93,8 @@ struct xe_mmio_gem *xe_mmio_gem_create(struct xe_device *xe, struct drm_file *fi
>   	if (err)
>   		goto free_gem;
>   
> +	obj->pgoff = drm_vma_node_start(&base->vma_node);
> +
>   	err = drm_vma_node_allow(&base->vma_node, file);
>   	if (err)
>   		goto free_gem;
> @@ -147,8 +150,6 @@ static int xe_mmio_gem_mmap(struct drm_gem_object *base, struct vm_area_struct *
>   	if ((vma->vm_flags & VM_SHARED) == 0)
>   		return -EINVAL;
>   
> -	/* Set vm_pgoff (used as a fake buffer offset by DRM) to 0 */
> -	vma->vm_pgoff = 0;
>   	vma->vm_page_prot = pgprot_noncached(vm_get_page_prot(vma->vm_flags));
>   	vm_flags_set(vma, VM_IO | VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP |
>   		     VM_DONTCOPY | VM_NORESERVE);
> @@ -190,7 +191,8 @@ static vm_fault_t xe_mmio_gem_vm_fault(struct vm_fault *vmf)
>   	struct xe_mmio_gem *obj = to_xe_mmio_gem(base);
>   	struct drm_device *dev = base->dev;
>   	vm_fault_t ret = VM_FAULT_NOPAGE;
> -	unsigned long i;
> +	unsigned long addr, pfn;
> +	unsigned long pgoff;
>   	int idx;
>   
>   	if (!drm_dev_enter(dev, &idx)) {
> @@ -203,13 +205,15 @@ static vm_fault_t xe_mmio_gem_vm_fault(struct vm_fault *vmf)
>   		return xe_mmio_gem_vm_fault_dummy_page(vmf);
>   	}
>   
> -	for (i = 0; i < base->size; i += PAGE_SIZE) {
> -		unsigned long addr = vma->vm_start + i;
> -		unsigned long phys_addr = obj->phys_addr + i;
> +	pgoff = vma->vm_pgoff - obj->pgoff;
> +	pfn = PHYS_PFN(obj->phys_addr) + pgoff;
>   
> -		ret = vmf_insert_pfn(vma, addr, PHYS_PFN(phys_addr));
> +	for (addr = vma->vm_start; addr < vma->vm_end; addr += PAGE_SIZE) {
> +		ret = vmf_insert_pfn(vma, addr, pfn);
>   		if (ret & VM_FAULT_ERROR)
>   			break;
> +
> +		pfn++;
>   	}
>   
>   	drm_dev_exit(idx);


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

* Re: [PATCH v2 5/5] drm/xe/mmio_gem: fix destroy flow
  2026-05-26 12:51 ` [PATCH v2 5/5] drm/xe/mmio_gem: fix destroy flow Ilia Levi
@ 2026-07-16 15:22   ` Matthew Auld
  2026-07-21  9:15     ` Matthew Auld
  0 siblings, 1 reply; 20+ messages in thread
From: Matthew Auld @ 2026-07-16 15:22 UTC (permalink / raw)
  To: Ilia Levi, intel-xe; +Cc: koby.elbaz, shuicheng.lin, thomas.hellstrom

On 26/05/2026 13:51, Ilia Levi wrote:
> xe_mmio_gem_destroy() currently frees the GEM object directly, bypassing
> reference counting.  Since existing VMAs hold a reference and the fault
> handler accesses the object through vma->vm_private_data, this is
> use-after-free.  Additionally, nothing prevents the fault handler from
> installing PTEs to the real MMIO after destroy.
> 
> Use SRCU to ensure the fault handler sees the 'destroyed' flag
> (mirroring the drm_dev_enter/exit pattern for hot-unplug), then zap
> existing PTEs to prevent continued access to the real MMIO. Use
> drm_gem_object_put() to respect the reference count.

Couple questions here:

1) Can we not just use the dma-resv for synchronisation? We wrap the 
mmio_gem with a gem buffer, so the dma-resv is already there. This has 
the added benefit of looking more similar to the normal bo fault path. 
Also same question for dummy_page_lock in the previous patch.

2) Should we not just SIGBUG, if something faults on this post destroy? 
Is this not a userspace issue? Re-routing to the dummy page on unplug 
makes sense, since userspace did nothing wrong, so we want to give it a 
chance to recover.

> 
> Fixes: 1ffcf8b8ae8a ("drm/xe: Support for mmap-ing mmio regions")
> Assisted-by: GitHub-Copilot:claude-opus-4.6
> Signed-off-by: Ilia Levi <ilia.levi@intel.com>
> ---
>   drivers/gpu/drm/xe/xe_mmio_gem.c | 27 ++++++++++++++++++++++++++-
>   1 file changed, 26 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/xe/xe_mmio_gem.c b/drivers/gpu/drm/xe/xe_mmio_gem.c
> index 2f2ebc4fd901..b91704c51a93 100644
> --- a/drivers/gpu/drm/xe/xe_mmio_gem.c
> +++ b/drivers/gpu/drm/xe/xe_mmio_gem.c
> @@ -5,11 +5,15 @@
>   
>   #include "xe_mmio_gem.h"
>   
> +#include <linux/srcu.h>
> +
>   #include <drm/drm_drv.h>
>   #include <drm/drm_gem.h>
>   
>   #include "xe_device_types.h"
>   
> +DEFINE_STATIC_SRCU(xe_mmio_gem_srcu);
> +
>   /**
>    * DOC: Exposing MMIO regions to userspace
>    *
> @@ -39,6 +43,7 @@ struct xe_mmio_gem {
>   	unsigned long pgoff;
>   	struct mutex dummy_page_lock; /* protects dummy page allocation */
>   	struct page *dummy_page;
> +	bool destroyed;
>   };
>   
>   static const struct vm_operations_struct vm_ops = {
> @@ -145,8 +150,23 @@ static void xe_mmio_gem_free(struct drm_gem_object *base)
>    */
>   void xe_mmio_gem_destroy(struct xe_mmio_gem *gem, struct drm_file *file)
>   {
> +	struct drm_gem_object *base = &gem->base;
> +	struct drm_device *dev = base->dev;
> +
>   	drm_vma_node_revoke(&gem->base.vma_node, file);
> -	xe_mmio_gem_free(&gem->base);
> +
> +	gem->destroyed = true;
> +	synchronize_srcu(&xe_mmio_gem_srcu);
> +
> +	/*
> +	 * At this point every subsequent fault handler will see that the
> +	 * object has been destroyed and provide the dummy page.
> +	 * Now just zap existing PTEs to prevent continued access to the real
> +	 * MMIO.
> +	 */
> +	drm_vma_node_unmap(&base->vma_node, dev->anon_inode->i_mapping);
> +
> +	drm_gem_object_put(base);
>   }
>   
>   static int xe_mmio_gem_mmap(struct drm_gem_object *base, struct vm_area_struct *vma)
> @@ -196,6 +216,11 @@ static vm_fault_t xe_mmio_gem_vm_fault(struct vm_fault *vmf)
>   	unsigned long pgoff;
>   	int idx;
>   
> +	guard(srcu)(&xe_mmio_gem_srcu);
> +
> +	if (obj->destroyed)
> +		return xe_mmio_gem_vm_fault_dummy_page(vmf);
> +
>   	if (!drm_dev_enter(dev, &idx)) {
>   		/*
>   		 * Provide a dummy page to avoid SIGBUS for events such as hot-unplug.


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

* Re: [PATCH v2 0/5] drm/xe/mmio_gem: fix fault handler and destroy path
  2026-05-26 12:51 [PATCH v2 0/5] drm/xe/mmio_gem: fix fault handler and destroy path Ilia Levi
                   ` (7 preceding siblings ...)
  2026-05-26 15:20 ` ✓ Xe.CI.FULL: " Patchwork
@ 2026-07-16 15:55 ` Matthew Auld
  8 siblings, 0 replies; 20+ messages in thread
From: Matthew Auld @ 2026-07-16 15:55 UTC (permalink / raw)
  To: Ilia Levi, intel-xe; +Cc: koby.elbaz, shuicheng.lin, thomas.hellstrom

On 26/05/2026 13:51, Ilia Levi wrote:
> This series fixes several issues in xe_mmio_gem, introduced by
> 1ffcf8b8ae8a ("drm/xe: Support for mmap-ing mmio regions"):
> split VMA fault handling, a rb-tree leak on destroy, dummy page
> accumulation, and use-after-free / MMIO access after destroy.

I think other consideration, is how this component should interact with 
RPM? Did you already have a plan for this? I think accessing the mmio 
mapping when in d3 likely yields rubbish, but in some cases like for 
PCI_BARRIER (once we convert), I think it's acceptable. If we track all 
mmio_gem instances we should be able to force a refault on RPM suspend, 
and then in the fault handler grab an RPM ref. I think should be pretty 
similar to VRAM mappings. Perhaps would also want mmio_gem.need_rpm.

> 
> v2:
> - New patch 1/5: fix dummy page WB/UC aliasing (Sashiko)
> - Patch 2/5: no longer modifies xe_mmio_gem_vm_fault_dummy_page() (handled by 1/5)
> - Patch 3/5: unchanged
> - Patch 4/5: compute pfn inside scoped_guard
> - Patch 5/5: adapt to xe_mmio_gem_vm_fault_dummy_page() signature change, fix "objecthas" typo
> 
> Ilia Levi (4):
>    drm/xe/mmio_gem: use write-back mapping for dummy page
>    drm/xe/mmio_gem: fix fault handling for split VMA
>    drm/xe/mmio_gem: cache the dummy page per object
>    drm/xe/mmio_gem: fix destroy flow
> 
> Shuicheng Lin (1):
>    drm/xe/mmio_gem: Revoke drm_vma_node on xe_mmio_gem destroy
> 
>   drivers/gpu/drm/xe/xe_mmio_gem.c | 97 +++++++++++++++++++-------------
>   drivers/gpu/drm/xe/xe_mmio_gem.h |  2 +-
>   2 files changed, 60 insertions(+), 39 deletions(-)
> 


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

* Re: [PATCH v2 2/5] drm/xe/mmio_gem: fix fault handling for split VMA
  2026-07-15 13:05   ` Matthew Auld
@ 2026-07-21  3:20     ` Matthew Brost
  2026-07-21  8:44       ` Matthew Auld
  0 siblings, 1 reply; 20+ messages in thread
From: Matthew Brost @ 2026-07-21  3:20 UTC (permalink / raw)
  To: Matthew Auld
  Cc: Ilia Levi, intel-xe, koby.elbaz, shuicheng.lin, thomas.hellstrom

On Wed, Jul 15, 2026 at 02:05:35PM +0100, Matthew Auld wrote:
> Hi,
> 
> On 26/05/2026 13:51, Ilia Levi wrote:
> > The fault handler currently assumes it always operates on a VMA spanning
> > the entire GEM object. This does not hold when the VMA has been split,
> > e.g. by a partial munmap or mprotect. In that case the handler may map
> > wrong physical pages or cause SIGBUS.
> > 
> > Change the fault handler to map only the GEM subrange corresponding to
> > the VMA, and do not set vm_pgoff to zero. Many DRM drivers do this
> > because helpers like dma_mmap_pages() interpret vm_pgoff as an
> > intra-buffer page offset; leaving the DRM fake offset there would break
> > these helpers. Those drivers can get away with zeroing it because they
> > map eagerly -- all PTEs are established before mmap returns, so vm_pgoff
> > is never consulted again. This driver does not use such helpers and
> > defers mapping to the fault handler, where vm_pgoff must be preserved:
> > when the kernel splits a VMA it adjusts vm_pgoff, and the fault handler
> > subtracts the GEM object's fake mmap offset to recover the page offset
> > within the object.
> > 
> > Fixes: 1ffcf8b8ae8a ("drm/xe: Support for mmap-ing mmio regions")
> > Assisted-by: GitHub-Copilot:claude-opus-4.6
> > Signed-off-by: Ilia Levi <ilia.levi@intel.com>
> 
> Would it work if we did something like:
> 
> +static int xe_mmio_gem_vm_may_split(struct vm_area_struct *vma, unsigned
> long addr)
> +{
> +       return -EINVAL;
> +}
> +
>  static const struct vm_operations_struct vm_ops = {
>         .open = drm_gem_vm_open,
>         .close = drm_gem_vm_close,
>         .fault = xe_mmio_gem_vm_fault,
> +       .may_split = xe_mmio_gem_vm_may_split,
>  };
> 
> ?
> 
> I don't think partial unmap or similar is really a real use case for this
> type of special mapping. IMO if we can just reject that would be simplest?
> What do you think here?
> 

+1 - I don't think split would really be a use case and most xe_mmio_gem
usages are likely exactly one page, right?

Matt 

> > ---
> >   drivers/gpu/drm/xe/xe_mmio_gem.c | 18 +++++++++++-------
> >   1 file changed, 11 insertions(+), 7 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/xe/xe_mmio_gem.c b/drivers/gpu/drm/xe/xe_mmio_gem.c
> > index c22a38e5616b..15e884ad3f1c 100644
> > --- a/drivers/gpu/drm/xe/xe_mmio_gem.c
> > +++ b/drivers/gpu/drm/xe/xe_mmio_gem.c
> > @@ -37,6 +37,7 @@ static vm_fault_t xe_mmio_gem_vm_fault(struct vm_fault *);
> >   struct xe_mmio_gem {
> >   	struct drm_gem_object base;
> >   	phys_addr_t phys_addr;
> > +	unsigned long pgoff;
> >   };
> >   static const struct vm_operations_struct vm_ops = {
> > @@ -92,6 +93,8 @@ struct xe_mmio_gem *xe_mmio_gem_create(struct xe_device *xe, struct drm_file *fi
> >   	if (err)
> >   		goto free_gem;
> > +	obj->pgoff = drm_vma_node_start(&base->vma_node);
> > +
> >   	err = drm_vma_node_allow(&base->vma_node, file);
> >   	if (err)
> >   		goto free_gem;
> > @@ -147,8 +150,6 @@ static int xe_mmio_gem_mmap(struct drm_gem_object *base, struct vm_area_struct *
> >   	if ((vma->vm_flags & VM_SHARED) == 0)
> >   		return -EINVAL;
> > -	/* Set vm_pgoff (used as a fake buffer offset by DRM) to 0 */
> > -	vma->vm_pgoff = 0;
> >   	vma->vm_page_prot = pgprot_noncached(vm_get_page_prot(vma->vm_flags));
> >   	vm_flags_set(vma, VM_IO | VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP |
> >   		     VM_DONTCOPY | VM_NORESERVE);
> > @@ -190,7 +191,8 @@ static vm_fault_t xe_mmio_gem_vm_fault(struct vm_fault *vmf)
> >   	struct xe_mmio_gem *obj = to_xe_mmio_gem(base);
> >   	struct drm_device *dev = base->dev;
> >   	vm_fault_t ret = VM_FAULT_NOPAGE;
> > -	unsigned long i;
> > +	unsigned long addr, pfn;
> > +	unsigned long pgoff;
> >   	int idx;
> >   	if (!drm_dev_enter(dev, &idx)) {
> > @@ -203,13 +205,15 @@ static vm_fault_t xe_mmio_gem_vm_fault(struct vm_fault *vmf)
> >   		return xe_mmio_gem_vm_fault_dummy_page(vmf);
> >   	}
> > -	for (i = 0; i < base->size; i += PAGE_SIZE) {
> > -		unsigned long addr = vma->vm_start + i;
> > -		unsigned long phys_addr = obj->phys_addr + i;
> > +	pgoff = vma->vm_pgoff - obj->pgoff;
> > +	pfn = PHYS_PFN(obj->phys_addr) + pgoff;
> > -		ret = vmf_insert_pfn(vma, addr, PHYS_PFN(phys_addr));
> > +	for (addr = vma->vm_start; addr < vma->vm_end; addr += PAGE_SIZE) {
> > +		ret = vmf_insert_pfn(vma, addr, pfn);
> >   		if (ret & VM_FAULT_ERROR)
> >   			break;
> > +
> > +		pfn++;
> >   	}
> >   	drm_dev_exit(idx);
> 

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

* Re: [PATCH v2 2/5] drm/xe/mmio_gem: fix fault handling for split VMA
  2026-07-21  3:20     ` Matthew Brost
@ 2026-07-21  8:44       ` Matthew Auld
  2026-07-21 11:49         ` Levi, Ilia
  0 siblings, 1 reply; 20+ messages in thread
From: Matthew Auld @ 2026-07-21  8:44 UTC (permalink / raw)
  To: Matthew Brost
  Cc: Ilia Levi, intel-xe, koby.elbaz, shuicheng.lin, thomas.hellstrom

On 21/07/2026 04:20, Matthew Brost wrote:
> On Wed, Jul 15, 2026 at 02:05:35PM +0100, Matthew Auld wrote:
>> Hi,
>>
>> On 26/05/2026 13:51, Ilia Levi wrote:
>>> The fault handler currently assumes it always operates on a VMA spanning
>>> the entire GEM object. This does not hold when the VMA has been split,
>>> e.g. by a partial munmap or mprotect. In that case the handler may map
>>> wrong physical pages or cause SIGBUS.
>>>
>>> Change the fault handler to map only the GEM subrange corresponding to
>>> the VMA, and do not set vm_pgoff to zero. Many DRM drivers do this
>>> because helpers like dma_mmap_pages() interpret vm_pgoff as an
>>> intra-buffer page offset; leaving the DRM fake offset there would break
>>> these helpers. Those drivers can get away with zeroing it because they
>>> map eagerly -- all PTEs are established before mmap returns, so vm_pgoff
>>> is never consulted again. This driver does not use such helpers and
>>> defers mapping to the fault handler, where vm_pgoff must be preserved:
>>> when the kernel splits a VMA it adjusts vm_pgoff, and the fault handler
>>> subtracts the GEM object's fake mmap offset to recover the page offset
>>> within the object.
>>>
>>> Fixes: 1ffcf8b8ae8a ("drm/xe: Support for mmap-ing mmio regions")
>>> Assisted-by: GitHub-Copilot:claude-opus-4.6
>>> Signed-off-by: Ilia Levi <ilia.levi@intel.com>
>>
>> Would it work if we did something like:
>>
>> +static int xe_mmio_gem_vm_may_split(struct vm_area_struct *vma, unsigned
>> long addr)
>> +{
>> +       return -EINVAL;
>> +}
>> +
>>   static const struct vm_operations_struct vm_ops = {
>>          .open = drm_gem_vm_open,
>>          .close = drm_gem_vm_close,
>>          .fault = xe_mmio_gem_vm_fault,
>> +       .may_split = xe_mmio_gem_vm_may_split,
>>   };
>>
>> ?
>>
>> I don't think partial unmap or similar is really a real use case for this
>> type of special mapping. IMO if we can just reject that would be simplest?
>> What do you think here?
>>
> 
> +1 - I don't think split would really be a use case and most xe_mmio_gem
> usages are likely exactly one page, right?

Yeah, at least in the case of barrier and the other upcoming case I'm 
interested in, it should be one 4K page. There could be usecases where 
it's more than one page, but even so I doubt doing partial unmap or 
whatever is really a needed thing from userspace, for a mapping like 
this. But if that turns out wrong, loosening the restriction should be 
fine in the future. IMO keep it dumb & simple, especially given all the 
bugs we have here.

> 
> Matt
> 
>>> ---
>>>    drivers/gpu/drm/xe/xe_mmio_gem.c | 18 +++++++++++-------
>>>    1 file changed, 11 insertions(+), 7 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/xe/xe_mmio_gem.c b/drivers/gpu/drm/xe/xe_mmio_gem.c
>>> index c22a38e5616b..15e884ad3f1c 100644
>>> --- a/drivers/gpu/drm/xe/xe_mmio_gem.c
>>> +++ b/drivers/gpu/drm/xe/xe_mmio_gem.c
>>> @@ -37,6 +37,7 @@ static vm_fault_t xe_mmio_gem_vm_fault(struct vm_fault *);
>>>    struct xe_mmio_gem {
>>>    	struct drm_gem_object base;
>>>    	phys_addr_t phys_addr;
>>> +	unsigned long pgoff;
>>>    };
>>>    static const struct vm_operations_struct vm_ops = {
>>> @@ -92,6 +93,8 @@ struct xe_mmio_gem *xe_mmio_gem_create(struct xe_device *xe, struct drm_file *fi
>>>    	if (err)
>>>    		goto free_gem;
>>> +	obj->pgoff = drm_vma_node_start(&base->vma_node);
>>> +
>>>    	err = drm_vma_node_allow(&base->vma_node, file);
>>>    	if (err)
>>>    		goto free_gem;
>>> @@ -147,8 +150,6 @@ static int xe_mmio_gem_mmap(struct drm_gem_object *base, struct vm_area_struct *
>>>    	if ((vma->vm_flags & VM_SHARED) == 0)
>>>    		return -EINVAL;
>>> -	/* Set vm_pgoff (used as a fake buffer offset by DRM) to 0 */
>>> -	vma->vm_pgoff = 0;
>>>    	vma->vm_page_prot = pgprot_noncached(vm_get_page_prot(vma->vm_flags));
>>>    	vm_flags_set(vma, VM_IO | VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP |
>>>    		     VM_DONTCOPY | VM_NORESERVE);
>>> @@ -190,7 +191,8 @@ static vm_fault_t xe_mmio_gem_vm_fault(struct vm_fault *vmf)
>>>    	struct xe_mmio_gem *obj = to_xe_mmio_gem(base);
>>>    	struct drm_device *dev = base->dev;
>>>    	vm_fault_t ret = VM_FAULT_NOPAGE;
>>> -	unsigned long i;
>>> +	unsigned long addr, pfn;
>>> +	unsigned long pgoff;
>>>    	int idx;
>>>    	if (!drm_dev_enter(dev, &idx)) {
>>> @@ -203,13 +205,15 @@ static vm_fault_t xe_mmio_gem_vm_fault(struct vm_fault *vmf)
>>>    		return xe_mmio_gem_vm_fault_dummy_page(vmf);
>>>    	}
>>> -	for (i = 0; i < base->size; i += PAGE_SIZE) {
>>> -		unsigned long addr = vma->vm_start + i;
>>> -		unsigned long phys_addr = obj->phys_addr + i;
>>> +	pgoff = vma->vm_pgoff - obj->pgoff;
>>> +	pfn = PHYS_PFN(obj->phys_addr) + pgoff;
>>> -		ret = vmf_insert_pfn(vma, addr, PHYS_PFN(phys_addr));
>>> +	for (addr = vma->vm_start; addr < vma->vm_end; addr += PAGE_SIZE) {
>>> +		ret = vmf_insert_pfn(vma, addr, pfn);
>>>    		if (ret & VM_FAULT_ERROR)
>>>    			break;
>>> +
>>> +		pfn++;
>>>    	}
>>>    	drm_dev_exit(idx);
>>


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

* Re: [PATCH v2 5/5] drm/xe/mmio_gem: fix destroy flow
  2026-07-16 15:22   ` Matthew Auld
@ 2026-07-21  9:15     ` Matthew Auld
  2026-07-21 15:00       ` Levi, Ilia
  0 siblings, 1 reply; 20+ messages in thread
From: Matthew Auld @ 2026-07-21  9:15 UTC (permalink / raw)
  To: Ilia Levi, intel-xe
  Cc: koby.elbaz, shuicheng.lin, thomas.hellstrom, Matthew Brost

On 16/07/2026 16:22, Matthew Auld wrote:
> On 26/05/2026 13:51, Ilia Levi wrote:
>> xe_mmio_gem_destroy() currently frees the GEM object directly, bypassing
>> reference counting.  Since existing VMAs hold a reference and the fault
>> handler accesses the object through vma->vm_private_data, this is
>> use-after-free.  Additionally, nothing prevents the fault handler from
>> installing PTEs to the real MMIO after destroy.
>>
>> Use SRCU to ensure the fault handler sees the 'destroyed' flag
>> (mirroring the drm_dev_enter/exit pattern for hot-unplug), then zap
>> existing PTEs to prevent continued access to the real MMIO. Use
>> drm_gem_object_put() to respect the reference count.
> 
> Couple questions here:
> 
> 1) Can we not just use the dma-resv for synchronisation? We wrap the 
> mmio_gem with a gem buffer, so the dma-resv is already there. This has 
> the added benefit of looking more similar to the normal bo fault path. 
> Also same question for dummy_page_lock in the previous patch.
> 
> 2) Should we not just SIGBUG, if something faults on this post destroy? 
> Is this not a userspace issue? Re-routing to the dummy page on unplug 
> makes sense, since userspace did nothing wrong, so we want to give it a 
> chance to recover.

For 2) other option is maybe just to drop the gem->destroyed handling 
for now. For PCI_BARRIER and anything else tied to the xe_file, there 
shouldn't be any weird lifetime issues, so it should be impossible to 
see something "destroyed" in the fault handler. It's otherwise hard to 
judge without seeing a real user for this special "destroyed" flow with 
the re-routing to a dummy page.

> 
>>
>> Fixes: 1ffcf8b8ae8a ("drm/xe: Support for mmap-ing mmio regions")
>> Assisted-by: GitHub-Copilot:claude-opus-4.6
>> Signed-off-by: Ilia Levi <ilia.levi@intel.com>
>> ---
>>   drivers/gpu/drm/xe/xe_mmio_gem.c | 27 ++++++++++++++++++++++++++-
>>   1 file changed, 26 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/gpu/drm/xe/xe_mmio_gem.c b/drivers/gpu/drm/xe/ 
>> xe_mmio_gem.c
>> index 2f2ebc4fd901..b91704c51a93 100644
>> --- a/drivers/gpu/drm/xe/xe_mmio_gem.c
>> +++ b/drivers/gpu/drm/xe/xe_mmio_gem.c
>> @@ -5,11 +5,15 @@
>>   #include "xe_mmio_gem.h"
>> +#include <linux/srcu.h>
>> +
>>   #include <drm/drm_drv.h>
>>   #include <drm/drm_gem.h>
>>   #include "xe_device_types.h"
>> +DEFINE_STATIC_SRCU(xe_mmio_gem_srcu);
>> +
>>   /**
>>    * DOC: Exposing MMIO regions to userspace
>>    *
>> @@ -39,6 +43,7 @@ struct xe_mmio_gem {
>>       unsigned long pgoff;
>>       struct mutex dummy_page_lock; /* protects dummy page allocation */
>>       struct page *dummy_page;
>> +    bool destroyed;
>>   };
>>   static const struct vm_operations_struct vm_ops = {
>> @@ -145,8 +150,23 @@ static void xe_mmio_gem_free(struct 
>> drm_gem_object *base)
>>    */
>>   void xe_mmio_gem_destroy(struct xe_mmio_gem *gem, struct drm_file 
>> *file)
>>   {
>> +    struct drm_gem_object *base = &gem->base;
>> +    struct drm_device *dev = base->dev;
>> +
>>       drm_vma_node_revoke(&gem->base.vma_node, file);
>> -    xe_mmio_gem_free(&gem->base);
>> +
>> +    gem->destroyed = true;
>> +    synchronize_srcu(&xe_mmio_gem_srcu);
>> +
>> +    /*
>> +     * At this point every subsequent fault handler will see that the
>> +     * object has been destroyed and provide the dummy page.
>> +     * Now just zap existing PTEs to prevent continued access to the 
>> real
>> +     * MMIO.
>> +     */
>> +    drm_vma_node_unmap(&base->vma_node, dev->anon_inode->i_mapping);
>> +
>> +    drm_gem_object_put(base);
>>   }
>>   static int xe_mmio_gem_mmap(struct drm_gem_object *base, struct 
>> vm_area_struct *vma)
>> @@ -196,6 +216,11 @@ static vm_fault_t xe_mmio_gem_vm_fault(struct 
>> vm_fault *vmf)
>>       unsigned long pgoff;
>>       int idx;
>> +    guard(srcu)(&xe_mmio_gem_srcu);
>> +
>> +    if (obj->destroyed)
>> +        return xe_mmio_gem_vm_fault_dummy_page(vmf);
>> +
>>       if (!drm_dev_enter(dev, &idx)) {
>>           /*
>>            * Provide a dummy page to avoid SIGBUS for events such as 
>> hot-unplug.
> 


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

* Re: [PATCH v2 2/5] drm/xe/mmio_gem: fix fault handling for split VMA
  2026-07-21  8:44       ` Matthew Auld
@ 2026-07-21 11:49         ` Levi, Ilia
  2026-07-21 13:19           ` Matthew Auld
  0 siblings, 1 reply; 20+ messages in thread
From: Levi, Ilia @ 2026-07-21 11:49 UTC (permalink / raw)
  To: Matthew Auld, Matthew Brost
  Cc: intel-xe, koby.elbaz, shuicheng.lin, thomas.hellstrom


On 21-Jul-26 11:44, Matthew Auld wrote:
> On 21/07/2026 04:20, Matthew Brost wrote:
>> On Wed, Jul 15, 2026 at 02:05:35PM +0100, Matthew Auld wrote:
>>> Hi,
>>>
>>> On 26/05/2026 13:51, Ilia Levi wrote:
>>>> The fault handler currently assumes it always operates on a VMA spanning
>>>> the entire GEM object. This does not hold when the VMA has been split,
>>>> e.g. by a partial munmap or mprotect. In that case the handler may map
>>>> wrong physical pages or cause SIGBUS.
>>>>
>>>> Change the fault handler to map only the GEM subrange corresponding to
>>>> the VMA, and do not set vm_pgoff to zero. Many DRM drivers do this
>>>> because helpers like dma_mmap_pages() interpret vm_pgoff as an
>>>> intra-buffer page offset; leaving the DRM fake offset there would break
>>>> these helpers. Those drivers can get away with zeroing it because they
>>>> map eagerly -- all PTEs are established before mmap returns, so vm_pgoff
>>>> is never consulted again. This driver does not use such helpers and
>>>> defers mapping to the fault handler, where vm_pgoff must be preserved:
>>>> when the kernel splits a VMA it adjusts vm_pgoff, and the fault handler
>>>> subtracts the GEM object's fake mmap offset to recover the page offset
>>>> within the object.
>>>>
>>>> Fixes: 1ffcf8b8ae8a ("drm/xe: Support for mmap-ing mmio regions")
>>>> Assisted-by: GitHub-Copilot:claude-opus-4.6
>>>> Signed-off-by: Ilia Levi <ilia.levi@intel.com>
>>>
>>> Would it work if we did something like:
>>>
>>> +static int xe_mmio_gem_vm_may_split(struct vm_area_struct *vma, unsigned
>>> long addr)
>>> +{
>>> +       return -EINVAL;
>>> +}
>>> +
>>>   static const struct vm_operations_struct vm_ops = {
>>>          .open = drm_gem_vm_open,
>>>          .close = drm_gem_vm_close,
>>>          .fault = xe_mmio_gem_vm_fault,
>>> +       .may_split = xe_mmio_gem_vm_may_split,
>>>   };
>>>
>>> ?
>>>
>>> I don't think partial unmap or similar is really a real use case for this
>>> type of special mapping. IMO if we can just reject that would be simplest?
>>> What do you think here?
>>>
>>
>> +1 - I don't think split would really be a use case and most xe_mmio_gem
>> usages are likely exactly one page, right?
>
> Yeah, at least in the case of barrier and the other upcoming case I'm interested in, it should be one 4K page. There could be usecases where it's more than one page, but even so I doubt doing partial unmap or whatever is really a needed thing from userspace, for a mapping like this. But if that turns out wrong, loosening the restriction should be fine in the future. IMO keep it dumb & simple, especially given all the bugs we have here.


We could definitely do that, but I'm not sure what we would gain by being more
restrictive.

In terms of implementation, we won't need to store and use pgoff, but I would
still keep the loop change (as it reads more naturally) and remove
vma->vm_pgoff = 0 (since drm_vma_node_unmap() zapping relies on it). 
So it comes out to roughly the same amount of code either way — the .may_split
hook is about the same size as the pgoff handling it replaces.

And while partial unmap indeed doesn't sound useful, I could imagine a use-case
for mprotect, e.g. a hw producer ring whose body is mapped read-only to
userspace while a control/doorbell page stays writable.

If you think a narrower API is preferable though - I'm ok with making the change.

- Ilia

>
>>
>> Matt
>>
>>>> ---
>>>>    drivers/gpu/drm/xe/xe_mmio_gem.c | 18 +++++++++++-------
>>>>    1 file changed, 11 insertions(+), 7 deletions(-)
>>>>
>>>> diff --git a/drivers/gpu/drm/xe/xe_mmio_gem.c b/drivers/gpu/drm/xe/xe_mmio_gem.c
>>>> index c22a38e5616b..15e884ad3f1c 100644
>>>> --- a/drivers/gpu/drm/xe/xe_mmio_gem.c
>>>> +++ b/drivers/gpu/drm/xe/xe_mmio_gem.c
>>>> @@ -37,6 +37,7 @@ static vm_fault_t xe_mmio_gem_vm_fault(struct vm_fault *);
>>>>    struct xe_mmio_gem {
>>>>        struct drm_gem_object base;
>>>>        phys_addr_t phys_addr;
>>>> +    unsigned long pgoff;
>>>>    };
>>>>    static const struct vm_operations_struct vm_ops = {
>>>> @@ -92,6 +93,8 @@ struct xe_mmio_gem *xe_mmio_gem_create(struct xe_device *xe, struct drm_file *fi
>>>>        if (err)
>>>>            goto free_gem;
>>>> +    obj->pgoff = drm_vma_node_start(&base->vma_node);
>>>> +
>>>>        err = drm_vma_node_allow(&base->vma_node, file);
>>>>        if (err)
>>>>            goto free_gem;
>>>> @@ -147,8 +150,6 @@ static int xe_mmio_gem_mmap(struct drm_gem_object *base, struct vm_area_struct *
>>>>        if ((vma->vm_flags & VM_SHARED) == 0)
>>>>            return -EINVAL;
>>>> -    /* Set vm_pgoff (used as a fake buffer offset by DRM) to 0 */
>>>> -    vma->vm_pgoff = 0;
>>>>        vma->vm_page_prot = pgprot_noncached(vm_get_page_prot(vma->vm_flags));
>>>>        vm_flags_set(vma, VM_IO | VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP |
>>>>                 VM_DONTCOPY | VM_NORESERVE);
>>>> @@ -190,7 +191,8 @@ static vm_fault_t xe_mmio_gem_vm_fault(struct vm_fault *vmf)
>>>>        struct xe_mmio_gem *obj = to_xe_mmio_gem(base);
>>>>        struct drm_device *dev = base->dev;
>>>>        vm_fault_t ret = VM_FAULT_NOPAGE;
>>>> -    unsigned long i;
>>>> +    unsigned long addr, pfn;
>>>> +    unsigned long pgoff;
>>>>        int idx;
>>>>        if (!drm_dev_enter(dev, &idx)) {
>>>> @@ -203,13 +205,15 @@ static vm_fault_t xe_mmio_gem_vm_fault(struct vm_fault *vmf)
>>>>            return xe_mmio_gem_vm_fault_dummy_page(vmf);
>>>>        }
>>>> -    for (i = 0; i < base->size; i += PAGE_SIZE) {
>>>> -        unsigned long addr = vma->vm_start + i;
>>>> -        unsigned long phys_addr = obj->phys_addr + i;
>>>> +    pgoff = vma->vm_pgoff - obj->pgoff;
>>>> +    pfn = PHYS_PFN(obj->phys_addr) + pgoff;
>>>> -        ret = vmf_insert_pfn(vma, addr, PHYS_PFN(phys_addr));
>>>> +    for (addr = vma->vm_start; addr < vma->vm_end; addr += PAGE_SIZE) {
>>>> +        ret = vmf_insert_pfn(vma, addr, pfn);
>>>>            if (ret & VM_FAULT_ERROR)
>>>>                break;
>>>> +
>>>> +        pfn++;
>>>>        }
>>>>        drm_dev_exit(idx);
>>>
>

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

* Re: [PATCH v2 2/5] drm/xe/mmio_gem: fix fault handling for split VMA
  2026-07-21 11:49         ` Levi, Ilia
@ 2026-07-21 13:19           ` Matthew Auld
  2026-07-21 17:35             ` Matthew Brost
  0 siblings, 1 reply; 20+ messages in thread
From: Matthew Auld @ 2026-07-21 13:19 UTC (permalink / raw)
  To: Levi, Ilia, Matthew Brost
  Cc: intel-xe, koby.elbaz, shuicheng.lin, thomas.hellstrom

On 21/07/2026 12:49, Levi, Ilia wrote:
> 
> On 21-Jul-26 11:44, Matthew Auld wrote:
>> On 21/07/2026 04:20, Matthew Brost wrote:
>>> On Wed, Jul 15, 2026 at 02:05:35PM +0100, Matthew Auld wrote:
>>>> Hi,
>>>>
>>>> On 26/05/2026 13:51, Ilia Levi wrote:
>>>>> The fault handler currently assumes it always operates on a VMA spanning
>>>>> the entire GEM object. This does not hold when the VMA has been split,
>>>>> e.g. by a partial munmap or mprotect. In that case the handler may map
>>>>> wrong physical pages or cause SIGBUS.
>>>>>
>>>>> Change the fault handler to map only the GEM subrange corresponding to
>>>>> the VMA, and do not set vm_pgoff to zero. Many DRM drivers do this
>>>>> because helpers like dma_mmap_pages() interpret vm_pgoff as an
>>>>> intra-buffer page offset; leaving the DRM fake offset there would break
>>>>> these helpers. Those drivers can get away with zeroing it because they
>>>>> map eagerly -- all PTEs are established before mmap returns, so vm_pgoff
>>>>> is never consulted again. This driver does not use such helpers and
>>>>> defers mapping to the fault handler, where vm_pgoff must be preserved:
>>>>> when the kernel splits a VMA it adjusts vm_pgoff, and the fault handler
>>>>> subtracts the GEM object's fake mmap offset to recover the page offset
>>>>> within the object.
>>>>>
>>>>> Fixes: 1ffcf8b8ae8a ("drm/xe: Support for mmap-ing mmio regions")
>>>>> Assisted-by: GitHub-Copilot:claude-opus-4.6
>>>>> Signed-off-by: Ilia Levi <ilia.levi@intel.com>
>>>>
>>>> Would it work if we did something like:
>>>>
>>>> +static int xe_mmio_gem_vm_may_split(struct vm_area_struct *vma, unsigned
>>>> long addr)
>>>> +{
>>>> +       return -EINVAL;
>>>> +}
>>>> +
>>>>    static const struct vm_operations_struct vm_ops = {
>>>>           .open = drm_gem_vm_open,
>>>>           .close = drm_gem_vm_close,
>>>>           .fault = xe_mmio_gem_vm_fault,
>>>> +       .may_split = xe_mmio_gem_vm_may_split,
>>>>    };
>>>>
>>>> ?
>>>>
>>>> I don't think partial unmap or similar is really a real use case for this
>>>> type of special mapping. IMO if we can just reject that would be simplest?
>>>> What do you think here?
>>>>
>>>
>>> +1 - I don't think split would really be a use case and most xe_mmio_gem
>>> usages are likely exactly one page, right?
>>
>> Yeah, at least in the case of barrier and the other upcoming case I'm interested in, it should be one 4K page. There could be usecases where it's more than one page, but even so I doubt doing partial unmap or whatever is really a needed thing from userspace, for a mapping like this. But if that turns out wrong, loosening the restriction should be fine in the future. IMO keep it dumb & simple, especially given all the bugs we have here.
> 
> 
> We could definitely do that, but I'm not sure what we would gain by being more
> restrictive.
 > > In terms of implementation, we won't need to store and use pgoff, 
but I would
> still keep the loop change (as it reads more naturally) and remove
> vma->vm_pgoff = 0 (since drm_vma_node_unmap() zapping relies on it).
> So it comes out to roughly the same amount of code either way — the .may_split
> hook is about the same size as the pgoff handling it replaces.
> 
> And while partial unmap indeed doesn't sound useful, I could imagine a use-case
> for mprotect, e.g. a hw producer ring whose body is mapped read-only to
> userspace while a control/doorbell page stays writable.
> 
> If you think a narrower API is preferable though - I'm ok with making the change.

Since this is uapi, it's usually better to go as narrow as possible, 
since it will be harder to revoke later, if we did decide to do that. On 
the other hand loosening the restriction later is fine.

In addition it looks like adding features with no current user or a way 
to currently validate it in IGT, even if the code itself looks simple in 
the KMD.

> 
> - Ilia
> 
>>
>>>
>>> Matt
>>>
>>>>> ---
>>>>>     drivers/gpu/drm/xe/xe_mmio_gem.c | 18 +++++++++++-------
>>>>>     1 file changed, 11 insertions(+), 7 deletions(-)
>>>>>
>>>>> diff --git a/drivers/gpu/drm/xe/xe_mmio_gem.c b/drivers/gpu/drm/xe/xe_mmio_gem.c
>>>>> index c22a38e5616b..15e884ad3f1c 100644
>>>>> --- a/drivers/gpu/drm/xe/xe_mmio_gem.c
>>>>> +++ b/drivers/gpu/drm/xe/xe_mmio_gem.c
>>>>> @@ -37,6 +37,7 @@ static vm_fault_t xe_mmio_gem_vm_fault(struct vm_fault *);
>>>>>     struct xe_mmio_gem {
>>>>>         struct drm_gem_object base;
>>>>>         phys_addr_t phys_addr;
>>>>> +    unsigned long pgoff;
>>>>>     };
>>>>>     static const struct vm_operations_struct vm_ops = {
>>>>> @@ -92,6 +93,8 @@ struct xe_mmio_gem *xe_mmio_gem_create(struct xe_device *xe, struct drm_file *fi
>>>>>         if (err)
>>>>>             goto free_gem;
>>>>> +    obj->pgoff = drm_vma_node_start(&base->vma_node);
>>>>> +
>>>>>         err = drm_vma_node_allow(&base->vma_node, file);
>>>>>         if (err)
>>>>>             goto free_gem;
>>>>> @@ -147,8 +150,6 @@ static int xe_mmio_gem_mmap(struct drm_gem_object *base, struct vm_area_struct *
>>>>>         if ((vma->vm_flags & VM_SHARED) == 0)
>>>>>             return -EINVAL;
>>>>> -    /* Set vm_pgoff (used as a fake buffer offset by DRM) to 0 */
>>>>> -    vma->vm_pgoff = 0;
>>>>>         vma->vm_page_prot = pgprot_noncached(vm_get_page_prot(vma->vm_flags));
>>>>>         vm_flags_set(vma, VM_IO | VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP |
>>>>>                  VM_DONTCOPY | VM_NORESERVE);
>>>>> @@ -190,7 +191,8 @@ static vm_fault_t xe_mmio_gem_vm_fault(struct vm_fault *vmf)
>>>>>         struct xe_mmio_gem *obj = to_xe_mmio_gem(base);
>>>>>         struct drm_device *dev = base->dev;
>>>>>         vm_fault_t ret = VM_FAULT_NOPAGE;
>>>>> -    unsigned long i;
>>>>> +    unsigned long addr, pfn;
>>>>> +    unsigned long pgoff;
>>>>>         int idx;
>>>>>         if (!drm_dev_enter(dev, &idx)) {
>>>>> @@ -203,13 +205,15 @@ static vm_fault_t xe_mmio_gem_vm_fault(struct vm_fault *vmf)
>>>>>             return xe_mmio_gem_vm_fault_dummy_page(vmf);
>>>>>         }
>>>>> -    for (i = 0; i < base->size; i += PAGE_SIZE) {
>>>>> -        unsigned long addr = vma->vm_start + i;
>>>>> -        unsigned long phys_addr = obj->phys_addr + i;
>>>>> +    pgoff = vma->vm_pgoff - obj->pgoff;
>>>>> +    pfn = PHYS_PFN(obj->phys_addr) + pgoff;
>>>>> -        ret = vmf_insert_pfn(vma, addr, PHYS_PFN(phys_addr));
>>>>> +    for (addr = vma->vm_start; addr < vma->vm_end; addr += PAGE_SIZE) {
>>>>> +        ret = vmf_insert_pfn(vma, addr, pfn);
>>>>>             if (ret & VM_FAULT_ERROR)
>>>>>                 break;
>>>>> +
>>>>> +        pfn++;
>>>>>         }
>>>>>         drm_dev_exit(idx);
>>>>
>>


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

* Re: [PATCH v2 5/5] drm/xe/mmio_gem: fix destroy flow
  2026-07-21  9:15     ` Matthew Auld
@ 2026-07-21 15:00       ` Levi, Ilia
  0 siblings, 0 replies; 20+ messages in thread
From: Levi, Ilia @ 2026-07-21 15:00 UTC (permalink / raw)
  To: Matthew Auld, intel-xe
  Cc: koby.elbaz, shuicheng.lin, thomas.hellstrom, Matthew Brost


On 21-Jul-26 12:15, Matthew Auld wrote:
> On 16/07/2026 16:22, Matthew Auld wrote:
>> On 26/05/2026 13:51, Ilia Levi wrote:
>>> xe_mmio_gem_destroy() currently frees the GEM object directly, bypassing
>>> reference counting.  Since existing VMAs hold a reference and the fault
>>> handler accesses the object through vma->vm_private_data, this is
>>> use-after-free.  Additionally, nothing prevents the fault handler from
>>> installing PTEs to the real MMIO after destroy.
>>>
>>> Use SRCU to ensure the fault handler sees the 'destroyed' flag
>>> (mirroring the drm_dev_enter/exit pattern for hot-unplug), then zap
>>> existing PTEs to prevent continued access to the real MMIO. Use
>>> drm_gem_object_put() to respect the reference count.
>>
>> Couple questions here:
>>
>> 1) Can we not just use the dma-resv for synchronisation? We wrap the mmio_gem with a gem buffer, so the dma-resv is already there. This has the added benefit of looking more similar to the normal bo fault path. Also same question for dummy_page_lock in the previous patch.
>>
>> 2) Should we not just SIGBUG, if something faults on this post destroy? Is this not a userspace issue? Re-routing to the dummy page on unplug makes sense, since userspace did nothing wrong, so we want to give it a chance to recover.
>
> For 2) other option is maybe just to drop the gem->destroyed handling for now. For PCI_BARRIER and anything else tied to the xe_file, there shouldn't be any weird lifetime issues, so it should be impossible to see something "destroyed" in the fault handler. It's otherwise hard to judge without seeing a real user for this special "destroyed" flow with the re-routing to a dummy page.
>

The contract I envisioned for xe_mmio_gem_destroy() is immediate access cut-off,
so we're not dependent on userspace releasing it with munmap. For example,
suppose the exposed MMIO region is a per-exec-queue resource (i.e.
xe_mmio_gem_create called from xe_exec_queue_create and
xe_mmio_gem_destroy called from xe_exec_queue_destroy).
In such case, the same MMIO region could be recycled and reassigned to another
client - hence the need for the "destroyed" flag and zapping. You're probably
right about SIGBUS being the better choice in this case than a dummy page though.

Regarding dma_resv lock instead of srcu and dummy_page_lock - interesting idea,
let me check it out.

- Ilia

>>
>>>
>>> Fixes: 1ffcf8b8ae8a ("drm/xe: Support for mmap-ing mmio regions")
>>> Assisted-by: GitHub-Copilot:claude-opus-4.6
>>> Signed-off-by: Ilia Levi <ilia.levi@intel.com>
>>> ---
>>>   drivers/gpu/drm/xe/xe_mmio_gem.c | 27 ++++++++++++++++++++++++++-
>>>   1 file changed, 26 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/drivers/gpu/drm/xe/xe_mmio_gem.c b/drivers/gpu/drm/xe/ xe_mmio_gem.c
>>> index 2f2ebc4fd901..b91704c51a93 100644
>>> --- a/drivers/gpu/drm/xe/xe_mmio_gem.c
>>> +++ b/drivers/gpu/drm/xe/xe_mmio_gem.c
>>> @@ -5,11 +5,15 @@
>>>   #include "xe_mmio_gem.h"
>>> +#include <linux/srcu.h>
>>> +
>>>   #include <drm/drm_drv.h>
>>>   #include <drm/drm_gem.h>
>>>   #include "xe_device_types.h"
>>> +DEFINE_STATIC_SRCU(xe_mmio_gem_srcu);
>>> +
>>>   /**
>>>    * DOC: Exposing MMIO regions to userspace
>>>    *
>>> @@ -39,6 +43,7 @@ struct xe_mmio_gem {
>>>       unsigned long pgoff;
>>>       struct mutex dummy_page_lock; /* protects dummy page allocation */
>>>       struct page *dummy_page;
>>> +    bool destroyed;
>>>   };
>>>   static const struct vm_operations_struct vm_ops = {
>>> @@ -145,8 +150,23 @@ static void xe_mmio_gem_free(struct drm_gem_object *base)
>>>    */
>>>   void xe_mmio_gem_destroy(struct xe_mmio_gem *gem, struct drm_file *file)
>>>   {
>>> +    struct drm_gem_object *base = &gem->base;
>>> +    struct drm_device *dev = base->dev;
>>> +
>>>       drm_vma_node_revoke(&gem->base.vma_node, file);
>>> -    xe_mmio_gem_free(&gem->base);
>>> +
>>> +    gem->destroyed = true;
>>> +    synchronize_srcu(&xe_mmio_gem_srcu);
>>> +
>>> +    /*
>>> +     * At this point every subsequent fault handler will see that the
>>> +     * object has been destroyed and provide the dummy page.
>>> +     * Now just zap existing PTEs to prevent continued access to the real
>>> +     * MMIO.
>>> +     */
>>> +    drm_vma_node_unmap(&base->vma_node, dev->anon_inode->i_mapping);
>>> +
>>> +    drm_gem_object_put(base);
>>>   }
>>>   static int xe_mmio_gem_mmap(struct drm_gem_object *base, struct vm_area_struct *vma)
>>> @@ -196,6 +216,11 @@ static vm_fault_t xe_mmio_gem_vm_fault(struct vm_fault *vmf)
>>>       unsigned long pgoff;
>>>       int idx;
>>> +    guard(srcu)(&xe_mmio_gem_srcu);
>>> +
>>> +    if (obj->destroyed)
>>> +        return xe_mmio_gem_vm_fault_dummy_page(vmf);
>>> +
>>>       if (!drm_dev_enter(dev, &idx)) {
>>>           /*
>>>            * Provide a dummy page to avoid SIGBUS for events such as hot-unplug.
>>
>

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

* Re: [PATCH v2 2/5] drm/xe/mmio_gem: fix fault handling for split VMA
  2026-07-21 13:19           ` Matthew Auld
@ 2026-07-21 17:35             ` Matthew Brost
  2026-07-21 18:45               ` Levi, Ilia
  0 siblings, 1 reply; 20+ messages in thread
From: Matthew Brost @ 2026-07-21 17:35 UTC (permalink / raw)
  To: Matthew Auld
  Cc: Levi, Ilia, intel-xe, koby.elbaz, shuicheng.lin, thomas.hellstrom

On Tue, Jul 21, 2026 at 02:19:37PM +0100, Matthew Auld wrote:
> On 21/07/2026 12:49, Levi, Ilia wrote:
> > 
> > On 21-Jul-26 11:44, Matthew Auld wrote:
> > > On 21/07/2026 04:20, Matthew Brost wrote:
> > > > On Wed, Jul 15, 2026 at 02:05:35PM +0100, Matthew Auld wrote:
> > > > > Hi,
> > > > > 
> > > > > On 26/05/2026 13:51, Ilia Levi wrote:
> > > > > > The fault handler currently assumes it always operates on a VMA spanning
> > > > > > the entire GEM object. This does not hold when the VMA has been split,
> > > > > > e.g. by a partial munmap or mprotect. In that case the handler may map
> > > > > > wrong physical pages or cause SIGBUS.
> > > > > > 
> > > > > > Change the fault handler to map only the GEM subrange corresponding to
> > > > > > the VMA, and do not set vm_pgoff to zero. Many DRM drivers do this
> > > > > > because helpers like dma_mmap_pages() interpret vm_pgoff as an
> > > > > > intra-buffer page offset; leaving the DRM fake offset there would break
> > > > > > these helpers. Those drivers can get away with zeroing it because they
> > > > > > map eagerly -- all PTEs are established before mmap returns, so vm_pgoff
> > > > > > is never consulted again. This driver does not use such helpers and
> > > > > > defers mapping to the fault handler, where vm_pgoff must be preserved:
> > > > > > when the kernel splits a VMA it adjusts vm_pgoff, and the fault handler
> > > > > > subtracts the GEM object's fake mmap offset to recover the page offset
> > > > > > within the object.
> > > > > > 
> > > > > > Fixes: 1ffcf8b8ae8a ("drm/xe: Support for mmap-ing mmio regions")
> > > > > > Assisted-by: GitHub-Copilot:claude-opus-4.6
> > > > > > Signed-off-by: Ilia Levi <ilia.levi@intel.com>
> > > > > 
> > > > > Would it work if we did something like:
> > > > > 
> > > > > +static int xe_mmio_gem_vm_may_split(struct vm_area_struct *vma, unsigned
> > > > > long addr)
> > > > > +{
> > > > > +       return -EINVAL;
> > > > > +}
> > > > > +
> > > > >    static const struct vm_operations_struct vm_ops = {
> > > > >           .open = drm_gem_vm_open,
> > > > >           .close = drm_gem_vm_close,
> > > > >           .fault = xe_mmio_gem_vm_fault,
> > > > > +       .may_split = xe_mmio_gem_vm_may_split,
> > > > >    };
> > > > > 
> > > > > ?
> > > > > 
> > > > > I don't think partial unmap or similar is really a real use case for this
> > > > > type of special mapping. IMO if we can just reject that would be simplest?
> > > > > What do you think here?
> > > > > 
> > > > 
> > > > +1 - I don't think split would really be a use case and most xe_mmio_gem
> > > > usages are likely exactly one page, right?
> > > 
> > > Yeah, at least in the case of barrier and the other upcoming case I'm interested in, it should be one 4K page. There could be usecases where it's more than one page, but even so I doubt doing partial unmap or whatever is really a needed thing from userspace, for a mapping like this. But if that turns out wrong, loosening the restriction should be fine in the future. IMO keep it dumb & simple, especially given all the bugs we have here.
> > 
> > 
> > We could definitely do that, but I'm not sure what we would gain by being more
> > restrictive.
> > > In terms of implementation, we won't need to store and use pgoff, but I
> would
> > still keep the loop change (as it reads more naturally) and remove
> > vma->vm_pgoff = 0 (since drm_vma_node_unmap() zapping relies on it).
> > So it comes out to roughly the same amount of code either way — the .may_split
> > hook is about the same size as the pgoff handling it replaces.
> > 
> > And while partial unmap indeed doesn't sound useful, I could imagine a use-case
> > for mprotect, e.g. a hw producer ring whose body is mapped read-only to
> > userspace while a control/doorbell page stays writable.
> > 

Almost certainly hw producer ring and control/doorbell page are
different xe_mmio_gem though.

> > If you think a narrower API is preferable though - I'm ok with making the change.
> 
> Since this is uapi, it's usually better to go as narrow as possible, since
> it will be harder to revoke later, if we did decide to do that. On the other
> hand loosening the restriction later is fine.
> 

+1.

Matt

> In addition it looks like adding features with no current user or a way to
> currently validate it in IGT, even if the code itself looks simple in the
> KMD.
> 
> > 
> > - Ilia
> > 
> > > 
> > > > 
> > > > Matt
> > > > 
> > > > > > ---
> > > > > >     drivers/gpu/drm/xe/xe_mmio_gem.c | 18 +++++++++++-------
> > > > > >     1 file changed, 11 insertions(+), 7 deletions(-)
> > > > > > 
> > > > > > diff --git a/drivers/gpu/drm/xe/xe_mmio_gem.c b/drivers/gpu/drm/xe/xe_mmio_gem.c
> > > > > > index c22a38e5616b..15e884ad3f1c 100644
> > > > > > --- a/drivers/gpu/drm/xe/xe_mmio_gem.c
> > > > > > +++ b/drivers/gpu/drm/xe/xe_mmio_gem.c
> > > > > > @@ -37,6 +37,7 @@ static vm_fault_t xe_mmio_gem_vm_fault(struct vm_fault *);
> > > > > >     struct xe_mmio_gem {
> > > > > >         struct drm_gem_object base;
> > > > > >         phys_addr_t phys_addr;
> > > > > > +    unsigned long pgoff;
> > > > > >     };
> > > > > >     static const struct vm_operations_struct vm_ops = {
> > > > > > @@ -92,6 +93,8 @@ struct xe_mmio_gem *xe_mmio_gem_create(struct xe_device *xe, struct drm_file *fi
> > > > > >         if (err)
> > > > > >             goto free_gem;
> > > > > > +    obj->pgoff = drm_vma_node_start(&base->vma_node);
> > > > > > +
> > > > > >         err = drm_vma_node_allow(&base->vma_node, file);
> > > > > >         if (err)
> > > > > >             goto free_gem;
> > > > > > @@ -147,8 +150,6 @@ static int xe_mmio_gem_mmap(struct drm_gem_object *base, struct vm_area_struct *
> > > > > >         if ((vma->vm_flags & VM_SHARED) == 0)
> > > > > >             return -EINVAL;
> > > > > > -    /* Set vm_pgoff (used as a fake buffer offset by DRM) to 0 */
> > > > > > -    vma->vm_pgoff = 0;
> > > > > >         vma->vm_page_prot = pgprot_noncached(vm_get_page_prot(vma->vm_flags));
> > > > > >         vm_flags_set(vma, VM_IO | VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP |
> > > > > >                  VM_DONTCOPY | VM_NORESERVE);
> > > > > > @@ -190,7 +191,8 @@ static vm_fault_t xe_mmio_gem_vm_fault(struct vm_fault *vmf)
> > > > > >         struct xe_mmio_gem *obj = to_xe_mmio_gem(base);
> > > > > >         struct drm_device *dev = base->dev;
> > > > > >         vm_fault_t ret = VM_FAULT_NOPAGE;
> > > > > > -    unsigned long i;
> > > > > > +    unsigned long addr, pfn;
> > > > > > +    unsigned long pgoff;
> > > > > >         int idx;
> > > > > >         if (!drm_dev_enter(dev, &idx)) {
> > > > > > @@ -203,13 +205,15 @@ static vm_fault_t xe_mmio_gem_vm_fault(struct vm_fault *vmf)
> > > > > >             return xe_mmio_gem_vm_fault_dummy_page(vmf);
> > > > > >         }
> > > > > > -    for (i = 0; i < base->size; i += PAGE_SIZE) {
> > > > > > -        unsigned long addr = vma->vm_start + i;
> > > > > > -        unsigned long phys_addr = obj->phys_addr + i;
> > > > > > +    pgoff = vma->vm_pgoff - obj->pgoff;
> > > > > > +    pfn = PHYS_PFN(obj->phys_addr) + pgoff;
> > > > > > -        ret = vmf_insert_pfn(vma, addr, PHYS_PFN(phys_addr));
> > > > > > +    for (addr = vma->vm_start; addr < vma->vm_end; addr += PAGE_SIZE) {
> > > > > > +        ret = vmf_insert_pfn(vma, addr, pfn);
> > > > > >             if (ret & VM_FAULT_ERROR)
> > > > > >                 break;
> > > > > > +
> > > > > > +        pfn++;
> > > > > >         }
> > > > > >         drm_dev_exit(idx);
> > > > > 
> > > 
> 

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

* Re: [PATCH v2 2/5] drm/xe/mmio_gem: fix fault handling for split VMA
  2026-07-21 17:35             ` Matthew Brost
@ 2026-07-21 18:45               ` Levi, Ilia
  0 siblings, 0 replies; 20+ messages in thread
From: Levi, Ilia @ 2026-07-21 18:45 UTC (permalink / raw)
  To: Matthew Brost, Matthew Auld
  Cc: intel-xe, koby.elbaz, shuicheng.lin, thomas.hellstrom


On 21-Jul-26 20:35, Matthew Brost wrote:
> On Tue, Jul 21, 2026 at 02:19:37PM +0100, Matthew Auld wrote:
>> On 21/07/2026 12:49, Levi, Ilia wrote:
>>> On 21-Jul-26 11:44, Matthew Auld wrote:
>>>> On 21/07/2026 04:20, Matthew Brost wrote:
>>>>> On Wed, Jul 15, 2026 at 02:05:35PM +0100, Matthew Auld wrote:
>>>>>> Hi,
>>>>>>
>>>>>> On 26/05/2026 13:51, Ilia Levi wrote:
>>>>>>> The fault handler currently assumes it always operates on a VMA spanning
>>>>>>> the entire GEM object. This does not hold when the VMA has been split,
>>>>>>> e.g. by a partial munmap or mprotect. In that case the handler may map
>>>>>>> wrong physical pages or cause SIGBUS.
>>>>>>>
>>>>>>> Change the fault handler to map only the GEM subrange corresponding to
>>>>>>> the VMA, and do not set vm_pgoff to zero. Many DRM drivers do this
>>>>>>> because helpers like dma_mmap_pages() interpret vm_pgoff as an
>>>>>>> intra-buffer page offset; leaving the DRM fake offset there would break
>>>>>>> these helpers. Those drivers can get away with zeroing it because they
>>>>>>> map eagerly -- all PTEs are established before mmap returns, so vm_pgoff
>>>>>>> is never consulted again. This driver does not use such helpers and
>>>>>>> defers mapping to the fault handler, where vm_pgoff must be preserved:
>>>>>>> when the kernel splits a VMA it adjusts vm_pgoff, and the fault handler
>>>>>>> subtracts the GEM object's fake mmap offset to recover the page offset
>>>>>>> within the object.
>>>>>>>
>>>>>>> Fixes: 1ffcf8b8ae8a ("drm/xe: Support for mmap-ing mmio regions")
>>>>>>> Assisted-by: GitHub-Copilot:claude-opus-4.6
>>>>>>> Signed-off-by: Ilia Levi <ilia.levi@intel.com>
>>>>>> Would it work if we did something like:
>>>>>>
>>>>>> +static int xe_mmio_gem_vm_may_split(struct vm_area_struct *vma, unsigned
>>>>>> long addr)
>>>>>> +{
>>>>>> +       return -EINVAL;
>>>>>> +}
>>>>>> +
>>>>>>    static const struct vm_operations_struct vm_ops = {
>>>>>>           .open = drm_gem_vm_open,
>>>>>>           .close = drm_gem_vm_close,
>>>>>>           .fault = xe_mmio_gem_vm_fault,
>>>>>> +       .may_split = xe_mmio_gem_vm_may_split,
>>>>>>    };
>>>>>>
>>>>>> ?
>>>>>>
>>>>>> I don't think partial unmap or similar is really a real use case for this
>>>>>> type of special mapping. IMO if we can just reject that would be simplest?
>>>>>> What do you think here?
>>>>>>
>>>>> +1 - I don't think split would really be a use case and most xe_mmio_gem
>>>>> usages are likely exactly one page, right?
>>>> Yeah, at least in the case of barrier and the other upcoming case I'm interested in, it should be one 4K page. There could be usecases where it's more than one page, but even so I doubt doing partial unmap or whatever is really a needed thing from userspace, for a mapping like this. But if that turns out wrong, loosening the restriction should be fine in the future. IMO keep it dumb & simple, especially given all the bugs we have here.
>>>
>>> We could definitely do that, but I'm not sure what we would gain by being more
>>> restrictive.
>>>> In terms of implementation, we won't need to store and use pgoff, but I
>> would
>>> still keep the loop change (as it reads more naturally) and remove
>>> vma->vm_pgoff = 0 (since drm_vma_node_unmap() zapping relies on it).
>>> So it comes out to roughly the same amount of code either way — the .may_split
>>> hook is about the same size as the pgoff handling it replaces.
>>>
>>> And while partial unmap indeed doesn't sound useful, I could imagine a use-case
>>> for mprotect, e.g. a hw producer ring whose body is mapped read-only to
>>> userspace while a control/doorbell page stays writable.
>>>
> Almost certainly hw producer ring and control/doorbell page are
> different xe_mmio_gem though.

Design choice, but yeah, that is a possibility.

>
>>> If you think a narrower API is preferable though - I'm ok with making the change.
>> Since this is uapi, it's usually better to go as narrow as possible, since
>> it will be harder to revoke later, if we did decide to do that. On the other
>> hand loosening the restriction later is fine.
>>
> +1.
>
> Matt


Fair enough, will do that, thanks.

- Ilia


>
>> In addition it looks like adding features with no current user or a way to
>> currently validate it in IGT, even if the code itself looks simple in the
>> KMD.
>>
>>> - Ilia
>>>
>>>>> Matt
>>>>>
>>>>>>> ---
>>>>>>>     drivers/gpu/drm/xe/xe_mmio_gem.c | 18 +++++++++++-------
>>>>>>>     1 file changed, 11 insertions(+), 7 deletions(-)
>>>>>>>
>>>>>>> diff --git a/drivers/gpu/drm/xe/xe_mmio_gem.c b/drivers/gpu/drm/xe/xe_mmio_gem.c
>>>>>>> index c22a38e5616b..15e884ad3f1c 100644
>>>>>>> --- a/drivers/gpu/drm/xe/xe_mmio_gem.c
>>>>>>> +++ b/drivers/gpu/drm/xe/xe_mmio_gem.c
>>>>>>> @@ -37,6 +37,7 @@ static vm_fault_t xe_mmio_gem_vm_fault(struct vm_fault *);
>>>>>>>     struct xe_mmio_gem {
>>>>>>>         struct drm_gem_object base;
>>>>>>>         phys_addr_t phys_addr;
>>>>>>> +    unsigned long pgoff;
>>>>>>>     };
>>>>>>>     static const struct vm_operations_struct vm_ops = {
>>>>>>> @@ -92,6 +93,8 @@ struct xe_mmio_gem *xe_mmio_gem_create(struct xe_device *xe, struct drm_file *fi
>>>>>>>         if (err)
>>>>>>>             goto free_gem;
>>>>>>> +    obj->pgoff = drm_vma_node_start(&base->vma_node);
>>>>>>> +
>>>>>>>         err = drm_vma_node_allow(&base->vma_node, file);
>>>>>>>         if (err)
>>>>>>>             goto free_gem;
>>>>>>> @@ -147,8 +150,6 @@ static int xe_mmio_gem_mmap(struct drm_gem_object *base, struct vm_area_struct *
>>>>>>>         if ((vma->vm_flags & VM_SHARED) == 0)
>>>>>>>             return -EINVAL;
>>>>>>> -    /* Set vm_pgoff (used as a fake buffer offset by DRM) to 0 */
>>>>>>> -    vma->vm_pgoff = 0;
>>>>>>>         vma->vm_page_prot = pgprot_noncached(vm_get_page_prot(vma->vm_flags));
>>>>>>>         vm_flags_set(vma, VM_IO | VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP |
>>>>>>>                  VM_DONTCOPY | VM_NORESERVE);
>>>>>>> @@ -190,7 +191,8 @@ static vm_fault_t xe_mmio_gem_vm_fault(struct vm_fault *vmf)
>>>>>>>         struct xe_mmio_gem *obj = to_xe_mmio_gem(base);
>>>>>>>         struct drm_device *dev = base->dev;
>>>>>>>         vm_fault_t ret = VM_FAULT_NOPAGE;
>>>>>>> -    unsigned long i;
>>>>>>> +    unsigned long addr, pfn;
>>>>>>> +    unsigned long pgoff;
>>>>>>>         int idx;
>>>>>>>         if (!drm_dev_enter(dev, &idx)) {
>>>>>>> @@ -203,13 +205,15 @@ static vm_fault_t xe_mmio_gem_vm_fault(struct vm_fault *vmf)
>>>>>>>             return xe_mmio_gem_vm_fault_dummy_page(vmf);
>>>>>>>         }
>>>>>>> -    for (i = 0; i < base->size; i += PAGE_SIZE) {
>>>>>>> -        unsigned long addr = vma->vm_start + i;
>>>>>>> -        unsigned long phys_addr = obj->phys_addr + i;
>>>>>>> +    pgoff = vma->vm_pgoff - obj->pgoff;
>>>>>>> +    pfn = PHYS_PFN(obj->phys_addr) + pgoff;
>>>>>>> -        ret = vmf_insert_pfn(vma, addr, PHYS_PFN(phys_addr));
>>>>>>> +    for (addr = vma->vm_start; addr < vma->vm_end; addr += PAGE_SIZE) {
>>>>>>> +        ret = vmf_insert_pfn(vma, addr, pfn);
>>>>>>>             if (ret & VM_FAULT_ERROR)
>>>>>>>                 break;
>>>>>>> +
>>>>>>> +        pfn++;
>>>>>>>         }
>>>>>>>         drm_dev_exit(idx);

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

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

Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-26 12:51 [PATCH v2 0/5] drm/xe/mmio_gem: fix fault handler and destroy path Ilia Levi
2026-05-26 12:51 ` [PATCH v2 1/5] drm/xe/mmio_gem: use write-back mapping for dummy page Ilia Levi
2026-05-26 12:51 ` [PATCH v2 2/5] drm/xe/mmio_gem: fix fault handling for split VMA Ilia Levi
2026-07-15 13:05   ` Matthew Auld
2026-07-21  3:20     ` Matthew Brost
2026-07-21  8:44       ` Matthew Auld
2026-07-21 11:49         ` Levi, Ilia
2026-07-21 13:19           ` Matthew Auld
2026-07-21 17:35             ` Matthew Brost
2026-07-21 18:45               ` Levi, Ilia
2026-05-26 12:51 ` [PATCH v2 3/5] drm/xe/mmio_gem: Revoke drm_vma_node on xe_mmio_gem destroy Ilia Levi
2026-05-26 12:51 ` [PATCH v2 4/5] drm/xe/mmio_gem: cache the dummy page per object Ilia Levi
2026-05-26 12:51 ` [PATCH v2 5/5] drm/xe/mmio_gem: fix destroy flow Ilia Levi
2026-07-16 15:22   ` Matthew Auld
2026-07-21  9:15     ` Matthew Auld
2026-07-21 15:00       ` Levi, Ilia
2026-05-26 12:58 ` ✓ CI.KUnit: success for drm/xe/mmio_gem: fix fault handler and destroy path (rev2) Patchwork
2026-05-26 13:42 ` ✓ Xe.CI.BAT: " Patchwork
2026-05-26 15:20 ` ✓ Xe.CI.FULL: " Patchwork
2026-07-16 15:55 ` [PATCH v2 0/5] drm/xe/mmio_gem: fix fault handler and destroy path Matthew Auld

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