Intel-XE Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/4] drm/gpusvm: share one HMM fault across per-device DMA mappings
@ 2026-09-01  9:00 Honglei Huang
  2026-09-01  9:00 ` [PATCH v2 1/4] drm/gpusvm: move dma_addr allocation before the notifier lock Honglei Huang
                   ` (6 more replies)
  0 siblings, 7 replies; 15+ messages in thread
From: Honglei Huang @ 2026-09-01  9:00 UTC (permalink / raw)
  To: matthew.brost, sima, rodrigo.vivi, thomas.hellstrom,
	himal.prasad.ghimiray, dakr, intel-xe
  Cc: aliceryhl, Alexander.Deucher, Felix.Kuehling, Christian.Koenig,
	Ray.Huang, Junhua.Shen, amd-gfx, dri-devel, honghuan

This series is a follow up to the earlier drm_gpusvm_pages decoupling
series [1], and follows the direction Matt suggested [2].

drm_gpusvm_get_pages() does two things at once: the MM level HMM fault
of the CPU range, and the device DMA mapping of the faulted pages. When
one CPU range is mirrored on several devices, every device has to call
get_pages() and redo the HMM fault. Matt suggested [2] passing an array
of drm_gpusvm_pages plus a count so the fault is taken once and shared,
while the notifier retry loop stays in common code so drivers never open
code it.

The series builds up to that in small steps, no functional change until
the last two patches:

  - patch 1 moves the dma_addr allocation out of the notifier locked
    section, so the mapping step becomes self contained.
  - patch 2 pulls the per-device mapping loop into
    drm_gpusvm_dma_map_pages(). Code motion only.
  - patch 3 makes get_pages() take an array of drm_gpusvm_pages plus a
    count: fault once, then DMA map each instance, one per owning
    drm_device, under a single notifier retry gate. Instances that are
    already mapped are skipped, so an -EAGAIN retry does not redo them.
    The common 1:1 case passes count == 1 and is unchanged.
  - patch 4 adds a no_dma_map context flag so a driver that only needs
    the CPU pages faulted in can skip the device DMA mapping.

Patch 4 has no in-tree user yet, AMDXDNA is the intended consumer but
that conversion is not ready. It is independent of patches 1-3, happy to
drop it and repost it together with its user.

v2:
  - Rebased on drm-tip. Matt asked for Stanislav's
    hmm_range_fault_unlocked_timeout() patch [3] to be carried at the
    base of this series, it has since landed in drm-tip, so this version
    is just rebased on top of it.
  - Dropped v1 patch 1 ("drm/gpusvm: extract drm_gpusvm_hmm_fault()
    helper"), it is part of [3] now.
  - patch 3: drm_gpusvm_pages_valid_unlocked() takes the array and the
    count itself, instead of get_pages() open coding an all_valid loop.
  - patch 3: fixed the N:1 doc example, it used the wrong union member
    when the count is 1. Added a driver_pages() accessor.
  - patch 3: documented that on error the instances mapped before the
    failing one stay mapped, the caller must unmap and free all of them.
  - patch 4: reject no_dma_map together with devmem_only, without the
    DMA mapping step there is no page type check to enforce it.
  - patch 4: documented that no_dma_map only returns a snapshot, the
    caller must recheck mmu_interval_read_retry() itself.

tests:
AMDGPU:
  SVM:DRM N:1 multi device support is work in progress on top of this
  series. The single device (1:1) path was tested with the amdgpu SVM
  adaptation on top. Based on amdgpu SVM [4].
  Tested on gfx943 (MI300X) and gfx906 (MI60) with XNACK on/off:
  - KFD test: SVM all passed except the get attr refactor.
  - ROCR test: all passed.
  - HIP catch test: gfx943 (MI300X): 99% passed.
                    gfx906 (MI60): 99% passed.

links:
[1] drm_gpusvm_pages decoupling series:
    https://lore.kernel.org/amd-gfx/20260630102127.392396-1-honghuan@amd.com/
[2] Matt's suggested direction:
    https://lore.kernel.org/amd-gfx/aijdg7RWwrEDEMxC@gsse-cloud1.jf.intel.com/
[3] drm/gpusvm: use hmm_range_fault_unlocked_timeout() for range faults:
    https://lore.kernel.org/20260723-hmm-v10-v11-8-c55b003a4b61@gmail.com
[4] amdgpu SVM:
    https://lore.kernel.org/amd-gfx/20260804094246.1719318-1-ray.huang@amd.com/

Honglei Huang (4):
  drm/gpusvm: move dma_addr allocation before the notifier lock
  drm/gpusvm: extract drm_gpusvm_dma_map_pages() helper
  drm/gpusvm: let drm_gpusvm_get_pages() map an array of pages
  drm/gpusvm: make the DMA mapping step in get_pages() optional

 drivers/gpu/drm/drm_gpusvm.c    | 336 +++++++++++++++++++++-----------
 drivers/gpu/drm/xe/xe_svm.c     |   2 +-
 drivers/gpu/drm/xe/xe_userptr.c |   2 +-
 include/drm/drm_gpusvm.h        |  10 +
 4 files changed, 239 insertions(+), 111 deletions(-)


base-commit: c8420bcb1802510e5411ea4c98e2e07bdb43d74e
-- 
2.34.1


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

* [PATCH v2 1/4] drm/gpusvm: move dma_addr allocation before the notifier lock
  2026-09-01  9:00 [PATCH v2 0/4] drm/gpusvm: share one HMM fault across per-device DMA mappings Honglei Huang
@ 2026-09-01  9:00 ` Honglei Huang
  2026-09-01 19:39   ` Matthew Brost
  2026-09-01  9:00 ` [PATCH v2 2/4] drm/gpusvm: extract drm_gpusvm_dma_map_pages() helper Honglei Huang
                   ` (5 subsequent siblings)
  6 siblings, 1 reply; 15+ messages in thread
From: Honglei Huang @ 2026-09-01  9:00 UTC (permalink / raw)
  To: matthew.brost, sima, rodrigo.vivi, thomas.hellstrom,
	himal.prasad.ghimiray, dakr, intel-xe
  Cc: aliceryhl, Alexander.Deucher, Felix.Kuehling, Christian.Koenig,
	Ray.Huang, Junhua.Shen, amd-gfx, dri-devel, honghuan

The dma_addr allocation was in a lazy allocation flow, it needs unlock
and goto map_pages. The allocation only needs npages, so just do it
before taking the lock. Drop the map_pages label and the relock flow, so
the sequence becomes fault, allocate, then lock, validate, map and
unlock. No functional change intended.

Signed-off-by: Honglei Huang <honghuan@amd.com>
---
 drivers/gpu/drm/drm_gpusvm.c | 22 +++++++++-------------
 1 file changed, 9 insertions(+), 13 deletions(-)

diff --git a/drivers/gpu/drm/drm_gpusvm.c b/drivers/gpu/drm/drm_gpusvm.c
index a93eee7ddb9..b507de539e6 100644
--- a/drivers/gpu/drm/drm_gpusvm.c
+++ b/drivers/gpu/drm/drm_gpusvm.c
@@ -1516,10 +1516,18 @@ int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
 	if (err)
 		goto err_free;
 
+	if (!svm_pages->dma_addr) {
+		svm_pages->dma_addr =
+			kvzalloc_objs(*svm_pages->dma_addr, npages);
+		if (!svm_pages->dma_addr) {
+			err = -ENOMEM;
+			goto err_free;
+		}
+	}
+
 	*state = (struct dma_iova_state){};
 	svm_pages->state_offset = 0;
 
-map_pages:
 	/*
 	 * Perform all dma mappings under the notifier lock to not
 	 * access freed pages. A notifier will either block on
@@ -1540,18 +1548,6 @@ int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
 		goto retry;
 	}
 
-	if (!svm_pages->dma_addr) {
-		/* Unlock and restart mapping to allocate memory. */
-		drm_gpusvm_notifier_unlock(gpusvm);
-		svm_pages->dma_addr =
-			kvzalloc_objs(*svm_pages->dma_addr, npages);
-		if (!svm_pages->dma_addr) {
-			err = -ENOMEM;
-			goto err_free;
-		}
-		goto map_pages;
-	}
-
 	zdd = NULL;
 	pagemap = NULL;
 	num_dma_mapped = 0;
-- 
2.34.1


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

* [PATCH v2 2/4] drm/gpusvm: extract drm_gpusvm_dma_map_pages() helper
  2026-09-01  9:00 [PATCH v2 0/4] drm/gpusvm: share one HMM fault across per-device DMA mappings Honglei Huang
  2026-09-01  9:00 ` [PATCH v2 1/4] drm/gpusvm: move dma_addr allocation before the notifier lock Honglei Huang
@ 2026-09-01  9:00 ` Honglei Huang
  2026-09-01 19:43   ` Matthew Brost
  2026-09-01  9:00 ` [PATCH v2 3/4] drm/gpusvm: let drm_gpusvm_get_pages() map an array of pages Honglei Huang
                   ` (4 subsequent siblings)
  6 siblings, 1 reply; 15+ messages in thread
From: Honglei Huang @ 2026-09-01  9:00 UTC (permalink / raw)
  To: matthew.brost, sima, rodrigo.vivi, thomas.hellstrom,
	himal.prasad.ghimiray, dakr, intel-xe
  Cc: aliceryhl, Alexander.Deucher, Felix.Kuehling, Christian.Koenig,
	Ray.Huang, Junhua.Shen, amd-gfx, dri-devel, honghuan

Move the per-device DMA mapping loop of drm_gpusvm_get_pages() into a
helper drm_gpusvm_dma_map_pages(). The mapping logic is only moved, not
changed, so there is no functional change.

The helper maps the already-faulted pfns into one drm_gpusvm_pages
instance under the notifier lock and unwinds its own partial mapping on
error. The HMM fault and the notifier retry loop stay in get_pages()
common code rather than being pushed down to drivers, so no driver has
to reimplement the subtle fault and retry logic.

With the mapping isolated per instance, get_pages() can later fault once
and DMA map an array of drm_gpusvm_pages plus a count, one per owning
drm_device.

Suggested-by: Matthew Brost <matthew.brost@intel.com>
Signed-off-by: Honglei Huang <honghuan@amd.com>
---
 drivers/gpu/drm/drm_gpusvm.c | 225 ++++++++++++++++++++---------------
 1 file changed, 129 insertions(+), 96 deletions(-)

diff --git a/drivers/gpu/drm/drm_gpusvm.c b/drivers/gpu/drm/drm_gpusvm.c
index b507de539e6..89c3061d8ef 100644
--- a/drivers/gpu/drm/drm_gpusvm.c
+++ b/drivers/gpu/drm/drm_gpusvm.c
@@ -1442,115 +1442,41 @@ static bool drm_gpusvm_pages_valid_unlocked(struct drm_gpusvm *gpusvm,
 }
 
 /**
- * drm_gpusvm_get_pages() - Get pages and populate GPU SVM pages struct
+ * drm_gpusvm_dma_map_pages() - DMA map one drm_gpusvm_pages instance
  * @gpusvm: Pointer to the GPU SVM structure
- * @svm_pages: The SVM pages to populate. This will contain the dma-addresses
- * @mm: The mm corresponding to the CPU range
- * @notifier: The corresponding notifier for the given CPU range
- * @pages_start: Start CPU address for the pages
- * @pages_end: End CPU address for the pages (exclusive)
+ * @svm_pages: The SVM pages instance to populate with dma-addresses
+ * @pfns: The already-faulted pfn array (size @npages)
+ * @npages: Number of pages in the CPU range
  * @ctx: GPU SVM context
+ * @dma_dir: DMA data direction for the mappings
  *
- * This function gets and maps pages for CPU range and ensures they are
- * mapped for DMA access.
+ * Map the faulted @pfns into @svm_pages for DMA access through its owning
+ * drm_device. Must be called under the notifier lock. On failure this unwinds
+ * the partial mapping of this instance before returning.
  *
  * Return: 0 on success, negative error code on failure.
  */
-int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
-			 struct drm_gpusvm_pages *svm_pages,
-			 struct mm_struct *mm,
-			 struct mmu_interval_notifier *notifier,
-			 unsigned long pages_start, unsigned long pages_end,
-			 const struct drm_gpusvm_ctx *ctx)
+static int drm_gpusvm_dma_map_pages(struct drm_gpusvm *gpusvm,
+				    struct drm_gpusvm_pages *svm_pages,
+				    unsigned long *pfns,
+				    unsigned long npages,
+				    const struct drm_gpusvm_ctx *ctx,
+				    enum dma_data_direction dma_dir)
 {
-	struct hmm_range hmm_range = {
-		.default_flags = HMM_PFN_REQ_FAULT | (ctx->read_only ? 0 :
-			HMM_PFN_REQ_WRITE),
-		.notifier = notifier,
-		.start = pages_start,
-		.end = pages_end,
-		.dev_private_owner = ctx->device_private_page_owner,
-	};
-	void *zdd;
-	unsigned long timeout =
-		jiffies + msecs_to_jiffies(HMM_RANGE_DEFAULT_TIMEOUT);
-	unsigned long remaining;
+	void *zdd = NULL;
 	unsigned long i, j;
-	unsigned long npages = npages_in_range(pages_start, pages_end);
-	unsigned long num_dma_mapped;
+	unsigned long num_dma_mapped = 0;
 	unsigned int order = 0;
-	unsigned long *pfns;
 	int err = 0;
-	struct dev_pagemap *pagemap;
+	struct dev_pagemap *pagemap = NULL;
 	struct drm_pagemap *dpagemap;
 	struct drm_gpusvm_pages_flags flags;
-	enum dma_data_direction dma_dir = ctx->read_only ? DMA_TO_DEVICE :
-							   DMA_BIDIRECTIONAL;
 	struct dma_iova_state *state = &svm_pages->state;
 
-	if (!svm_pages->drm)
-		return -EINVAL;
-
-retry:
-	remaining = timeout - jiffies;
-
-	if (time_after_eq(jiffies, timeout))
-		return -EBUSY;
-
-	hmm_range.notifier_seq = mmu_interval_read_begin(notifier);
-	if (drm_gpusvm_pages_valid_unlocked(gpusvm, svm_pages))
-		goto set_seqno;
-
-	pfns = kvmalloc_array(npages, sizeof(*pfns), GFP_KERNEL);
-	if (!pfns)
-		return -ENOMEM;
-
-	if (!mmget_not_zero(mm)) {
-		err = -EFAULT;
-		goto err_free;
-	}
-
-	hmm_range.hmm_pfns = pfns;
-	err = hmm_range_fault_unlocked_timeout(&hmm_range, remaining);
-	mmput(mm);
-	if (err)
-		goto err_free;
-
-	if (!svm_pages->dma_addr) {
-		svm_pages->dma_addr =
-			kvzalloc_objs(*svm_pages->dma_addr, npages);
-		if (!svm_pages->dma_addr) {
-			err = -ENOMEM;
-			goto err_free;
-		}
-	}
-
-	*state = (struct dma_iova_state){};
-	svm_pages->state_offset = 0;
-
-	/*
-	 * Perform all dma mappings under the notifier lock to not
-	 * access freed pages. A notifier will either block on
-	 * the notifier lock or unmap dma.
-	 */
-	drm_gpusvm_notifier_lock(gpusvm);
+	lockdep_assert_held(&gpusvm->notifier_lock);
 
 	flags.__flags = svm_pages->flags.__flags;
-	if (flags.unmapped) {
-		drm_gpusvm_notifier_unlock(gpusvm);
-		err = -EFAULT;
-		goto err_free;
-	}
-
-	if (mmu_interval_read_retry(notifier, hmm_range.notifier_seq)) {
-		drm_gpusvm_notifier_unlock(gpusvm);
-		kvfree(pfns);
-		goto retry;
-	}
 
-	zdd = NULL;
-	pagemap = NULL;
-	num_dma_mapped = 0;
 	for (i = 0, j = 0; i < npages; ++j) {
 		struct page *page = hmm_pfn_to_page(pfns[i]);
 
@@ -1666,17 +1592,124 @@ int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
 	/* WRITE_ONCE pairs with READ_ONCE for opportunistic checks */
 	WRITE_ONCE(svm_pages->flags.__flags, flags.__flags);
 
+	return 0;
+
+err_unmap:
+	svm_pages->flags.has_dma_mapping = true;
+	__drm_gpusvm_unmap_pages(gpusvm, svm_pages, num_dma_mapped);
+	return err;
+}
+
+/**
+ * drm_gpusvm_get_pages() - Get pages and populate GPU SVM pages struct
+ * @gpusvm: Pointer to the GPU SVM structure
+ * @svm_pages: The SVM pages to populate. This will contain the dma-addresses
+ * @mm: The mm corresponding to the CPU range
+ * @notifier: The corresponding notifier for the given CPU range
+ * @pages_start: Start CPU address for the pages
+ * @pages_end: End CPU address for the pages (exclusive)
+ * @ctx: GPU SVM context
+ *
+ * This function gets and maps pages for CPU range and ensures they are
+ * mapped for DMA access.
+ *
+ * Return: 0 on success, negative error code on failure.
+ */
+int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
+			 struct drm_gpusvm_pages *svm_pages,
+			 struct mm_struct *mm,
+			 struct mmu_interval_notifier *notifier,
+			 unsigned long pages_start, unsigned long pages_end,
+			 const struct drm_gpusvm_ctx *ctx)
+{
+	struct hmm_range hmm_range = {
+		.default_flags = HMM_PFN_REQ_FAULT | (ctx->read_only ? 0 :
+			HMM_PFN_REQ_WRITE),
+		.notifier = notifier,
+		.start = pages_start,
+		.end = pages_end,
+		.dev_private_owner = ctx->device_private_page_owner,
+	};
+	unsigned long timeout =
+		jiffies + msecs_to_jiffies(HMM_RANGE_DEFAULT_TIMEOUT);
+	unsigned long remaining;
+	unsigned long npages = npages_in_range(pages_start, pages_end);
+	unsigned long *pfns;
+	int err = 0;
+	enum dma_data_direction dma_dir = ctx->read_only ? DMA_TO_DEVICE :
+							   DMA_BIDIRECTIONAL;
+
+	if (!svm_pages->drm)
+		return -EINVAL;
+
+retry:
+	remaining = timeout - jiffies;
+
+	if (time_after_eq(jiffies, timeout))
+		return -EBUSY;
+
+	hmm_range.notifier_seq = mmu_interval_read_begin(notifier);
+	if (drm_gpusvm_pages_valid_unlocked(gpusvm, svm_pages))
+		goto set_seqno;
+
+	pfns = kvmalloc_array(npages, sizeof(*pfns), GFP_KERNEL);
+	if (!pfns)
+		return -ENOMEM;
+
+	if (!mmget_not_zero(mm)) {
+		err = -EFAULT;
+		goto err_free;
+	}
+
+	hmm_range.hmm_pfns = pfns;
+	err = hmm_range_fault_unlocked_timeout(&hmm_range, remaining);
+	mmput(mm);
+	if (err)
+		goto err_free;
+
+	if (!svm_pages->dma_addr) {
+		svm_pages->dma_addr =
+			kvzalloc_objs(*svm_pages->dma_addr, npages);
+		if (!svm_pages->dma_addr) {
+			err = -ENOMEM;
+			goto err_free;
+		}
+	}
+
+	svm_pages->state = (struct dma_iova_state){};
+	svm_pages->state_offset = 0;
+
+	/*
+	 * Perform all dma mappings under the notifier lock to not
+	 * access freed pages. A notifier will either block on
+	 * the notifier lock or unmap dma.
+	 */
+	drm_gpusvm_notifier_lock(gpusvm);
+
+	if (svm_pages->flags.unmapped) {
+		drm_gpusvm_notifier_unlock(gpusvm);
+		err = -EFAULT;
+		goto err_free;
+	}
+
+	if (mmu_interval_read_retry(notifier, hmm_range.notifier_seq)) {
+		drm_gpusvm_notifier_unlock(gpusvm);
+		kvfree(pfns);
+		goto retry;
+	}
+
+	err = drm_gpusvm_dma_map_pages(gpusvm, svm_pages, pfns, npages, ctx,
+				       dma_dir);
 	drm_gpusvm_notifier_unlock(gpusvm);
+	if (err)
+		goto err_free;
+
 	kvfree(pfns);
 set_seqno:
 	svm_pages->notifier_seq = hmm_range.notifier_seq;
 
 	return 0;
 
-err_unmap:
-	svm_pages->flags.has_dma_mapping = true;
-	__drm_gpusvm_unmap_pages(gpusvm, svm_pages, num_dma_mapped);
-	drm_gpusvm_notifier_unlock(gpusvm);
 err_free:
 	kvfree(pfns);
 	if (err == -EAGAIN)
-- 
2.34.1


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

* [PATCH v2 3/4] drm/gpusvm: let drm_gpusvm_get_pages() map an array of pages
  2026-09-01  9:00 [PATCH v2 0/4] drm/gpusvm: share one HMM fault across per-device DMA mappings Honglei Huang
  2026-09-01  9:00 ` [PATCH v2 1/4] drm/gpusvm: move dma_addr allocation before the notifier lock Honglei Huang
  2026-09-01  9:00 ` [PATCH v2 2/4] drm/gpusvm: extract drm_gpusvm_dma_map_pages() helper Honglei Huang
@ 2026-09-01  9:00 ` Honglei Huang
  2026-09-01 19:57   ` Matthew Brost
  2026-09-01  9:01 ` [PATCH v2 4/4] drm/gpusvm: make the DMA mapping step in get_pages() optional Honglei Huang
                   ` (3 subsequent siblings)
  6 siblings, 1 reply; 15+ messages in thread
From: Honglei Huang @ 2026-09-01  9:00 UTC (permalink / raw)
  To: matthew.brost, sima, rodrigo.vivi, thomas.hellstrom,
	himal.prasad.ghimiray, dakr, intel-xe
  Cc: aliceryhl, Alexander.Deucher, Felix.Kuehling, Christian.Koenig,
	Ray.Huang, Junhua.Shen, amd-gfx, dri-devel, honghuan

With the N:1 drm_gpusvm_pages layout, one CPU range mirrored on several
drm_devices, the caller had to invoke get_pages() once per device and
repeat the HMM fault every time.

Make get_pages() take a contiguous array of drm_gpusvm_pages plus a
count: fault once, then DMA map each instance by
drm_gpusvm_dma_map_pages() under a single read_retry gate. xe range and
userptr callers are updated.

Document the N:1 array usage in the Overview, showing how get_pages()
and drm_gpusvm_range_set_unmapped() take the whole array and its count
while the unmap and free paths stay per-instance.

Suggested-by: Matthew Brost <matthew.brost@intel.com>
Signed-off-by: Honglei Huang <honghuan@amd.com>
---
 drivers/gpu/drm/drm_gpusvm.c    | 141 ++++++++++++++++++++++++--------
 drivers/gpu/drm/xe/xe_svm.c     |   2 +-
 drivers/gpu/drm/xe/xe_userptr.c |   2 +-
 include/drm/drm_gpusvm.h        |   1 +
 4 files changed, 108 insertions(+), 38 deletions(-)

diff --git a/drivers/gpu/drm/drm_gpusvm.c b/drivers/gpu/drm/drm_gpusvm.c
index 89c3061d8ef..810f801a9f7 100644
--- a/drivers/gpu/drm/drm_gpusvm.c
+++ b/drivers/gpu/drm/drm_gpusvm.c
@@ -80,6 +80,13 @@
  *			};
  *		};
  *
+ *		static struct drm_gpusvm_pages *
+ *		driver_pages(struct driver_range *drange)
+ *		{
+ *			return drange->num_pages == 1 ? &drange->inline_pages :
+ *							drange->pages;
+ *		}
+ *
  *	In the N:1 case the driver allocates the pages array with a zeroing
  *	allocator (e.g. kcalloc(num_pages, ...)), initialises each entry with
  *	drm_gpusvm_init_pages(), and frees each entry with
@@ -89,6 +96,28 @@
  *	Each drm_gpusvm_pages must be zero-initialised and initialised with
  *	drm_gpusvm_init_pages(), called once per entry.
  *
+ *	The 1:1 examples below pass @num_pages == 1 and &drange->pages. In the
+ *	N:1 case the driver instead passes the whole array and its count, so a
+ *	single call faults the CPU range once and DMA maps it for every owning
+ *	drm_device, e.g.:
+ *
+ *	.. code-block:: c
+ *
+ *		// GPU fault handler: one fault, one DMA mapping per device
+ *		err = drm_gpusvm_get_pages(gpusvm, driver_pages(drange),
+ *					   drange->num_pages, gpusvm->mm,
+ *					   &range->notifier->notifier,
+ *					   drm_gpusvm_range_start(range),
+ *					   drm_gpusvm_range_end(range), &ctx);
+ *
+ *		// Notifier callback: mark every instance unmapped in one call
+ *		drm_gpusvm_range_set_unmapped(range, driver_pages(drange),
+ *					      drange->num_pages, mmu_range);
+ *
+ *	The unmap and free paths stay per-instance: iterate @num_pages over
+ *	driver_pages(drange) and call drm_gpusvm_unmap_pages() /
+ *	drm_gpusvm_free_pages() for each entry.
+ *
  * - Operations:
  *	Define the interface for driver-specific GPU SVM operations such as
  *	range allocation, notifier allocation, and invalidations.
@@ -232,7 +261,7 @@
  *				goto retry;
  *		}
  *
- *		err = drm_gpusvm_get_pages(gpusvm, &drange->pages,
+ *		err = drm_gpusvm_get_pages(gpusvm, &drange->pages, 1,
  *					   gpusvm->mm, &range->notifier->notifier,
  *					   drm_gpusvm_range_start(range),
  *					   drm_gpusvm_range_end(range), &ctx);
@@ -1417,25 +1446,34 @@ EXPORT_SYMBOL_GPL(drm_gpusvm_pages_valid);
 /**
  * drm_gpusvm_pages_valid_unlocked() - GPU SVM pages valid unlocked
  * @gpusvm: Pointer to the GPU SVM structure
- * @svm_pages: Pointer to the GPU SVM pages structure
+ * @svm_pages: Array of GPU SVM pages structures
+ * @num_pages: Number of drm_gpusvm_pages instances in @svm_pages
  *
- * This function determines if a GPU SVM pages are valid. Expected be called
+ * This function determines if every GPU SVM pages instance is valid, dropping
+ * the stale dma_addr array of any instance which is not. Expected be called
  * without holding gpusvm->notifier_lock.
  *
- * Return: True if GPU SVM pages are valid, False otherwise
+ * Return: True if all GPU SVM pages are valid, False otherwise
  */
 static bool drm_gpusvm_pages_valid_unlocked(struct drm_gpusvm *gpusvm,
-					    struct drm_gpusvm_pages *svm_pages)
+					    struct drm_gpusvm_pages *svm_pages,
+					    unsigned int num_pages)
 {
-	bool pages_valid;
+	bool pages_valid = true;
+	unsigned int p;
 
-	if (!svm_pages->dma_addr)
-		return false;
+	for (p = 0; p < num_pages; ++p) {
+		if (!svm_pages[p].dma_addr)
+			return false;
+	}
 
 	drm_gpusvm_notifier_lock(gpusvm);
-	pages_valid = drm_gpusvm_pages_valid(gpusvm, svm_pages);
-	if (!pages_valid)
-		__drm_gpusvm_free_pages(gpusvm, svm_pages);
+	for (p = 0; p < num_pages; ++p) {
+		if (drm_gpusvm_pages_valid(gpusvm, &svm_pages[p]))
+			continue;
+		__drm_gpusvm_free_pages(gpusvm, &svm_pages[p]);
+		pages_valid = false;
+	}
 	drm_gpusvm_notifier_unlock(gpusvm);
 
 	return pages_valid;
@@ -1451,8 +1489,9 @@ static bool drm_gpusvm_pages_valid_unlocked(struct drm_gpusvm *gpusvm,
  * @dma_dir: DMA data direction for the mappings
  *
  * Map the faulted @pfns into @svm_pages for DMA access through its owning
- * drm_device. Must be called under the notifier lock. On failure this unwinds
- * the partial mapping of this instance before returning.
+ * drm_device. Must be called under the notifier lock and only for an instance
+ * without a live mapping. On failure this unwinds the partial mapping of this
+ * instance before returning.
  *
  * Return: 0 on success, negative error code on failure.
  */
@@ -1475,6 +1514,9 @@ static int drm_gpusvm_dma_map_pages(struct drm_gpusvm *gpusvm,
 
 	lockdep_assert_held(&gpusvm->notifier_lock);
 
+	*state = (struct dma_iova_state){};
+	svm_pages->state_offset = 0;
+
 	flags.__flags = svm_pages->flags.__flags;
 
 	for (i = 0, j = 0; i < npages; ++j) {
@@ -1603,20 +1645,29 @@ static int drm_gpusvm_dma_map_pages(struct drm_gpusvm *gpusvm,
 /**
  * drm_gpusvm_get_pages() - Get pages and populate GPU SVM pages struct
  * @gpusvm: Pointer to the GPU SVM structure
- * @svm_pages: The SVM pages to populate. This will contain the dma-addresses
+ * @svm_pages: Array of SVM pages instances to populate with dma addresses
+ * @num_pages: Number of drm_gpusvm_pages instances in @svm_pages
  * @mm: The mm corresponding to the CPU range
  * @notifier: The corresponding notifier for the given CPU range
  * @pages_start: Start CPU address for the pages
  * @pages_end: End CPU address for the pages (exclusive)
  * @ctx: GPU SVM context
  *
- * This function gets and maps pages for CPU range and ensures they are
- * mapped for DMA access.
+ * This function gets and maps pages for a CPU range and ensures they are
+ * mapped for DMA access. The HMM fault for the CPU range is performed once,
+ * the DMA mapping by drm_gpusvm_dma_map_pages() is then done per instance,
+ * one per owning drm_device. The retry against notifier races is kept here
+ * in common code so drivers never open code it.
+ * The common 1:1 case passes @num_pages == 1.
+ *
+ * On error the instances mapped before the failing one stay mapped, so the
+ * caller must unmap and free every instance regardless of the return value.
  *
  * Return: 0 on success, negative error code on failure.
  */
 int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
 			 struct drm_gpusvm_pages *svm_pages,
+			 unsigned int num_pages,
 			 struct mm_struct *mm,
 			 struct mmu_interval_notifier *notifier,
 			 unsigned long pages_start, unsigned long pages_end,
@@ -1638,9 +1689,11 @@ int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
 	int err = 0;
 	enum dma_data_direction dma_dir = ctx->read_only ? DMA_TO_DEVICE :
 							   DMA_BIDIRECTIONAL;
+	unsigned int p;
 
-	if (!svm_pages->drm)
-		return -EINVAL;
+	for (p = 0; p < num_pages; ++p)
+		if (!svm_pages[p].drm)
+			return -EINVAL;
 
 retry:
 	remaining = timeout - jiffies;
@@ -1649,7 +1702,8 @@ int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
 		return -EBUSY;
 
 	hmm_range.notifier_seq = mmu_interval_read_begin(notifier);
-	if (drm_gpusvm_pages_valid_unlocked(gpusvm, svm_pages))
+
+	if (drm_gpusvm_pages_valid_unlocked(gpusvm, svm_pages, num_pages))
 		goto set_seqno;
 
 	pfns = kvmalloc_array(npages, sizeof(*pfns), GFP_KERNEL);
@@ -1667,18 +1721,17 @@ int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
 	if (err)
 		goto err_free;
 
-	if (!svm_pages->dma_addr) {
-		svm_pages->dma_addr =
-			kvzalloc_objs(*svm_pages->dma_addr, npages);
-		if (!svm_pages->dma_addr) {
+	for (p = 0; p < num_pages; ++p) {
+		if (svm_pages[p].dma_addr)
+			continue;
+		svm_pages[p].dma_addr =
+			kvzalloc_objs(*svm_pages[p].dma_addr, npages);
+		if (!svm_pages[p].dma_addr) {
 			err = -ENOMEM;
 			goto err_free;
 		}
 	}
 
-	svm_pages->state = (struct dma_iova_state){};
-	svm_pages->state_offset = 0;
-
 	/*
 	 * Perform all dma mappings under the notifier lock to not
 	 * access freed pages. A notifier will either block on
@@ -1686,10 +1739,12 @@ int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
 	 */
 	drm_gpusvm_notifier_lock(gpusvm);
 
-	if (svm_pages->flags.unmapped) {
-		drm_gpusvm_notifier_unlock(gpusvm);
-		err = -EFAULT;
-		goto err_free;
+	for (p = 0; p < num_pages; ++p) {
+		if (svm_pages[p].flags.unmapped) {
+			drm_gpusvm_notifier_unlock(gpusvm);
+			err = -EFAULT;
+			goto err_free;
+		}
 	}
 
 	if (mmu_interval_read_retry(notifier, hmm_range.notifier_seq)) {
@@ -1698,15 +1753,29 @@ int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
 		goto retry;
 	}
 
-	err = drm_gpusvm_dma_map_pages(gpusvm, svm_pages, pfns, npages, ctx,
-				       dma_dir);
-	drm_gpusvm_notifier_unlock(gpusvm);
-	if (err)
-		goto err_free;
+	for (p = 0; p < num_pages; ++p) {
+		if (drm_gpusvm_pages_valid(gpusvm, &svm_pages[p]))
+			continue;
 
+		err = drm_gpusvm_dma_map_pages(gpusvm, &svm_pages[p], pfns,
+					       npages, ctx, dma_dir);
+		if (err) {
+			/*
+			 * The failing instance was unwound by the helper. Keep
+			 * the ones mapped earlier: the -EAGAIN retry reuses
+			 * them, and the driver unmaps every instance with the
+			 * range on the other error paths.
+			 */
+			drm_gpusvm_notifier_unlock(gpusvm);
+			goto err_free;
+		}
+	}
+
+	drm_gpusvm_notifier_unlock(gpusvm);
 	kvfree(pfns);
 set_seqno:
-	svm_pages->notifier_seq = hmm_range.notifier_seq;
+	for (p = 0; p < num_pages; ++p)
+		svm_pages[p].notifier_seq = hmm_range.notifier_seq;
 
 	return 0;
 
diff --git a/drivers/gpu/drm/xe/xe_svm.c b/drivers/gpu/drm/xe/xe_svm.c
index 627a741293d..1c7793d8caa 100644
--- a/drivers/gpu/drm/xe/xe_svm.c
+++ b/drivers/gpu/drm/xe/xe_svm.c
@@ -1598,7 +1598,7 @@ int xe_svm_range_get_pages(struct xe_vm *vm, struct xe_svm_range *range,
 
 	lockdep_assert_held(&range->lock);
 
-	err = drm_gpusvm_get_pages(&vm->svm.gpusvm, &range->pages,
+	err = drm_gpusvm_get_pages(&vm->svm.gpusvm, &range->pages, 1,
 				   vm->svm.gpusvm.mm,
 				   &range->base.notifier->notifier,
 				   drm_gpusvm_range_start(&range->base),
diff --git a/drivers/gpu/drm/xe/xe_userptr.c b/drivers/gpu/drm/xe/xe_userptr.c
index 90ac141fc12..9c1dac0fce6 100644
--- a/drivers/gpu/drm/xe/xe_userptr.c
+++ b/drivers/gpu/drm/xe/xe_userptr.c
@@ -91,7 +91,7 @@ int xe_vma_userptr_pin_pages(struct xe_userptr_vma *uvma)
 	if (vma->gpuva.flags & XE_VMA_DESTROYED)
 		return 0;
 
-	return drm_gpusvm_get_pages(&vm->svm.gpusvm, &uvma->userptr.pages,
+	return drm_gpusvm_get_pages(&vm->svm.gpusvm, &uvma->userptr.pages, 1,
 				    uvma->userptr.notifier.mm,
 				    &uvma->userptr.notifier,
 				    xe_vma_userptr(vma),
diff --git a/include/drm/drm_gpusvm.h b/include/drm/drm_gpusvm.h
index b7d987bf76a..d2b6f3d2b84 100644
--- a/include/drm/drm_gpusvm.h
+++ b/include/drm/drm_gpusvm.h
@@ -324,6 +324,7 @@ void drm_gpusvm_range_set_unmapped(struct drm_gpusvm_range *range,
 
 int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
 			 struct drm_gpusvm_pages *svm_pages,
+			 unsigned int num_pages,
 			 struct mm_struct *mm,
 			 struct mmu_interval_notifier *notifier,
 			 unsigned long pages_start, unsigned long pages_end,
-- 
2.34.1


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

* [PATCH v2 4/4] drm/gpusvm: make the DMA mapping step in get_pages() optional
  2026-09-01  9:00 [PATCH v2 0/4] drm/gpusvm: share one HMM fault across per-device DMA mappings Honglei Huang
                   ` (2 preceding siblings ...)
  2026-09-01  9:00 ` [PATCH v2 3/4] drm/gpusvm: let drm_gpusvm_get_pages() map an array of pages Honglei Huang
@ 2026-09-01  9:01 ` Honglei Huang
  2026-09-01 20:02   ` Matthew Brost
  2026-09-01  9:09 ` ✓ CI.KUnit: success for drm/gpusvm: share one HMM fault across per-device DMA mappings (rev2) Patchwork
                   ` (2 subsequent siblings)
  6 siblings, 1 reply; 15+ messages in thread
From: Honglei Huang @ 2026-09-01  9:01 UTC (permalink / raw)
  To: matthew.brost, sima, rodrigo.vivi, thomas.hellstrom,
	himal.prasad.ghimiray, dakr, intel-xe
  Cc: aliceryhl, Alexander.Deucher, Felix.Kuehling, Christian.Koenig,
	Ray.Huang, Junhua.Shen, amd-gfx, dri-devel, honghuan

Some drivers (e.g. AMDXDNA) only need the CPU pages faulted in and tracked
by the notifier, no need DMA mapping.

Add a drm_gpusvm_ctx::no_dma_map flag. When set, get_pages() does the
shared HMM fault and records notifier_seq, but skips svm_pages->drm
validation, the dma_addr allocation and drm_gpusvm_dma_map_pages().
With no mapping state to check, the fault is redone on every call. The
default (no_dma_map == 0) is unchanged.

Suggested-by: Matthew Brost <matthew.brost@intel.com>
Signed-off-by: Honglei Huang <honghuan@amd.com>
---
 drivers/gpu/drm/drm_gpusvm.c | 44 ++++++++++++++++++++++++++----------
 include/drm/drm_gpusvm.h     |  9 ++++++++
 2 files changed, 41 insertions(+), 12 deletions(-)

diff --git a/drivers/gpu/drm/drm_gpusvm.c b/drivers/gpu/drm/drm_gpusvm.c
index 810f801a9f7..0156ee82d7c 100644
--- a/drivers/gpu/drm/drm_gpusvm.c
+++ b/drivers/gpu/drm/drm_gpusvm.c
@@ -1663,6 +1663,12 @@ static int drm_gpusvm_dma_map_pages(struct drm_gpusvm *gpusvm,
  * On error the instances mapped before the failing one stay mapped, so the
  * caller must unmap and free every instance regardless of the return value.
  *
+ * With &drm_gpusvm_ctx.no_dma_map no mapping state is recorded, so
+ * drm_gpusvm_pages_valid() never returns true and success is only a snapshot:
+ * the caller must recheck mmu_interval_read_retry() against the recorded
+ * &drm_gpusvm_pages.notifier_seq under the notifier lock, and hold it until
+ * its work is visible to invalidation.
+ *
  * Return: 0 on success, negative error code on failure.
  */
 int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
@@ -1689,11 +1695,18 @@ int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
 	int err = 0;
 	enum dma_data_direction dma_dir = ctx->read_only ? DMA_TO_DEVICE :
 							   DMA_BIDIRECTIONAL;
+	const bool map_dma = !ctx->no_dma_map;
 	unsigned int p;
 
-	for (p = 0; p < num_pages; ++p)
-		if (!svm_pages[p].drm)
-			return -EINVAL;
+	if (ctx->no_dma_map && ctx->devmem_only)
+		return -EINVAL;
+
+	if (map_dma) {
+		for (p = 0; p < num_pages; ++p) {
+			if (!svm_pages[p].drm)
+				return -EINVAL;
+		}
+	}
 
 retry:
 	remaining = timeout - jiffies;
@@ -1703,7 +1716,8 @@ int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
 
 	hmm_range.notifier_seq = mmu_interval_read_begin(notifier);
 
-	if (drm_gpusvm_pages_valid_unlocked(gpusvm, svm_pages, num_pages))
+	if (map_dma &&
+	    drm_gpusvm_pages_valid_unlocked(gpusvm, svm_pages, num_pages))
 		goto set_seqno;
 
 	pfns = kvmalloc_array(npages, sizeof(*pfns), GFP_KERNEL);
@@ -1721,14 +1735,16 @@ int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
 	if (err)
 		goto err_free;
 
-	for (p = 0; p < num_pages; ++p) {
-		if (svm_pages[p].dma_addr)
-			continue;
-		svm_pages[p].dma_addr =
-			kvzalloc_objs(*svm_pages[p].dma_addr, npages);
-		if (!svm_pages[p].dma_addr) {
-			err = -ENOMEM;
-			goto err_free;
+	if (map_dma) {
+		for (p = 0; p < num_pages; ++p) {
+			if (svm_pages[p].dma_addr)
+				continue;
+			svm_pages[p].dma_addr =
+				kvzalloc_objs(*svm_pages[p].dma_addr, npages);
+			if (!svm_pages[p].dma_addr) {
+				err = -ENOMEM;
+				goto err_free;
+			}
 		}
 	}
 
@@ -1753,6 +1769,9 @@ int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
 		goto retry;
 	}
 
+	if (!map_dma)
+		goto done_mapping;
+
 	for (p = 0; p < num_pages; ++p) {
 		if (drm_gpusvm_pages_valid(gpusvm, &svm_pages[p]))
 			continue;
@@ -1771,6 +1790,7 @@ int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
 		}
 	}
 
+done_mapping:
 	drm_gpusvm_notifier_unlock(gpusvm);
 	kvfree(pfns);
 set_seqno:
diff --git a/include/drm/drm_gpusvm.h b/include/drm/drm_gpusvm.h
index d2b6f3d2b84..ec7b81957b1 100644
--- a/include/drm/drm_gpusvm.h
+++ b/include/drm/drm_gpusvm.h
@@ -254,6 +254,14 @@ struct drm_gpusvm {
  * @allow_mixed: Allow mixed mappings in get pages. Mixing between system and
  *               single dpagemap is supported, mixing between multiple dpagemap
  *               is unsupported.
+ * @no_dma_map: Only fault the CPU pages for the range; skip the device DMA
+ *              mapping step. Used by drivers that consume the faulted pages
+ *              without needing a DMA mapping. In this mode @drm on the
+ *              drm_gpusvm_pages is not required, no mapping state is recorded
+ *              and drm_gpusvm_pages_valid() therefore never reports these
+ *              pages as valid; the caller revalidates the snapshot itself, see
+ *              drm_gpusvm_get_pages(). @devmem_only is rejected and no page
+ *              type check is performed, so @allow_mixed has no effect.
  *
  * Context that is DRM GPUSVM is operating in (i.e. user arguments).
  */
@@ -266,6 +274,7 @@ struct drm_gpusvm_ctx {
 	unsigned int devmem_possible :1;
 	unsigned int devmem_only :1;
 	unsigned int allow_mixed :1;
+	unsigned int no_dma_map :1;
 };
 
 int drm_gpusvm_init(struct drm_gpusvm *gpusvm,
-- 
2.34.1


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

* ✓ CI.KUnit: success for drm/gpusvm: share one HMM fault across per-device DMA mappings (rev2)
  2026-09-01  9:00 [PATCH v2 0/4] drm/gpusvm: share one HMM fault across per-device DMA mappings Honglei Huang
                   ` (3 preceding siblings ...)
  2026-09-01  9:01 ` [PATCH v2 4/4] drm/gpusvm: make the DMA mapping step in get_pages() optional Honglei Huang
@ 2026-09-01  9:09 ` Patchwork
  2026-09-01 10:04 ` ✓ Xe.CI.BAT: " Patchwork
  2026-09-01 10:52 ` ✓ Xe.CI.FULL: " Patchwork
  6 siblings, 0 replies; 15+ messages in thread
From: Patchwork @ 2026-09-01  9:09 UTC (permalink / raw)
  To: Honglei Huang; +Cc: intel-xe

== Series Details ==

Series: drm/gpusvm: share one HMM fault across per-device DMA mappings (rev2)
URL   : https://patchwork.freedesktop.org/series/172838/
State : success

== Summary ==

+ trap cleanup EXIT
+ kunitconfigs=('/kernel/drivers/gpu/tests/.kunitconfig' '/kernel/drivers/gpu/drm/xe/.kunitconfig' '/kernel/drivers/gpu/drm/tests/.kunitconfig' '/kernel/drivers/gpu/drm/ttm/tests/.kunitconfig' '/kernel/drivers/dma-buf/.kunitconfig')
+ for kcfg in "${kunitconfigs[@]}"
+ [[ ! -f /kernel/drivers/gpu/tests/.kunitconfig ]]
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/tests/.kunitconfig
[09:07:33] Configuring KUnit Kernel ...
Generating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[09:07:37] 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
[09:07:58] Starting KUnit Kernel (1/1)...
[09:07:58] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[09:07:58] ============= refcount_interrupt (4 subtests) ==============
[09:07:58] [PASSED] test_single_irq_change
[09:07:58] [PASSED] test_nested_irq_change
[09:07:58] [PASSED] test_multiple_irq_change
[09:07:58] [PASSED] test_irq_save
[09:07:58] =============== [PASSED] refcount_interrupt ================
[09:07:58] ================= gpu_buddy (14 subtests) ==================
[09:07:58] [PASSED] gpu_test_buddy_alloc_limit
[09:07:58] [PASSED] gpu_test_buddy_alloc_optimistic
[09:07:58] [PASSED] gpu_test_buddy_alloc_pessimistic
[09:07:58] [PASSED] gpu_test_buddy_alloc_pathological
[09:07:58] [PASSED] gpu_test_buddy_alloc_contiguous
[09:07:58] [PASSED] gpu_test_buddy_alloc_clear
[09:07:58] [PASSED] gpu_test_buddy_alloc_range
[09:07:58] [PASSED] gpu_test_buddy_alloc_range_bias
[09:07:59] [PASSED] gpu_test_buddy_fragmentation_performance
[09:08:00] [PASSED] gpu_test_buddy_dirty_tracker_performance
[09:08:00] [PASSED] gpu_test_buddy_alloc_exceeds_max_order
[09:08:00] [PASSED] gpu_test_buddy_offset_aligned_allocation
[09:08:00] [PASSED] gpu_test_buddy_subtree_offset_alignment_stress
[09:08:00] [PASSED] gpu_test_buddy_addr_to_block
[09:08:00] ==================== [PASSED] gpu_buddy ====================
[09:08:00] ============================================================
[09:08:00] Testing complete. Ran 18 tests: passed: 18
[09:08:00] Elapsed time: 26.775s total, 4.437s configuring, 20.371s building, 1.893s running

+ for kcfg in "${kunitconfigs[@]}"
+ [[ ! -f /kernel/drivers/gpu/drm/xe/.kunitconfig ]]
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig
[09:08:00] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[09:08:02] 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
[09:08:35] Starting KUnit Kernel (1/1)...
[09:08:35] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[09:08:36] ============= refcount_interrupt (4 subtests) ==============
[09:08:36] [PASSED] test_single_irq_change
[09:08:36] [PASSED] test_nested_irq_change
[09:08:36] [PASSED] test_multiple_irq_change
[09:08:36] [PASSED] test_irq_save
[09:08:36] =============== [PASSED] refcount_interrupt ================
[09:08:36] ================== guc_buf (11 subtests) ===================
[09:08:36] [PASSED] test_smallest
[09:08:36] [PASSED] test_largest
[09:08:36] [PASSED] test_granular
[09:08:36] [PASSED] test_unique
[09:08:36] [PASSED] test_overlap
[09:08:36] [PASSED] test_reusable
[09:08:36] [PASSED] test_too_big
[09:08:36] [PASSED] test_flush
[09:08:36] [PASSED] test_lookup
[09:08:36] [PASSED] test_data
[09:08:36] [PASSED] test_class
[09:08:36] ===================== [PASSED] guc_buf =====================
[09:08:36] =================== guc_dbm (7 subtests) ===================
[09:08:36] [PASSED] test_empty
[09:08:36] [PASSED] test_default
[09:08:36] ======================== test_size  ========================
[09:08:36] [PASSED] 4
[09:08:36] [PASSED] 8
[09:08:36] [PASSED] 32
[09:08:36] [PASSED] 256
[09:08:36] ==================== [PASSED] test_size ====================
[09:08:36] ======================= test_reuse  ========================
[09:08:36] [PASSED] 4
[09:08:36] [PASSED] 8
[09:08:36] [PASSED] 32
[09:08:36] [PASSED] 256
[09:08:36] =================== [PASSED] test_reuse ====================
[09:08:36] =================== test_range_overlap  ====================
[09:08:36] [PASSED] 4
[09:08:36] [PASSED] 8
[09:08:36] [PASSED] 32
[09:08:36] [PASSED] 256
[09:08:36] =============== [PASSED] test_range_overlap ================
[09:08:36] =================== test_range_compact  ====================
[09:08:36] [PASSED] 4
[09:08:36] [PASSED] 8
[09:08:36] [PASSED] 32
[09:08:36] [PASSED] 256
[09:08:36] =============== [PASSED] test_range_compact ================
[09:08:36] ==================== test_range_spare  =====================
[09:08:36] [PASSED] 4
[09:08:36] [PASSED] 8
[09:08:36] [PASSED] 32
[09:08:36] [PASSED] 256
[09:08:36] ================ [PASSED] test_range_spare =================
[09:08:36] ===================== [PASSED] guc_dbm =====================
[09:08:36] =================== guc_idm (6 subtests) ===================
[09:08:36] [PASSED] bad_init
[09:08:36] [PASSED] no_init
[09:08:36] [PASSED] init_fini
[09:08:36] [PASSED] check_used
[09:08:36] [PASSED] check_quota
[09:08:36] [PASSED] check_all
[09:08:36] ===================== [PASSED] guc_idm =====================
[09:08:36] =============== guc_klv_helpers (9 subtests) ===============
[09:08:36] [PASSED] test_count
[09:08:36] [PASSED] test_encode_u32
[09:08:36] [PASSED] test_encode_u64
[09:08:36] [PASSED] test_encode_string
[09:08:36] [PASSED] test_encode_object_raw
[09:08:36] [PASSED] test_encode_object_klv
[09:08:36] [PASSED] test_encode_object_nested
[09:08:36] [PASSED] test_encode_object_basic
[09:08:36] [PASSED] test_print
[09:08:36] ================= [PASSED] guc_klv_helpers =================
[09:08:36] =================== xe_log (4 subtests) ====================
[09:08:36] [PASSED] demo_cper
[09:08:36] [PASSED] demo_dmesg
[09:08:36] ======================= test_dmesg  ========================
[09:08:36] [PASSED] test_fatal
[09:08:36] [PASSED] test_fatal_tile
[09:08:36] [PASSED] test_fatal_gt
[09:08:36] [PASSED] test_fatal_comp
[09:08:36] [PASSED] test_fatal_comp_tile
[09:08:36] [PASSED] test_fatal_comp_gt
[09:08:36] [PASSED] test_fatal_all
[09:08:36] [PASSED] test_recoverable
[09:08:36] [PASSED] test_recoverable_tile
[09:08:36] [PASSED] test_recoverable_gt
[09:08:36] [PASSED] test_recoverable_comp
[09:08:36] [PASSED] test_recoverable_comp_tile
[09:08:36] [PASSED] test_recoverable_comp_gt
[09:08:36] [PASSED] test_recoverable_all
[09:08:36] [PASSED] test_info
[09:08:36] [PASSED] test_info_tile
[09:08:36] [PASSED] test_info_gt
[09:08:36] [PASSED] test_info_err
[09:08:36] [PASSED] test_info_comp
[09:08:36] [PASSED] test_info_comp_tile
[09:08:36] [PASSED] test_info_comp_gt
[09:08:36] [PASSED] test_info_all
[09:08:36] [PASSED] test_hw_fatal
[09:08:36] [PASSED] test_hw_recoverable
[09:08:36] [PASSED] test_hw_corrected
[09:08:36] [PASSED] test_hw_informational
[09:08:36] =================== [PASSED] test_dmesg ====================
[09:08:36] ====================== test_invalid  =======================
[09:08:36] [SKIPPED] no-component no-location no-warn (requires CONFIG_DRM_XE_DEBUG)
[09:08:36] [SKIPPED] reserved location (requires CONFIG_DRM_XE_DEBUG)
[09:08:36] [SKIPPED] unknown location (requires CONFIG_DRM_XE_DEBUG)
[09:08:36] [SKIPPED] nonzero-device-id location (requires CONFIG_DRM_XE_DEBUG)
[09:08:36] [SKIPPED] invalid-tile-id location (requires CONFIG_DRM_XE_DEBUG)
[09:08:36] [SKIPPED] invalid-gt-id location (requires CONFIG_DRM_XE_DEBUG)
[09:08:36] [SKIPPED] unknown component class (requires CONFIG_DRM_XE_DEBUG)
[09:08:36] [SKIPPED] unknown system component (requires CONFIG_DRM_XE_DEBUG)
[09:08:36] [SKIPPED] unknown hardware component (requires CONFIG_DRM_XE_DEBUG)
[09:08:36] [SKIPPED] unknown component and location (requires CONFIG_DRM_XE_DEBUG)
[09:08:36] ================== [SKIPPED] test_invalid ==================
[09:08:36] ===================== [PASSED] xe_log ======================
[09:08:36] ================== no_relay (3 subtests) ===================
[09:08:36] [PASSED] xe_drops_guc2pf_if_not_ready
[09:08:36] [PASSED] xe_drops_guc2vf_if_not_ready
[09:08:36] [PASSED] xe_rejects_send_if_not_ready
[09:08:36] ==================== [PASSED] no_relay =====================
[09:08:36] ================== pf_relay (14 subtests) ==================
[09:08:36] [PASSED] pf_rejects_guc2pf_too_short
[09:08:36] [PASSED] pf_rejects_guc2pf_too_long
[09:08:36] [PASSED] pf_rejects_guc2pf_no_payload
[09:08:36] [PASSED] pf_fails_no_payload
[09:08:36] [PASSED] pf_fails_bad_origin
[09:08:36] [PASSED] pf_fails_bad_type
[09:08:36] [PASSED] pf_txn_reports_error
[09:08:36] [PASSED] pf_txn_sends_pf2guc
[09:08:36] [PASSED] pf_sends_pf2guc
[09:08:36] [SKIPPED] pf_loopback_nop (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[09:08:36] [SKIPPED] pf_loopback_echo (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[09:08:36] [SKIPPED] pf_loopback_fail (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[09:08:36] [SKIPPED] pf_loopback_busy (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[09:08:36] [SKIPPED] pf_loopback_retry (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[09:08:36] ==================== [PASSED] pf_relay =====================
[09:08:36] ================== vf_relay (3 subtests) ===================
[09:08:36] [PASSED] vf_rejects_guc2vf_too_short
[09:08:36] [PASSED] vf_rejects_guc2vf_too_long
[09:08:36] [PASSED] vf_rejects_guc2vf_no_payload
[09:08:36] ==================== [PASSED] vf_relay =====================
[09:08:36] ================ pf_gt_config (9 subtests) =================
[09:08:36] [PASSED] fair_contexts_1vf
[09:08:36] [PASSED] fair_doorbells_1vf
[09:08:36] [PASSED] fair_ggtt_1vf
[09:08:36] ====================== fair_vram_1vf  ======================
[09:08:36] [PASSED] 3.50 GiB
[09:08:36] [PASSED] 11.5 GiB
[09:08:36] [PASSED] 15.5 GiB
[09:08:36] [PASSED] 31.5 GiB
[09:08:36] [PASSED] 63.5 GiB
[09:08:36] [PASSED] 1.91 GiB
[09:08:36] ================== [PASSED] fair_vram_1vf ==================
[09:08:36] ================ fair_vram_1vf_admin_only  =================
[09:08:36] [PASSED] 3.50 GiB
[09:08:36] [PASSED] 11.5 GiB
[09:08:36] [PASSED] 15.5 GiB
[09:08:36] [PASSED] 31.5 GiB
[09:08:36] [PASSED] 63.5 GiB
[09:08:36] [PASSED] 1.91 GiB
[09:08:36] ============ [PASSED] fair_vram_1vf_admin_only =============
[09:08:36] ====================== fair_contexts  ======================
[09:08:36] [PASSED] 1 VF
[09:08:36] [PASSED] 2 VFs
[09:08:36] [PASSED] 3 VFs
[09:08:36] [PASSED] 4 VFs
[09:08:36] [PASSED] 5 VFs
[09:08:36] [PASSED] 6 VFs
[09:08:36] [PASSED] 7 VFs
[09:08:36] [PASSED] 8 VFs
[09:08:36] [PASSED] 9 VFs
[09:08:36] [PASSED] 10 VFs
[09:08:36] [PASSED] 11 VFs
[09:08:36] [PASSED] 12 VFs
[09:08:36] [PASSED] 13 VFs
[09:08:36] [PASSED] 14 VFs
[09:08:36] [PASSED] 15 VFs
[09:08:36] [PASSED] 16 VFs
[09:08:36] [PASSED] 17 VFs
[09:08:36] [PASSED] 18 VFs
[09:08:36] [PASSED] 19 VFs
[09:08:36] [PASSED] 20 VFs
[09:08:36] [PASSED] 21 VFs
[09:08:36] [PASSED] 22 VFs
[09:08:36] [PASSED] 23 VFs
[09:08:36] [PASSED] 24 VFs
[09:08:36] [PASSED] 25 VFs
[09:08:36] [PASSED] 26 VFs
[09:08:36] [PASSED] 27 VFs
[09:08:36] [PASSED] 28 VFs
[09:08:36] [PASSED] 29 VFs
[09:08:36] [PASSED] 30 VFs
[09:08:36] [PASSED] 31 VFs
[09:08:36] [PASSED] 32 VFs
[09:08:36] [PASSED] 33 VFs
[09:08:36] [PASSED] 34 VFs
[09:08:36] [PASSED] 35 VFs
[09:08:36] [PASSED] 36 VFs
[09:08:36] [PASSED] 37 VFs
[09:08:36] [PASSED] 38 VFs
[09:08:36] [PASSED] 39 VFs
[09:08:36] [PASSED] 40 VFs
[09:08:36] [PASSED] 41 VFs
[09:08:36] [PASSED] 42 VFs
[09:08:36] [PASSED] 43 VFs
[09:08:36] [PASSED] 44 VFs
[09:08:36] [PASSED] 45 VFs
[09:08:36] [PASSED] 46 VFs
[09:08:36] [PASSED] 47 VFs
[09:08:36] [PASSED] 48 VFs
[09:08:36] [PASSED] 49 VFs
[09:08:36] [PASSED] 50 VFs
[09:08:36] [PASSED] 51 VFs
[09:08:36] [PASSED] 52 VFs
[09:08:36] [PASSED] 53 VFs
[09:08:36] [PASSED] 54 VFs
[09:08:36] [PASSED] 55 VFs
[09:08:36] [PASSED] 56 VFs
[09:08:36] [PASSED] 57 VFs
[09:08:36] [PASSED] 58 VFs
[09:08:36] [PASSED] 59 VFs
[09:08:36] [PASSED] 60 VFs
[09:08:36] [PASSED] 61 VFs
[09:08:36] [PASSED] 62 VFs
[09:08:36] [PASSED] 63 VFs
[09:08:36] ================== [PASSED] fair_contexts ==================
[09:08:36] ===================== fair_doorbells  ======================
[09:08:36] [PASSED] 1 VF
[09:08:36] [PASSED] 2 VFs
[09:08:36] [PASSED] 3 VFs
[09:08:36] [PASSED] 4 VFs
[09:08:36] [PASSED] 5 VFs
[09:08:36] [PASSED] 6 VFs
[09:08:36] [PASSED] 7 VFs
[09:08:36] [PASSED] 8 VFs
[09:08:36] [PASSED] 9 VFs
[09:08:36] [PASSED] 10 VFs
[09:08:36] [PASSED] 11 VFs
[09:08:36] [PASSED] 12 VFs
[09:08:36] [PASSED] 13 VFs
[09:08:36] [PASSED] 14 VFs
[09:08:36] [PASSED] 15 VFs
[09:08:36] [PASSED] 16 VFs
[09:08:36] [PASSED] 17 VFs
[09:08:36] [PASSED] 18 VFs
[09:08:36] [PASSED] 19 VFs
[09:08:36] [PASSED] 20 VFs
[09:08:36] [PASSED] 21 VFs
[09:08:36] [PASSED] 22 VFs
[09:08:36] [PASSED] 23 VFs
[09:08:36] [PASSED] 24 VFs
[09:08:36] [PASSED] 25 VFs
[09:08:36] [PASSED] 26 VFs
[09:08:36] [PASSED] 27 VFs
[09:08:36] [PASSED] 28 VFs
[09:08:36] [PASSED] 29 VFs
[09:08:36] [PASSED] 30 VFs
[09:08:36] [PASSED] 31 VFs
[09:08:36] [PASSED] 32 VFs
[09:08:36] [PASSED] 33 VFs
[09:08:36] [PASSED] 34 VFs
[09:08:36] [PASSED] 35 VFs
[09:08:36] [PASSED] 36 VFs
[09:08:36] [PASSED] 37 VFs
[09:08:36] [PASSED] 38 VFs
[09:08:36] [PASSED] 39 VFs
[09:08:36] [PASSED] 40 VFs
[09:08:36] [PASSED] 41 VFs
[09:08:36] [PASSED] 42 VFs
[09:08:36] [PASSED] 43 VFs
[09:08:36] [PASSED] 44 VFs
[09:08:36] [PASSED] 45 VFs
[09:08:36] [PASSED] 46 VFs
[09:08:36] [PASSED] 47 VFs
[09:08:36] [PASSED] 48 VFs
[09:08:36] [PASSED] 49 VFs
[09:08:36] [PASSED] 50 VFs
[09:08:36] [PASSED] 51 VFs
[09:08:36] [PASSED] 52 VFs
[09:08:36] [PASSED] 53 VFs
[09:08:36] [PASSED] 54 VFs
[09:08:36] [PASSED] 55 VFs
[09:08:36] [PASSED] 56 VFs
[09:08:36] [PASSED] 57 VFs
[09:08:36] [PASSED] 58 VFs
[09:08:36] [PASSED] 59 VFs
[09:08:36] [PASSED] 60 VFs
[09:08:36] [PASSED] 61 VFs
[09:08:36] [PASSED] 62 VFs
[09:08:36] [PASSED] 63 VFs
[09:08:36] ================= [PASSED] fair_doorbells ==================
[09:08:36] ======================== fair_ggtt  ========================
[09:08:36] [PASSED] 1 VF
[09:08:36] [PASSED] 2 VFs
[09:08:36] [PASSED] 3 VFs
[09:08:36] [PASSED] 4 VFs
[09:08:36] [PASSED] 5 VFs
[09:08:36] [PASSED] 6 VFs
[09:08:36] [PASSED] 7 VFs
[09:08:36] [PASSED] 8 VFs
[09:08:36] [PASSED] 9 VFs
[09:08:36] [PASSED] 10 VFs
[09:08:36] [PASSED] 11 VFs
[09:08:36] [PASSED] 12 VFs
[09:08:36] [PASSED] 13 VFs
[09:08:36] [PASSED] 14 VFs
[09:08:36] [PASSED] 15 VFs
[09:08:36] [PASSED] 16 VFs
[09:08:36] [PASSED] 17 VFs
[09:08:36] [PASSED] 18 VFs
[09:08:36] [PASSED] 19 VFs
[09:08:36] [PASSED] 20 VFs
[09:08:36] [PASSED] 21 VFs
[09:08:36] [PASSED] 22 VFs
[09:08:36] [PASSED] 23 VFs
[09:08:36] [PASSED] 24 VFs
[09:08:36] [PASSED] 25 VFs
[09:08:36] [PASSED] 26 VFs
[09:08:36] [PASSED] 27 VFs
[09:08:36] [PASSED] 28 VFs
[09:08:36] [PASSED] 29 VFs
[09:08:36] [PASSED] 30 VFs
[09:08:36] [PASSED] 31 VFs
[09:08:36] [PASSED] 32 VFs
[09:08:36] [PASSED] 33 VFs
[09:08:36] [PASSED] 34 VFs
[09:08:36] [PASSED] 35 VFs
[09:08:36] [PASSED] 36 VFs
[09:08:36] [PASSED] 37 VFs
[09:08:36] [PASSED] 38 VFs
[09:08:36] [PASSED] 39 VFs
[09:08:36] [PASSED] 40 VFs
[09:08:36] [PASSED] 41 VFs
[09:08:36] [PASSED] 42 VFs
[09:08:36] [PASSED] 43 VFs
[09:08:36] [PASSED] 44 VFs
[09:08:36] [PASSED] 45 VFs
[09:08:36] [PASSED] 46 VFs
[09:08:36] [PASSED] 47 VFs
[09:08:36] [PASSED] 48 VFs
[09:08:36] [PASSED] 49 VFs
[09:08:36] [PASSED] 50 VFs
[09:08:36] [PASSED] 51 VFs
[09:08:36] [PASSED] 52 VFs
[09:08:36] [PASSED] 53 VFs
[09:08:36] [PASSED] 54 VFs
[09:08:36] [PASSED] 55 VFs
[09:08:36] [PASSED] 56 VFs
[09:08:36] [PASSED] 57 VFs
[09:08:36] [PASSED] 58 VFs
[09:08:36] [PASSED] 59 VFs
[09:08:36] [PASSED] 60 VFs
[09:08:36] [PASSED] 61 VFs
[09:08:36] [PASSED] 62 VFs
[09:08:36] [PASSED] 63 VFs
[09:08:36] ==================== [PASSED] fair_ggtt ====================
[09:08:36] ======================== fair_vram  ========================
[09:08:36] [PASSED] 1 VF
[09:08:36] [PASSED] 2 VFs
[09:08:36] [PASSED] 3 VFs
[09:08:36] [PASSED] 4 VFs
[09:08:36] [PASSED] 5 VFs
[09:08:36] [PASSED] 6 VFs
[09:08:36] [PASSED] 7 VFs
[09:08:36] [PASSED] 8 VFs
[09:08:36] [PASSED] 9 VFs
[09:08:36] [PASSED] 10 VFs
[09:08:36] [PASSED] 11 VFs
[09:08:36] [PASSED] 12 VFs
[09:08:36] [PASSED] 13 VFs
[09:08:36] [PASSED] 14 VFs
[09:08:36] [PASSED] 15 VFs
[09:08:36] [PASSED] 16 VFs
[09:08:36] [PASSED] 17 VFs
[09:08:36] [PASSED] 18 VFs
[09:08:36] [PASSED] 19 VFs
[09:08:36] [PASSED] 20 VFs
[09:08:36] [PASSED] 21 VFs
[09:08:36] [PASSED] 22 VFs
[09:08:36] [PASSED] 23 VFs
[09:08:36] [PASSED] 24 VFs
[09:08:36] [PASSED] 25 VFs
[09:08:36] [PASSED] 26 VFs
[09:08:36] [PASSED] 27 VFs
[09:08:36] [PASSED] 28 VFs
[09:08:36] [PASSED] 29 VFs
[09:08:36] [PASSED] 30 VFs
[09:08:36] [PASSED] 31 VFs
[09:08:36] [PASSED] 32 VFs
[09:08:36] [PASSED] 33 VFs
[09:08:36] [PASSED] 34 VFs
[09:08:36] [PASSED] 35 VFs
[09:08:36] [PASSED] 36 VFs
[09:08:36] [PASSED] 37 VFs
[09:08:36] [PASSED] 38 VFs
[09:08:36] [PASSED] 39 VFs
[09:08:36] [PASSED] 40 VFs
[09:08:36] [PASSED] 41 VFs
[09:08:36] [PASSED] 42 VFs
[09:08:36] [PASSED] 43 VFs
[09:08:36] [PASSED] 44 VFs
[09:08:36] [PASSED] 45 VFs
[09:08:36] [PASSED] 46 VFs
[09:08:36] [PASSED] 47 VFs
[09:08:36] [PASSED] 48 VFs
[09:08:36] [PASSED] 49 VFs
[09:08:36] [PASSED] 50 VFs
[09:08:36] [PASSED] 51 VFs
[09:08:36] [PASSED] 52 VFs
[09:08:36] [PASSED] 53 VFs
[09:08:36] [PASSED] 54 VFs
[09:08:36] [PASSED] 55 VFs
[09:08:36] [PASSED] 56 VFs
[09:08:36] [PASSED] 57 VFs
[09:08:36] [PASSED] 58 VFs
[09:08:36] [PASSED] 59 VFs
[09:08:36] [PASSED] 60 VFs
[09:08:36] [PASSED] 61 VFs
[09:08:36] [PASSED] 62 VFs
[09:08:36] [PASSED] 63 VFs
[09:08:36] ==================== [PASSED] fair_vram ====================
[09:08:36] ================== [PASSED] pf_gt_config ===================
[09:08:36] ===================== lmtt (1 subtest) =====================
[09:08:36] ======================== test_ops  =========================
[09:08:36] [PASSED] 2-level
[09:08:36] [PASSED] multi-level
[09:08:36] ==================== [PASSED] test_ops =====================
[09:08:36] ====================== [PASSED] lmtt =======================
[09:08:36] ================= sriov_packet (1 subtest) =================
[09:08:36] [PASSED] test_descriptor_init
[09:08:36] ================== [PASSED] sriov_packet ===================
[09:08:36] ================= pf_service (11 subtests) =================
[09:08:36] [PASSED] pf_negotiate_any
[09:08:36] [PASSED] pf_negotiate_base_match
[09:08:36] [PASSED] pf_negotiate_base_newer
[09:08:36] [PASSED] pf_negotiate_base_next
[09:08:36] [SKIPPED] pf_negotiate_base_older (no older minor)
[09:08:36] [PASSED] pf_negotiate_base_prev
[09:08:36] [PASSED] pf_negotiate_latest_match
[09:08:36] [PASSED] pf_negotiate_latest_newer
[09:08:36] [PASSED] pf_negotiate_latest_next
[09:08:36] [SKIPPED] pf_negotiate_latest_older (no older minor)
[09:08:36] [SKIPPED] pf_negotiate_latest_prev (no prev major)
[09:08:36] =================== [PASSED] pf_service ====================
[09:08:36] ================= xe_guc_g2g (2 subtests) ==================
[09:08:36] ============== xe_live_guc_g2g_kunit_default  ==============
[09:08:36] ========= [SKIPPED] xe_live_guc_g2g_kunit_default ==========
[09:08:36] ============== xe_live_guc_g2g_kunit_allmem  ===============
[09:08:36] ========== [SKIPPED] xe_live_guc_g2g_kunit_allmem ==========
[09:08:36] =================== [SKIPPED] xe_guc_g2g ===================
[09:08:36] =================== xe_mocs (2 subtests) ===================
[09:08:36] ================ xe_live_mocs_kernel_kunit  ================
[09:08:36] =========== [SKIPPED] xe_live_mocs_kernel_kunit ============
[09:08:36] ================ xe_live_mocs_reset_kunit  =================
[09:08:36] ============ [SKIPPED] xe_live_mocs_reset_kunit ============
[09:08:36] ==================== [SKIPPED] xe_mocs =====================
[09:08:36] ================= xe_migrate (2 subtests) ==================
[09:08:36] ================= xe_migrate_sanity_kunit  =================
[09:08:36] ============ [SKIPPED] xe_migrate_sanity_kunit =============
[09:08:36] ================== xe_validate_ccs_kunit  ==================
[09:08:36] ============= [SKIPPED] xe_validate_ccs_kunit ==============
[09:08:36] =================== [SKIPPED] xe_migrate ===================
[09:08:36] ================== xe_dma_buf (1 subtest) ==================
[09:08:36] ==================== xe_dma_buf_kunit  =====================
[09:08:36] ================ [SKIPPED] xe_dma_buf_kunit ================
[09:08:36] =================== [SKIPPED] xe_dma_buf ===================
[09:08:36] ================= xe_bo_shrink (1 subtest) =================
[09:08:36] =================== xe_bo_shrink_kunit  ====================
[09:08:36] =============== [SKIPPED] xe_bo_shrink_kunit ===============
[09:08:36] ================== [SKIPPED] xe_bo_shrink ==================
[09:08:36] ==================== xe_bo (2 subtests) ====================
[09:08:36] ================== xe_ccs_migrate_kunit  ===================
[09:08:36] ============== [SKIPPED] xe_ccs_migrate_kunit ==============
[09:08:36] ==================== xe_bo_evict_kunit  ====================
[09:08:36] =============== [SKIPPED] xe_bo_evict_kunit ================
[09:08:36] ===================== [SKIPPED] xe_bo ======================
[09:08:36] =================== xe_any (9 subtests) ====================
[09:08:36] [PASSED] test_to_xe
[09:08:36] [PASSED] test_to_dev
[09:08:36] [PASSED] test_to_pdev
[09:08:36] [PASSED] test_to_drm
[09:08:36] [PASSED] test_if_pdev
[09:08:36] [PASSED] test_if_xe
[09:08:36] [PASSED] test_if_tile
[09:08:36] [PASSED] test_if_gt
[09:08:36] [PASSED] test_to_id
[09:08:36] ===================== [PASSED] xe_any ======================
[09:08:36] ==================== args (13 subtests) ====================
[09:08:36] [PASSED] count_args_test
[09:08:36] [PASSED] call_args_example
[09:08:36] [PASSED] call_args_test
[09:08:36] [PASSED] drop_first_arg_example
[09:08:36] [PASSED] drop_first_arg_test
[09:08:36] [PASSED] first_arg_example
[09:08:36] [PASSED] first_arg_test
[09:08:36] [PASSED] last_arg_example
[09:08:36] [PASSED] last_arg_test
[09:08:36] [PASSED] pick_arg_example
[09:08:36] [PASSED] if_args_example
[09:08:36] [PASSED] if_args_test
[09:08:36] [PASSED] sep_comma_example
[09:08:36] ====================== [PASSED] args =======================
[09:08:36] =================== xe_pci (3 subtests) ====================
[09:08:36] ==================== check_graphics_ip  ====================
[09:08:36] [PASSED] 12.00 Xe_LP
[09:08:36] [PASSED] 12.10 Xe_LP+
[09:08:36] [PASSED] 12.55 Xe_HPG
[09:08:36] [PASSED] 12.60 Xe_HPC
[09:08:36] [PASSED] 12.70 Xe_LPG
[09:08:36] [PASSED] 12.71 Xe_LPG
[09:08:36] [PASSED] 12.74 Xe_LPG+
[09:08:36] [PASSED] 20.01 Xe2_HPG
[09:08:36] [PASSED] 20.02 Xe2_HPG
[09:08:36] [PASSED] 20.04 Xe2_LPG
[09:08:36] [PASSED] 30.00 Xe3_LPG
[09:08:36] [PASSED] 30.01 Xe3_LPG
[09:08:36] [PASSED] 30.03 Xe3_LPG
[09:08:36] [PASSED] 30.04 Xe3_LPG
[09:08:36] [PASSED] 30.05 Xe3_LPG
[09:08:36] [PASSED] 35.10 Xe3p_LPG
[09:08:36] [PASSED] 35.11 Xe3p_XPC
[09:08:36] ================ [PASSED] check_graphics_ip ================
[09:08:36] ===================== check_media_ip  ======================
[09:08:36] [PASSED] 12.00 Xe_M
[09:08:36] [PASSED] 12.55 Xe_HPM
[09:08:36] [PASSED] 13.00 Xe_LPM+
[09:08:36] [PASSED] 13.01 Xe2_HPM
[09:08:36] [PASSED] 20.00 Xe2_LPM
[09:08:36] [PASSED] 30.00 Xe3_LPM
[09:08:36] [PASSED] 30.02 Xe3_LPM
[09:08:36] [PASSED] 35.00 Xe3p_LPM
[09:08:36] [PASSED] 35.03 Xe3p_HPM
[09:08:36] ================= [PASSED] check_media_ip ==================
[09:08:36] =================== check_platform_desc  ===================
[09:08:36] [PASSED] 0x9A60 (TIGERLAKE)
[09:08:36] [PASSED] 0x9A68 (TIGERLAKE)
[09:08:36] [PASSED] 0x9A70 (TIGERLAKE)
[09:08:36] [PASSED] 0x9A40 (TIGERLAKE)
[09:08:36] [PASSED] 0x9A49 (TIGERLAKE)
[09:08:36] [PASSED] 0x9A59 (TIGERLAKE)
[09:08:36] [PASSED] 0x9A78 (TIGERLAKE)
[09:08:36] [PASSED] 0x9AC0 (TIGERLAKE)
[09:08:36] [PASSED] 0x9AC9 (TIGERLAKE)
[09:08:36] [PASSED] 0x9AD9 (TIGERLAKE)
[09:08:36] [PASSED] 0x9AF8 (TIGERLAKE)
[09:08:36] [PASSED] 0x4C80 (ROCKETLAKE)
[09:08:36] [PASSED] 0x4C8A (ROCKETLAKE)
[09:08:36] [PASSED] 0x4C8B (ROCKETLAKE)
[09:08:36] [PASSED] 0x4C8C (ROCKETLAKE)
[09:08:36] [PASSED] 0x4C90 (ROCKETLAKE)
[09:08:36] [PASSED] 0x4C9A (ROCKETLAKE)
[09:08:36] [PASSED] 0x4680 (ALDERLAKE_S)
[09:08:36] [PASSED] 0x4682 (ALDERLAKE_S)
[09:08:36] [PASSED] 0x4688 (ALDERLAKE_S)
[09:08:36] [PASSED] 0x468A (ALDERLAKE_S)
[09:08:36] [PASSED] 0x468B (ALDERLAKE_S)
[09:08:36] [PASSED] 0x4690 (ALDERLAKE_S)
[09:08:36] [PASSED] 0x4692 (ALDERLAKE_S)
[09:08:36] [PASSED] 0x4693 (ALDERLAKE_S)
[09:08:36] [PASSED] 0x46A0 (ALDERLAKE_P)
[09:08:36] [PASSED] 0x46A1 (ALDERLAKE_P)
[09:08:36] [PASSED] 0x46A2 (ALDERLAKE_P)
[09:08:36] [PASSED] 0x46A3 (ALDERLAKE_P)
[09:08:36] [PASSED] 0x46A6 (ALDERLAKE_P)
[09:08:36] [PASSED] 0x46A8 (ALDERLAKE_P)
[09:08:36] [PASSED] 0x46AA (ALDERLAKE_P)
[09:08:36] [PASSED] 0x462A (ALDERLAKE_P)
[09:08:36] [PASSED] 0x4626 (ALDERLAKE_P)
[09:08:36] [PASSED] 0x4628 (ALDERLAKE_P)
[09:08:36] [PASSED] 0x46B0 (ALDERLAKE_P)
[09:08:36] [PASSED] 0x46B1 (ALDERLAKE_P)
[09:08:36] [PASSED] 0x46B2 (ALDERLAKE_P)
[09:08:36] [PASSED] 0x46B3 (ALDERLAKE_P)
[09:08:36] [PASSED] 0x46C0 (ALDERLAKE_P)
[09:08:36] [PASSED] 0x46C1 (ALDERLAKE_P)
[09:08:36] [PASSED] 0x46C2 (ALDERLAKE_P)
[09:08:36] [PASSED] 0x46C3 (ALDERLAKE_P)
[09:08:36] [PASSED] 0x46D0 (ALDERLAKE_N)
[09:08:36] [PASSED] 0x46D1 (ALDERLAKE_N)
[09:08:36] [PASSED] 0x46D2 (ALDERLAKE_N)
[09:08:36] [PASSED] 0x46D3 (ALDERLAKE_N)
[09:08:36] [PASSED] 0x46D4 (ALDERLAKE_N)
[09:08:36] [PASSED] 0xA721 (ALDERLAKE_P)
[09:08:36] [PASSED] 0xA7A1 (ALDERLAKE_P)
[09:08:36] [PASSED] 0xA7A9 (ALDERLAKE_P)
[09:08:36] [PASSED] 0xA7AC (ALDERLAKE_P)
[09:08:36] [PASSED] 0xA7AD (ALDERLAKE_P)
[09:08:36] [PASSED] 0xA720 (ALDERLAKE_P)
[09:08:36] [PASSED] 0xA7A0 (ALDERLAKE_P)
[09:08:36] [PASSED] 0xA7A8 (ALDERLAKE_P)
[09:08:36] [PASSED] 0xA7AA (ALDERLAKE_P)
[09:08:36] [PASSED] 0xA7AB (ALDERLAKE_P)
[09:08:36] [PASSED] 0xA780 (ALDERLAKE_S)
[09:08:36] [PASSED] 0xA781 (ALDERLAKE_S)
[09:08:36] [PASSED] 0xA782 (ALDERLAKE_S)
[09:08:36] [PASSED] 0xA783 (ALDERLAKE_S)
[09:08:36] [PASSED] 0xA788 (ALDERLAKE_S)
[09:08:36] [PASSED] 0xA789 (ALDERLAKE_S)
[09:08:36] [PASSED] 0xA78A (ALDERLAKE_S)
[09:08:36] [PASSED] 0xA78B (ALDERLAKE_S)
[09:08:36] [PASSED] 0x4905 (DG1)
[09:08:36] [PASSED] 0x4906 (DG1)
[09:08:36] [PASSED] 0x4907 (DG1)
[09:08:36] [PASSED] 0x4908 (DG1)
[09:08:36] [PASSED] 0x4909 (DG1)
[09:08:36] [PASSED] 0x56C0 (DG2)
[09:08:36] [PASSED] 0x56C2 (DG2)
[09:08:36] [PASSED] 0x56C1 (DG2)
[09:08:36] [PASSED] 0x7D51 (METEORLAKE)
[09:08:36] [PASSED] 0x7DD1 (METEORLAKE)
[09:08:36] [PASSED] 0x7D41 (METEORLAKE)
[09:08:36] [PASSED] 0x7D67 (METEORLAKE)
[09:08:36] [PASSED] 0xB640 (METEORLAKE)
[09:08:36] [PASSED] 0x56A0 (DG2)
[09:08:36] [PASSED] 0x56A1 (DG2)
[09:08:36] [PASSED] 0x56A2 (DG2)
[09:08:36] [PASSED] 0x56BE (DG2)
[09:08:36] [PASSED] 0x56BF (DG2)
[09:08:36] [PASSED] 0x5690 (DG2)
[09:08:36] [PASSED] 0x5691 (DG2)
[09:08:36] [PASSED] 0x5692 (DG2)
[09:08:36] [PASSED] 0x56A5 (DG2)
[09:08:36] [PASSED] 0x56A6 (DG2)
[09:08:36] [PASSED] 0x56B0 (DG2)
[09:08:36] [PASSED] 0x56B1 (DG2)
[09:08:36] [PASSED] 0x56BA (DG2)
[09:08:36] [PASSED] 0x56BB (DG2)
[09:08:36] [PASSED] 0x56BC (DG2)
[09:08:36] [PASSED] 0x56BD (DG2)
[09:08:36] [PASSED] 0x5693 (DG2)
[09:08:36] [PASSED] 0x5694 (DG2)
[09:08:36] [PASSED] 0x5695 (DG2)
[09:08:36] [PASSED] 0x56A3 (DG2)
[09:08:36] [PASSED] 0x56A4 (DG2)
[09:08:36] [PASSED] 0x56B2 (DG2)
[09:08:36] [PASSED] 0x56B3 (DG2)
[09:08:36] [PASSED] 0x5696 (DG2)
[09:08:36] [PASSED] 0x5697 (DG2)
[09:08:36] [PASSED] 0xB69 (PVC)
[09:08:36] [PASSED] 0xB6E (PVC)
[09:08:36] [PASSED] 0xBD4 (PVC)
[09:08:36] [PASSED] 0xBD5 (PVC)
[09:08:36] [PASSED] 0xBD6 (PVC)
[09:08:36] [PASSED] 0xBD7 (PVC)
[09:08:36] [PASSED] 0xBD8 (PVC)
[09:08:36] [PASSED] 0xBD9 (PVC)
[09:08:36] [PASSED] 0xBDA (PVC)
[09:08:36] [PASSED] 0xBDB (PVC)
[09:08:36] [PASSED] 0xBE0 (PVC)
[09:08:36] [PASSED] 0xBE1 (PVC)
[09:08:36] [PASSED] 0xBE5 (PVC)
[09:08:36] [PASSED] 0x7D40 (METEORLAKE)
[09:08:36] [PASSED] 0x7D45 (METEORLAKE)
[09:08:36] [PASSED] 0x7D55 (METEORLAKE)
[09:08:36] [PASSED] 0x7D60 (METEORLAKE)
[09:08:36] [PASSED] 0x7DD5 (METEORLAKE)
[09:08:36] [PASSED] 0x6420 (LUNARLAKE)
[09:08:36] [PASSED] 0x64A0 (LUNARLAKE)
[09:08:36] [PASSED] 0x64B0 (LUNARLAKE)
[09:08:36] [PASSED] 0xE202 (BATTLEMAGE)
[09:08:36] [PASSED] 0xE209 (BATTLEMAGE)
[09:08:36] [PASSED] 0xE20B (BATTLEMAGE)
[09:08:36] [PASSED] 0xE20C (BATTLEMAGE)
[09:08:36] [PASSED] 0xE20D (BATTLEMAGE)
[09:08:36] [PASSED] 0xE210 (BATTLEMAGE)
[09:08:36] [PASSED] 0xE211 (BATTLEMAGE)
[09:08:36] [PASSED] 0xE212 (BATTLEMAGE)
[09:08:36] [PASSED] 0xE216 (BATTLEMAGE)
[09:08:36] [PASSED] 0xE220 (BATTLEMAGE)
[09:08:36] [PASSED] 0xE221 (BATTLEMAGE)
[09:08:36] [PASSED] 0xE222 (BATTLEMAGE)
[09:08:36] [PASSED] 0xE223 (BATTLEMAGE)
[09:08:36] [PASSED] 0xB080 (PANTHERLAKE)
[09:08:36] [PASSED] 0xB081 (PANTHERLAKE)
[09:08:36] [PASSED] 0xB082 (PANTHERLAKE)
[09:08:36] [PASSED] 0xB083 (PANTHERLAKE)
[09:08:36] [PASSED] 0xB084 (PANTHERLAKE)
[09:08:36] [PASSED] 0xB085 (PANTHERLAKE)
[09:08:36] [PASSED] 0xB086 (PANTHERLAKE)
[09:08:36] [PASSED] 0xB087 (PANTHERLAKE)
[09:08:36] [PASSED] 0xB08F (PANTHERLAKE)
[09:08:36] [PASSED] 0xB090 (PANTHERLAKE)
[09:08:36] [PASSED] 0xB0A0 (PANTHERLAKE)
[09:08:36] [PASSED] 0xB0B0 (PANTHERLAKE)
[09:08:36] [PASSED] 0xFD80 (PANTHERLAKE)
[09:08:36] [PASSED] 0xFD81 (PANTHERLAKE)
[09:08:36] [PASSED] 0xD740 (NOVALAKE_S)
[09:08:36] [PASSED] 0xD741 (NOVALAKE_S)
[09:08:36] [PASSED] 0xD742 (NOVALAKE_S)
[09:08:36] [PASSED] 0xD743 (NOVALAKE_S)
[09:08:36] [PASSED] 0xD745 (NOVALAKE_S)
[09:08:36] [PASSED] 0xD74A (NOVALAKE_S)
[09:08:36] [PASSED] 0xD74B (NOVALAKE_S)
[09:08:36] [PASSED] 0x674C (CRESCENTISLAND)
[09:08:36] [PASSED] 0x674D (CRESCENTISLAND)
[09:08:36] [PASSED] 0x674E (CRESCENTISLAND)
[09:08:36] [PASSED] 0x674F (CRESCENTISLAND)
[09:08:36] [PASSED] 0x6750 (CRESCENTISLAND)
[09:08:36] [PASSED] 0xD750 (NOVALAKE_P)
[09:08:36] [PASSED] 0xD751 (NOVALAKE_P)
[09:08:36] [PASSED] 0xD752 (NOVALAKE_P)
[09:08:36] [PASSED] 0xD753 (NOVALAKE_P)
[09:08:36] [PASSED] 0xD754 (NOVALAKE_P)
[09:08:36] [PASSED] 0xD755 (NOVALAKE_P)
[09:08:36] [PASSED] 0xD756 (NOVALAKE_P)
[09:08:36] [PASSED] 0xD757 (NOVALAKE_P)
[09:08:36] [PASSED] 0xD75F (NOVALAKE_P)
[09:08:36] =============== [PASSED] check_platform_desc ===============
[09:08:36] ===================== [PASSED] xe_pci ======================
[09:08:36] ============= xe_rtp_tables_test (5 subtests) ==============
[09:08:36] ================== xe_rtp_table_gt_test  ===================
[09:08:36] [PASSED] gt_was/14011060649
[09:08:36] [PASSED] gt_was/14011059788
[09:08:36] [PASSED] gt_was/14015795083
[09:08:36] [PASSED] gt_was/16021867713
[09:08:36] [PASSED] gt_was/14019449301
[09:08:36] [PASSED] gt_was/16028005424
[09:08:36] [PASSED] gt_was/14026578760
[09:08:36] [PASSED] gt_was/1409420604
[09:08:36] [PASSED] gt_was/1408615072
[09:08:36] [PASSED] gt_was/22010523718
[09:08:36] [PASSED] gt_was/14011006942
[09:08:36] [PASSED] gt_was/14014830051
[09:08:36] [PASSED] gt_was/18018781329
[09:08:36] [PASSED] gt_was/1509235366
[09:08:36] [PASSED] gt_was/18018781329
[09:08:36] [PASSED] gt_was/16016694945
[09:08:36] [PASSED] gt_was/14018575942
[09:08:36] [PASSED] gt_was/22016670082
[09:08:36] [PASSED] gt_was/22016670082
[09:08:36] [PASSED] gt_was/14017421178
[09:08:36] [PASSED] gt_was/16025250150
[09:08:36] [PASSED] gt_was/14021871409
[09:08:36] [PASSED] gt_was/16021865536
[09:08:36] [PASSED] gt_was/14021486841
[09:08:36] [PASSED] gt_was/14025160223
[09:08:36] [PASSED] gt_was/14026144927, 16029437861, 14026127056
[09:08:36] [PASSED] gt_was/14025635424
[09:08:36] [PASSED] gt_was/16028005424
[09:08:36] ============== [PASSED] xe_rtp_table_gt_test ===============
[09:08:36] ================== xe_rtp_table_gt_test  ===================
[09:08:36] [PASSED] gt_tunings/Tuning: Blend Fill Caching Optimization Disable
[09:08:36] [PASSED] gt_tunings/Tuning: 32B Access Enable
[09:08:36] [PASSED] gt_tunings/Tuning: L3 cache
[09:08:36] [PASSED] gt_tunings/Tuning: L3 cache - media
[09:08:36] [PASSED] gt_tunings/Tuning: Compression Overfetch
[09:08:36] [PASSED] gt_tunings/Tuning: Compression Overfetch - media
[09:08:36] [PASSED] gt_tunings/Tuning: Enable compressible partial write overfetch in L3
[09:08:36] [PASSED] gt_tunings/Tuning: Enable compressible partial write overfetch in L3 - media
[09:08:36] [PASSED] gt_tunings/Tuning: L2 Overfetch Compressible Only
[09:08:36] [PASSED] gt_tunings/Tuning: L2 Overfetch Compressible Only - media
[09:08:36] [PASSED] gt_tunings/Tuning: Stateless compression control
[09:08:36] [PASSED] gt_tunings/Tuning: Stateless compression control - media
[09:08:36] [PASSED] gt_tunings/Tuning: L3 RW flush all Cache
[09:08:36] [PASSED] gt_tunings/Tuning: L3 RW flush all cache - media
[09:08:36] [PASSED] gt_tunings/Tuning: Set STLB Bank Hash Mode to 4KB
[09:08:36] ============== [PASSED] xe_rtp_table_gt_test ===============
[09:08:36] ================== xe_rtp_table_oob_test  ==================
[09:08:36] [PASSED] oob_was/1607983814
[09:08:36] [PASSED] oob_was/16010904313
[09:08:36] [PASSED] oob_was/18022495364
[09:08:36] [PASSED] oob_was/22012773006
[09:08:36] [PASSED] oob_was/14014475959
[09:08:36] [PASSED] oob_was/22011391025
[09:08:36] [PASSED] oob_was/22012727170
[09:08:36] [PASSED] oob_was/22012727685
[09:08:36] [PASSED] oob_was/22016596838
[09:08:36] [PASSED] oob_was/18020744125
[09:08:36] [PASSED] oob_was/1409600907
[09:08:36] [PASSED] oob_was/22014953428
[09:08:36] [PASSED] oob_was/16017236439
[09:08:36] [PASSED] oob_was/14019821291
[09:08:36] [PASSED] oob_was/14015076503
[09:08:36] [PASSED] oob_was/14018913170
[09:08:36] [PASSED] oob_was/14018094691
[09:08:36] [PASSED] oob_was/18024947630
[09:08:36] [PASSED] oob_was/16022287689
[09:08:36] [PASSED] oob_was/13011645652
[09:08:36] [PASSED] oob_was/14022293748
[09:08:36] [PASSED] oob_was/22019794406
[09:08:36] [PASSED] oob_was/22019338487
[09:08:36] [PASSED] oob_was/16023588340
[09:08:36] [PASSED] oob_was/14019789679
[09:08:36] [PASSED] oob_was/14022866841
[09:08:36] [PASSED] oob_was/16021333562
[09:08:36] [PASSED] oob_was/14016712196
[09:08:36] [PASSED] oob_was/14015568240
[09:08:36] [PASSED] oob_was/18013179988
[09:08:36] [PASSED] oob_was/1508761755
[09:08:36] [PASSED] oob_was/16023105232
[09:08:36] [PASSED] oob_was/16026508708
[09:08:36] [PASSED] oob_was/14020001231
[09:08:36] [PASSED] oob_was/16023683509
[09:08:36] [PASSED] oob_was/14025515070
[09:08:36] [PASSED] oob_was/15015404425_disable
[09:08:36] [PASSED] oob_was/16026007364
[09:08:36] [PASSED] oob_was/14020316580
[09:08:36] [PASSED] oob_was/14025883347
[09:08:36] [PASSED] oob_was/16029380221
[09:08:36] [PASSED] oob_was/22022079272
[09:08:36] [PASSED] oob_was/16029897822
[09:08:36] [PASSED] oob_was/14027054324
[09:08:36] ============== [PASSED] xe_rtp_table_oob_test ==============
[09:08:36] ================ xe_rtp_table_dev_oob_test  ================
[09:08:36] [PASSED] device_oob_was/22010954014
[09:08:36] [PASSED] device_oob_was/15015404425
[09:08:36] [PASSED] device_oob_was/22019338487_display
[09:08:36] [PASSED] device_oob_was/14022085890
[09:08:36] [PASSED] device_oob_was/14026539277
[09:08:36] [PASSED] device_oob_was/14026633728
[09:08:36] [PASSED] device_oob_was/14026746987
[09:08:36] [PASSED] device_oob_was/14026779378
[09:08:36] ============ [PASSED] xe_rtp_table_dev_oob_test ============
[09:08:36] ========== xe_rtp_table_missing_upper_bound_test  ==========
[09:08:36] [PASSED] register_whitelist/WaAllowPMDepthAndInvocationCountAccessFromUMD, 1408556865
[09:08:36] [PASSED] register_whitelist/1508744258, 14012131227, 1808121037
[09:08:36] [PASSED] register_whitelist/1806527549
[09:08:36] [PASSED] register_whitelist/allow_read_ctx_timestamp
[09:08:36] [PASSED] register_whitelist/allow_read_queue_timestamp
[09:08:36] [PASSED] register_whitelist/16014440446
[09:08:36] [PASSED] register_whitelist/16017236439
[09:08:36] [PASSED] register_whitelist/16020183090
[09:08:36] [PASSED] register_whitelist/14024997852
[09:08:36] [PASSED] register_whitelist/14024997852
[09:08:36] ====== [PASSED] xe_rtp_table_missing_upper_bound_test ======
[09:08:36] =============== [PASSED] xe_rtp_tables_test ================
[09:08:36] =================== xe_rtp (3 subtests) ====================
[09:08:36] =================== xe_rtp_rules_tests  ====================
[09:08:36] [PASSED] no
[09:08:36] [PASSED] yes
[09:08:36] [PASSED] no-and-no
[09:08:36] [PASSED] no-and-yes
[09:08:36] [PASSED] yes-and-no
[09:08:36] [PASSED] yes-and-yes
[09:08:36] [PASSED] no-or-no
[09:08:36] [PASSED] no-or-yes
[09:08:36] [PASSED] yes-or-no
[09:08:36] [PASSED] yes-or-yes
[09:08:36] [PASSED] no-yes-or-yes-no
[09:08:36] [PASSED] no-yes-or-yes-yes
[09:08:36] [PASSED] yes-yes-or-no-yes
[09:08:36] [PASSED] yes-yes-or-yes-yes
[09:08:36] [PASSED] no-no-or-yes-or-no
[09:08:36] [PASSED] or
[09:08:36] [PASSED] or-yes
[09:08:36] [PASSED] or-no
[09:08:36] [PASSED] yes-or
[09:08:36] [PASSED] no-or
[09:08:36] [PASSED] no-or-or-yes
[09:08:36] [PASSED] yes-or-or-no
[09:08:36] [PASSED] no-or-or-no
[09:08:36] [PASSED] missing-context-engine-class
[09:08:36] [PASSED] missing-context-engine-class-or-yes
[09:08:36] [PASSED] missing-context-engine-class-or-or-yes
[09:08:36] =============== [PASSED] xe_rtp_rules_tests ================
[09:08:36] =============== xe_rtp_process_to_sr_tests  ================
[09:08:36] [PASSED] coalesce-same-reg
[09:08:36] [PASSED] coalesce-same-reg-literal-and-func
[09:08:36] [PASSED] no-match-no-add
[09:08:36] [PASSED] two-regs-two-entries
[09:08:36] [PASSED] clr-one-set-other
[09:08:36] [PASSED] set-field
[09:08:36] [PASSED] conflict-duplicate
[09:08:36] [PASSED] conflict-not-disjoint
[09:08:36] [PASSED] conflict-not-disjoint-literal-and-func
[09:08:36] [PASSED] conflict-reg-type
[09:08:36] [PASSED] bad-mcr-reg-forced-to-regular
[09:08:36] [PASSED] bad-regular-reg-forced-to-mcr
[09:08:36] =========== [PASSED] xe_rtp_process_to_sr_tests ============
[09:08:36] ================== xe_rtp_process_tests  ===================
[09:08:36] [PASSED] active1
[09:08:36] [PASSED] active2
[09:08:36] [PASSED] active-inactive
[09:08:36] [PASSED] inactive-active
[09:08:36] [PASSED] inactive-active-inactive
[09:08:36] [PASSED] inactive-inactive-inactive
[09:08:36] ============== [PASSED] xe_rtp_process_tests ===============
[09:08:36] ===================== [PASSED] xe_rtp ======================
[09:08:36] ==================== xe_wa (1 subtest) =====================
[09:08:36] ======================== xe_wa_gt  =========================
[09:08:36] [PASSED] TIGERLAKE B0
[09:08:36] [PASSED] DG1 A0
[09:08:36] [PASSED] DG1 B0
[09:08:36] [PASSED] ALDERLAKE_S A0
[09:08:36] [PASSED] ALDERLAKE_S B0
[09:08:36] [PASSED] ALDERLAKE_S C0
[09:08:36] [PASSED] ALDERLAKE_S D0
[09:08:36] [PASSED] ALDERLAKE_P A0
[09:08:36] [PASSED] ALDERLAKE_P B0
[09:08:36] [PASSED] ALDERLAKE_P C0
[09:08:36] [PASSED] ALDERLAKE_S RPLS D0
[09:08:36] [PASSED] ALDERLAKE_P RPLU E0
[09:08:36] [PASSED] DG2 G10 C0
[09:08:36] [PASSED] DG2 G11 B1
[09:08:36] [PASSED] DG2 G12 A1
[09:08:36] [PASSED] METEORLAKE 12.70(Xe_LPG) A0 13.00(Xe_LPM+) A0
[09:08:36] [PASSED] METEORLAKE 12.71(Xe_LPG) A0 13.00(Xe_LPM+) A0
[09:08:36] [PASSED] METEORLAKE 12.74(Xe_LPG+) A0 13.00(Xe_LPM+) A0
[09:08:36] [PASSED] LUNARLAKE 20.04(Xe2_LPG) A0 20.00(Xe2_LPM) A0
[09:08:36] [PASSED] LUNARLAKE 20.04(Xe2_LPG) B0 20.00(Xe2_LPM) A0
[09:08:36] [PASSED] BATTLEMAGE 20.01(Xe2_HPG) A0 13.01(Xe2_HPM) A1
[09:08:36] [PASSED] PANTHERLAKE 30.00(Xe3_LPG) A0 30.00(Xe3_LPM) A0
[09:08:36] ==================== [PASSED] xe_wa_gt =====================
[09:08:36] ====================== [PASSED] xe_wa ======================
[09:08:36] ============================================================
[09:08:36] Testing complete. Ran 793 tests: passed: 765, skipped: 28
[09:08:36] Elapsed time: 36.223s total, 1.810s configuring, 33.697s building, 0.683s running

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

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

+ for kcfg in "${kunitconfigs[@]}"
+ [[ ! -f /kernel/drivers/dma-buf/.kunitconfig ]]
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/dma-buf/.kunitconfig
[09:09:15] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[09:09:17] 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
[09:09:26] Starting KUnit Kernel (1/1)...
[09:09:26] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[09:09:26] ============= refcount_interrupt (4 subtests) ==============
[09:09:26] [PASSED] test_single_irq_change
[09:09:26] [PASSED] test_nested_irq_change
[09:09:26] [PASSED] test_multiple_irq_change
[09:09:26] [PASSED] test_irq_save
[09:09:26] =============== [PASSED] refcount_interrupt ================
[09:09:26] =============== dma-buf-fence (12 subtests) ================
[09:09:26] [PASSED] test_sanitycheck
[09:09:26] [PASSED] test_signaling
[09:09:26] [PASSED] test_add_callback
[09:09:26] [PASSED] test_late_add_callback
[09:09:26] [PASSED] test_rm_callback
[09:09:26] [PASSED] test_late_rm_callback
[09:09:26] [PASSED] test_status
[09:09:26] [PASSED] test_error
[09:09:26] [PASSED] test_wait
[09:09:26] [PASSED] test_wait_timeout
[09:09:26] [PASSED] test_stub
[09:09:26] [SKIPPED] test_race_signal_callback (requires at least 2 CPUs)
[09:09:26] ================== [PASSED] dma-buf-fence ==================
[09:09:26] ============ dma-buf-fence-chain (11 subtests) =============
[09:09:26] [PASSED] test_sanitycheck
[09:09:26] [PASSED] test_find_seqno
[09:09:26] [PASSED] test_find_signaled
[09:09:26] [PASSED] test_find_out_of_order
[09:09:31] [PASSED] test_find_gap
[09:09:31] [PASSED] test_find_race
[09:09:31] [PASSED] test_signal_forward
[09:09:31] [PASSED] test_signal_backward
[09:09:31] [PASSED] test_wait_forward
[09:09:31] [PASSED] test_wait_backward
[09:09:31] [PASSED] test_wait_random
[09:09:31] =============== [PASSED] dma-buf-fence-chain ===============
[09:09:31] ============ dma-buf-fence-unwrap (10 subtests) ============
[09:09:31] [PASSED] test_sanitycheck
[09:09:31] [PASSED] test_unwrap_array
[09:09:31] [PASSED] test_unwrap_chain
[09:09:31] [PASSED] test_unwrap_chain_array
[09:09:31] [PASSED] test_unwrap_merge
[09:09:31] [PASSED] test_unwrap_merge_duplicate
[09:09:31] [PASSED] test_unwrap_merge_seqno
[09:09:31] [PASSED] test_unwrap_merge_order
[09:09:31] [PASSED] test_unwrap_merge_complex
[09:09:31] [PASSED] test_unwrap_merge_complex_seqno
[09:09:31] ============== [PASSED] dma-buf-fence-unwrap ===============
[09:09:31] ================ dma-buf-resv (5 subtests) =================
[09:09:31] [PASSED] test_sanitycheck
[09:09:31] ===================== test_signaling  ======================
[09:09:31] [PASSED] kernel
[09:09:31] [PASSED] write
[09:09:31] [PASSED] read
[09:09:31] [PASSED] bookkeep
[09:09:31] ================= [PASSED] test_signaling ==================
[09:09:31] ====================== test_for_each  ======================
[09:09:31] [PASSED] kernel
[09:09:31] [PASSED] write
[09:09:31] [PASSED] read
[09:09:31] [PASSED] bookkeep
[09:09:31] ================== [PASSED] test_for_each ==================
[09:09:31] ================= test_for_each_unlocked  ==================
[09:09:31] [PASSED] kernel
[09:09:31] [PASSED] write
[09:09:31] [PASSED] read
[09:09:31] [PASSED] bookkeep
[09:09:31] ============= [PASSED] test_for_each_unlocked ==============
[09:09:31] ===================== test_get_fences  =====================
[09:09:31] [PASSED] kernel
[09:09:31] [PASSED] write
[09:09:31] [PASSED] read
[09:09:31] [PASSED] bookkeep
[09:09:31] ================= [PASSED] test_get_fences =================
[09:09:31] ================== [PASSED] dma-buf-resv ===================
[09:09:31] ============================================================
[09:09:31] Testing complete. Ran 54 tests: passed: 53, skipped: 1
[09:09:31] Elapsed time: 15.844s total, 1.802s configuring, 8.720s building, 5.272s running

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



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

* ✓ Xe.CI.BAT: success for drm/gpusvm: share one HMM fault across per-device DMA mappings (rev2)
  2026-09-01  9:00 [PATCH v2 0/4] drm/gpusvm: share one HMM fault across per-device DMA mappings Honglei Huang
                   ` (4 preceding siblings ...)
  2026-09-01  9:09 ` ✓ CI.KUnit: success for drm/gpusvm: share one HMM fault across per-device DMA mappings (rev2) Patchwork
@ 2026-09-01 10:04 ` Patchwork
  2026-09-01 10:52 ` ✓ Xe.CI.FULL: " Patchwork
  6 siblings, 0 replies; 15+ messages in thread
From: Patchwork @ 2026-09-01 10:04 UTC (permalink / raw)
  To: Huang, Honglei; +Cc: intel-xe

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

== Series Details ==

Series: drm/gpusvm: share one HMM fault across per-device DMA mappings (rev2)
URL   : https://patchwork.freedesktop.org/series/172838/
State : success

== Summary ==

CI Bug Log - changes from xe-5665-43b9a5e9d30783bb6f4d7dacdd1739184666940f_BAT -> xe-pw-172838v2_BAT
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  

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

  No changes in participating hosts


Changes
-------

  No changes found


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

  * Linux: xe-5665-43b9a5e9d30783bb6f4d7dacdd1739184666940f -> xe-pw-172838v2

  IGT_9078: 9078
  xe-5665-43b9a5e9d30783bb6f4d7dacdd1739184666940f: 43b9a5e9d30783bb6f4d7dacdd1739184666940f
  xe-pw-172838v2: 172838v2

== Logs ==

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

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

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

* ✓ Xe.CI.FULL: success for drm/gpusvm: share one HMM fault across per-device DMA mappings (rev2)
  2026-09-01  9:00 [PATCH v2 0/4] drm/gpusvm: share one HMM fault across per-device DMA mappings Honglei Huang
                   ` (5 preceding siblings ...)
  2026-09-01 10:04 ` ✓ Xe.CI.BAT: " Patchwork
@ 2026-09-01 10:52 ` Patchwork
  6 siblings, 0 replies; 15+ messages in thread
From: Patchwork @ 2026-09-01 10:52 UTC (permalink / raw)
  To: Huang, Honglei; +Cc: intel-xe

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

== Series Details ==

Series: drm/gpusvm: share one HMM fault across per-device DMA mappings (rev2)
URL   : https://patchwork.freedesktop.org/series/172838/
State : success

== Summary ==

CI Bug Log - changes from xe-5665-43b9a5e9d30783bb6f4d7dacdd1739184666940f_FULL -> xe-pw-172838v2_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-172838v2_FULL that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@intel_hwmon@hwmon-write:
    - shard-lnl:          NOTRUN -> [SKIP][1] ([Intel XE#1125] / [Intel XE#7312])
   [1]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-1/igt@intel_hwmon@hwmon-write.html

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

  * igt@kms_big_fb@linear-max-hw-stride-32bpp-rotate-0-hflip:
    - shard-lnl:          NOTRUN -> [SKIP][3] ([Intel XE#7059] / [Intel XE#7085])
   [3]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-4/igt@kms_big_fb@linear-max-hw-stride-32bpp-rotate-0-hflip.html

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

  * igt@kms_big_fb@y-tiled-addfb:
    - shard-lnl:          NOTRUN -> [SKIP][5] ([Intel XE#1467] / [Intel XE#7367])
   [5]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-2/igt@kms_big_fb@y-tiled-addfb.html

  * igt@kms_big_fb@yf-tiled-max-hw-stride-64bpp-rotate-180-hflip:
    - shard-lnl:          NOTRUN -> [SKIP][6] ([Intel XE#1124]) +8 other tests skip
   [6]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-2/igt@kms_big_fb@yf-tiled-max-hw-stride-64bpp-rotate-180-hflip.html

  * igt@kms_bw@connected-linear-tiling-4-displays-target-2560x1440p:
    - shard-lnl:          NOTRUN -> [SKIP][7] ([Intel XE#8365]) +1 other test skip
   [7]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-4/igt@kms_bw@connected-linear-tiling-4-displays-target-2560x1440p.html

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

  * igt@kms_bw@linear-tiling-2-displays-target-1920x1080p:
    - shard-lnl:          NOTRUN -> [SKIP][9] ([Intel XE#367]) +1 other test skip
   [9]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-1/igt@kms_bw@linear-tiling-2-displays-target-1920x1080p.html

  * igt@kms_ccs@crc-primary-rotation-180-4-tiled-bmg-ccs@pipe-b-edp-1:
    - shard-lnl:          NOTRUN -> [SKIP][10] ([Intel XE#2669] / [Intel XE#7389]) +3 other tests skip
   [10]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-1/igt@kms_ccs@crc-primary-rotation-180-4-tiled-bmg-ccs@pipe-b-edp-1.html

  * igt@kms_ccs@crc-primary-rotation-180-y-tiled-gen12-rc-ccs:
    - shard-lnl:          NOTRUN -> [SKIP][11] ([Intel XE#2887]) +11 other tests skip
   [11]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-1/igt@kms_ccs@crc-primary-rotation-180-y-tiled-gen12-rc-ccs.html

  * igt@kms_ccs@crc-primary-suspend-4-tiled-bmg-ccs@pipe-a-edp-1:
    - shard-lnl:          NOTRUN -> [SKIP][12] ([Intel XE#2669] / [Intel XE#3433] / [Intel XE#7389]) +3 other tests skip
   [12]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-2/igt@kms_ccs@crc-primary-suspend-4-tiled-bmg-ccs@pipe-a-edp-1.html

  * igt@kms_ccs@crc-primary-suspend-y-tiled-gen12-rc-ccs-cc:
    - shard-lnl:          NOTRUN -> [SKIP][13] ([Intel XE#3432]) +2 other tests skip
   [13]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-4/igt@kms_ccs@crc-primary-suspend-y-tiled-gen12-rc-ccs-cc.html

  * igt@kms_ccs@missing-ccs-buffer-y-tiled-ccs:
    - shard-bmg:          NOTRUN -> [SKIP][14] ([Intel XE#2887]) +4 other tests skip
   [14]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-bmg-4/igt@kms_ccs@missing-ccs-buffer-y-tiled-ccs.html

  * igt@kms_cdclk@plane-scaling:
    - shard-lnl:          NOTRUN -> [SKIP][15] ([Intel XE#4416] / [Intel XE#7381]) +3 other tests skip
   [15]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-1/igt@kms_cdclk@plane-scaling.html

  * igt@kms_chamelium_audio@hdmi-audio-after-suspend:
    - shard-lnl:          NOTRUN -> [SKIP][16] ([Intel XE#2252])
   [16]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-4/igt@kms_chamelium_audio@hdmi-audio-after-suspend.html

  * igt@kms_chamelium_color@ctm-blue-to-red:
    - shard-lnl:          NOTRUN -> [SKIP][17] ([Intel XE#306] / [Intel XE#7358])
   [17]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-2/igt@kms_chamelium_color@ctm-blue-to-red.html

  * igt@kms_chamelium_color@ctm-red-to-blue:
    - shard-bmg:          NOTRUN -> [SKIP][18] ([Intel XE#2325] / [Intel XE#7358])
   [18]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-bmg-4/igt@kms_chamelium_color@ctm-red-to-blue.html

  * igt@kms_chamelium_edid@hdmi-edid-change-during-suspend:
    - shard-lnl:          NOTRUN -> [SKIP][19] ([Intel XE#373]) +8 other tests skip
   [19]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-1/igt@kms_chamelium_edid@hdmi-edid-change-during-suspend.html

  * igt@kms_chamelium_hpd@dp-hpd-storm-disable:
    - shard-bmg:          NOTRUN -> [SKIP][20] ([Intel XE#2252])
   [20]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-bmg-4/igt@kms_chamelium_hpd@dp-hpd-storm-disable.html

  * igt@kms_content_protection@content-type-change:
    - shard-lnl:          NOTRUN -> [SKIP][21] ([Intel XE#7642])
   [21]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-1/igt@kms_content_protection@content-type-change.html

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

  * igt@kms_content_protection@dp-mst-type-1-suspend-resume:
    - shard-bmg:          NOTRUN -> [SKIP][23] ([Intel XE#6974])
   [23]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-bmg-4/igt@kms_content_protection@dp-mst-type-1-suspend-resume.html

  * igt@kms_content_protection@mei-interface:
    - shard-lnl:          NOTRUN -> [SKIP][24] ([Intel XE#1468] / [Intel XE#7396])
   [24]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-2/igt@kms_content_protection@mei-interface.html

  * igt@kms_cursor_crc@cursor-onscreen-128x42:
    - shard-lnl:          NOTRUN -> [SKIP][25] ([Intel XE#1424]) +5 other tests skip
   [25]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-2/igt@kms_cursor_crc@cursor-onscreen-128x42.html

  * igt@kms_cursor_crc@cursor-onscreen-512x170:
    - shard-lnl:          NOTRUN -> [SKIP][26] ([Intel XE#2321] / [Intel XE#7355])
   [26]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-1/igt@kms_cursor_crc@cursor-onscreen-512x170.html

  * igt@kms_cursor_legacy@cursorb-vs-flipa-legacy:
    - shard-lnl:          NOTRUN -> [SKIP][27] ([Intel XE#309] / [Intel XE#7343]) +6 other tests skip
   [27]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-1/igt@kms_cursor_legacy@cursorb-vs-flipa-legacy.html

  * igt@kms_cursor_legacy@flip-vs-cursor-legacy:
    - shard-bmg:          [PASS][28] -> [FAIL][29] ([Intel XE#7809])
   [28]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5665-43b9a5e9d30783bb6f4d7dacdd1739184666940f/shard-bmg-10/igt@kms_cursor_legacy@flip-vs-cursor-legacy.html
   [29]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-bmg-4/igt@kms_cursor_legacy@flip-vs-cursor-legacy.html

  * igt@kms_display_modes@extended-mode-basic:
    - shard-lnl:          NOTRUN -> [SKIP][30] ([Intel XE#4302])
   [30]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-1/igt@kms_display_modes@extended-mode-basic.html

  * igt@kms_dp_link_training@non-uhbr-mst:
    - shard-bmg:          NOTRUN -> [SKIP][31] ([Intel XE#4354] / [Intel XE#5882])
   [31]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-bmg-4/igt@kms_dp_link_training@non-uhbr-mst.html

  * igt@kms_dsc@dsc-fractional-bpp:
    - shard-bmg:          NOTRUN -> [SKIP][32] ([Intel XE#8265])
   [32]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-bmg-4/igt@kms_dsc@dsc-fractional-bpp.html

  * igt@kms_dsc@dsc-with-output-formats-with-bpc-ultrajoiner:
    - shard-lnl:          NOTRUN -> [SKIP][33] ([Intel XE#8265]) +4 other tests skip
   [33]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-4/igt@kms_dsc@dsc-with-output-formats-with-bpc-ultrajoiner.html

  * igt@kms_feature_discovery@display-2x:
    - shard-lnl:          NOTRUN -> [SKIP][34] ([Intel XE#702] / [Intel XE#7344])
   [34]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-1/igt@kms_feature_discovery@display-2x.html

  * igt@kms_flip@2x-flip-vs-dpms:
    - shard-lnl:          NOTRUN -> [SKIP][35] ([Intel XE#1421]) +9 other tests skip
   [35]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-4/igt@kms_flip@2x-flip-vs-dpms.html

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

  * igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-16bpp-4tile-downscaling:
    - shard-lnl:          NOTRUN -> [SKIP][37] ([Intel XE#1397] / [Intel XE#1745] / [Intel XE#7385]) +2 other tests skip
   [37]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-2/igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-16bpp-4tile-downscaling.html

  * igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tile-downscaling@pipe-a-default-mode:
    - shard-lnl:          NOTRUN -> [SKIP][38] ([Intel XE#1397] / [Intel XE#7385]) +2 other tests skip
   [38]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-1/igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tile-downscaling@pipe-a-default-mode.html

  * igt@kms_flip_scaled_crc@flip-64bpp-yftile-to-16bpp-yftile-upscaling:
    - shard-lnl:          NOTRUN -> [SKIP][39] ([Intel XE#7178] / [Intel XE#7351]) +3 other tests skip
   [39]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-2/igt@kms_flip_scaled_crc@flip-64bpp-yftile-to-16bpp-yftile-upscaling.html

  * igt@kms_flip_scaled_crc@flip-nv12-linear-to-nv12-linear-reflect-x:
    - shard-bmg:          NOTRUN -> [SKIP][40] ([Intel XE#7179])
   [40]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-bmg-4/igt@kms_flip_scaled_crc@flip-nv12-linear-to-nv12-linear-reflect-x.html

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

  * igt@kms_frontbuffer_tracking@drrs-2p-primscrn-pri-indfb-draw-blt:
    - shard-lnl:          NOTRUN -> [SKIP][42] ([Intel XE#656] / [Intel XE#7905]) +37 other tests skip
   [42]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-1/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-pri-indfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@drrs-modesetfrombusy:
    - shard-lnl:          NOTRUN -> [SKIP][43] ([Intel XE#6312] / [Intel XE#651]) +8 other tests skip
   [43]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-2/igt@kms_frontbuffer_tracking@drrs-modesetfrombusy.html

  * igt@kms_frontbuffer_tracking@drrshdr-abgr161616f-draw-render:
    - shard-lnl:          NOTRUN -> [SKIP][44] ([Intel XE#7061]) +4 other tests skip
   [44]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-2/igt@kms_frontbuffer_tracking@drrshdr-abgr161616f-draw-render.html

  * igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-shrfb-msflip-blt:
    - shard-bmg:          NOTRUN -> [SKIP][45] ([Intel XE#4141]) +3 other tests skip
   [45]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-bmg-4/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-shrfb-msflip-blt.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-1p-offscreen-pri-indfb-draw-blt:
    - shard-lnl:          NOTRUN -> [SKIP][46] ([Intel XE#6312]) +19 other tests skip
   [46]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-1/igt@kms_frontbuffer_tracking@fbcdrrs-1p-offscreen-pri-indfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@fbcdrrshdr-2p-scndscrn-cur-indfb-draw-render:
    - shard-lnl:          NOTRUN -> [SKIP][47] ([Intel XE#7905]) +44 other tests skip
   [47]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-2/igt@kms_frontbuffer_tracking@fbcdrrshdr-2p-scndscrn-cur-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@fbchdr-argb161616f-draw-mmap-wc:
    - shard-bmg:          NOTRUN -> [SKIP][48] ([Intel XE#7061])
   [48]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-bmg-4/igt@kms_frontbuffer_tracking@fbchdr-argb161616f-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@fbcpsrhdr-1p-primscrn-cur-indfb-draw-blt:
    - shard-lnl:          NOTRUN -> [SKIP][49] ([Intel XE#7865]) +27 other tests skip
   [49]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-4/igt@kms_frontbuffer_tracking@fbcpsrhdr-1p-primscrn-cur-indfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@fbcpsrhdr-tiling-y:
    - shard-bmg:          NOTRUN -> [SKIP][50] ([Intel XE#7399])
   [50]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-bmg-4/igt@kms_frontbuffer_tracking@fbcpsrhdr-tiling-y.html

  * igt@kms_frontbuffer_tracking@psr-argb161616f-draw-blt:
    - shard-lnl:          NOTRUN -> [SKIP][51] ([Intel XE#7061] / [Intel XE#7356]) +3 other tests skip
   [51]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-4/igt@kms_frontbuffer_tracking@psr-argb161616f-draw-blt.html

  * igt@kms_frontbuffer_tracking@psrhdr-1p-pri-indfb-multidraw:
    - shard-bmg:          NOTRUN -> [SKIP][52] ([Intel XE#2313]) +12 other tests skip
   [52]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-bmg-4/igt@kms_frontbuffer_tracking@psrhdr-1p-pri-indfb-multidraw.html

  * igt@kms_hdr@brightness-with-hdr:
    - shard-lnl:          NOTRUN -> [SKIP][53] ([Intel XE#3374] / [Intel XE#3544])
   [53]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-1/igt@kms_hdr@brightness-with-hdr.html

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

  * igt@kms_joiner@invalid-modeset-force-big-joiner:
    - shard-lnl:          NOTRUN -> [SKIP][55] ([Intel XE#7086] / [Intel XE#7390])
   [55]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-1/igt@kms_joiner@invalid-modeset-force-big-joiner.html

  * igt@kms_mst@mst-suspend-read-crc:
    - shard-lnl:          NOTRUN -> [SKIP][56] ([Intel XE#8348])
   [56]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-2/igt@kms_mst@mst-suspend-read-crc.html

  * igt@kms_plane@pixel-format-4-tiled-dg2-rc-ccs-modifier:
    - shard-bmg:          NOTRUN -> [SKIP][57] ([Intel XE#7283]) +1 other test skip
   [57]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-bmg-4/igt@kms_plane@pixel-format-4-tiled-dg2-rc-ccs-modifier.html

  * igt@kms_plane@pixel-format-4-tiled-lnl-ccs-modifier@pipe-a-plane-5:
    - shard-lnl:          NOTRUN -> [SKIP][58] ([Intel XE#8303]) +1 other test skip
   [58]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-2/igt@kms_plane@pixel-format-4-tiled-lnl-ccs-modifier@pipe-a-plane-5.html

  * igt@kms_plane@pixel-format-4-tiled-mtl-mc-ccs-modifier:
    - shard-lnl:          NOTRUN -> [SKIP][59] ([Intel XE#7283]) +4 other tests skip
   [59]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-1/igt@kms_plane@pixel-format-4-tiled-mtl-mc-ccs-modifier.html

  * igt@kms_plane_lowres@tiling-none@pipe-b-edp-1:
    - shard-lnl:          NOTRUN -> [SKIP][60] ([Intel XE#599] / [Intel XE#7382]) +3 other tests skip
   [60]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-1/igt@kms_plane_lowres@tiling-none@pipe-b-edp-1.html

  * igt@kms_plane_multiple@2x-tiling-y:
    - shard-lnl:          NOTRUN -> [SKIP][61] ([Intel XE#4596] / [Intel XE#5854]) +1 other test skip
   [61]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-1/igt@kms_plane_multiple@2x-tiling-y.html

  * igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-5@pipe-a:
    - shard-lnl:          NOTRUN -> [SKIP][62] ([Intel XE#2763] / [Intel XE#6886]) +9 other tests skip
   [62]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-2/igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-5@pipe-a.html

  * igt@kms_pm_backlight@bad-brightness:
    - shard-bmg:          NOTRUN -> [SKIP][63] ([Intel XE#7376] / [Intel XE#7760] / [Intel XE#870])
   [63]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-bmg-4/igt@kms_pm_backlight@bad-brightness.html

  * igt@kms_pm_rpm@dpms-non-lpsp:
    - shard-lnl:          NOTRUN -> [SKIP][64] ([Intel XE#1439] / [Intel XE#3141] / [Intel XE#7383])
   [64]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-4/igt@kms_pm_rpm@dpms-non-lpsp.html

  * igt@kms_pm_rpm@package-g7:
    - shard-lnl:          NOTRUN -> [SKIP][65] ([Intel XE#6813])
   [65]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-4/igt@kms_pm_rpm@package-g7.html

  * igt@kms_psr2_sf@fbc-psr2-cursor-plane-move-continuous-exceed-sf:
    - shard-lnl:          NOTRUN -> [SKIP][66] ([Intel XE#2893] / [Intel XE#4608] / [Intel XE#7304])
   [66]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-1/igt@kms_psr2_sf@fbc-psr2-cursor-plane-move-continuous-exceed-sf.html

  * igt@kms_psr2_sf@fbc-psr2-cursor-plane-move-continuous-exceed-sf@pipe-a-edp-1:
    - shard-lnl:          NOTRUN -> [SKIP][67] ([Intel XE#4608])
   [67]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-1/igt@kms_psr2_sf@fbc-psr2-cursor-plane-move-continuous-exceed-sf@pipe-a-edp-1.html

  * igt@kms_psr2_sf@fbc-psr2-cursor-plane-move-continuous-exceed-sf@pipe-b-edp-1:
    - shard-lnl:          NOTRUN -> [SKIP][68] ([Intel XE#4608] / [Intel XE#7304])
   [68]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-1/igt@kms_psr2_sf@fbc-psr2-cursor-plane-move-continuous-exceed-sf@pipe-b-edp-1.html

  * igt@kms_psr2_sf@fbc-psr2-overlay-plane-move-continuous-exceed-sf:
    - shard-bmg:          NOTRUN -> [SKIP][69] ([Intel XE#1489])
   [69]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-bmg-4/igt@kms_psr2_sf@fbc-psr2-overlay-plane-move-continuous-exceed-sf.html

  * igt@kms_psr2_sf@pr-overlay-plane-move-continuous-sf:
    - shard-lnl:          NOTRUN -> [SKIP][70] ([Intel XE#2893] / [Intel XE#7304]) +4 other tests skip
   [70]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-1/igt@kms_psr2_sf@pr-overlay-plane-move-continuous-sf.html

  * igt@kms_psr2_su@page_flip-nv12:
    - shard-lnl:          NOTRUN -> [SKIP][71] ([Intel XE#1128] / [Intel XE#7413])
   [71]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-4/igt@kms_psr2_su@page_flip-nv12.html

  * igt@kms_psr@fbc-psr2-primary-blt@edp-1:
    - shard-lnl:          NOTRUN -> [SKIP][72] ([Intel XE#1406] / [Intel XE#4609] / [Intel XE#7345]) +2 other tests skip
   [72]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-1/igt@kms_psr@fbc-psr2-primary-blt@edp-1.html

  * igt@kms_psr@fbc-psr2-primary-render:
    - shard-lnl:          NOTRUN -> [SKIP][73] ([Intel XE#1406] / [Intel XE#7345]) +2 other tests skip
   [73]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-1/igt@kms_psr@fbc-psr2-primary-render.html

  * igt@kms_psr@pr-basic:
    - shard-bmg:          NOTRUN -> [SKIP][74] ([Intel XE#2234] / [Intel XE#2850]) +1 other test skip
   [74]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-bmg-4/igt@kms_psr@pr-basic.html

  * igt@kms_psr@pr-cursor-plane-move:
    - shard-lnl:          NOTRUN -> [SKIP][75] ([Intel XE#1406]) +2 other tests skip
   [75]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-1/igt@kms_psr@pr-cursor-plane-move.html

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

  * igt@kms_rotation_crc@primary-yf-tiled-reflect-x-0:
    - shard-bmg:          NOTRUN -> [SKIP][77] ([Intel XE#2330] / [Intel XE#5813])
   [77]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-bmg-4/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-0.html

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

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

  * igt@xe_ccs@vm-bind-decompress:
    - shard-lnl:          NOTRUN -> [SKIP][80] ([Intel XE#7644])
   [80]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-2/igt@xe_ccs@vm-bind-decompress.html

  * igt@xe_compute_preempt@compute-preempt-many-vram-evict:
    - shard-lnl:          NOTRUN -> [SKIP][81] ([Intel XE#5191] / [Intel XE#7316] / [Intel XE#7346])
   [81]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-1/igt@xe_compute_preempt@compute-preempt-many-vram-evict.html

  * igt@xe_configfs@survivability-mode:
    - shard-lnl:          NOTRUN -> [SKIP][82] ([Intel XE#8428])
   [82]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-1/igt@xe_configfs@survivability-mode.html

  * igt@xe_create@multigpu-create-massive-size:
    - shard-bmg:          NOTRUN -> [SKIP][83] ([Intel XE#2504] / [Intel XE#7319] / [Intel XE#7350])
   [83]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-bmg-4/igt@xe_create@multigpu-create-massive-size.html

  * igt@xe_evict@evict-beng-cm-threads-small:
    - shard-lnl:          NOTRUN -> [SKIP][84] ([Intel XE#6540] / [Intel XE#688]) +10 other tests skip
   [84]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-1/igt@xe_evict@evict-beng-cm-threads-small.html

  * igt@xe_exec_balancer@twice-cm-virtual-userptr-invalidate-race:
    - shard-lnl:          NOTRUN -> [SKIP][85] ([Intel XE#7482]) +19 other tests skip
   [85]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-2/igt@xe_exec_balancer@twice-cm-virtual-userptr-invalidate-race.html

  * igt@xe_exec_basic@multigpu-once-userptr-invalidate:
    - shard-lnl:          NOTRUN -> [SKIP][86] ([Intel XE#1392]) +9 other tests skip
   [86]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-2/igt@xe_exec_basic@multigpu-once-userptr-invalidate.html

  * igt@xe_exec_basic@multigpu-once-userptr-rebind:
    - shard-bmg:          NOTRUN -> [SKIP][87] ([Intel XE#2322] / [Intel XE#7372]) +1 other test skip
   [87]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-bmg-4/igt@xe_exec_basic@multigpu-once-userptr-rebind.html

  * igt@xe_exec_fault_mode@many-execqueues-multi-queue-userptr-invalidate-imm:
    - shard-bmg:          NOTRUN -> [SKIP][88] ([Intel XE#8374]) +1 other test skip
   [88]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-bmg-4/igt@xe_exec_fault_mode@many-execqueues-multi-queue-userptr-invalidate-imm.html

  * igt@xe_exec_fault_mode@once-multi-queue-userptr-rebind:
    - shard-lnl:          NOTRUN -> [SKIP][89] ([Intel XE#8374]) +10 other tests skip
   [89]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-2/igt@xe_exec_fault_mode@once-multi-queue-userptr-rebind.html

  * igt@xe_exec_multi_queue@many-execs-preempt-mode-userptr:
    - shard-lnl:          NOTRUN -> [SKIP][90] ([Intel XE#8364]) +28 other tests skip
   [90]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-2/igt@xe_exec_multi_queue@many-execs-preempt-mode-userptr.html

  * igt@xe_exec_multi_queue@two-queues-preempt-mode-priority-smem:
    - shard-bmg:          NOTRUN -> [SKIP][91] ([Intel XE#8364]) +6 other tests skip
   [91]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-bmg-4/igt@xe_exec_multi_queue@two-queues-preempt-mode-priority-smem.html

  * igt@xe_exec_reset@multi-queue-close-execqueues:
    - shard-lnl:          NOTRUN -> [SKIP][92] ([Intel XE#8369]) +1 other test skip
   [92]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-4/igt@xe_exec_reset@multi-queue-close-execqueues.html

  * igt@xe_exec_reset@multi-queue-long-spin-reuse-many-queue-switch:
    - shard-bmg:          NOTRUN -> [SKIP][93] ([Intel XE#8369])
   [93]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-bmg-4/igt@xe_exec_reset@multi-queue-long-spin-reuse-many-queue-switch.html

  * igt@xe_exec_threads@threads-multi-queue-cm-fd-userptr:
    - shard-bmg:          NOTRUN -> [SKIP][94] ([Intel XE#8378]) +2 other tests skip
   [94]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-bmg-4/igt@xe_exec_threads@threads-multi-queue-cm-fd-userptr.html

  * igt@xe_exec_threads@threads-multi-queue-cm-rebind:
    - shard-lnl:          NOTRUN -> [SKIP][95] ([Intel XE#8378]) +9 other tests skip
   [95]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-2/igt@xe_exec_threads@threads-multi-queue-cm-rebind.html

  * igt@xe_live_ktest@xe_migrate@xe_validate_ccs_kunit:
    - shard-lnl:          NOTRUN -> [SKIP][96] ([Intel XE#2229])
   [96]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-1/igt@xe_live_ktest@xe_migrate@xe_validate_ccs_kunit.html

  * igt@xe_madvise@atomic-device:
    - shard-lnl:          NOTRUN -> [SKIP][97] ([Intel XE#7980])
   [97]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-2/igt@xe_madvise@atomic-device.html

  * igt@xe_multigpu_svm@mgpu-coherency-prefetch:
    - shard-lnl:          NOTRUN -> [SKIP][98] ([Intel XE#6964]) +3 other tests skip
   [98]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-4/igt@xe_multigpu_svm@mgpu-coherency-prefetch.html

  * igt@xe_page_reclaim@binds-null-vma:
    - shard-lnl:          NOTRUN -> [SKIP][99] ([Intel XE#7793]) +1 other test skip
   [99]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-2/igt@xe_page_reclaim@binds-null-vma.html

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

  * igt@xe_pat@pat-sw-hw-reset-compare:
    - shard-lnl:          NOTRUN -> [FAIL][101] ([Intel XE#7695]) +2 other tests fail
   [101]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-2/igt@xe_pat@pat-sw-hw-reset-compare.html

  * igt@xe_pat@xa-app-transient-media-off:
    - shard-lnl:          NOTRUN -> [SKIP][102] ([Intel XE#7590] / [Intel XE#7772])
   [102]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-1/igt@xe_pat@xa-app-transient-media-off.html

  * igt@xe_pm@d3cold-multiple-execs:
    - shard-lnl:          NOTRUN -> [SKIP][103] ([Intel XE#2284] / [Intel XE#366] / [Intel XE#7370])
   [103]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-4/igt@xe_pm@d3cold-multiple-execs.html

  * igt@xe_pm@s3-vm-bind-userptr:
    - shard-lnl:          NOTRUN -> [SKIP][104] ([Intel XE#584] / [Intel XE#7369]) +1 other test skip
   [104]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-1/igt@xe_pm@s3-vm-bind-userptr.html

  * igt@xe_pm@vram-d3cold-threshold:
    - shard-lnl:          NOTRUN -> [SKIP][105] ([Intel XE#579] / [Intel XE#7329] / [Intel XE#7456])
   [105]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-1/igt@xe_pm@vram-d3cold-threshold.html

  * igt@xe_pm_residency@aspm_link_residency:
    - shard-lnl:          NOTRUN -> [SKIP][106] ([Intel XE#7271])
   [106]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-2/igt@xe_pm_residency@aspm_link_residency.html

  * igt@xe_pmu@fn-engine-activity-sched-if-idle:
    - shard-lnl:          NOTRUN -> [SKIP][107] ([Intel XE#4650] / [Intel XE#7347])
   [107]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-1/igt@xe_pmu@fn-engine-activity-sched-if-idle.html

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

  * igt@xe_sriov_auto_provisioning@selfconfig-basic:
    - shard-lnl:          NOTRUN -> [SKIP][109] ([Intel XE#4130] / [Intel XE#7366]) +1 other test skip
   [109]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-4/igt@xe_sriov_auto_provisioning@selfconfig-basic.html

  * igt@xe_sriov_scheduling@default-enabled-fair-scheduling:
    - shard-lnl:          NOTRUN -> [SKIP][110] ([Intel XE#8339])
   [110]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-2/igt@xe_sriov_scheduling@default-enabled-fair-scheduling.html

  * igt@xe_sriov_vfio@region-info:
    - shard-lnl:          NOTRUN -> [SKIP][111] ([Intel XE#7724])
   [111]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-2/igt@xe_sriov_vfio@region-info.html

  * igt@xe_vm@overcommit-nonfault-vram-lr-external-nodefer:
    - shard-lnl:          NOTRUN -> [SKIP][112] ([Intel XE#7892]) +1 other test skip
   [112]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-1/igt@xe_vm@overcommit-nonfault-vram-lr-external-nodefer.html

  * igt@xe_wedged@wedged-at-any-timeout:
    - shard-bmg:          NOTRUN -> [DMESG-WARN][113] ([Intel XE#8963])
   [113]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-bmg-4/igt@xe_wedged@wedged-at-any-timeout.html

  
#### Possible fixes ####

  * igt@kms_atomic_transition@plane-all-modeset-transition-fencing:
    - shard-bmg:          [FAIL][114] ([Intel XE#8098]) -> [PASS][115] +1 other test pass
   [114]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5665-43b9a5e9d30783bb6f4d7dacdd1739184666940f/shard-bmg-10/igt@kms_atomic_transition@plane-all-modeset-transition-fencing.html
   [115]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-bmg-4/igt@kms_atomic_transition@plane-all-modeset-transition-fencing.html

  * igt@kms_flip@flip-vs-expired-vblank-interruptible:
    - shard-lnl:          [FAIL][116] ([Intel XE#301]) -> [PASS][117] +1 other test pass
   [116]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5665-43b9a5e9d30783bb6f4d7dacdd1739184666940f/shard-lnl-3/igt@kms_flip@flip-vs-expired-vblank-interruptible.html
   [117]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-2/igt@kms_flip@flip-vs-expired-vblank-interruptible.html

  * igt@kms_flip@plain-flip-fb-recreate-interruptible:
    - shard-lnl:          [FAIL][118] ([Intel XE#3098] / [Intel XE#3149]) -> [PASS][119] +1 other test pass
   [118]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5665-43b9a5e9d30783bb6f4d7dacdd1739184666940f/shard-lnl-6/igt@kms_flip@plain-flip-fb-recreate-interruptible.html
   [119]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-6/igt@kms_flip@plain-flip-fb-recreate-interruptible.html

  * igt@kms_hdr@invalid-hdr:
    - shard-bmg:          [SKIP][120] ([Intel XE#1503]) -> [PASS][121]
   [120]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5665-43b9a5e9d30783bb6f4d7dacdd1739184666940f/shard-bmg-4/igt@kms_hdr@invalid-hdr.html
   [121]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-bmg-8/igt@kms_hdr@invalid-hdr.html

  * igt@xe_exec_threads@threads-hang-userptr-invalidate-race:
    - shard-bmg:          [FAIL][122] ([Intel XE#9096]) -> [PASS][123]
   [122]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5665-43b9a5e9d30783bb6f4d7dacdd1739184666940f/shard-bmg-2/igt@xe_exec_threads@threads-hang-userptr-invalidate-race.html
   [123]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-bmg-2/igt@xe_exec_threads@threads-hang-userptr-invalidate-race.html

  * igt@xe_fault_injection@inject-fault-probe-function-xe_wa_gt_init:
    - shard-bmg:          [ABORT][124] ([Intel XE#8007]) -> [PASS][125]
   [124]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5665-43b9a5e9d30783bb6f4d7dacdd1739184666940f/shard-bmg-10/igt@xe_fault_injection@inject-fault-probe-function-xe_wa_gt_init.html
   [125]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-bmg-4/igt@xe_fault_injection@inject-fault-probe-function-xe_wa_gt_init.html

  
#### Warnings ####

  * igt@kms_cursor_legacy@cursorb-vs-flipb-atomic-transitions:
    - shard-lnl:          [SKIP][126] ([Intel XE#309] / [Intel XE#7343]) -> [SKIP][127] ([Intel XE#309] / [Intel XE#7343] / [Intel XE#7935])
   [126]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5665-43b9a5e9d30783bb6f4d7dacdd1739184666940f/shard-lnl-2/igt@kms_cursor_legacy@cursorb-vs-flipb-atomic-transitions.html
   [127]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-lnl-8/igt@kms_cursor_legacy@cursorb-vs-flipb-atomic-transitions.html

  * igt@kms_tiled_display@basic-test-pattern:
    - shard-bmg:          [SKIP][128] ([Intel XE#2426] / [Intel XE#5848]) -> [FAIL][129] ([Intel XE#1729] / [Intel XE#7424])
   [128]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5665-43b9a5e9d30783bb6f4d7dacdd1739184666940f/shard-bmg-8/igt@kms_tiled_display@basic-test-pattern.html
   [129]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172838v2/shard-bmg-1/igt@kms_tiled_display@basic-test-pattern.html

  
  [Intel XE#1124]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1124
  [Intel XE#1125]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1125
  [Intel XE#1128]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1128
  [Intel XE#1392]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1392
  [Intel XE#1397]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1397
  [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#1467]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1467
  [Intel XE#1468]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1468
  [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#1745]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1745
  [Intel XE#2229]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2229
  [Intel XE#2234]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2234
  [Intel XE#2252]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2252
  [Intel XE#2284]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2284
  [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#2321]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2321
  [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#2330]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2330
  [Intel XE#2426]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2426
  [Intel XE#2504]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2504
  [Intel XE#2669]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2669
  [Intel XE#2763]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2763
  [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#3098]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3098
  [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#3374]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3374
  [Intel XE#3414]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3414
  [Intel XE#3432]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3432
  [Intel XE#3433]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3433
  [Intel XE#3544]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3544
  [Intel XE#366]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/366
  [Intel XE#367]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/367
  [Intel XE#373]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/373
  [Intel XE#3904]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3904
  [Intel XE#4130]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4130
  [Intel XE#4141]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4141
  [Intel XE#4302]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4302
  [Intel XE#4354]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4354
  [Intel XE#4416]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4416
  [Intel XE#4596]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4596
  [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#4650]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4650
  [Intel XE#5191]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5191
  [Intel XE#579]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/579
  [Intel XE#5813]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5813
  [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#5854]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5854
  [Intel XE#5882]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5882
  [Intel XE#599]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/599
  [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#656]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/656
  [Intel XE#6813]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6813
  [Intel XE#688]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/688
  [Intel XE#6886]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6886
  [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#702]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/702
  [Intel XE#7059]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7059
  [Intel XE#7061]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7061
  [Intel XE#7085]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7085
  [Intel XE#7086]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7086
  [Intel XE#7178]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7178
  [Intel XE#7179]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7179
  [Intel XE#7271]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7271
  [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#7312]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7312
  [Intel XE#7316]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7316
  [Intel XE#7319]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7319
  [Intel XE#7329]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7329
  [Intel XE#7342]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7342
  [Intel XE#7343]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7343
  [Intel XE#7344]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7344
  [Intel XE#7345]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7345
  [Intel XE#7346]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7346
  [Intel XE#7347]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7347
  [Intel XE#7350]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7350
  [Intel XE#7351]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7351
  [Intel XE#7355]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7355
  [Intel XE#7356]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7356
  [Intel XE#7358]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7358
  [Intel XE#7366]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7366
  [Intel XE#7367]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7367
  [Intel XE#7369]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7369
  [Intel XE#7370]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7370
  [Intel XE#7372]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7372
  [Intel XE#7376]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7376
  [Intel XE#7381]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7381
  [Intel XE#7382]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7382
  [Intel XE#7383]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7383
  [Intel XE#7385]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7385
  [Intel XE#7389]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7389
  [Intel XE#7390]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7390
  [Intel XE#7396]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7396
  [Intel XE#7399]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7399
  [Intel XE#7413]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7413
  [Intel XE#7424]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7424
  [Intel XE#7456]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7456
  [Intel XE#7482]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7482
  [Intel XE#7590]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7590
  [Intel XE#7642]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7642
  [Intel XE#7644]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7644
  [Intel XE#7679]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7679
  [Intel XE#7695]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7695
  [Intel XE#7724]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7724
  [Intel XE#7760]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7760
  [Intel XE#7772]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7772
  [Intel XE#7793]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7793
  [Intel XE#7809]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7809
  [Intel XE#7865]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7865
  [Intel XE#7892]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7892
  [Intel XE#7905]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7905
  [Intel XE#7935]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7935
  [Intel XE#7980]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7980
  [Intel XE#8007]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8007
  [Intel XE#8098]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8098
  [Intel XE#8265]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8265
  [Intel XE#8303]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8303
  [Intel XE#8339]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8339
  [Intel XE#8348]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8348
  [Intel XE#8364]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8364
  [Intel XE#8365]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8365
  [Intel XE#8369]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8369
  [Intel XE#8374]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8374
  [Intel XE#8378]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8378
  [Intel XE#8428]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8428
  [Intel XE#870]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/870
  [Intel XE#8963]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8963
  [Intel XE#9096]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9096
  [Intel XE#944]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/944


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

  * Linux: xe-5665-43b9a5e9d30783bb6f4d7dacdd1739184666940f -> xe-pw-172838v2

  IGT_9078: 9078
  xe-5665-43b9a5e9d30783bb6f4d7dacdd1739184666940f: 43b9a5e9d30783bb6f4d7dacdd1739184666940f
  xe-pw-172838v2: 172838v2

== Logs ==

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

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

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

* Re: [PATCH v2 1/4] drm/gpusvm: move dma_addr allocation before the notifier lock
  2026-09-01  9:00 ` [PATCH v2 1/4] drm/gpusvm: move dma_addr allocation before the notifier lock Honglei Huang
@ 2026-09-01 19:39   ` Matthew Brost
  2026-09-02  6:21     ` Huang, Honglei
  0 siblings, 1 reply; 15+ messages in thread
From: Matthew Brost @ 2026-09-01 19:39 UTC (permalink / raw)
  To: Honglei Huang
  Cc: sima, rodrigo.vivi, thomas.hellstrom, himal.prasad.ghimiray, dakr,
	intel-xe, aliceryhl, Alexander.Deucher, Felix.Kuehling,
	Christian.Koenig, Ray.Huang, Junhua.Shen, amd-gfx, dri-devel

On Tue, Sep 01, 2026 at 05:00:57PM +0800, Honglei Huang wrote:
> The dma_addr allocation was in a lazy allocation flow, it needs unlock
> and goto map_pages. The allocation only needs npages, so just do it
> before taking the lock. Drop the map_pages label and the relock flow, so
> the sequence becomes fault, allocate, then lock, validate, map and
> unlock. No functional change intended.
> 
> Signed-off-by: Honglei Huang <honghuan@amd.com>

One follow up suggestion below - not blocker for merging this series.
Feel free to implement this or at some point (we) Intel will get around
to this.

This patch is:
Reviewed-by: Matthew Brost <matthew.brost@intel.com>

> ---
>  drivers/gpu/drm/drm_gpusvm.c | 22 +++++++++-------------
>  1 file changed, 9 insertions(+), 13 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_gpusvm.c b/drivers/gpu/drm/drm_gpusvm.c
> index a93eee7ddb9..b507de539e6 100644
> --- a/drivers/gpu/drm/drm_gpusvm.c
> +++ b/drivers/gpu/drm/drm_gpusvm.c
> @@ -1516,10 +1516,18 @@ int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
>  	if (err)
>  		goto err_free;
>  
> +	if (!svm_pages->dma_addr) {
> +		svm_pages->dma_addr =
> +			kvzalloc_objs(*svm_pages->dma_addr, npages);

One thing that isn't great about the current code is that, regardless of
`npages`, the overwhelming majority of cases result in exactly one DMA
mapping. As a result, we end up wasting a significant amount of memory.
If an IOVA is allocated, we only ever need a single DMA mapping. Even
without IOVA support (e.g., `iommu=off` or `iommu=pt`), a 2 MiB backing
store implemented as a THP would still yield a single DMA mapping via
`dma_map_page()`.

Longer term, I'd like to do something like the structure changes below.
We would still preallocate unless `npages == 1`, but if
`drm_gpusvm_dma_map_pages()` finds exactly one DMA mapping, we could free
`dma_addr`, store the `drm_pagemap_addr` in `inline_addr`, and set an
`inline_dma_mapping` flag. This would save 8 KiB per page of
`drm_gpusvm_pages` for every 2 MiB THP-backed allocation.

Then the final piece is teach drivers to understand 'inline_dma_mapping'
in their iterators (xe_res_cursor.h in Xe) to correctly walk the
dma-mapping.

Matt 

diff --git a/include/drm/drm_gpusvm.h b/include/drm/drm_gpusvm.h
index b7d987bf76aa..73b7065610f0 100644
--- a/include/drm/drm_gpusvm.h
+++ b/include/drm/drm_gpusvm.h
@@ -121,6 +121,7 @@ struct drm_gpusvm_pages_flags {
                        u16 unmapped : 1;
                        u16 has_devmem_pages : 1;
                        u16 has_dma_mapping : 1;
+                       u16 inline_dma_mapping : 1;
                };
                u16 __flags;
        };
@@ -140,7 +141,10 @@ struct drm_gpusvm_pages_flags {
  */
 struct drm_gpusvm_pages {
        struct drm_device *drm;
-       struct drm_pagemap_addr *dma_addr;
+       union {
+               struct drm_pagemap_addr *dma_addr;
+               struct drm_pagemap_addr inline_addr;
+       };
        struct drm_pagemap *dpagemap;
        struct dma_iova_state state;
        unsigned long state_offset;


> +		if (!svm_pages->dma_addr) {
> +			err = -ENOMEM;
> +			goto err_free;
> +		}
> +	}
> +
>  	*state = (struct dma_iova_state){};
>  	svm_pages->state_offset = 0;
>  
> -map_pages:
>  	/*
>  	 * Perform all dma mappings under the notifier lock to not
>  	 * access freed pages. A notifier will either block on
> @@ -1540,18 +1548,6 @@ int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
>  		goto retry;
>  	}
>  
> -	if (!svm_pages->dma_addr) {
> -		/* Unlock and restart mapping to allocate memory. */
> -		drm_gpusvm_notifier_unlock(gpusvm);
> -		svm_pages->dma_addr =
> -			kvzalloc_objs(*svm_pages->dma_addr, npages);
> -		if (!svm_pages->dma_addr) {
> -			err = -ENOMEM;
> -			goto err_free;
> -		}
> -		goto map_pages;
> -	}
> -
>  	zdd = NULL;
>  	pagemap = NULL;
>  	num_dma_mapped = 0;
> -- 
> 2.34.1
> 

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

* Re: [PATCH v2 2/4] drm/gpusvm: extract drm_gpusvm_dma_map_pages() helper
  2026-09-01  9:00 ` [PATCH v2 2/4] drm/gpusvm: extract drm_gpusvm_dma_map_pages() helper Honglei Huang
@ 2026-09-01 19:43   ` Matthew Brost
  2026-09-02  6:22     ` Huang, Honglei
  0 siblings, 1 reply; 15+ messages in thread
From: Matthew Brost @ 2026-09-01 19:43 UTC (permalink / raw)
  To: Honglei Huang
  Cc: sima, rodrigo.vivi, thomas.hellstrom, himal.prasad.ghimiray, dakr,
	intel-xe, aliceryhl, Alexander.Deucher, Felix.Kuehling,
	Christian.Koenig, Ray.Huang, Junhua.Shen, amd-gfx, dri-devel

On Tue, Sep 01, 2026 at 05:00:58PM +0800, Honglei Huang wrote:
> Move the per-device DMA mapping loop of drm_gpusvm_get_pages() into a
> helper drm_gpusvm_dma_map_pages(). The mapping logic is only moved, not
> changed, so there is no functional change.
> 
> The helper maps the already-faulted pfns into one drm_gpusvm_pages
> instance under the notifier lock and unwinds its own partial mapping on
> error. The HMM fault and the notifier retry loop stay in get_pages()
> common code rather than being pushed down to drivers, so no driver has
> to reimplement the subtle fault and retry logic.
> 
> With the mapping isolated per instance, get_pages() can later fault once
> and DMA map an array of drm_gpusvm_pages plus a count, one per owning
> drm_device.
> 
> Suggested-by: Matthew Brost <matthew.brost@intel.com>

For some reason, Sashiko didn't run on this particular patch [1]. It
would be good to have it run through the tooling in case I'm missing
something.

That said, I can't spot anything incorrect, and this looks like a solid
cleanup.

With that:
Reviewed-by: Matthew Brost <matthew.brost@intel.com>

[1] https://sashiko.dev/#/patchset/20260901090100.2024933-1-honghuan%40amd.com

> Signed-off-by: Honglei Huang <honghuan@amd.com>
> ---
>  drivers/gpu/drm/drm_gpusvm.c | 225 ++++++++++++++++++++---------------
>  1 file changed, 129 insertions(+), 96 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_gpusvm.c b/drivers/gpu/drm/drm_gpusvm.c
> index b507de539e6..89c3061d8ef 100644
> --- a/drivers/gpu/drm/drm_gpusvm.c
> +++ b/drivers/gpu/drm/drm_gpusvm.c
> @@ -1442,115 +1442,41 @@ static bool drm_gpusvm_pages_valid_unlocked(struct drm_gpusvm *gpusvm,
>  }
>  
>  /**
> - * drm_gpusvm_get_pages() - Get pages and populate GPU SVM pages struct
> + * drm_gpusvm_dma_map_pages() - DMA map one drm_gpusvm_pages instance
>   * @gpusvm: Pointer to the GPU SVM structure
> - * @svm_pages: The SVM pages to populate. This will contain the dma-addresses
> - * @mm: The mm corresponding to the CPU range
> - * @notifier: The corresponding notifier for the given CPU range
> - * @pages_start: Start CPU address for the pages
> - * @pages_end: End CPU address for the pages (exclusive)
> + * @svm_pages: The SVM pages instance to populate with dma-addresses
> + * @pfns: The already-faulted pfn array (size @npages)
> + * @npages: Number of pages in the CPU range
>   * @ctx: GPU SVM context
> + * @dma_dir: DMA data direction for the mappings
>   *
> - * This function gets and maps pages for CPU range and ensures they are
> - * mapped for DMA access.
> + * Map the faulted @pfns into @svm_pages for DMA access through its owning
> + * drm_device. Must be called under the notifier lock. On failure this unwinds
> + * the partial mapping of this instance before returning.
>   *
>   * Return: 0 on success, negative error code on failure.
>   */
> -int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
> -			 struct drm_gpusvm_pages *svm_pages,
> -			 struct mm_struct *mm,
> -			 struct mmu_interval_notifier *notifier,
> -			 unsigned long pages_start, unsigned long pages_end,
> -			 const struct drm_gpusvm_ctx *ctx)
> +static int drm_gpusvm_dma_map_pages(struct drm_gpusvm *gpusvm,
> +				    struct drm_gpusvm_pages *svm_pages,
> +				    unsigned long *pfns,
> +				    unsigned long npages,
> +				    const struct drm_gpusvm_ctx *ctx,
> +				    enum dma_data_direction dma_dir)
>  {
> -	struct hmm_range hmm_range = {
> -		.default_flags = HMM_PFN_REQ_FAULT | (ctx->read_only ? 0 :
> -			HMM_PFN_REQ_WRITE),
> -		.notifier = notifier,
> -		.start = pages_start,
> -		.end = pages_end,
> -		.dev_private_owner = ctx->device_private_page_owner,
> -	};
> -	void *zdd;
> -	unsigned long timeout =
> -		jiffies + msecs_to_jiffies(HMM_RANGE_DEFAULT_TIMEOUT);
> -	unsigned long remaining;
> +	void *zdd = NULL;
>  	unsigned long i, j;
> -	unsigned long npages = npages_in_range(pages_start, pages_end);
> -	unsigned long num_dma_mapped;
> +	unsigned long num_dma_mapped = 0;
>  	unsigned int order = 0;
> -	unsigned long *pfns;
>  	int err = 0;
> -	struct dev_pagemap *pagemap;
> +	struct dev_pagemap *pagemap = NULL;
>  	struct drm_pagemap *dpagemap;
>  	struct drm_gpusvm_pages_flags flags;
> -	enum dma_data_direction dma_dir = ctx->read_only ? DMA_TO_DEVICE :
> -							   DMA_BIDIRECTIONAL;
>  	struct dma_iova_state *state = &svm_pages->state;
>  
> -	if (!svm_pages->drm)
> -		return -EINVAL;
> -
> -retry:
> -	remaining = timeout - jiffies;
> -
> -	if (time_after_eq(jiffies, timeout))
> -		return -EBUSY;
> -
> -	hmm_range.notifier_seq = mmu_interval_read_begin(notifier);
> -	if (drm_gpusvm_pages_valid_unlocked(gpusvm, svm_pages))
> -		goto set_seqno;
> -
> -	pfns = kvmalloc_array(npages, sizeof(*pfns), GFP_KERNEL);
> -	if (!pfns)
> -		return -ENOMEM;
> -
> -	if (!mmget_not_zero(mm)) {
> -		err = -EFAULT;
> -		goto err_free;
> -	}
> -
> -	hmm_range.hmm_pfns = pfns;
> -	err = hmm_range_fault_unlocked_timeout(&hmm_range, remaining);
> -	mmput(mm);
> -	if (err)
> -		goto err_free;
> -
> -	if (!svm_pages->dma_addr) {
> -		svm_pages->dma_addr =
> -			kvzalloc_objs(*svm_pages->dma_addr, npages);
> -		if (!svm_pages->dma_addr) {
> -			err = -ENOMEM;
> -			goto err_free;
> -		}
> -	}
> -
> -	*state = (struct dma_iova_state){};
> -	svm_pages->state_offset = 0;
> -
> -	/*
> -	 * Perform all dma mappings under the notifier lock to not
> -	 * access freed pages. A notifier will either block on
> -	 * the notifier lock or unmap dma.
> -	 */
> -	drm_gpusvm_notifier_lock(gpusvm);
> +	lockdep_assert_held(&gpusvm->notifier_lock);
>  
>  	flags.__flags = svm_pages->flags.__flags;
> -	if (flags.unmapped) {
> -		drm_gpusvm_notifier_unlock(gpusvm);
> -		err = -EFAULT;
> -		goto err_free;
> -	}
> -
> -	if (mmu_interval_read_retry(notifier, hmm_range.notifier_seq)) {
> -		drm_gpusvm_notifier_unlock(gpusvm);
> -		kvfree(pfns);
> -		goto retry;
> -	}
>  
> -	zdd = NULL;
> -	pagemap = NULL;
> -	num_dma_mapped = 0;
>  	for (i = 0, j = 0; i < npages; ++j) {
>  		struct page *page = hmm_pfn_to_page(pfns[i]);
>  
> @@ -1666,17 +1592,124 @@ int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
>  	/* WRITE_ONCE pairs with READ_ONCE for opportunistic checks */
>  	WRITE_ONCE(svm_pages->flags.__flags, flags.__flags);
>  
> +	return 0;
> +
> +err_unmap:
> +	svm_pages->flags.has_dma_mapping = true;
> +	__drm_gpusvm_unmap_pages(gpusvm, svm_pages, num_dma_mapped);
> +	return err;
> +}
> +
> +/**
> + * drm_gpusvm_get_pages() - Get pages and populate GPU SVM pages struct
> + * @gpusvm: Pointer to the GPU SVM structure
> + * @svm_pages: The SVM pages to populate. This will contain the dma-addresses
> + * @mm: The mm corresponding to the CPU range
> + * @notifier: The corresponding notifier for the given CPU range
> + * @pages_start: Start CPU address for the pages
> + * @pages_end: End CPU address for the pages (exclusive)
> + * @ctx: GPU SVM context
> + *
> + * This function gets and maps pages for CPU range and ensures they are
> + * mapped for DMA access.
> + *
> + * Return: 0 on success, negative error code on failure.
> + */
> +int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
> +			 struct drm_gpusvm_pages *svm_pages,
> +			 struct mm_struct *mm,
> +			 struct mmu_interval_notifier *notifier,
> +			 unsigned long pages_start, unsigned long pages_end,
> +			 const struct drm_gpusvm_ctx *ctx)
> +{
> +	struct hmm_range hmm_range = {
> +		.default_flags = HMM_PFN_REQ_FAULT | (ctx->read_only ? 0 :
> +			HMM_PFN_REQ_WRITE),
> +		.notifier = notifier,
> +		.start = pages_start,
> +		.end = pages_end,
> +		.dev_private_owner = ctx->device_private_page_owner,
> +	};
> +	unsigned long timeout =
> +		jiffies + msecs_to_jiffies(HMM_RANGE_DEFAULT_TIMEOUT);
> +	unsigned long remaining;
> +	unsigned long npages = npages_in_range(pages_start, pages_end);
> +	unsigned long *pfns;
> +	int err = 0;
> +	enum dma_data_direction dma_dir = ctx->read_only ? DMA_TO_DEVICE :
> +							   DMA_BIDIRECTIONAL;
> +
> +	if (!svm_pages->drm)
> +		return -EINVAL;
> +
> +retry:
> +	remaining = timeout - jiffies;
> +
> +	if (time_after_eq(jiffies, timeout))
> +		return -EBUSY;
> +
> +	hmm_range.notifier_seq = mmu_interval_read_begin(notifier);
> +	if (drm_gpusvm_pages_valid_unlocked(gpusvm, svm_pages))
> +		goto set_seqno;
> +
> +	pfns = kvmalloc_array(npages, sizeof(*pfns), GFP_KERNEL);
> +	if (!pfns)
> +		return -ENOMEM;
> +
> +	if (!mmget_not_zero(mm)) {
> +		err = -EFAULT;
> +		goto err_free;
> +	}
> +
> +	hmm_range.hmm_pfns = pfns;
> +	err = hmm_range_fault_unlocked_timeout(&hmm_range, remaining);
> +	mmput(mm);
> +	if (err)
> +		goto err_free;
> +
> +	if (!svm_pages->dma_addr) {
> +		svm_pages->dma_addr =
> +			kvzalloc_objs(*svm_pages->dma_addr, npages);
> +		if (!svm_pages->dma_addr) {
> +			err = -ENOMEM;
> +			goto err_free;
> +		}
> +	}
> +
> +	svm_pages->state = (struct dma_iova_state){};
> +	svm_pages->state_offset = 0;
> +
> +	/*
> +	 * Perform all dma mappings under the notifier lock to not
> +	 * access freed pages. A notifier will either block on
> +	 * the notifier lock or unmap dma.
> +	 */
> +	drm_gpusvm_notifier_lock(gpusvm);
> +
> +	if (svm_pages->flags.unmapped) {
> +		drm_gpusvm_notifier_unlock(gpusvm);
> +		err = -EFAULT;
> +		goto err_free;
> +	}
> +
> +	if (mmu_interval_read_retry(notifier, hmm_range.notifier_seq)) {
> +		drm_gpusvm_notifier_unlock(gpusvm);
> +		kvfree(pfns);
> +		goto retry;
> +	}
> +
> +	err = drm_gpusvm_dma_map_pages(gpusvm, svm_pages, pfns, npages, ctx,
> +				       dma_dir);
>  	drm_gpusvm_notifier_unlock(gpusvm);
> +	if (err)
> +		goto err_free;
> +
>  	kvfree(pfns);
>  set_seqno:
>  	svm_pages->notifier_seq = hmm_range.notifier_seq;
>  
>  	return 0;
>  
> -err_unmap:
> -	svm_pages->flags.has_dma_mapping = true;
> -	__drm_gpusvm_unmap_pages(gpusvm, svm_pages, num_dma_mapped);
> -	drm_gpusvm_notifier_unlock(gpusvm);
>  err_free:
>  	kvfree(pfns);
>  	if (err == -EAGAIN)
> -- 
> 2.34.1
> 

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

* Re: [PATCH v2 3/4] drm/gpusvm: let drm_gpusvm_get_pages() map an array of pages
  2026-09-01  9:00 ` [PATCH v2 3/4] drm/gpusvm: let drm_gpusvm_get_pages() map an array of pages Honglei Huang
@ 2026-09-01 19:57   ` Matthew Brost
  2026-09-02  6:39     ` Huang, Honglei
  0 siblings, 1 reply; 15+ messages in thread
From: Matthew Brost @ 2026-09-01 19:57 UTC (permalink / raw)
  To: Honglei Huang
  Cc: sima, rodrigo.vivi, thomas.hellstrom, himal.prasad.ghimiray, dakr,
	intel-xe, aliceryhl, Alexander.Deucher, Felix.Kuehling,
	Christian.Koenig, Ray.Huang, Junhua.Shen, amd-gfx, dri-devel

On Tue, Sep 01, 2026 at 05:00:59PM +0800, Honglei Huang wrote:
> With the N:1 drm_gpusvm_pages layout, one CPU range mirrored on several
> drm_devices, the caller had to invoke get_pages() once per device and
> repeat the HMM fault every time.
> 
> Make get_pages() take a contiguous array of drm_gpusvm_pages plus a
> count: fault once, then DMA map each instance by
> drm_gpusvm_dma_map_pages() under a single read_retry gate. xe range and
> userptr callers are updated.
> 
> Document the N:1 array usage in the Overview, showing how get_pages()
> and drm_gpusvm_range_set_unmapped() take the whole array and its count
> while the unmap and free paths stay per-instance.
> 
> Suggested-by: Matthew Brost <matthew.brost@intel.com>
> Signed-off-by: Honglei Huang <honghuan@amd.com>
> ---
>  drivers/gpu/drm/drm_gpusvm.c    | 141 ++++++++++++++++++++++++--------
>  drivers/gpu/drm/xe/xe_svm.c     |   2 +-
>  drivers/gpu/drm/xe/xe_userptr.c |   2 +-
>  include/drm/drm_gpusvm.h        |   1 +
>  4 files changed, 108 insertions(+), 38 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_gpusvm.c b/drivers/gpu/drm/drm_gpusvm.c
> index 89c3061d8ef..810f801a9f7 100644
> --- a/drivers/gpu/drm/drm_gpusvm.c
> +++ b/drivers/gpu/drm/drm_gpusvm.c
> @@ -80,6 +80,13 @@
>   *			};
>   *		};
>   *
> + *		static struct drm_gpusvm_pages *
> + *		driver_pages(struct driver_range *drange)
> + *		{
> + *			return drange->num_pages == 1 ? &drange->inline_pages :
> + *							drange->pages;
> + *		}
> + *
>   *	In the N:1 case the driver allocates the pages array with a zeroing
>   *	allocator (e.g. kcalloc(num_pages, ...)), initialises each entry with
>   *	drm_gpusvm_init_pages(), and frees each entry with
> @@ -89,6 +96,28 @@
>   *	Each drm_gpusvm_pages must be zero-initialised and initialised with
>   *	drm_gpusvm_init_pages(), called once per entry.
>   *
> + *	The 1:1 examples below pass @num_pages == 1 and &drange->pages. In the
> + *	N:1 case the driver instead passes the whole array and its count, so a
> + *	single call faults the CPU range once and DMA maps it for every owning
> + *	drm_device, e.g.:
> + *
> + *	.. code-block:: c
> + *
> + *		// GPU fault handler: one fault, one DMA mapping per device
> + *		err = drm_gpusvm_get_pages(gpusvm, driver_pages(drange),
> + *					   drange->num_pages, gpusvm->mm,
> + *					   &range->notifier->notifier,
> + *					   drm_gpusvm_range_start(range),
> + *					   drm_gpusvm_range_end(range), &ctx);
> + *
> + *		// Notifier callback: mark every instance unmapped in one call
> + *		drm_gpusvm_range_set_unmapped(range, driver_pages(drange),
> + *					      drange->num_pages, mmu_range);
> + *
> + *	The unmap and free paths stay per-instance: iterate @num_pages over
> + *	driver_pages(drange) and call drm_gpusvm_unmap_pages() /
> + *	drm_gpusvm_free_pages() for each entry.
> + *
>   * - Operations:
>   *	Define the interface for driver-specific GPU SVM operations such as
>   *	range allocation, notifier allocation, and invalidations.
> @@ -232,7 +261,7 @@
>   *				goto retry;
>   *		}
>   *
> - *		err = drm_gpusvm_get_pages(gpusvm, &drange->pages,
> + *		err = drm_gpusvm_get_pages(gpusvm, &drange->pages, 1,
>   *					   gpusvm->mm, &range->notifier->notifier,
>   *					   drm_gpusvm_range_start(range),
>   *					   drm_gpusvm_range_end(range), &ctx);
> @@ -1417,25 +1446,34 @@ EXPORT_SYMBOL_GPL(drm_gpusvm_pages_valid);
>  /**
>   * drm_gpusvm_pages_valid_unlocked() - GPU SVM pages valid unlocked
>   * @gpusvm: Pointer to the GPU SVM structure
> - * @svm_pages: Pointer to the GPU SVM pages structure
> + * @svm_pages: Array of GPU SVM pages structures
> + * @num_pages: Number of drm_gpusvm_pages instances in @svm_pages
>   *
> - * This function determines if a GPU SVM pages are valid. Expected be called
> + * This function determines if every GPU SVM pages instance is valid, dropping
> + * the stale dma_addr array of any instance which is not. Expected be called
>   * without holding gpusvm->notifier_lock.
>   *
> - * Return: True if GPU SVM pages are valid, False otherwise
> + * Return: True if all GPU SVM pages are valid, False otherwise
>   */
>  static bool drm_gpusvm_pages_valid_unlocked(struct drm_gpusvm *gpusvm,
> -					    struct drm_gpusvm_pages *svm_pages)
> +					    struct drm_gpusvm_pages *svm_pages,
> +					    unsigned int num_pages)
>  {
> -	bool pages_valid;
> +	bool pages_valid = true;
> +	unsigned int p;
>  
> -	if (!svm_pages->dma_addr)
> -		return false;
> +	for (p = 0; p < num_pages; ++p) {
> +		if (!svm_pages[p].dma_addr)
> +			return false;
> +	}
>  
>  	drm_gpusvm_notifier_lock(gpusvm);
> -	pages_valid = drm_gpusvm_pages_valid(gpusvm, svm_pages);
> -	if (!pages_valid)
> -		__drm_gpusvm_free_pages(gpusvm, svm_pages);
> +	for (p = 0; p < num_pages; ++p) {
> +		if (drm_gpusvm_pages_valid(gpusvm, &svm_pages[p]))
> +			continue;
> +		__drm_gpusvm_free_pages(gpusvm, &svm_pages[p]);
> +		pages_valid = false;
> +	}
>  	drm_gpusvm_notifier_unlock(gpusvm);
>  
>  	return pages_valid;
> @@ -1451,8 +1489,9 @@ static bool drm_gpusvm_pages_valid_unlocked(struct drm_gpusvm *gpusvm,
>   * @dma_dir: DMA data direction for the mappings
>   *
>   * Map the faulted @pfns into @svm_pages for DMA access through its owning
> - * drm_device. Must be called under the notifier lock. On failure this unwinds
> - * the partial mapping of this instance before returning.
> + * drm_device. Must be called under the notifier lock and only for an instance
> + * without a live mapping. On failure this unwinds the partial mapping of this
> + * instance before returning.
>   *
>   * Return: 0 on success, negative error code on failure.
>   */
> @@ -1475,6 +1514,9 @@ static int drm_gpusvm_dma_map_pages(struct drm_gpusvm *gpusvm,
>  
>  	lockdep_assert_held(&gpusvm->notifier_lock);
>  
> +	*state = (struct dma_iova_state){};
> +	svm_pages->state_offset = 0;
> +
>  	flags.__flags = svm_pages->flags.__flags;
>  
>  	for (i = 0, j = 0; i < npages; ++j) {
> @@ -1603,20 +1645,29 @@ static int drm_gpusvm_dma_map_pages(struct drm_gpusvm *gpusvm,
>  /**
>   * drm_gpusvm_get_pages() - Get pages and populate GPU SVM pages struct
>   * @gpusvm: Pointer to the GPU SVM structure
> - * @svm_pages: The SVM pages to populate. This will contain the dma-addresses
> + * @svm_pages: Array of SVM pages instances to populate with dma addresses
> + * @num_pages: Number of drm_gpusvm_pages instances in @svm_pages
>   * @mm: The mm corresponding to the CPU range
>   * @notifier: The corresponding notifier for the given CPU range
>   * @pages_start: Start CPU address for the pages
>   * @pages_end: End CPU address for the pages (exclusive)
>   * @ctx: GPU SVM context
>   *
> - * This function gets and maps pages for CPU range and ensures they are
> - * mapped for DMA access.
> + * This function gets and maps pages for a CPU range and ensures they are
> + * mapped for DMA access. The HMM fault for the CPU range is performed once,
> + * the DMA mapping by drm_gpusvm_dma_map_pages() is then done per instance,
> + * one per owning drm_device. The retry against notifier races is kept here
> + * in common code so drivers never open code it.
> + * The common 1:1 case passes @num_pages == 1.
> + *
> + * On error the instances mapped before the failing one stay mapped, so the
> + * caller must unmap and free every instance regardless of the return value.
>   *
>   * Return: 0 on success, negative error code on failure.
>   */
>  int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
>  			 struct drm_gpusvm_pages *svm_pages,
> +			 unsigned int num_pages,
>  			 struct mm_struct *mm,
>  			 struct mmu_interval_notifier *notifier,
>  			 unsigned long pages_start, unsigned long pages_end,
> @@ -1638,9 +1689,11 @@ int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
>  	int err = 0;
>  	enum dma_data_direction dma_dir = ctx->read_only ? DMA_TO_DEVICE :
>  							   DMA_BIDIRECTIONAL;
> +	unsigned int p;
>  
> -	if (!svm_pages->drm)
> -		return -EINVAL;
> +	for (p = 0; p < num_pages; ++p)
> +		if (!svm_pages[p].drm)
> +			return -EINVAL;
>  
>  retry:
>  	remaining = timeout - jiffies;
> @@ -1649,7 +1702,8 @@ int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
>  		return -EBUSY;
>  
>  	hmm_range.notifier_seq = mmu_interval_read_begin(notifier);
> -	if (drm_gpusvm_pages_valid_unlocked(gpusvm, svm_pages))
> +
> +	if (drm_gpusvm_pages_valid_unlocked(gpusvm, svm_pages, num_pages))
>  		goto set_seqno;
>  
>  	pfns = kvmalloc_array(npages, sizeof(*pfns), GFP_KERNEL);
> @@ -1667,18 +1721,17 @@ int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
>  	if (err)
>  		goto err_free;
>  
> -	if (!svm_pages->dma_addr) {
> -		svm_pages->dma_addr =
> -			kvzalloc_objs(*svm_pages->dma_addr, npages);
> -		if (!svm_pages->dma_addr) {
> +	for (p = 0; p < num_pages; ++p) {
> +		if (svm_pages[p].dma_addr)
> +			continue;
> +		svm_pages[p].dma_addr =
> +			kvzalloc_objs(*svm_pages[p].dma_addr, npages);
> +		if (!svm_pages[p].dma_addr) {
>  			err = -ENOMEM;
>  			goto err_free;
>  		}
>  	}
>  
> -	svm_pages->state = (struct dma_iova_state){};
> -	svm_pages->state_offset = 0;
> -
>  	/*
>  	 * Perform all dma mappings under the notifier lock to not
>  	 * access freed pages. A notifier will either block on
> @@ -1686,10 +1739,12 @@ int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
>  	 */
>  	drm_gpusvm_notifier_lock(gpusvm);
>  
> -	if (svm_pages->flags.unmapped) {
> -		drm_gpusvm_notifier_unlock(gpusvm);
> -		err = -EFAULT;
> -		goto err_free;
> +	for (p = 0; p < num_pages; ++p) {
> +		if (svm_pages[p].flags.unmapped) {
> +			drm_gpusvm_notifier_unlock(gpusvm);
> +			err = -EFAULT;
> +			goto err_free;
> +		}

I believe, given how the notifiers work, that checking
`svm_pages[0].flags.unmapped` is actually sufficient. It's a
micro-optimization, so I'm fine with it either way.
 
>  	}
>  
>  	if (mmu_interval_read_retry(notifier, hmm_range.notifier_seq)) {
> @@ -1698,15 +1753,29 @@ int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
>  		goto retry;
>  	}
>  
> -	err = drm_gpusvm_dma_map_pages(gpusvm, svm_pages, pfns, npages, ctx,
> -				       dma_dir);
> -	drm_gpusvm_notifier_unlock(gpusvm);
> -	if (err)
> -		goto err_free;
> +	for (p = 0; p < num_pages; ++p) {
> +		if (drm_gpusvm_pages_valid(gpusvm, &svm_pages[p]))
> +			continue;
>  
> +		err = drm_gpusvm_dma_map_pages(gpusvm, &svm_pages[p], pfns,
> +					       npages, ctx, dma_dir);

One thing that is different here is that if `drm_gpusvm_dma_map_pages()`
fails, say at `p == 1`, then `p[0]` will already contain valid DMA
mappings. I think this is actually fine, though, because the existing
cleanup paths will eventually release those mappings one way or another.
 
That said, it's probably worth confirming this through a code-path audit
and adding a comment here explaining why this is safe.
 
Again, Sashiko didn't run on this patch, and it would be good to get a
run before merging this series.

Matt

> +		if (err) {
> +			/*
> +			 * The failing instance was unwound by the helper. Keep
> +			 * the ones mapped earlier: the -EAGAIN retry reuses
> +			 * them, and the driver unmaps every instance with the
> +			 * range on the other error paths.
> +			 */
> +			drm_gpusvm_notifier_unlock(gpusvm);
> +			goto err_free;
> +		}
> +	}
> +
> +	drm_gpusvm_notifier_unlock(gpusvm);
>  	kvfree(pfns);
>  set_seqno:
> -	svm_pages->notifier_seq = hmm_range.notifier_seq;
> +	for (p = 0; p < num_pages; ++p)
> +		svm_pages[p].notifier_seq = hmm_range.notifier_seq;
>  
>  	return 0;
>  
> diff --git a/drivers/gpu/drm/xe/xe_svm.c b/drivers/gpu/drm/xe/xe_svm.c
> index 627a741293d..1c7793d8caa 100644
> --- a/drivers/gpu/drm/xe/xe_svm.c
> +++ b/drivers/gpu/drm/xe/xe_svm.c
> @@ -1598,7 +1598,7 @@ int xe_svm_range_get_pages(struct xe_vm *vm, struct xe_svm_range *range,
>  
>  	lockdep_assert_held(&range->lock);
>  
> -	err = drm_gpusvm_get_pages(&vm->svm.gpusvm, &range->pages,
> +	err = drm_gpusvm_get_pages(&vm->svm.gpusvm, &range->pages, 1,
>  				   vm->svm.gpusvm.mm,
>  				   &range->base.notifier->notifier,
>  				   drm_gpusvm_range_start(&range->base),
> diff --git a/drivers/gpu/drm/xe/xe_userptr.c b/drivers/gpu/drm/xe/xe_userptr.c
> index 90ac141fc12..9c1dac0fce6 100644
> --- a/drivers/gpu/drm/xe/xe_userptr.c
> +++ b/drivers/gpu/drm/xe/xe_userptr.c
> @@ -91,7 +91,7 @@ int xe_vma_userptr_pin_pages(struct xe_userptr_vma *uvma)
>  	if (vma->gpuva.flags & XE_VMA_DESTROYED)
>  		return 0;
>  
> -	return drm_gpusvm_get_pages(&vm->svm.gpusvm, &uvma->userptr.pages,
> +	return drm_gpusvm_get_pages(&vm->svm.gpusvm, &uvma->userptr.pages, 1,
>  				    uvma->userptr.notifier.mm,
>  				    &uvma->userptr.notifier,
>  				    xe_vma_userptr(vma),
> diff --git a/include/drm/drm_gpusvm.h b/include/drm/drm_gpusvm.h
> index b7d987bf76a..d2b6f3d2b84 100644
> --- a/include/drm/drm_gpusvm.h
> +++ b/include/drm/drm_gpusvm.h
> @@ -324,6 +324,7 @@ void drm_gpusvm_range_set_unmapped(struct drm_gpusvm_range *range,
>  
>  int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
>  			 struct drm_gpusvm_pages *svm_pages,
> +			 unsigned int num_pages,
>  			 struct mm_struct *mm,
>  			 struct mmu_interval_notifier *notifier,
>  			 unsigned long pages_start, unsigned long pages_end,
> -- 
> 2.34.1
> 

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

* Re: [PATCH v2 4/4] drm/gpusvm: make the DMA mapping step in get_pages() optional
  2026-09-01  9:01 ` [PATCH v2 4/4] drm/gpusvm: make the DMA mapping step in get_pages() optional Honglei Huang
@ 2026-09-01 20:02   ` Matthew Brost
  0 siblings, 0 replies; 15+ messages in thread
From: Matthew Brost @ 2026-09-01 20:02 UTC (permalink / raw)
  To: Honglei Huang
  Cc: sima, rodrigo.vivi, thomas.hellstrom, himal.prasad.ghimiray, dakr,
	intel-xe, aliceryhl, Alexander.Deucher, Felix.Kuehling,
	Christian.Koenig, Ray.Huang, Junhua.Shen, amd-gfx, dri-devel

On Tue, Sep 01, 2026 at 05:01:00PM +0800, Honglei Huang wrote:
> Some drivers (e.g. AMDXDNA) only need the CPU pages faulted in and tracked
> by the notifier, no need DMA mapping.
> 
> Add a drm_gpusvm_ctx::no_dma_map flag. When set, get_pages() does the
> shared HMM fault and records notifier_seq, but skips svm_pages->drm
> validation, the dma_addr allocation and drm_gpusvm_dma_map_pages().
> With no mapping state to check, the fault is redone on every call. The
> default (no_dma_map == 0) is unchanged.
> 
> Suggested-by: Matthew Brost <matthew.brost@intel.com>

Reviewed-by: Matthew Brost <matthew.brost@intel.com>

> Signed-off-by: Honglei Huang <honghuan@amd.com>
> ---
>  drivers/gpu/drm/drm_gpusvm.c | 44 ++++++++++++++++++++++++++----------
>  include/drm/drm_gpusvm.h     |  9 ++++++++
>  2 files changed, 41 insertions(+), 12 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_gpusvm.c b/drivers/gpu/drm/drm_gpusvm.c
> index 810f801a9f7..0156ee82d7c 100644
> --- a/drivers/gpu/drm/drm_gpusvm.c
> +++ b/drivers/gpu/drm/drm_gpusvm.c
> @@ -1663,6 +1663,12 @@ static int drm_gpusvm_dma_map_pages(struct drm_gpusvm *gpusvm,
>   * On error the instances mapped before the failing one stay mapped, so the
>   * caller must unmap and free every instance regardless of the return value.
>   *
> + * With &drm_gpusvm_ctx.no_dma_map no mapping state is recorded, so
> + * drm_gpusvm_pages_valid() never returns true and success is only a snapshot:
> + * the caller must recheck mmu_interval_read_retry() against the recorded
> + * &drm_gpusvm_pages.notifier_seq under the notifier lock, and hold it until
> + * its work is visible to invalidation.
> + *
>   * Return: 0 on success, negative error code on failure.
>   */
>  int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
> @@ -1689,11 +1695,18 @@ int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
>  	int err = 0;
>  	enum dma_data_direction dma_dir = ctx->read_only ? DMA_TO_DEVICE :
>  							   DMA_BIDIRECTIONAL;
> +	const bool map_dma = !ctx->no_dma_map;
>  	unsigned int p;
>  
> -	for (p = 0; p < num_pages; ++p)
> -		if (!svm_pages[p].drm)
> -			return -EINVAL;
> +	if (ctx->no_dma_map && ctx->devmem_only)
> +		return -EINVAL;
> +
> +	if (map_dma) {
> +		for (p = 0; p < num_pages; ++p) {
> +			if (!svm_pages[p].drm)
> +				return -EINVAL;
> +		}
> +	}
>  
>  retry:
>  	remaining = timeout - jiffies;
> @@ -1703,7 +1716,8 @@ int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
>  
>  	hmm_range.notifier_seq = mmu_interval_read_begin(notifier);
>  
> -	if (drm_gpusvm_pages_valid_unlocked(gpusvm, svm_pages, num_pages))
> +	if (map_dma &&
> +	    drm_gpusvm_pages_valid_unlocked(gpusvm, svm_pages, num_pages))
>  		goto set_seqno;
>  
>  	pfns = kvmalloc_array(npages, sizeof(*pfns), GFP_KERNEL);
> @@ -1721,14 +1735,16 @@ int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
>  	if (err)
>  		goto err_free;
>  
> -	for (p = 0; p < num_pages; ++p) {
> -		if (svm_pages[p].dma_addr)
> -			continue;
> -		svm_pages[p].dma_addr =
> -			kvzalloc_objs(*svm_pages[p].dma_addr, npages);
> -		if (!svm_pages[p].dma_addr) {
> -			err = -ENOMEM;
> -			goto err_free;
> +	if (map_dma) {
> +		for (p = 0; p < num_pages; ++p) {
> +			if (svm_pages[p].dma_addr)
> +				continue;
> +			svm_pages[p].dma_addr =
> +				kvzalloc_objs(*svm_pages[p].dma_addr, npages);
> +			if (!svm_pages[p].dma_addr) {
> +				err = -ENOMEM;
> +				goto err_free;
> +			}
>  		}
>  	}
>  
> @@ -1753,6 +1769,9 @@ int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
>  		goto retry;
>  	}
>  
> +	if (!map_dma)
> +		goto done_mapping;
> +
>  	for (p = 0; p < num_pages; ++p) {
>  		if (drm_gpusvm_pages_valid(gpusvm, &svm_pages[p]))
>  			continue;
> @@ -1771,6 +1790,7 @@ int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
>  		}
>  	}
>  
> +done_mapping:
>  	drm_gpusvm_notifier_unlock(gpusvm);
>  	kvfree(pfns);
>  set_seqno:
> diff --git a/include/drm/drm_gpusvm.h b/include/drm/drm_gpusvm.h
> index d2b6f3d2b84..ec7b81957b1 100644
> --- a/include/drm/drm_gpusvm.h
> +++ b/include/drm/drm_gpusvm.h
> @@ -254,6 +254,14 @@ struct drm_gpusvm {
>   * @allow_mixed: Allow mixed mappings in get pages. Mixing between system and
>   *               single dpagemap is supported, mixing between multiple dpagemap
>   *               is unsupported.
> + * @no_dma_map: Only fault the CPU pages for the range; skip the device DMA
> + *              mapping step. Used by drivers that consume the faulted pages
> + *              without needing a DMA mapping. In this mode @drm on the
> + *              drm_gpusvm_pages is not required, no mapping state is recorded
> + *              and drm_gpusvm_pages_valid() therefore never reports these
> + *              pages as valid; the caller revalidates the snapshot itself, see
> + *              drm_gpusvm_get_pages(). @devmem_only is rejected and no page
> + *              type check is performed, so @allow_mixed has no effect.
>   *
>   * Context that is DRM GPUSVM is operating in (i.e. user arguments).
>   */
> @@ -266,6 +274,7 @@ struct drm_gpusvm_ctx {
>  	unsigned int devmem_possible :1;
>  	unsigned int devmem_only :1;
>  	unsigned int allow_mixed :1;
> +	unsigned int no_dma_map :1;
>  };
>  
>  int drm_gpusvm_init(struct drm_gpusvm *gpusvm,
> -- 
> 2.34.1
> 

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

* Re: [PATCH v2 1/4] drm/gpusvm: move dma_addr allocation before the notifier lock
  2026-09-01 19:39   ` Matthew Brost
@ 2026-09-02  6:21     ` Huang, Honglei
  0 siblings, 0 replies; 15+ messages in thread
From: Huang, Honglei @ 2026-09-02  6:21 UTC (permalink / raw)
  To: Matthew Brost
  Cc: sima, rodrigo.vivi, thomas.hellstrom, himal.prasad.ghimiray, dakr,
	intel-xe, aliceryhl, Alexander.Deucher, Felix.Kuehling,
	Christian.Koenig, Ray.Huang, Junhua.Shen, amd-gfx, dri-devel



On 9/2/2026 3:39 AM, Matthew Brost wrote:
> On Tue, Sep 01, 2026 at 05:00:57PM +0800, Honglei Huang wrote:
>> The dma_addr allocation was in a lazy allocation flow, it needs unlock
>> and goto map_pages. The allocation only needs npages, so just do it
>> before taking the lock. Drop the map_pages label and the relock flow, so
>> the sequence becomes fault, allocate, then lock, validate, map and
>> unlock. No functional change intended.
>>
>> Signed-off-by: Honglei Huang <honghuan@amd.com>
> 
> One follow up suggestion below - not blocker for merging this series.
> Feel free to implement this or at some point (we) Intel will get around
> to this.

Got it, you can give me RB after you are really satisfied. I can keep 
modifying until you feel there are no problems.

> 
> This patch is:
> Reviewed-by: Matthew Brost <matthew.brost@intel.com>
> 
>> ---
>>   drivers/gpu/drm/drm_gpusvm.c | 22 +++++++++-------------
>>   1 file changed, 9 insertions(+), 13 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/drm_gpusvm.c b/drivers/gpu/drm/drm_gpusvm.c
>> index a93eee7ddb9..b507de539e6 100644
>> --- a/drivers/gpu/drm/drm_gpusvm.c
>> +++ b/drivers/gpu/drm/drm_gpusvm.c
>> @@ -1516,10 +1516,18 @@ int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
>>   	if (err)
>>   		goto err_free;
>>   
>> +	if (!svm_pages->dma_addr) {
>> +		svm_pages->dma_addr =
>> +			kvzalloc_objs(*svm_pages->dma_addr, npages);
> 
> One thing that isn't great about the current code is that, regardless of
> `npages`, the overwhelming majority of cases result in exactly one DMA
> mapping. As a result, we end up wasting a significant amount of memory.
> If an IOVA is allocated, we only ever need a single DMA mapping. Even
> without IOVA support (e.g., `iommu=off` or `iommu=pt`), a 2 MiB backing
> store implemented as a THP would still yield a single DMA mapping via
> `dma_map_page()`.
> 
> Longer term, I'd like to do something like the structure changes below.
> We would still preallocate unless `npages == 1`, but if
> `drm_gpusvm_dma_map_pages()` finds exactly one DMA mapping, we could free
> `dma_addr`, store the `drm_pagemap_addr` in `inline_addr`, and set an
> `inline_dma_mapping` flag. This would save 8 KiB per page of
> `drm_gpusvm_pages` for every 2 MiB THP-backed allocation.

Makes sense, working on it to reduce memory waste.

> 
> Then the final piece is teach drivers to understand 'inline_dma_mapping'
> in their iterators (xe_res_cursor.h in Xe) to correctly walk the
> dma-mapping.

Agreed, the important part is driver maybe miss this change and the 
compiles still fine, maybe worth changing xe_res_first_dma() to take a 
drm_gpusvm_pages instead of a bare pointer.

> 
> Matt
> 
> diff --git a/include/drm/drm_gpusvm.h b/include/drm/drm_gpusvm.h
> index b7d987bf76aa..73b7065610f0 100644
> --- a/include/drm/drm_gpusvm.h
> +++ b/include/drm/drm_gpusvm.h
> @@ -121,6 +121,7 @@ struct drm_gpusvm_pages_flags {
>                          u16 unmapped : 1;
>                          u16 has_devmem_pages : 1;
>                          u16 has_dma_mapping : 1;
> +                       u16 inline_dma_mapping : 1;
>                  };
>                  u16 __flags;
>          };
> @@ -140,7 +141,10 @@ struct drm_gpusvm_pages_flags {
>    */
>   struct drm_gpusvm_pages {
>          struct drm_device *drm;
> -       struct drm_pagemap_addr *dma_addr;
> +       union {
> +               struct drm_pagemap_addr *dma_addr;
> +               struct drm_pagemap_addr inline_addr;
> +       };
>          struct drm_pagemap *dpagemap;
>          struct dma_iova_state state;
>          unsigned long state_offset;

Will modify the code according to your suggestion.

Regards,
Honglei


> 
> 
>> +		if (!svm_pages->dma_addr) {
>> +			err = -ENOMEM;
>> +			goto err_free;
>> +		}
>> +	}
>> +
>>   	*state = (struct dma_iova_state){};
>>   	svm_pages->state_offset = 0;
>>   
>> -map_pages:
>>   	/*
>>   	 * Perform all dma mappings under the notifier lock to not
>>   	 * access freed pages. A notifier will either block on
>> @@ -1540,18 +1548,6 @@ int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
>>   		goto retry;
>>   	}
>>   
>> -	if (!svm_pages->dma_addr) {
>> -		/* Unlock and restart mapping to allocate memory. */
>> -		drm_gpusvm_notifier_unlock(gpusvm);
>> -		svm_pages->dma_addr =
>> -			kvzalloc_objs(*svm_pages->dma_addr, npages);
>> -		if (!svm_pages->dma_addr) {
>> -			err = -ENOMEM;
>> -			goto err_free;
>> -		}
>> -		goto map_pages;
>> -	}
>> -
>>   	zdd = NULL;
>>   	pagemap = NULL;
>>   	num_dma_mapped = 0;
>> -- 
>> 2.34.1
>>


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

* Re: [PATCH v2 2/4] drm/gpusvm: extract drm_gpusvm_dma_map_pages() helper
  2026-09-01 19:43   ` Matthew Brost
@ 2026-09-02  6:22     ` Huang, Honglei
  0 siblings, 0 replies; 15+ messages in thread
From: Huang, Honglei @ 2026-09-02  6:22 UTC (permalink / raw)
  To: Matthew Brost
  Cc: sima, rodrigo.vivi, thomas.hellstrom, himal.prasad.ghimiray, dakr,
	intel-xe, aliceryhl, Alexander.Deucher, Felix.Kuehling,
	Christian.Koenig, Ray.Huang, Junhua.Shen, amd-gfx, dri-devel



On 9/2/2026 3:43 AM, Matthew Brost wrote:
> On Tue, Sep 01, 2026 at 05:00:58PM +0800, Honglei Huang wrote:
>> Move the per-device DMA mapping loop of drm_gpusvm_get_pages() into a
>> helper drm_gpusvm_dma_map_pages(). The mapping logic is only moved, not
>> changed, so there is no functional change.
>>
>> The helper maps the already-faulted pfns into one drm_gpusvm_pages
>> instance under the notifier lock and unwinds its own partial mapping on
>> error. The HMM fault and the notifier retry loop stay in get_pages()
>> common code rather than being pushed down to drivers, so no driver has
>> to reimplement the subtle fault and retry logic.
>>
>> With the mapping isolated per instance, get_pages() can later fault once
>> and DMA map an array of drm_gpusvm_pages plus a count, one per owning
>> drm_device.
>>
>> Suggested-by: Matthew Brost <matthew.brost@intel.com>
> 
> For some reason, Sashiko didn't run on this particular patch [1]. It
> would be good to have it run through the tooling in case I'm missing
> something.
> 
> That said, I can't spot anything incorrect, and this looks like a solid
> cleanup.
> 
> With that:
> Reviewed-by: Matthew Brost <matthew.brost@intel.com>

Will resent this series only to intel-xe@list and dri-devel@list to 
retigger the Sashiko review.

Regards,
Honglei

> 
> [1] https://sashiko.dev/#/patchset/20260901090100.2024933-1-honghuan%40amd.com
> 
>> Signed-off-by: Honglei Huang <honghuan@amd.com>
>> ---
>>   drivers/gpu/drm/drm_gpusvm.c | 225 ++++++++++++++++++++---------------
>>   1 file changed, 129 insertions(+), 96 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/drm_gpusvm.c b/drivers/gpu/drm/drm_gpusvm.c
>> index b507de539e6..89c3061d8ef 100644
>> --- a/drivers/gpu/drm/drm_gpusvm.c
>> +++ b/drivers/gpu/drm/drm_gpusvm.c
>> @@ -1442,115 +1442,41 @@ static bool drm_gpusvm_pages_valid_unlocked(struct drm_gpusvm *gpusvm,
>>   }
>>   
>>   /**
>> - * drm_gpusvm_get_pages() - Get pages and populate GPU SVM pages struct
>> + * drm_gpusvm_dma_map_pages() - DMA map one drm_gpusvm_pages instance
>>    * @gpusvm: Pointer to the GPU SVM structure
>> - * @svm_pages: The SVM pages to populate. This will contain the dma-addresses
>> - * @mm: The mm corresponding to the CPU range
>> - * @notifier: The corresponding notifier for the given CPU range
>> - * @pages_start: Start CPU address for the pages
>> - * @pages_end: End CPU address for the pages (exclusive)
>> + * @svm_pages: The SVM pages instance to populate with dma-addresses
>> + * @pfns: The already-faulted pfn array (size @npages)
>> + * @npages: Number of pages in the CPU range
>>    * @ctx: GPU SVM context
>> + * @dma_dir: DMA data direction for the mappings
>>    *
>> - * This function gets and maps pages for CPU range and ensures they are
>> - * mapped for DMA access.
>> + * Map the faulted @pfns into @svm_pages for DMA access through its owning
>> + * drm_device. Must be called under the notifier lock. On failure this unwinds
>> + * the partial mapping of this instance before returning.
>>    *
>>    * Return: 0 on success, negative error code on failure.
>>    */
>> -int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
>> -			 struct drm_gpusvm_pages *svm_pages,
>> -			 struct mm_struct *mm,
>> -			 struct mmu_interval_notifier *notifier,
>> -			 unsigned long pages_start, unsigned long pages_end,
>> -			 const struct drm_gpusvm_ctx *ctx)
>> +static int drm_gpusvm_dma_map_pages(struct drm_gpusvm *gpusvm,
>> +				    struct drm_gpusvm_pages *svm_pages,
>> +				    unsigned long *pfns,
>> +				    unsigned long npages,
>> +				    const struct drm_gpusvm_ctx *ctx,
>> +				    enum dma_data_direction dma_dir)
>>   {
>> -	struct hmm_range hmm_range = {
>> -		.default_flags = HMM_PFN_REQ_FAULT | (ctx->read_only ? 0 :
>> -			HMM_PFN_REQ_WRITE),
>> -		.notifier = notifier,
>> -		.start = pages_start,
>> -		.end = pages_end,
>> -		.dev_private_owner = ctx->device_private_page_owner,
>> -	};
>> -	void *zdd;
>> -	unsigned long timeout =
>> -		jiffies + msecs_to_jiffies(HMM_RANGE_DEFAULT_TIMEOUT);
>> -	unsigned long remaining;
>> +	void *zdd = NULL;
>>   	unsigned long i, j;
>> -	unsigned long npages = npages_in_range(pages_start, pages_end);
>> -	unsigned long num_dma_mapped;
>> +	unsigned long num_dma_mapped = 0;
>>   	unsigned int order = 0;
>> -	unsigned long *pfns;
>>   	int err = 0;
>> -	struct dev_pagemap *pagemap;
>> +	struct dev_pagemap *pagemap = NULL;
>>   	struct drm_pagemap *dpagemap;
>>   	struct drm_gpusvm_pages_flags flags;
>> -	enum dma_data_direction dma_dir = ctx->read_only ? DMA_TO_DEVICE :
>> -							   DMA_BIDIRECTIONAL;
>>   	struct dma_iova_state *state = &svm_pages->state;
>>   
>> -	if (!svm_pages->drm)
>> -		return -EINVAL;
>> -
>> -retry:
>> -	remaining = timeout - jiffies;
>> -
>> -	if (time_after_eq(jiffies, timeout))
>> -		return -EBUSY;
>> -
>> -	hmm_range.notifier_seq = mmu_interval_read_begin(notifier);
>> -	if (drm_gpusvm_pages_valid_unlocked(gpusvm, svm_pages))
>> -		goto set_seqno;
>> -
>> -	pfns = kvmalloc_array(npages, sizeof(*pfns), GFP_KERNEL);
>> -	if (!pfns)
>> -		return -ENOMEM;
>> -
>> -	if (!mmget_not_zero(mm)) {
>> -		err = -EFAULT;
>> -		goto err_free;
>> -	}
>> -
>> -	hmm_range.hmm_pfns = pfns;
>> -	err = hmm_range_fault_unlocked_timeout(&hmm_range, remaining);
>> -	mmput(mm);
>> -	if (err)
>> -		goto err_free;
>> -
>> -	if (!svm_pages->dma_addr) {
>> -		svm_pages->dma_addr =
>> -			kvzalloc_objs(*svm_pages->dma_addr, npages);
>> -		if (!svm_pages->dma_addr) {
>> -			err = -ENOMEM;
>> -			goto err_free;
>> -		}
>> -	}
>> -
>> -	*state = (struct dma_iova_state){};
>> -	svm_pages->state_offset = 0;
>> -
>> -	/*
>> -	 * Perform all dma mappings under the notifier lock to not
>> -	 * access freed pages. A notifier will either block on
>> -	 * the notifier lock or unmap dma.
>> -	 */
>> -	drm_gpusvm_notifier_lock(gpusvm);
>> +	lockdep_assert_held(&gpusvm->notifier_lock);
>>   
>>   	flags.__flags = svm_pages->flags.__flags;
>> -	if (flags.unmapped) {
>> -		drm_gpusvm_notifier_unlock(gpusvm);
>> -		err = -EFAULT;
>> -		goto err_free;
>> -	}
>> -
>> -	if (mmu_interval_read_retry(notifier, hmm_range.notifier_seq)) {
>> -		drm_gpusvm_notifier_unlock(gpusvm);
>> -		kvfree(pfns);
>> -		goto retry;
>> -	}
>>   
>> -	zdd = NULL;
>> -	pagemap = NULL;
>> -	num_dma_mapped = 0;
>>   	for (i = 0, j = 0; i < npages; ++j) {
>>   		struct page *page = hmm_pfn_to_page(pfns[i]);
>>   
>> @@ -1666,17 +1592,124 @@ int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
>>   	/* WRITE_ONCE pairs with READ_ONCE for opportunistic checks */
>>   	WRITE_ONCE(svm_pages->flags.__flags, flags.__flags);
>>   
>> +	return 0;
>> +
>> +err_unmap:
>> +	svm_pages->flags.has_dma_mapping = true;
>> +	__drm_gpusvm_unmap_pages(gpusvm, svm_pages, num_dma_mapped);
>> +	return err;
>> +}
>> +
>> +/**
>> + * drm_gpusvm_get_pages() - Get pages and populate GPU SVM pages struct
>> + * @gpusvm: Pointer to the GPU SVM structure
>> + * @svm_pages: The SVM pages to populate. This will contain the dma-addresses
>> + * @mm: The mm corresponding to the CPU range
>> + * @notifier: The corresponding notifier for the given CPU range
>> + * @pages_start: Start CPU address for the pages
>> + * @pages_end: End CPU address for the pages (exclusive)
>> + * @ctx: GPU SVM context
>> + *
>> + * This function gets and maps pages for CPU range and ensures they are
>> + * mapped for DMA access.
>> + *
>> + * Return: 0 on success, negative error code on failure.
>> + */
>> +int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
>> +			 struct drm_gpusvm_pages *svm_pages,
>> +			 struct mm_struct *mm,
>> +			 struct mmu_interval_notifier *notifier,
>> +			 unsigned long pages_start, unsigned long pages_end,
>> +			 const struct drm_gpusvm_ctx *ctx)
>> +{
>> +	struct hmm_range hmm_range = {
>> +		.default_flags = HMM_PFN_REQ_FAULT | (ctx->read_only ? 0 :
>> +			HMM_PFN_REQ_WRITE),
>> +		.notifier = notifier,
>> +		.start = pages_start,
>> +		.end = pages_end,
>> +		.dev_private_owner = ctx->device_private_page_owner,
>> +	};
>> +	unsigned long timeout =
>> +		jiffies + msecs_to_jiffies(HMM_RANGE_DEFAULT_TIMEOUT);
>> +	unsigned long remaining;
>> +	unsigned long npages = npages_in_range(pages_start, pages_end);
>> +	unsigned long *pfns;
>> +	int err = 0;
>> +	enum dma_data_direction dma_dir = ctx->read_only ? DMA_TO_DEVICE :
>> +							   DMA_BIDIRECTIONAL;
>> +
>> +	if (!svm_pages->drm)
>> +		return -EINVAL;
>> +
>> +retry:
>> +	remaining = timeout - jiffies;
>> +
>> +	if (time_after_eq(jiffies, timeout))
>> +		return -EBUSY;
>> +
>> +	hmm_range.notifier_seq = mmu_interval_read_begin(notifier);
>> +	if (drm_gpusvm_pages_valid_unlocked(gpusvm, svm_pages))
>> +		goto set_seqno;
>> +
>> +	pfns = kvmalloc_array(npages, sizeof(*pfns), GFP_KERNEL);
>> +	if (!pfns)
>> +		return -ENOMEM;
>> +
>> +	if (!mmget_not_zero(mm)) {
>> +		err = -EFAULT;
>> +		goto err_free;
>> +	}
>> +
>> +	hmm_range.hmm_pfns = pfns;
>> +	err = hmm_range_fault_unlocked_timeout(&hmm_range, remaining);
>> +	mmput(mm);
>> +	if (err)
>> +		goto err_free;
>> +
>> +	if (!svm_pages->dma_addr) {
>> +		svm_pages->dma_addr =
>> +			kvzalloc_objs(*svm_pages->dma_addr, npages);
>> +		if (!svm_pages->dma_addr) {
>> +			err = -ENOMEM;
>> +			goto err_free;
>> +		}
>> +	}
>> +
>> +	svm_pages->state = (struct dma_iova_state){};
>> +	svm_pages->state_offset = 0;
>> +
>> +	/*
>> +	 * Perform all dma mappings under the notifier lock to not
>> +	 * access freed pages. A notifier will either block on
>> +	 * the notifier lock or unmap dma.
>> +	 */
>> +	drm_gpusvm_notifier_lock(gpusvm);
>> +
>> +	if (svm_pages->flags.unmapped) {
>> +		drm_gpusvm_notifier_unlock(gpusvm);
>> +		err = -EFAULT;
>> +		goto err_free;
>> +	}
>> +
>> +	if (mmu_interval_read_retry(notifier, hmm_range.notifier_seq)) {
>> +		drm_gpusvm_notifier_unlock(gpusvm);
>> +		kvfree(pfns);
>> +		goto retry;
>> +	}
>> +
>> +	err = drm_gpusvm_dma_map_pages(gpusvm, svm_pages, pfns, npages, ctx,
>> +				       dma_dir);
>>   	drm_gpusvm_notifier_unlock(gpusvm);
>> +	if (err)
>> +		goto err_free;
>> +
>>   	kvfree(pfns);
>>   set_seqno:
>>   	svm_pages->notifier_seq = hmm_range.notifier_seq;
>>   
>>   	return 0;
>>   
>> -err_unmap:
>> -	svm_pages->flags.has_dma_mapping = true;
>> -	__drm_gpusvm_unmap_pages(gpusvm, svm_pages, num_dma_mapped);
>> -	drm_gpusvm_notifier_unlock(gpusvm);
>>   err_free:
>>   	kvfree(pfns);
>>   	if (err == -EAGAIN)
>> -- 
>> 2.34.1
>>


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

* Re: [PATCH v2 3/4] drm/gpusvm: let drm_gpusvm_get_pages() map an array of pages
  2026-09-01 19:57   ` Matthew Brost
@ 2026-09-02  6:39     ` Huang, Honglei
  0 siblings, 0 replies; 15+ messages in thread
From: Huang, Honglei @ 2026-09-02  6:39 UTC (permalink / raw)
  To: Matthew Brost
  Cc: sima, rodrigo.vivi, thomas.hellstrom, himal.prasad.ghimiray, dakr,
	intel-xe, aliceryhl, Alexander.Deucher, Felix.Kuehling,
	Christian.Koenig, Ray.Huang, Junhua.Shen, amd-gfx, dri-devel



On 9/2/2026 3:57 AM, Matthew Brost wrote:
> On Tue, Sep 01, 2026 at 05:00:59PM +0800, Honglei Huang wrote:
>> With the N:1 drm_gpusvm_pages layout, one CPU range mirrored on several
>> drm_devices, the caller had to invoke get_pages() once per device and
>> repeat the HMM fault every time.
>>
>> Make get_pages() take a contiguous array of drm_gpusvm_pages plus a
>> count: fault once, then DMA map each instance by
>> drm_gpusvm_dma_map_pages() under a single read_retry gate. xe range and
>> userptr callers are updated.
>>
>> Document the N:1 array usage in the Overview, showing how get_pages()
>> and drm_gpusvm_range_set_unmapped() take the whole array and its count
>> while the unmap and free paths stay per-instance.
>>
>> Suggested-by: Matthew Brost <matthew.brost@intel.com>
>> Signed-off-by: Honglei Huang <honghuan@amd.com>
>> ---
>>   drivers/gpu/drm/drm_gpusvm.c    | 141 ++++++++++++++++++++++++--------
>>   drivers/gpu/drm/xe/xe_svm.c     |   2 +-
>>   drivers/gpu/drm/xe/xe_userptr.c |   2 +-
>>   include/drm/drm_gpusvm.h        |   1 +
>>   4 files changed, 108 insertions(+), 38 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/drm_gpusvm.c b/drivers/gpu/drm/drm_gpusvm.c
>> index 89c3061d8ef..810f801a9f7 100644
>> --- a/drivers/gpu/drm/drm_gpusvm.c
>> +++ b/drivers/gpu/drm/drm_gpusvm.c
>> @@ -80,6 +80,13 @@
>>    *			};
>>    *		};
>>    *
>> + *		static struct drm_gpusvm_pages *
>> + *		driver_pages(struct driver_range *drange)
>> + *		{
>> + *			return drange->num_pages == 1 ? &drange->inline_pages :
>> + *							drange->pages;
>> + *		}
>> + *
>>    *	In the N:1 case the driver allocates the pages array with a zeroing
>>    *	allocator (e.g. kcalloc(num_pages, ...)), initialises each entry with
>>    *	drm_gpusvm_init_pages(), and frees each entry with
>> @@ -89,6 +96,28 @@
>>    *	Each drm_gpusvm_pages must be zero-initialised and initialised with
>>    *	drm_gpusvm_init_pages(), called once per entry.
>>    *
>> + *	The 1:1 examples below pass @num_pages == 1 and &drange->pages. In the
>> + *	N:1 case the driver instead passes the whole array and its count, so a
>> + *	single call faults the CPU range once and DMA maps it for every owning
>> + *	drm_device, e.g.:
>> + *
>> + *	.. code-block:: c
>> + *
>> + *		// GPU fault handler: one fault, one DMA mapping per device
>> + *		err = drm_gpusvm_get_pages(gpusvm, driver_pages(drange),
>> + *					   drange->num_pages, gpusvm->mm,
>> + *					   &range->notifier->notifier,
>> + *					   drm_gpusvm_range_start(range),
>> + *					   drm_gpusvm_range_end(range), &ctx);
>> + *
>> + *		// Notifier callback: mark every instance unmapped in one call
>> + *		drm_gpusvm_range_set_unmapped(range, driver_pages(drange),
>> + *					      drange->num_pages, mmu_range);
>> + *
>> + *	The unmap and free paths stay per-instance: iterate @num_pages over
>> + *	driver_pages(drange) and call drm_gpusvm_unmap_pages() /
>> + *	drm_gpusvm_free_pages() for each entry.
>> + *
>>    * - Operations:
>>    *	Define the interface for driver-specific GPU SVM operations such as
>>    *	range allocation, notifier allocation, and invalidations.
>> @@ -232,7 +261,7 @@
>>    *				goto retry;
>>    *		}
>>    *
>> - *		err = drm_gpusvm_get_pages(gpusvm, &drange->pages,
>> + *		err = drm_gpusvm_get_pages(gpusvm, &drange->pages, 1,
>>    *					   gpusvm->mm, &range->notifier->notifier,
>>    *					   drm_gpusvm_range_start(range),
>>    *					   drm_gpusvm_range_end(range), &ctx);
>> @@ -1417,25 +1446,34 @@ EXPORT_SYMBOL_GPL(drm_gpusvm_pages_valid);
>>   /**
>>    * drm_gpusvm_pages_valid_unlocked() - GPU SVM pages valid unlocked
>>    * @gpusvm: Pointer to the GPU SVM structure
>> - * @svm_pages: Pointer to the GPU SVM pages structure
>> + * @svm_pages: Array of GPU SVM pages structures
>> + * @num_pages: Number of drm_gpusvm_pages instances in @svm_pages
>>    *
>> - * This function determines if a GPU SVM pages are valid. Expected be called
>> + * This function determines if every GPU SVM pages instance is valid, dropping
>> + * the stale dma_addr array of any instance which is not. Expected be called
>>    * without holding gpusvm->notifier_lock.
>>    *
>> - * Return: True if GPU SVM pages are valid, False otherwise
>> + * Return: True if all GPU SVM pages are valid, False otherwise
>>    */
>>   static bool drm_gpusvm_pages_valid_unlocked(struct drm_gpusvm *gpusvm,
>> -					    struct drm_gpusvm_pages *svm_pages)
>> +					    struct drm_gpusvm_pages *svm_pages,
>> +					    unsigned int num_pages)
>>   {
>> -	bool pages_valid;
>> +	bool pages_valid = true;
>> +	unsigned int p;
>>   
>> -	if (!svm_pages->dma_addr)
>> -		return false;
>> +	for (p = 0; p < num_pages; ++p) {
>> +		if (!svm_pages[p].dma_addr)
>> +			return false;
>> +	}
>>   
>>   	drm_gpusvm_notifier_lock(gpusvm);
>> -	pages_valid = drm_gpusvm_pages_valid(gpusvm, svm_pages);
>> -	if (!pages_valid)
>> -		__drm_gpusvm_free_pages(gpusvm, svm_pages);
>> +	for (p = 0; p < num_pages; ++p) {
>> +		if (drm_gpusvm_pages_valid(gpusvm, &svm_pages[p]))
>> +			continue;
>> +		__drm_gpusvm_free_pages(gpusvm, &svm_pages[p]);
>> +		pages_valid = false;
>> +	}
>>   	drm_gpusvm_notifier_unlock(gpusvm);
>>   
>>   	return pages_valid;
>> @@ -1451,8 +1489,9 @@ static bool drm_gpusvm_pages_valid_unlocked(struct drm_gpusvm *gpusvm,
>>    * @dma_dir: DMA data direction for the mappings
>>    *
>>    * Map the faulted @pfns into @svm_pages for DMA access through its owning
>> - * drm_device. Must be called under the notifier lock. On failure this unwinds
>> - * the partial mapping of this instance before returning.
>> + * drm_device. Must be called under the notifier lock and only for an instance
>> + * without a live mapping. On failure this unwinds the partial mapping of this
>> + * instance before returning.
>>    *
>>    * Return: 0 on success, negative error code on failure.
>>    */
>> @@ -1475,6 +1514,9 @@ static int drm_gpusvm_dma_map_pages(struct drm_gpusvm *gpusvm,
>>   
>>   	lockdep_assert_held(&gpusvm->notifier_lock);
>>   
>> +	*state = (struct dma_iova_state){};
>> +	svm_pages->state_offset = 0;
>> +
>>   	flags.__flags = svm_pages->flags.__flags;
>>   
>>   	for (i = 0, j = 0; i < npages; ++j) {
>> @@ -1603,20 +1645,29 @@ static int drm_gpusvm_dma_map_pages(struct drm_gpusvm *gpusvm,
>>   /**
>>    * drm_gpusvm_get_pages() - Get pages and populate GPU SVM pages struct
>>    * @gpusvm: Pointer to the GPU SVM structure
>> - * @svm_pages: The SVM pages to populate. This will contain the dma-addresses
>> + * @svm_pages: Array of SVM pages instances to populate with dma addresses
>> + * @num_pages: Number of drm_gpusvm_pages instances in @svm_pages
>>    * @mm: The mm corresponding to the CPU range
>>    * @notifier: The corresponding notifier for the given CPU range
>>    * @pages_start: Start CPU address for the pages
>>    * @pages_end: End CPU address for the pages (exclusive)
>>    * @ctx: GPU SVM context
>>    *
>> - * This function gets and maps pages for CPU range and ensures they are
>> - * mapped for DMA access.
>> + * This function gets and maps pages for a CPU range and ensures they are
>> + * mapped for DMA access. The HMM fault for the CPU range is performed once,
>> + * the DMA mapping by drm_gpusvm_dma_map_pages() is then done per instance,
>> + * one per owning drm_device. The retry against notifier races is kept here
>> + * in common code so drivers never open code it.
>> + * The common 1:1 case passes @num_pages == 1.
>> + *
>> + * On error the instances mapped before the failing one stay mapped, so the
>> + * caller must unmap and free every instance regardless of the return value.
>>    *
>>    * Return: 0 on success, negative error code on failure.
>>    */
>>   int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
>>   			 struct drm_gpusvm_pages *svm_pages,
>> +			 unsigned int num_pages,
>>   			 struct mm_struct *mm,
>>   			 struct mmu_interval_notifier *notifier,
>>   			 unsigned long pages_start, unsigned long pages_end,
>> @@ -1638,9 +1689,11 @@ int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
>>   	int err = 0;
>>   	enum dma_data_direction dma_dir = ctx->read_only ? DMA_TO_DEVICE :
>>   							   DMA_BIDIRECTIONAL;
>> +	unsigned int p;
>>   
>> -	if (!svm_pages->drm)
>> -		return -EINVAL;
>> +	for (p = 0; p < num_pages; ++p)
>> +		if (!svm_pages[p].drm)
>> +			return -EINVAL;
>>   
>>   retry:
>>   	remaining = timeout - jiffies;
>> @@ -1649,7 +1702,8 @@ int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
>>   		return -EBUSY;
>>   
>>   	hmm_range.notifier_seq = mmu_interval_read_begin(notifier);
>> -	if (drm_gpusvm_pages_valid_unlocked(gpusvm, svm_pages))
>> +
>> +	if (drm_gpusvm_pages_valid_unlocked(gpusvm, svm_pages, num_pages))
>>   		goto set_seqno;
>>   
>>   	pfns = kvmalloc_array(npages, sizeof(*pfns), GFP_KERNEL);
>> @@ -1667,18 +1721,17 @@ int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
>>   	if (err)
>>   		goto err_free;
>>   
>> -	if (!svm_pages->dma_addr) {
>> -		svm_pages->dma_addr =
>> -			kvzalloc_objs(*svm_pages->dma_addr, npages);
>> -		if (!svm_pages->dma_addr) {
>> +	for (p = 0; p < num_pages; ++p) {
>> +		if (svm_pages[p].dma_addr)
>> +			continue;
>> +		svm_pages[p].dma_addr =
>> +			kvzalloc_objs(*svm_pages[p].dma_addr, npages);
>> +		if (!svm_pages[p].dma_addr) {
>>   			err = -ENOMEM;
>>   			goto err_free;
>>   		}
>>   	}
>>   
>> -	svm_pages->state = (struct dma_iova_state){};
>> -	svm_pages->state_offset = 0;
>> -
>>   	/*
>>   	 * Perform all dma mappings under the notifier lock to not
>>   	 * access freed pages. A notifier will either block on
>> @@ -1686,10 +1739,12 @@ int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
>>   	 */
>>   	drm_gpusvm_notifier_lock(gpusvm);
>>   
>> -	if (svm_pages->flags.unmapped) {
>> -		drm_gpusvm_notifier_unlock(gpusvm);
>> -		err = -EFAULT;
>> -		goto err_free;
>> +	for (p = 0; p < num_pages; ++p) {
>> +		if (svm_pages[p].flags.unmapped) {
>> +			drm_gpusvm_notifier_unlock(gpusvm);
>> +			err = -EFAULT;
>> +			goto err_free;
>> +		}
> 
> I believe, given how the notifiers work, that checking
> `svm_pages[0].flags.unmapped` is actually sufficient. It's a
> micro-optimization, so I'm fine with it either way.

Agreed, will change to `svm_pages[0].flags.unmapped` .

>   
>>   	}
>>   
>>   	if (mmu_interval_read_retry(notifier, hmm_range.notifier_seq)) {
>> @@ -1698,15 +1753,29 @@ int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
>>   		goto retry;
>>   	}
>>   
>> -	err = drm_gpusvm_dma_map_pages(gpusvm, svm_pages, pfns, npages, ctx,
>> -				       dma_dir);
>> -	drm_gpusvm_notifier_unlock(gpusvm);
>> -	if (err)
>> -		goto err_free;
>> +	for (p = 0; p < num_pages; ++p) {
>> +		if (drm_gpusvm_pages_valid(gpusvm, &svm_pages[p]))
>> +			continue;
>>   
>> +		err = drm_gpusvm_dma_map_pages(gpusvm, &svm_pages[p], pfns,
>> +					       npages, ctx, dma_dir);
> 
> One thing that is different here is that if `drm_gpusvm_dma_map_pages()`
> fails, say at `p == 1`, then `p[0]` will already contain valid DMA
> mappings. I think this is actually fine, though, because the existing
> cleanup paths will eventually release those mappings one way or another.
>   
> That said, it's probably worth confirming this through a code-path audit
> and adding a comment here explaining why this is safe.
>   
> Again, Sashiko didn't run on this patch, and it would be good to get a
> run before merging this series.
> 

Actually, I hesitated when modifying the code whether to perform a 
rollback here. And I decided to not rollback here, driver can reuse the
previous success mapping when return -EAGAIN, and for other error code,
driver will call drm_gpusvm_unmap_pages then range_free safely.

And actullay I put some comments below, after if (err),
and int drm_gpusvm.c:1663, I put same documents for this situlation.

And I will also resent this series to trigger Sashiko review, and use AI 
to scan this part to ensure it is safe.

Regards,
Honglei

> Matt
> 
>> +		if (err) {
>> +			/*
>> +			 * The failing instance was unwound by the helper. Keep
>> +			 * the ones mapped earlier: the -EAGAIN retry reuses
>> +			 * them, and the driver unmaps every instance with the
>> +			 * range on the other error paths.
>> +			 */
>> +			drm_gpusvm_notifier_unlock(gpusvm);
>> +			goto err_free;
>> +		}
>> +	}
>> +
>> +	drm_gpusvm_notifier_unlock(gpusvm);
>>   	kvfree(pfns);
>>   set_seqno:
>> -	svm_pages->notifier_seq = hmm_range.notifier_seq;
>> +	for (p = 0; p < num_pages; ++p)
>> +		svm_pages[p].notifier_seq = hmm_range.notifier_seq;
>>   
>>   	return 0;
>>   
>> diff --git a/drivers/gpu/drm/xe/xe_svm.c b/drivers/gpu/drm/xe/xe_svm.c
>> index 627a741293d..1c7793d8caa 100644
>> --- a/drivers/gpu/drm/xe/xe_svm.c
>> +++ b/drivers/gpu/drm/xe/xe_svm.c
>> @@ -1598,7 +1598,7 @@ int xe_svm_range_get_pages(struct xe_vm *vm, struct xe_svm_range *range,
>>   
>>   	lockdep_assert_held(&range->lock);
>>   
>> -	err = drm_gpusvm_get_pages(&vm->svm.gpusvm, &range->pages,
>> +	err = drm_gpusvm_get_pages(&vm->svm.gpusvm, &range->pages, 1,
>>   				   vm->svm.gpusvm.mm,
>>   				   &range->base.notifier->notifier,
>>   				   drm_gpusvm_range_start(&range->base),
>> diff --git a/drivers/gpu/drm/xe/xe_userptr.c b/drivers/gpu/drm/xe/xe_userptr.c
>> index 90ac141fc12..9c1dac0fce6 100644
>> --- a/drivers/gpu/drm/xe/xe_userptr.c
>> +++ b/drivers/gpu/drm/xe/xe_userptr.c
>> @@ -91,7 +91,7 @@ int xe_vma_userptr_pin_pages(struct xe_userptr_vma *uvma)
>>   	if (vma->gpuva.flags & XE_VMA_DESTROYED)
>>   		return 0;
>>   
>> -	return drm_gpusvm_get_pages(&vm->svm.gpusvm, &uvma->userptr.pages,
>> +	return drm_gpusvm_get_pages(&vm->svm.gpusvm, &uvma->userptr.pages, 1,
>>   				    uvma->userptr.notifier.mm,
>>   				    &uvma->userptr.notifier,
>>   				    xe_vma_userptr(vma),
>> diff --git a/include/drm/drm_gpusvm.h b/include/drm/drm_gpusvm.h
>> index b7d987bf76a..d2b6f3d2b84 100644
>> --- a/include/drm/drm_gpusvm.h
>> +++ b/include/drm/drm_gpusvm.h
>> @@ -324,6 +324,7 @@ void drm_gpusvm_range_set_unmapped(struct drm_gpusvm_range *range,
>>   
>>   int drm_gpusvm_get_pages(struct drm_gpusvm *gpusvm,
>>   			 struct drm_gpusvm_pages *svm_pages,
>> +			 unsigned int num_pages,
>>   			 struct mm_struct *mm,
>>   			 struct mmu_interval_notifier *notifier,
>>   			 unsigned long pages_start, unsigned long pages_end,
>> -- 
>> 2.34.1
>>


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

end of thread, other threads:[~2026-09-02  6:39 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-01  9:00 [PATCH v2 0/4] drm/gpusvm: share one HMM fault across per-device DMA mappings Honglei Huang
2026-09-01  9:00 ` [PATCH v2 1/4] drm/gpusvm: move dma_addr allocation before the notifier lock Honglei Huang
2026-09-01 19:39   ` Matthew Brost
2026-09-02  6:21     ` Huang, Honglei
2026-09-01  9:00 ` [PATCH v2 2/4] drm/gpusvm: extract drm_gpusvm_dma_map_pages() helper Honglei Huang
2026-09-01 19:43   ` Matthew Brost
2026-09-02  6:22     ` Huang, Honglei
2026-09-01  9:00 ` [PATCH v2 3/4] drm/gpusvm: let drm_gpusvm_get_pages() map an array of pages Honglei Huang
2026-09-01 19:57   ` Matthew Brost
2026-09-02  6:39     ` Huang, Honglei
2026-09-01  9:01 ` [PATCH v2 4/4] drm/gpusvm: make the DMA mapping step in get_pages() optional Honglei Huang
2026-09-01 20:02   ` Matthew Brost
2026-09-01  9:09 ` ✓ CI.KUnit: success for drm/gpusvm: share one HMM fault across per-device DMA mappings (rev2) Patchwork
2026-09-01 10:04 ` ✓ Xe.CI.BAT: " Patchwork
2026-09-01 10:52 ` ✓ Xe.CI.FULL: " Patchwork

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