Intel-XE Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 00/12] [PATCH v14 00/12] migrate on fault for device pages
@ 2026-09-22  5:34 mpenttil
  2026-09-22  5:34 ` [PATCH v14 01/12] mm/Kconfig: changes for " mpenttil
                   ` (17 more replies)
  0 siblings, 18 replies; 35+ messages in thread
From: mpenttil @ 2026-09-22  5:34 UTC (permalink / raw)
  To: linux-mm
  Cc: dri-devel, intel-xe, linux-kernel, Mika Penttilä,
	David Hildenbrand, Jason Gunthorpe, Leon Romanovsky,
	Alistair Popple, Balbir Singh, Zi Yan, Matthew Brost,
	Andrew Morton, Lorenzo Stoakes, Liam R. Howlett, Vlastimil Babka,
	Mike Rapoport, Suren Baghdasaryan, Michal Hocko

From: Mika Penttilä <mpenttil@redhat.com>

Currently, the way device page faulting and migration works
is not optimal, if you want to do both fault handling and
migration at once.

Being able to migrate not present pages (or pages mapped with incorrect
permissions, eg. COW) to the GPU requires doing either of the
following sequences:

1. hmm_range_fault() - fault in non-present pages with correct permissions, etc.
2. migrate_vma_*() - migrate the pages

Or:

1. migrate_vma_*() - migrate present pages
2. If non-present pages detected by migrate_vma_*():
   a) call hmm_range_fault() to fault pages in
   b) call migrate_vma_*() again to migrate now present pages

The problem with the first sequence is that you always have to do two
page walks even when most of the time the pages are present or zero page
mappings so the common case takes a performance hit.

The second sequence is better for the common case, but far worse if
pages aren't present because now you have to walk the page tables three
times (once to find the page is not present, once so hmm_range_fault()
can find a non-present page to fault in and once again to setup the
migration). It is also tricky to code correctly. One page table walk
could costs over 1000 cpu cycles on X86-64, which is a significant hit.

We should be able to walk the page table once, faulting
pages in as required and replacing them with migration entries if
requested.

Add a new flag to HMM APIs, HMM_PFN_REQ_MIGRATE,
which tells to prepare for migration also during fault handling.
For the migrate_vma_setup() call paths, new flags, MIGRATE_VMA_FAULT,
and MIGRATE_VMA_WRITE are added to tell to add fault handling to migrate.

An extra benefit of migrating with hmm_range_fault() path
is the migrate_vma.vma gets populated, so no need to
retrieve that separataly.

Tested in X86-64 VM with HMM test device, passing the selftests.
For performance, the migrate throughput tests from the selftests
show similar numbers (within error margin) as unmodified kernel.
Tested also rebased on the
"Remove device private pages from physical address space" series:
https://lore.kernel.org/linux-mm/20260130111050.53670-1-jniethe@nvidia.com/
plus a small patch to adjust with no problems.

Changes since v13:
  - rebased on v7.3-rc
  - fix compile error in !CONFIG_MMU_NOTIFIER kernel configs
  - added patch 12/12 for Documentation/mm/hmm updates
  - document the semantics of new flags for migrate_vma_setup()
  - fix error handling after migrate_vma_split_folio() failure
  - comment and style fixes

Link to v13: https://lore.kernel.org/linux-mm/20260804042631.2175585-1-mpenttil@redhat.com/

Cc: David Hildenbrand <david@kernel.org>
Cc: Jason Gunthorpe <jgg@nvidia.com>
Cc: Leon Romanovsky <leonro@nvidia.com>
Cc: Alistair Popple <apopple@nvidia.com>
Cc: Balbir Singh <balbirs@nvidia.com>
Cc: Zi Yan <ziy@nvidia.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Lorenzo Stoakes <ljs@kernel.org>
Cc: "Liam R. Howlett" <Liam.Howlett@oracle.com>
Cc: Vlastimil Babka <vbabka@suse.cz>
Cc: Mike Rapoport <rppt@kernel.org>
Cc: Suren Baghdasaryan <surenb@google.com>
Cc: Michal Hocko <mhocko@suse.com>

Mika Penttilä (12):
  mm/Kconfig: changes for migrate on fault for device pages
  mm: add helper to convert HMM pfn to migrate pfn
  mm/hmm: preparations for HMM to participate in migration
  mm/hmm: do the plumbing for HMM to participate in migration
  mm/hmm: implement folio split for migrate needs in HMM pagewalk
  mm/hmm: migrate collection in HMM pagewalk - pte level
  mm/hmm: migrate collection in HMM pagewalk - pmd level
  mm/hmm: add lazy MMU mode support for migration in HMM pagewalk
  mm/hmm: implement rollback for device page migration in HMM pagewalk
  mm: enable device page migration from HMM pagewalk
  lib/test_hmm: add a new testcase for the migrate on fault
  Documentation/mm/hmm: document migration through hmm_range_fault()

 Documentation/mm/hmm.rst               |  39 +
 include/linux/hmm.h                    |  51 +-
 include/linux/migrate.h                |  58 +-
 lib/test_hmm.c                         | 132 +++-
 lib/test_hmm_uapi.h                    |  21 +-
 mm/Kconfig                             |   1 +
 mm/hmm.c                               | 977 +++++++++++++++++++++++--
 mm/migrate_device.c                    | 617 +++-------------
 tools/testing/selftests/mm/hmm-tests.c |  54 ++
 9 files changed, 1341 insertions(+), 609 deletions(-)

drm-tip
base-commit: dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04
-- 
2.55.0


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

* [PATCH v14 01/12] mm/Kconfig: changes for migrate on fault for device pages
  2026-09-22  5:34 [PATCH 00/12] [PATCH v14 00/12] migrate on fault for device pages mpenttil
@ 2026-09-22  5:34 ` mpenttil
  2026-09-22  5:44   ` sashiko-bot
  2026-09-22 22:27   ` Balbir Singh
  2026-09-22  5:34 ` [PATCH v14 02/12] mm: add helper to convert HMM pfn to migrate pfn mpenttil
                   ` (16 subsequent siblings)
  17 siblings, 2 replies; 35+ messages in thread
From: mpenttil @ 2026-09-22  5:34 UTC (permalink / raw)
  To: linux-mm
  Cc: dri-devel, intel-xe, linux-kernel, Mika Penttilä,
	David Hildenbrand, Jason Gunthorpe, Leon Romanovsky,
	Alistair Popple, Balbir Singh, Zi Yan, Matthew Brost,
	Andrew Morton, Lorenzo Stoakes, Liam R. Howlett, Vlastimil Babka,
	Mike Rapoport, Suren Baghdasaryan, Michal Hocko

From: Mika Penttilä <mpenttil@redhat.com>

HMM depends on MMU notifiers. With the unified HMM/migrate_device
page table walk migrate_device needs HMM enabled.
Enable them explicitly to avoid breaking random configs.

Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: David Hildenbrand <david@kernel.org>
Cc: Lorenzo Stoakes <ljs@kernel.org>
Cc: "Liam R. Howlett" <Liam.Howlett@oracle.com>
Cc: Vlastimil Babka <vbabka@suse.cz>
Cc: Mike Rapoport <rppt@kernel.org>
Cc: Suren Baghdasaryan <surenb@google.com>
Cc: Michal Hocko <mhocko@suse.com>
Signed-off-by: Mika Penttilä <mpenttil@redhat.com>
Acked-by: David Hildenbrand (Arm) <david@kernel.org>
---
 mm/Kconfig | 1 +
 1 file changed, 1 insertion(+)

diff --git a/mm/Kconfig b/mm/Kconfig
index 604c58199acb..b7a485beb9a7 100644
--- a/mm/Kconfig
+++ b/mm/Kconfig
@@ -687,6 +687,7 @@ config MIGRATION
 
 config DEVICE_MIGRATION
 	def_bool MIGRATION && ZONE_DEVICE
+	select HMM_MIRROR
 
 config ARCH_ENABLE_HUGEPAGE_MIGRATION
 	bool
-- 
2.55.0


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

* [PATCH v14 02/12] mm: add helper to convert HMM pfn to migrate pfn
  2026-09-22  5:34 [PATCH 00/12] [PATCH v14 00/12] migrate on fault for device pages mpenttil
  2026-09-22  5:34 ` [PATCH v14 01/12] mm/Kconfig: changes for " mpenttil
@ 2026-09-22  5:34 ` mpenttil
  2026-09-22  5:34 ` [PATCH v14 03/12] mm/hmm: preparations for HMM to participate in migration mpenttil
                   ` (15 subsequent siblings)
  17 siblings, 0 replies; 35+ messages in thread
From: mpenttil @ 2026-09-22  5:34 UTC (permalink / raw)
  To: linux-mm
  Cc: dri-devel, intel-xe, linux-kernel, Mika Penttilä,
	David Hildenbrand, Jason Gunthorpe, Leon Romanovsky,
	Alistair Popple, Balbir Singh, Zi Yan, Matthew Brost,
	Andrew Morton, Lorenzo Stoakes, Liam R. Howlett, Vlastimil Babka,
	Mike Rapoport, Suren Baghdasaryan, Michal Hocko

From: Mika Penttilä <mpenttil@redhat.com>

The unified HMM/migrate_device pagewalk does the "collecting"
on the HMM side, so we need a helper to transfer pfns to the
migrate_vma world.

Cc: David Hildenbrand <david@kernel.org>
Cc: Jason Gunthorpe <jgg@nvidia.com>
Cc: Leon Romanovsky <leonro@nvidia.com>
Cc: Alistair Popple <apopple@nvidia.com>
Cc: Balbir Singh <balbirs@nvidia.com>
Cc: Zi Yan <ziy@nvidia.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Suggested-by: Alistair Popple <apopple@nvidia.com>
Signed-off-by: Mika Penttilä <mpenttil@redhat.com>
---
 include/linux/hmm.h     | 29 +++++++++++++++++-----
 include/linux/migrate.h |  3 ++-
 mm/migrate_device.c     | 55 +++++++++++++++++++++++++++++++++++++++++
 3 files changed, 80 insertions(+), 7 deletions(-)

diff --git a/include/linux/hmm.h b/include/linux/hmm.h
index 6f04e3932f5b..4f56f3419cb4 100644
--- a/include/linux/hmm.h
+++ b/include/linux/hmm.h
@@ -13,6 +13,8 @@
 
 struct mmu_interval_notifier;
 
+struct migrate_vma;
+
 /*
  * On output:
  * 0             - The page is faultable and a future call with 
@@ -27,13 +29,22 @@ struct mmu_interval_notifier;
  * HMM_PFN_P2PDMA_BUS - Bus mapped P2P transfer
  * HMM_PFN_DMA_MAPPED - Flag preserved on input-to-output transformation
  *                      to mark that page is already DMA mapped
+ * HMM_PFN_MIGRATE    - The entry is to be migrated. Note, HMM_PFN_MIGRATE
+ *                      alone without HMM_PFN_VALID denotes the
+ *                      empty page.
+ *                      This flag optionally together with HMM_PFN_COMPOUND
+ *                      are indicators for migrate_hmm_range_setup() to
+ *                      setup the migrate pfns.
+ * HMM_PFN_COMPOUND   - The entry represents a > 0 order page
  *
  * On input:
- * 0                 - Return the current state of the page, do not fault it.
- * HMM_PFN_REQ_FAULT - The output must have HMM_PFN_VALID or hmm_range_fault()
- *                     will fail
- * HMM_PFN_REQ_WRITE - The output must have HMM_PFN_WRITE or hmm_range_fault()
- *                     will fail. Must be combined with HMM_PFN_REQ_FAULT.
+ * 0                   - Return the current state of the page, do not fault it.
+ * HMM_PFN_REQ_FAULT   - The output must have HMM_PFN_VALID or hmm_range_fault()
+ *                       will fail
+ * HMM_PFN_REQ_WRITE   - The output must have HMM_PFN_WRITE or hmm_range_fault()
+ *                       will fail. Must be combined with HMM_PFN_REQ_FAULT.
+ * HMM_PFN_REQ_MIGRATE - For default_flags only, request to migrate the range,
+ *                       according to hmm_range.migrate.flags
  */
 enum hmm_pfn_flags {
 	/* Output fields and flags */
@@ -48,11 +59,15 @@ enum hmm_pfn_flags {
 	HMM_PFN_P2PDMA     = 1UL << (BITS_PER_LONG - 5),
 	HMM_PFN_P2PDMA_BUS = 1UL << (BITS_PER_LONG - 6),
 
-	HMM_PFN_ORDER_SHIFT = (BITS_PER_LONG - 11),
+	/* Migrate request */
+	HMM_PFN_MIGRATE    = 1UL << (BITS_PER_LONG - 7),
+	HMM_PFN_COMPOUND   = 1UL << (BITS_PER_LONG - 8),
+	HMM_PFN_ORDER_SHIFT = (BITS_PER_LONG - 13),
 
 	/* Input flags */
 	HMM_PFN_REQ_FAULT = HMM_PFN_VALID,
 	HMM_PFN_REQ_WRITE = HMM_PFN_WRITE,
+	HMM_PFN_REQ_MIGRATE = HMM_PFN_MIGRATE,
 
 	HMM_PFN_FLAGS = ~((1UL << HMM_PFN_ORDER_SHIFT) - 1),
 };
@@ -107,6 +122,7 @@ static inline unsigned int hmm_pfn_to_map_order(unsigned long hmm_pfn)
  * @default_flags: default flags for the range (write, read, ... see hmm doc)
  * @pfn_flags_mask: allows to mask pfn flags so that only default_flags matter
  * @dev_private_owner: owner of device private pages
+ * @migrate: structure for migrating a range of a VMA
  */
 struct hmm_range {
 	struct mmu_interval_notifier *notifier;
@@ -117,6 +133,7 @@ struct hmm_range {
 	unsigned long		default_flags;
 	unsigned long		pfn_flags_mask;
 	void			*dev_private_owner;
+	struct migrate_vma      *migrate;
 };
 
 /*
diff --git a/include/linux/migrate.h b/include/linux/migrate.h
index 78424b3824c2..280ec9a866c7 100644
--- a/include/linux/migrate.h
+++ b/include/linux/migrate.h
@@ -3,6 +3,7 @@
 #define _LINUX_MIGRATE_H
 
 #include <linux/mm.h>
+#include <linux/hmm.h>
 #include <linux/mempolicy.h>
 #include <linux/migrate_mode.h>
 #include <linux/hugetlb.h>
@@ -202,7 +203,7 @@ void migrate_device_pages(unsigned long *src_pfns, unsigned long *dst_pfns,
 			unsigned long npages);
 void migrate_device_finalize(unsigned long *src_pfns,
 			unsigned long *dst_pfns, unsigned long npages);
-
+void migrate_hmm_range_setup(struct hmm_range *range);
 #endif /* CONFIG_MIGRATION */
 
 #endif /* _LINUX_MIGRATE_H */
diff --git a/mm/migrate_device.c b/mm/migrate_device.c
index 009bfa8b212d..43e571e82cca 100644
--- a/mm/migrate_device.c
+++ b/mm/migrate_device.c
@@ -1528,3 +1528,58 @@ int migrate_device_coherent_folio(struct folio *folio)
 		return 0;
 	return -EBUSY;
 }
+
+/**
+ * migrate_hmm_range_setup() - prepare to migrate a range of memory
+ * @range: contains pointer to struct migrate_vma to be set up.
+ *
+ * When collecting has been done with hmm_range_fault(), this
+ * should be called next, and completes range->migrate by
+ * populating migrate->src[] and migrate->dst[]
+ * using range->hmm_pfns[].
+ * Also, migrate->cpages and migrate->npages get initialized.
+ * After migrate_hmm_range_setup(), range->migrate is good
+ * for the rest of the migrate_vma_* flow.
+ */
+void migrate_hmm_range_setup(struct hmm_range *range)
+{
+	struct migrate_vma *migrate = range->migrate;
+
+	if (!migrate)
+		return;
+
+	migrate->npages = (migrate->end - migrate->start) >> PAGE_SHIFT;
+	migrate->cpages = 0;
+
+	for (unsigned long i = 0; i < migrate->npages; i++) {
+		unsigned long pfn = range->hmm_pfns[i];
+
+		/*
+		 * We are only interested in entries to be
+		 * migrated.
+		 */
+		if (!(pfn & HMM_PFN_MIGRATE)) {
+			migrate->src[i] = 0;
+			migrate->dst[i] = 0;
+			continue;
+		}
+
+		migrate->cpages++;
+
+		/* HMM_PFN_MIGRATE without HMM_PFN_VALID denotes the special zero page */
+		if (pfn & HMM_PFN_VALID)
+			migrate->src[i] = migrate_pfn(page_to_pfn(hmm_pfn_to_page(pfn)));
+		else
+			migrate->src[i] = 0;
+
+		migrate->src[i] |= MIGRATE_PFN_MIGRATE;
+		migrate->src[i] |= (pfn & HMM_PFN_WRITE) ? MIGRATE_PFN_WRITE : 0;
+		migrate->src[i] |= (pfn & HMM_PFN_COMPOUND) ? MIGRATE_PFN_COMPOUND : 0;
+		migrate->dst[i] = 0;
+	}
+
+	if (migrate->cpages)
+		migrate_vma_unmap(migrate);
+
+}
+EXPORT_SYMBOL(migrate_hmm_range_setup);
-- 
2.55.0


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

* [PATCH v14 03/12] mm/hmm: preparations for HMM to participate in migration
  2026-09-22  5:34 [PATCH 00/12] [PATCH v14 00/12] migrate on fault for device pages mpenttil
  2026-09-22  5:34 ` [PATCH v14 01/12] mm/Kconfig: changes for " mpenttil
  2026-09-22  5:34 ` [PATCH v14 02/12] mm: add helper to convert HMM pfn to migrate pfn mpenttil
@ 2026-09-22  5:34 ` mpenttil
  2026-09-22  5:49   ` sashiko-bot
  2026-09-22  5:34 ` [PATCH v14 04/12] mm/hmm: do the plumbing " mpenttil
                   ` (14 subsequent siblings)
  17 siblings, 1 reply; 35+ messages in thread
From: mpenttil @ 2026-09-22  5:34 UTC (permalink / raw)
  To: linux-mm
  Cc: dri-devel, intel-xe, linux-kernel, Mika Penttilä,
	David Hildenbrand, Jason Gunthorpe, Leon Romanovsky,
	Alistair Popple, Balbir Singh, Zi Yan, Matthew Brost,
	Andrew Morton, Lorenzo Stoakes, Liam R. Howlett, Vlastimil Babka,
	Mike Rapoport, Suren Baghdasaryan, Michal Hocko

From: Mika Penttilä <mpenttil@redhat.com>

For migration to happen after hmm_range_fault(), the vma has to
retrieved. Luckily, pagewalk already resolves that for us, so
just have to save it for further use. For migration, mmap_lock
has to be hold for the whole operation, so vma stays stable.
In case lock-drop behavior is requested, return an error while
migrating. Also, rename some struct hmm_vma_walk fields to solve
namespace collisions, and we are later introducing more
xxlocked fields so be unambiguous.

Take care also of firing the mmu_notifier when migrating.

Also, prepare for differencies of how mm_struct * is retrieved
in fault and migrate_vma paths.

Cc: David Hildenbrand <david@kernel.org>
Cc: Jason Gunthorpe <jgg@nvidia.com>
Cc: Leon Romanovsky <leonro@nvidia.com>
Cc: Alistair Popple <apopple@nvidia.com>
Cc: Balbir Singh <balbirs@nvidia.com>
Cc: Zi Yan <ziy@nvidia.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Suggested-by: Alistair Popple <apopple@nvidia.com>
Signed-off-by: Mika Penttilä <mpenttil@redhat.com>
---
 include/linux/migrate.h |  49 +++++++++++++++++-
 lib/test_hmm.c          |   2 +-
 mm/hmm.c                | 107 ++++++++++++++++++++++++++++++++++------
 3 files changed, 141 insertions(+), 17 deletions(-)

diff --git a/include/linux/migrate.h b/include/linux/migrate.h
index 280ec9a866c7..01c5f62a56e9 100644
--- a/include/linux/migrate.h
+++ b/include/linux/migrate.h
@@ -5,6 +5,7 @@
 #include <linux/mm.h>
 #include <linux/hmm.h>
 #include <linux/mempolicy.h>
+#include <linux/mmu_notifier.h>
 #include <linux/migrate_mode.h>
 #include <linux/hugetlb.h>
 
@@ -108,6 +109,29 @@ static inline void softleaf_entry_wait_on_locked(softleaf_t entry, spinlock_t *p
 	spin_unlock(ptl);
 }
 
+enum migrate_vma_info {
+	MIGRATE_VMA_SELECT_NONE = 0,
+	MIGRATE_VMA_SELECT_COMPOUND = MIGRATE_VMA_SELECT_NONE,
+};
+
+static inline enum migrate_vma_info hmm_select_migrate(struct hmm_range *range)
+{
+	return MIGRATE_VMA_SELECT_NONE;
+}
+
+static inline void hmm_fill_migrate_vma(struct hmm_range *range,
+					struct vm_area_struct *vma,
+					unsigned long start,
+					unsigned long end)
+{
+}
+
+#ifdef CONFIG_MMU_NOTIFIER
+static inline struct mm_struct *hmm_range_fault_mm(struct hmm_range *range)
+{
+	return range->notifier->mm;
+}
+#endif
 #endif /* CONFIG_MIGRATION */
 
 #ifdef CONFIG_NUMA_BALANCING
@@ -151,7 +175,7 @@ static inline unsigned long migrate_pfn(unsigned long pfn)
 	return (pfn << MIGRATE_PFN_SHIFT) | MIGRATE_PFN_VALID;
 }
 
-enum migrate_vma_direction {
+enum migrate_vma_info {
 	MIGRATE_VMA_SELECT_SYSTEM = 1 << 0,
 	MIGRATE_VMA_SELECT_DEVICE_PRIVATE = 1 << 1,
 	MIGRATE_VMA_SELECT_DEVICE_COHERENT = 1 << 2,
@@ -193,6 +217,29 @@ struct migrate_vma {
 	struct page		*fault_page;
 };
 
+// TODO: enable migration
+static inline enum migrate_vma_info hmm_select_migrate(struct hmm_range *range)
+{
+	return 0;
+}
+
+#ifdef CONFIG_MMU_NOTIFIER
+static inline struct mm_struct *hmm_range_fault_mm(struct hmm_range *range)
+{
+	return range->notifier ? range->notifier->mm : range->migrate->vma->vm_mm;
+}
+#endif
+
+static inline void hmm_fill_migrate_vma(struct hmm_range *range,
+					struct vm_area_struct *vma,
+					unsigned long start,
+					unsigned long end)
+{
+	range->migrate->vma   = vma;
+	range->migrate->start = start;
+	range->migrate->end   = end;
+}
+
 int migrate_vma_setup(struct migrate_vma *args);
 void migrate_vma_pages(struct migrate_vma *migrate);
 void migrate_vma_finalize(struct migrate_vma *migrate);
diff --git a/lib/test_hmm.c b/lib/test_hmm.c
index 6911daa9f854..cd88e8177d0a 100644
--- a/lib/test_hmm.c
+++ b/lib/test_hmm.c
@@ -145,7 +145,7 @@ static bool dmirror_is_private_zone(struct dmirror_device *mdevice)
 		HMM_DMIRROR_MEMORY_DEVICE_PRIVATE);
 }
 
-static enum migrate_vma_direction
+static enum migrate_vma_info
 dmirror_select_device(struct dmirror *dmirror)
 {
 	return (dmirror->mdevice->zone_device_type ==
diff --git a/mm/hmm.c b/mm/hmm.c
index 2f1e98c6b644..be39d2e5403a 100644
--- a/mm/hmm.c
+++ b/mm/hmm.c
@@ -21,6 +21,7 @@
 #include <linux/pagemap.h>
 #include <linux/leafops.h>
 #include <linux/hugetlb.h>
+#include <linux/migrate.h>
 #include <linux/memremap.h>
 #include <linux/sched/mm.h>
 #include <linux/jump_label.h>
@@ -28,15 +29,21 @@
 #include <linux/pci-p2pdma.h>
 #include <linux/mmu_notifier.h>
 #include <linux/memory_hotplug.h>
+#include <asm/tlbflush.h>
 
 #include "internal.h"
 
 struct hmm_vma_walk {
-	struct hmm_range	*range;
-	bool			*locked;
-	unsigned long		last;
-	unsigned long		end;
-	unsigned int		required_fault;
+	struct mmu_notifier_range	mmu_range;
+	struct vm_area_struct		*vma;
+	struct hmm_range		*range;
+	unsigned long			start;
+	unsigned long			end;
+	unsigned long			last;
+	/* fault and lock drop related fields */
+	bool				*mmlocked;
+	unsigned long			fault_end;
+	unsigned int			required_fault;
 };
 
 /*
@@ -95,7 +102,7 @@ static int hmm_record_fault(unsigned long addr, unsigned long end,
 
 	WARN_ON_ONCE(!required_fault);
 	hmm_vma_walk->last = addr;
-	hmm_vma_walk->end = end;
+	hmm_vma_walk->fault_end = end;
 	hmm_vma_walk->required_fault = required_fault;
 	return HMM_FAULT_PENDING;
 }
@@ -400,6 +407,57 @@ static int hmm_vma_handle_absent_pmd(struct mm_walk *walk, unsigned long start,
 }
 #endif  /* CONFIG_ARCH_HAS_PMD_SOFTLEAVES */
 
+static int hmm_vma_capture_migrate_range(unsigned long start,
+					 unsigned long end,
+					 struct mm_walk *walk)
+{
+	struct hmm_vma_walk *hmm_vma_walk = walk->private;
+	struct hmm_range *range = hmm_vma_walk->range;
+
+	if (!hmm_select_migrate(range))
+		return 0;
+
+	if (hmm_vma_walk->vma && (hmm_vma_walk->vma != walk->vma))
+		return -ERANGE;
+
+	hmm_vma_walk->vma = walk->vma;
+	hmm_vma_walk->start = start;
+	hmm_vma_walk->end = end;
+
+	if (end - start > range->end - range->start)
+		return -ERANGE;
+
+	if (!hmm_vma_walk->mmu_range.owner) {
+		mmu_notifier_range_init_owner(&hmm_vma_walk->mmu_range, MMU_NOTIFY_MIGRATE, 0,
+					      walk->vma->vm_mm, start, end,
+					      range->dev_private_owner);
+		mmu_notifier_invalidate_range_start(&hmm_vma_walk->mmu_range);
+	}
+
+	return 0;
+}
+
+static void hmm_vma_post_range_fault(struct hmm_vma_walk *hmm_vma_walk)
+{
+
+	struct hmm_range *range = hmm_vma_walk->range;
+
+	if (hmm_select_migrate(range) &&
+	    hmm_vma_walk->mmu_range.owner) {
+		/*
+		 *  The migrate_vma path has the following initialized,
+		 *  so take care of fault path below.
+		 */
+		if (range->notifier) {
+			hmm_fill_migrate_vma(range,
+					     hmm_vma_walk->vma,
+					     hmm_vma_walk->start,
+					     hmm_vma_walk->end);
+		}
+		mmu_notifier_invalidate_range_end(&hmm_vma_walk->mmu_range);
+	}
+}
+
 static int hmm_vma_walk_pmd(pmd_t *pmdp,
 			    unsigned long start,
 			    unsigned long end,
@@ -594,6 +652,11 @@ static int hmm_vma_walk_test(unsigned long start, unsigned long end,
 	struct hmm_vma_walk *hmm_vma_walk = walk->private;
 	struct hmm_range *range = hmm_vma_walk->range;
 	struct vm_area_struct *vma = walk->vma;
+	int r;
+
+	r = hmm_vma_capture_migrate_range(start, end, walk);
+	if (r)
+		return r;
 
 	if (!(vma->vm_flags & (VM_IO | VM_PFNMAP)) &&
 	    vma->vm_flags & VM_READ)
@@ -646,12 +709,12 @@ static int hmm_do_fault(struct mm_struct *mm,
 			struct hmm_vma_walk *hmm_vma_walk)
 {
 	unsigned long addr = hmm_vma_walk->last;
-	unsigned long end = hmm_vma_walk->end;
+	unsigned long end = hmm_vma_walk->fault_end;
 	unsigned int required_fault = hmm_vma_walk->required_fault;
 	unsigned int fault_flags = FAULT_FLAG_REMOTE;
 	struct vm_area_struct *vma;
 
-	if (hmm_vma_walk->locked)
+	if (hmm_vma_walk->mmlocked)
 		fault_flags |= FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
 
 	vma = vma_lookup(mm, addr);
@@ -670,8 +733,8 @@ static int hmm_do_fault(struct mm_struct *mm,
 		ret = handle_mm_fault(vma, addr, fault_flags, NULL);
 
 		if (ret & (VM_FAULT_COMPLETED | VM_FAULT_RETRY)) {
-			if (hmm_vma_walk->locked)    /* needed by sparse */
-				*hmm_vma_walk->locked = false;
+			if (hmm_vma_walk->mmlocked)    /* needed by sparse */
+				*hmm_vma_walk->mmlocked = false;
 			else
 				WARN_ON_ONCE(1);    /* broken fault handler */
 			return HMM_FAULT_UNLOCKED;
@@ -694,19 +757,31 @@ static int hmm_range_fault_locked(struct hmm_range *range, bool *locked)
 {
 	struct hmm_vma_walk hmm_vma_walk = {
 		.range = range,
-		.locked = locked,
+		.mmlocked = locked,
 		.last = range->start,
 	};
-	struct mm_struct *mm = range->notifier->mm;
+	/*
+	 *  Could be serving a device fault or come from migrate
+	 *  entry point. For the former we have not resolved the vma
+	 *  yet, and the latter we don't have a notifier (but have a vma).
+	 *
+	 */
+	struct mm_struct *mm = hmm_range_fault_mm(range);
 	int ret;
 
+	/* Migration is incompatible with mmap lock drop */
+	if (locked && hmm_select_migrate(range))
+		return -EINVAL;
+
 	mmap_assert_locked(mm);
 
 	do {
 		/* If range is no longer valid force retry. */
-		if (mmu_interval_check_retry(range->notifier,
-					     range->notifier_seq))
-			return -EBUSY;
+		if (range->notifier && mmu_interval_check_retry(range->notifier,
+								range->notifier_seq)) {
+			ret =  -EBUSY;
+			break;
+		}
 		ret = walk_page_range(mm, hmm_vma_walk.last, range->end,
 				      &hmm_walk_ops, &hmm_vma_walk);
 		/*
@@ -732,6 +807,8 @@ static int hmm_range_fault_locked(struct hmm_range *range, bool *locked)
 		 * output, and all >= are still at their input values.
 		 */
 	} while (ret == -EBUSY);
+
+	hmm_vma_post_range_fault(&hmm_vma_walk);
 	return ret;
 }
 
-- 
2.55.0


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

* [PATCH v14 04/12] mm/hmm: do the plumbing for HMM to participate in migration
  2026-09-22  5:34 [PATCH 00/12] [PATCH v14 00/12] migrate on fault for device pages mpenttil
                   ` (2 preceding siblings ...)
  2026-09-22  5:34 ` [PATCH v14 03/12] mm/hmm: preparations for HMM to participate in migration mpenttil
@ 2026-09-22  5:34 ` mpenttil
  2026-09-22  5:50   ` sashiko-bot
  2026-09-22  5:34 ` [PATCH v14 05/12] mm/hmm: implement folio split for migrate needs in HMM pagewalk mpenttil
                   ` (13 subsequent siblings)
  17 siblings, 1 reply; 35+ messages in thread
From: mpenttil @ 2026-09-22  5:34 UTC (permalink / raw)
  To: linux-mm
  Cc: dri-devel, intel-xe, linux-kernel, Mika Penttilä,
	David Hildenbrand, Jason Gunthorpe, Leon Romanovsky,
	Alistair Popple, Balbir Singh, Zi Yan, Matthew Brost,
	Andrew Morton, Lorenzo Stoakes, Liam R. Howlett, Vlastimil Babka,
	Mike Rapoport, Suren Baghdasaryan, Michal Hocko

From: Mika Penttilä <mpenttil@redhat.com>

Do the preparations in hmm_range_fault() and pagewalk callbacks to
do the "collecting" part of migration, needed for migration.

These steps include locking for pmd/pte if migrating, and calling the
still dummy hmm_vma_handle_migrate_prepare_pmd() and
hmm_vma_handle_migrate_prepare()  functions in the pagewalk.

When doing migration, have to have pmd/pte table locked for the
duration of both hmm_vma_handle*() and hmm_vma_handle_migrate_prepare*()
walks, and unlock when handling the faults.

Cc: David Hildenbrand <david@kernel.org>
Cc: Jason Gunthorpe <jgg@nvidia.com>
Cc: Leon Romanovsky <leonro@nvidia.com>
Cc: Alistair Popple <apopple@nvidia.com>
Cc: Balbir Singh <balbirs@nvidia.com>
Cc: Zi Yan <ziy@nvidia.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Suggested-by: Alistair Popple <apopple@nvidia.com>
Signed-off-by: Mika Penttilä <mpenttil@redhat.com>
---
 mm/hmm.c | 361 +++++++++++++++++++++++++++++++++++++++++++++++--------
 1 file changed, 310 insertions(+), 51 deletions(-)

diff --git a/mm/hmm.c b/mm/hmm.c
index be39d2e5403a..4805c88347e6 100644
--- a/mm/hmm.c
+++ b/mm/hmm.c
@@ -40,6 +40,16 @@ struct hmm_vma_walk {
 	unsigned long			start;
 	unsigned long			end;
 	unsigned long			last;
+	/*
+	 * For migration we need pte/pmd locked for the handle_* and
+	 * prepare_* regions. While faulting we have to drop the locks
+	 * and start again. ptelocked and pmdlocked hold the state
+	 * and tell  if need to drop locks before faulting.
+	 * ptl is the lock held for pte or pmd.
+	 */
+	bool				ptelocked;
+	bool				pmdlocked;
+	spinlock_t			*ptl;
 	/* fault and lock drop related fields */
 	bool				*mmlocked;
 	unsigned long			fault_end;
@@ -61,6 +71,16 @@ struct hmm_vma_walk {
  */
 #define HMM_FAULT_UNLOCKED	-ENOLCK
 
+#define HMM_ASSERT_PTE_LOCKED(hmm_vma_walk, locked)		\
+	WARN_ON_ONCE((hmm_vma_walk)->ptelocked != locked)
+
+#define HMM_ASSERT_PMD_LOCKED(hmm_vma_walk, locked)		\
+	WARN_ON_ONCE((hmm_vma_walk)->pmdlocked != locked)
+
+#define HMM_ASSERT_UNLOCKED(hmm_vma_walk)			\
+	WARN_ON_ONCE((hmm_vma_walk)->ptelocked ||		\
+		     (hmm_vma_walk)->pmdlocked)
+
 enum {
 	HMM_NEED_FAULT = 1 << 0,
 	HMM_NEED_WRITE_FAULT = 1 << 1,
@@ -74,14 +94,38 @@ enum {
 };
 
 static int hmm_pfns_fill(unsigned long addr, unsigned long end,
-			 struct hmm_range *range, unsigned long cpu_flags)
+			 struct hmm_vma_walk *hmm_vma_walk, unsigned long cpu_flags)
 {
+	struct hmm_range *range = hmm_vma_walk->range;
 	unsigned long i = (addr - range->start) >> PAGE_SHIFT;
+	enum migrate_vma_info minfo;
+	bool migrate = false;
+
+	minfo = hmm_select_migrate(range);
+	if (cpu_flags != HMM_PFN_ERROR) {
+		if (minfo && (vma_is_anonymous(hmm_vma_walk->vma))) {
+			cpu_flags |= HMM_PFN_MIGRATE;
+			migrate = true;
+		}
+	}
+
+	if (migrate && thp_migration_supported() &&
+	    (minfo & MIGRATE_VMA_SELECT_COMPOUND) &&
+	    IS_ALIGNED(addr, HPAGE_PMD_SIZE) &&
+	    IS_ALIGNED(end, HPAGE_PMD_SIZE) &&
+		end-addr == HPAGE_PMD_SIZE) {
+		range->hmm_pfns[i] &= HMM_PFN_INOUT_FLAGS;
+		range->hmm_pfns[i] |= cpu_flags | HMM_PFN_COMPOUND;
+		addr += PAGE_SIZE;
+		i++;
+		cpu_flags = 0;
+	}
 
 	for (; addr < end; addr += PAGE_SIZE, i++) {
 		range->hmm_pfns[i] &= HMM_PFN_INOUT_FLAGS;
 		range->hmm_pfns[i] |= cpu_flags;
 	}
+
 	return 0;
 }
 
@@ -101,6 +145,7 @@ static int hmm_record_fault(unsigned long addr, unsigned long end,
 	struct hmm_vma_walk *hmm_vma_walk = walk->private;
 
 	WARN_ON_ONCE(!required_fault);
+	HMM_ASSERT_UNLOCKED(hmm_vma_walk);
 	hmm_vma_walk->last = addr;
 	hmm_vma_walk->fault_end = end;
 	hmm_vma_walk->required_fault = required_fault;
@@ -185,11 +230,16 @@ static int hmm_vma_walk_hole(unsigned long addr, unsigned long end,
 	if (!walk->vma) {
 		if (required_fault)
 			return -EFAULT;
-		return hmm_pfns_fill(addr, end, range, HMM_PFN_ERROR);
+		return hmm_pfns_fill(addr, end, hmm_vma_walk, HMM_PFN_ERROR);
 	}
-	if (required_fault)
+	if (required_fault) {
+		if (hmm_vma_walk->pmdlocked) {
+			spin_unlock(hmm_vma_walk->ptl);
+			hmm_vma_walk->pmdlocked = false;
+		}
 		return hmm_record_fault(addr, end, required_fault, walk);
-	return hmm_pfns_fill(addr, end, range, 0);
+	}
+	return hmm_pfns_fill(addr, end, hmm_vma_walk, 0);
 }
 
 static inline unsigned long hmm_pfn_flags_order(unsigned long order)
@@ -222,8 +272,13 @@ static int hmm_vma_handle_pmd(struct mm_walk *walk, unsigned long addr,
 	cpu_flags = pmd_to_hmm_pfn_flags(range, pmd);
 	required_fault =
 		hmm_range_need_fault(hmm_vma_walk, hmm_pfns, npages, cpu_flags);
-	if (required_fault)
+	if (required_fault) {
+		if (hmm_vma_walk->pmdlocked) {
+			spin_unlock(hmm_vma_walk->ptl);
+			hmm_vma_walk->pmdlocked = false;
+		}
 		return hmm_record_fault(addr, end, required_fault, walk);
+	}
 
 	pfn = pmd_pfn(pmd) + ((addr & ~PMD_MASK) >> PAGE_SHIFT);
 	for (i = 0; addr < end; addr += PAGE_SIZE, i++, pfn++) {
@@ -303,14 +358,25 @@ static int hmm_vma_handle_pte(struct mm_walk *walk, unsigned long addr,
 			goto fault;
 
 		if (softleaf_is_migration(entry)) {
-			pte_unmap(ptep);
-			hmm_vma_walk->last = addr;
-			migration_entry_wait(walk->mm, pmdp, addr);
-			return -EBUSY;
+			if (!hmm_select_migrate(range)) {
+				HMM_ASSERT_UNLOCKED(hmm_vma_walk);
+				pte_unmap(ptep);
+				hmm_vma_walk->last = addr;
+				migration_entry_wait(walk->mm, pmdp, addr);
+				return -EBUSY;
+			}
+			return 0;
 		}
 
 		/* Report error for everything else */
-		pte_unmap(ptep);
+
+		if (hmm_vma_walk->ptelocked) {
+			pte_unmap_unlock(ptep, hmm_vma_walk->ptl);
+			hmm_vma_walk->ptelocked = false;
+		} else {
+			pte_unmap(ptep);
+		}
+
 		return -EFAULT;
 	}
 
@@ -327,7 +393,13 @@ static int hmm_vma_handle_pte(struct mm_walk *walk, unsigned long addr,
 	if (!vm_normal_page(walk->vma, addr, pte) &&
 	    !is_zero_pfn(pte_pfn(pte))) {
 		if (hmm_pte_need_fault(hmm_vma_walk, pfn_req_flags, 0)) {
-			pte_unmap(ptep);
+			if (hmm_vma_walk->ptelocked) {
+				pte_unmap_unlock(ptep, hmm_vma_walk->ptl);
+				hmm_vma_walk->ptelocked = false;
+			} else {
+				pte_unmap(ptep);
+			}
+
 			return -EFAULT;
 		}
 		new_pfn_flags = HMM_PFN_ERROR;
@@ -340,7 +412,12 @@ static int hmm_vma_handle_pte(struct mm_walk *walk, unsigned long addr,
 	return 0;
 
 fault:
-	pte_unmap(ptep);
+	if (hmm_vma_walk->ptelocked) {
+		pte_unmap_unlock(ptep, hmm_vma_walk->ptl);
+		hmm_vma_walk->ptelocked = false;
+	} else {
+		pte_unmap(ptep);
+	}
 	/* Fault any virtual address we were asked to fault */
 	return hmm_record_fault(addr, end, required_fault, walk);
 }
@@ -384,13 +461,18 @@ static int hmm_vma_handle_absent_pmd(struct mm_walk *walk, unsigned long start,
 	required_fault = hmm_range_need_fault(hmm_vma_walk, hmm_pfns,
 					      npages, 0);
 	if (required_fault) {
-		if (softleaf_is_device_private(entry))
+		if (softleaf_is_device_private(entry)) {
+			if (hmm_vma_walk->pmdlocked) {
+				spin_unlock(hmm_vma_walk->ptl);
+				hmm_vma_walk->pmdlocked = false;
+			}
 			return hmm_record_fault(addr, end, required_fault, walk);
+		}
 		else
 			return -EFAULT;
 	}
 
-	return hmm_pfns_fill(start, end, range, HMM_PFN_ERROR);
+	return hmm_pfns_fill(start, end, hmm_vma_walk, HMM_PFN_ERROR);
 }
 #else
 static int hmm_vma_handle_absent_pmd(struct mm_walk *walk, unsigned long start,
@@ -398,15 +480,72 @@ static int hmm_vma_handle_absent_pmd(struct mm_walk *walk, unsigned long start,
 				     pmd_t pmd)
 {
 	struct hmm_vma_walk *hmm_vma_walk = walk->private;
-	struct hmm_range *range = hmm_vma_walk->range;
 	unsigned long npages = (end - start) >> PAGE_SHIFT;
 
 	if (hmm_range_need_fault(hmm_vma_walk, hmm_pfns, npages, 0))
 		return -EFAULT;
-	return hmm_pfns_fill(start, end, range, HMM_PFN_ERROR);
+	return hmm_pfns_fill(start, end, hmm_vma_walk, HMM_PFN_ERROR);
 }
 #endif  /* CONFIG_ARCH_HAS_PMD_SOFTLEAVES */
 
+#ifdef CONFIG_DEVICE_MIGRATION
+static int hmm_vma_handle_migrate_prepare_pmd(const struct mm_walk *walk,
+					      pmd_t *pmdp,
+					      unsigned long start,
+					      unsigned long end,
+					      unsigned long *hmm_pfn)
+{
+	// TODO: implement migration entry insertion
+	return 0;
+}
+
+static int hmm_vma_handle_migrate_prepare(const struct mm_walk *walk,
+					  pmd_t *pmdp,
+					  pte_t *ptep,
+					  unsigned long addr,
+					  unsigned long *hmm_pfn,
+					  bool *unmapped)
+{
+	// TODO: implement migration entry insertion
+	return 0;
+}
+
+static int hmm_vma_walk_split(pmd_t *pmdp,
+			      unsigned long addr,
+			      struct mm_walk *walk)
+{
+	// TODO : implement split
+	return 0;
+}
+
+#else
+static int hmm_vma_handle_migrate_prepare_pmd(const struct mm_walk *walk,
+					      pmd_t *pmdp,
+					      unsigned long start,
+					      unsigned long end,
+					      unsigned long *hmm_pfn)
+{
+	return 0;
+}
+
+static int hmm_vma_handle_migrate_prepare(const struct mm_walk *walk,
+					  pmd_t *pmdp,
+					  pte_t *ptep,
+					  unsigned long addr,
+					  unsigned long *hmm_pfn,
+					  bool *unmapped)
+{
+	return 0;
+}
+
+static int hmm_vma_walk_split(pmd_t *pmdp,
+			      unsigned long addr,
+			      struct mm_walk *walk)
+{
+	return 0;
+}
+#endif
+
 static int hmm_vma_capture_migrate_range(unsigned long start,
 					 unsigned long end,
 					 struct mm_walk *walk)
@@ -465,46 +604,128 @@ static int hmm_vma_walk_pmd(pmd_t *pmdp,
 {
 	struct hmm_vma_walk *hmm_vma_walk = walk->private;
 	struct hmm_range *range = hmm_vma_walk->range;
-	unsigned long *hmm_pfns =
-		&range->hmm_pfns[(start - range->start) >> PAGE_SHIFT];
 	unsigned long npages = (end - start) >> PAGE_SHIFT;
+	struct mm_struct *mm = walk->vma->vm_mm;
+	unsigned long *hmm_pfns, *hmm_pfns_start;
+	enum migrate_vma_info minfo;
 	unsigned long addr = start;
+	bool unmapped = false;
+	unsigned long i;
 	pte_t *ptep;
 	pmd_t pmd;
+	int r = 0;
 
+	minfo = hmm_select_migrate(range);
+	hmm_pfns_start = &range->hmm_pfns[(start - range->start) >> PAGE_SHIFT];
 again:
-	pmd = pmdp_get_lockless(pmdp);
-	if (pmd_none(pmd))
-		return hmm_vma_walk_hole(start, end, -1, walk);
+	hmm_pfns = &range->hmm_pfns[(addr - range->start) >> PAGE_SHIFT];
+	hmm_vma_walk->ptelocked = false;
+	hmm_vma_walk->pmdlocked = false;
+
+	if (minfo) {
+		hmm_vma_walk->ptl = pmd_lock(mm, pmdp);
+		hmm_vma_walk->pmdlocked = true;
+		pmd = pmdp_get(pmdp);
+	} else
+		pmd = pmdp_get_lockless(pmdp);
+
+	if (pmd_none(pmd)) {
+		r = hmm_vma_walk_hole(start, end, -1, walk);
+
+		if (hmm_vma_walk->pmdlocked) {
+			spin_unlock(hmm_vma_walk->ptl);
+			hmm_vma_walk->pmdlocked = false;
+		}
+		return r;
+	}
 
 	if (thp_migration_supported() && pmd_is_migration_entry(pmd)) {
-		if (hmm_range_need_fault(hmm_vma_walk, hmm_pfns, npages, 0)) {
-			hmm_vma_walk->last = addr;
-			pmd_migration_entry_wait(walk->mm, pmdp);
-			return -EBUSY;
+		if (!minfo) {
+			if (hmm_range_need_fault(hmm_vma_walk, hmm_pfns_start, npages, 0)) {
+				hmm_vma_walk->last = addr;
+				pmd_migration_entry_wait(walk->mm, pmdp);
+				return -EBUSY;
+			}
+			for (i = 0; start < end; start += PAGE_SIZE, i++)
+				hmm_pfns_start[i] &= HMM_PFN_INOUT_FLAGS;
+		}
+
+		if (hmm_vma_walk->pmdlocked) {
+			spin_unlock(hmm_vma_walk->ptl);
+			hmm_vma_walk->pmdlocked = false;
 		}
-		return hmm_pfns_fill(start, end, range, 0);
+
+		return 0;
 	}
 
-	if (!pmd_present(pmd))
-		return hmm_vma_handle_absent_pmd(walk, start, end, hmm_pfns,
-						 pmd);
+	if (pmd_trans_huge(pmd) || !pmd_present(pmd)) {
+		if (!pmd_present(pmd)) {
+			r = hmm_vma_handle_absent_pmd(walk, start, end, hmm_pfns_start,
+						      pmd);
+			// If not migrating we are done
+			if (r || !minfo) {
+				if (hmm_vma_walk->pmdlocked) {
+					spin_unlock(hmm_vma_walk->ptl);
+					hmm_vma_walk->pmdlocked = false;
+				}
+				return r;
+			}
+		}
 
-	if (pmd_trans_huge(pmd)) {
-		/*
-		 * No need to take pmd_lock here, even if some other thread
-		 * is splitting the huge pmd we will get that event through
-		 * mmu_notifier callback.
-		 *
-		 * So just read pmd value and check again it's a transparent
-		 * huge or device mapping one and compute corresponding pfn
-		 * values.
-		 */
-		pmd = pmdp_get_lockless(pmdp);
-		if (!pmd_trans_huge(pmd))
-			goto again;
+		if (pmd_trans_huge(pmd)) {
+			/*
+			 * No need to take pmd_lock here if not migrating,
+			 * even if some other thread is splitting the huge
+			 * pmd we will get that event through mmu_notifier callback.
+			 *
+			 * So just read pmd value and check again it's a transparent
+			 * huge or device mapping one and compute corresponding pfn
+			 * values.
+			 */
+
+			if (!minfo) {
+				pmd = pmdp_get_lockless(pmdp);
+				if (!pmd_trans_huge(pmd))
+					goto again;
+			}
+
+			r = hmm_vma_handle_pmd(walk, start, end, hmm_pfns_start, pmd);
 
-		return hmm_vma_handle_pmd(walk, addr, end, hmm_pfns, pmd);
+			// If not migrating we are done
+			if (r || !minfo) {
+				if (hmm_vma_walk->pmdlocked) {
+					spin_unlock(hmm_vma_walk->ptl);
+					hmm_vma_walk->pmdlocked = false;
+				}
+				return r;
+			}
+		}
+
+		r = hmm_vma_handle_migrate_prepare_pmd(walk, pmdp, start, end, hmm_pfns_start);
+
+		if (hmm_vma_walk->pmdlocked) {
+			spin_unlock(hmm_vma_walk->ptl);
+			hmm_vma_walk->pmdlocked = false;
+		}
+
+		if (r == -ENOENT) {
+			r = hmm_vma_walk_split(pmdp, addr, walk);
+			if (r) {
+				/* Split not successful, skip */
+				return hmm_pfns_fill(start, end, hmm_vma_walk, HMM_PFN_ERROR);
+			}
+
+			/* Split successful, reloop */
+			hmm_vma_walk->last = addr;
+			return -EBUSY;
+		}
+		return r;
+
+	}
+
+	if (hmm_vma_walk->pmdlocked) {
+		spin_unlock(hmm_vma_walk->ptl);
+		hmm_vma_walk->pmdlocked = false;
 	}
 
 	/*
@@ -514,24 +735,62 @@ static int hmm_vma_walk_pmd(pmd_t *pmdp,
 	 * recover.
 	 */
 	if (pmd_bad(pmd)) {
-		if (hmm_range_need_fault(hmm_vma_walk, hmm_pfns, npages, 0))
+		if (hmm_range_need_fault(hmm_vma_walk, hmm_pfns_start, npages, 0))
 			return -EFAULT;
-		return hmm_pfns_fill(start, end, range, HMM_PFN_ERROR);
+		return hmm_pfns_fill(start, end, hmm_vma_walk, HMM_PFN_ERROR);
 	}
 
-	ptep = pte_offset_map(pmdp, addr);
-	if (!ptep)
+	if (minfo) {
+		ptep = pte_offset_map_lock(mm, pmdp, addr, &hmm_vma_walk->ptl);
+		if (ptep)
+			hmm_vma_walk->ptelocked = true;
+	} else {
+		ptep = pte_offset_map(pmdp, addr);
+	}
+	if (!ptep) {
+		addr = start;
 		goto again;
+	}
+
 	for (; addr < end; addr += PAGE_SIZE, ptep++, hmm_pfns++) {
-		int r;
 
 		r = hmm_vma_handle_pte(walk, addr, end, pmdp, ptep, hmm_pfns);
 		if (r) {
-			/* hmm_vma_handle_pte() did pte_unmap() */
+			/* hmm_vma_handle_pte() did pte_unmap() / pte_unmap_unlock */
 			return r;
 		}
+
+		r = hmm_vma_handle_migrate_prepare(walk, pmdp, ptep, addr, hmm_pfns, &unmapped);
+		if (r == -EAGAIN) {
+			HMM_ASSERT_UNLOCKED(hmm_vma_walk);
+			if (unmapped) {
+				flush_tlb_range(walk->vma, start, addr);
+				unmapped = false;
+			}
+			goto again;
+		}
+		if (r) {
+			/* A non -EAGAIN error here means migrate_vma_split_folio()
+			 * already dropped the PTE lock and cleared ptelocked.
+			 */
+			HMM_ASSERT_UNLOCKED(hmm_vma_walk);
+			if (unmapped)
+				flush_tlb_range(walk->vma, start, addr);
+			hmm_pfns_fill(addr, end, hmm_vma_walk, HMM_PFN_ERROR);
+			return 0;
+		}
 	}
-	pte_unmap(ptep - 1);
+
+	if (unmapped)
+		flush_tlb_range(walk->vma, start, addr);
+
+	if (hmm_vma_walk->ptelocked) {
+		pte_unmap_unlock(ptep - 1, hmm_vma_walk->ptl);
+		hmm_vma_walk->ptelocked = false;
+	} else {
+		pte_unmap(ptep - 1);
+	}
+
 	return 0;
 }
 
@@ -679,7 +938,7 @@ static int hmm_vma_walk_test(unsigned long start, unsigned long end,
 				 (end - start) >> PAGE_SHIFT, 0))
 		return -EFAULT;
 
-	hmm_pfns_fill(start, end, range, HMM_PFN_ERROR);
+	hmm_pfns_fill(start, end, hmm_vma_walk, HMM_PFN_ERROR);
 
 	/* Skip this vma and continue processing the next vma. */
 	return 1;
-- 
2.55.0


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

* [PATCH v14 05/12] mm/hmm: implement folio split for migrate needs in HMM pagewalk
  2026-09-22  5:34 [PATCH 00/12] [PATCH v14 00/12] migrate on fault for device pages mpenttil
                   ` (3 preceding siblings ...)
  2026-09-22  5:34 ` [PATCH v14 04/12] mm/hmm: do the plumbing " mpenttil
@ 2026-09-22  5:34 ` mpenttil
  2026-09-22  5:47   ` sashiko-bot
  2026-09-22  5:34 ` [PATCH v14 06/12] mm/hmm: migrate collection in HMM pagewalk - pte level mpenttil
                   ` (12 subsequent siblings)
  17 siblings, 1 reply; 35+ messages in thread
From: mpenttil @ 2026-09-22  5:34 UTC (permalink / raw)
  To: linux-mm
  Cc: dri-devel, intel-xe, linux-kernel, Mika Penttilä,
	David Hildenbrand, Jason Gunthorpe, Leon Romanovsky,
	Alistair Popple, Balbir Singh, Zi Yan, Matthew Brost,
	Andrew Morton, Lorenzo Stoakes, Liam R. Howlett, Vlastimil Babka,
	Mike Rapoport, Suren Baghdasaryan, Michal Hocko

From: Mika Penttilä <mpenttil@redhat.com>

Implement the helper to split PMD size folios during pagewalk.
Splitting is needed if the start and end addresses are
not PMD aligned, or setting up pmd migration entry fails.

Cc: David Hildenbrand <david@kernel.org>
Cc: Jason Gunthorpe <jgg@nvidia.com>
Cc: Leon Romanovsky <leonro@nvidia.com>
Cc: Alistair Popple <apopple@nvidia.com>
Cc: Balbir Singh <balbirs@nvidia.com>
Cc: Zi Yan <ziy@nvidia.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Suggested-by: Alistair Popple <apopple@nvidia.com>
Signed-off-by: Mika Penttilä <mpenttil@redhat.com>
---
 mm/hmm.c | 47 ++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 44 insertions(+), 3 deletions(-)

diff --git a/mm/hmm.c b/mm/hmm.c
index 4805c88347e6..e6469ef4ae6a 100644
--- a/mm/hmm.c
+++ b/mm/hmm.c
@@ -514,10 +514,51 @@ static int hmm_vma_walk_split(pmd_t *pmdp,
 			      unsigned long addr,
 			      struct mm_walk *walk)
 {
-	// TODO : implement split
-	return 0;
-}
+	struct hmm_vma_walk *hmm_vma_walk = walk->private;
+	struct hmm_range *range = hmm_vma_walk->range;
+	struct migrate_vma *migrate = range->migrate;
+	struct folio *folio, *fault_folio;
+	spinlock_t *ptl;
+	int ret = 0;
+
+	HMM_ASSERT_UNLOCKED(hmm_vma_walk);
+
+	fault_folio = (migrate && migrate->fault_page) ?
+		page_folio(migrate->fault_page) : NULL;
+
+	ptl = pmd_lock(walk->mm, pmdp);
+	if (unlikely(!pmd_trans_huge(*pmdp))) {
+		spin_unlock(ptl);
+		goto out;
+	}
 
+	folio = pmd_folio(*pmdp);
+	if (is_huge_zero_folio(folio)) {
+		spin_unlock(ptl);
+		split_huge_pmd(walk->vma, pmdp, addr);
+	} else {
+		folio_get(folio);
+		spin_unlock(ptl);
+
+		if (folio != fault_folio) {
+			if (unlikely(!folio_trylock(folio))) {
+				folio_put(folio);
+				ret = -EBUSY;
+				goto out;
+			}
+		}  else {
+			folio_put(folio);
+		}
+
+		ret = split_folio(folio);
+		if (fault_folio != folio) {
+			folio_unlock(folio);
+			folio_put(folio);
+		}
+	}
+out:
+	return ret;
+}
 #else
 static int hmm_vma_handle_migrate_prepare_pmd(const struct mm_walk *walk,
 					      pmd_t *pmdp,
-- 
2.55.0


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

* [PATCH v14 06/12] mm/hmm: migrate collection in HMM pagewalk - pte level
  2026-09-22  5:34 [PATCH 00/12] [PATCH v14 00/12] migrate on fault for device pages mpenttil
                   ` (4 preceding siblings ...)
  2026-09-22  5:34 ` [PATCH v14 05/12] mm/hmm: implement folio split for migrate needs in HMM pagewalk mpenttil
@ 2026-09-22  5:34 ` mpenttil
  2026-09-22  5:47   ` sashiko-bot
  2026-09-22  5:34 ` [PATCH v14 07/12] mm/hmm: migrate collection in HMM pagewalk - pmd level mpenttil
                   ` (11 subsequent siblings)
  17 siblings, 1 reply; 35+ messages in thread
From: mpenttil @ 2026-09-22  5:34 UTC (permalink / raw)
  To: linux-mm
  Cc: dri-devel, intel-xe, linux-kernel, Mika Penttilä,
	David Hildenbrand, Jason Gunthorpe, Leon Romanovsky,
	Alistair Popple, Balbir Singh, Zi Yan, Matthew Brost,
	Andrew Morton, Lorenzo Stoakes, Liam R. Howlett, Vlastimil Babka,
	Mike Rapoport, Suren Baghdasaryan, Michal Hocko

From: Mika Penttilä <mpenttil@redhat.com>

Implement the needed hmm_vma_handle_migrate_prepare() function
which is mostly carried over from migrate_device.c's
migrate_vma_collect_pmd() function.

Also implement the migrate_vma_split_folio(), for splitting
pte mapped large folios. It is also mostly from migrate_device.c,
with care taken to reference folio before relasing page table
lock.

With HMM pagewalk based migration, the idea is that
hmm_vma_handle_*() are responsible for faulting,
and the pfn collecting part. hmm_vma_handle_migrate_prepare*()
do the migration decisions (with HMM_PFN_MIGRATE), possibly split
folios, and insert migration ptes/pmds.

HMM pagewalk based migration is enabled in later commit, for now
now hmm_select_migrate() returns 0.

Cc: David Hildenbrand <david@kernel.org>
Cc: Jason Gunthorpe <jgg@nvidia.com>
Cc: Leon Romanovsky <leonro@nvidia.com>
Cc: Alistair Popple <apopple@nvidia.com>
Cc: Balbir Singh <balbirs@nvidia.com>
Cc: Zi Yan <ziy@nvidia.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Suggested-by: Alistair Popple <apopple@nvidia.com>
Signed-off-by: Mika Penttilä <mpenttil@redhat.com>
---
 mm/hmm.c | 262 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 261 insertions(+), 1 deletion(-)

diff --git a/mm/hmm.c b/mm/hmm.c
index e6469ef4ae6a..b3b79d13c797 100644
--- a/mm/hmm.c
+++ b/mm/hmm.c
@@ -489,6 +489,63 @@ static int hmm_vma_handle_absent_pmd(struct mm_walk *walk, unsigned long start,
 #endif  /* CONFIG_ARCH_HAS_PMD_SOFTLEAVES */
 
 #ifdef CONFIG_DEVICE_MIGRATION
+/**
+ * migrate_vma_split_folio() - Helper function to split a THP folio
+ * @folio: the folio to split
+ * @fault_page: struct page associated with the fault if any
+ * @hmm_vma_walk: walk in progress
+ * @ptep: pte_t * for unmap and unlock ptl
+ *
+ * Returns 0 on success
+ */
+static int migrate_vma_split_folio(struct folio *folio,
+				   struct page *fault_page,
+				   struct hmm_vma_walk *hmm_vma_walk,
+				   pte_t *ptep)
+{
+	int ret;
+	struct folio *fault_folio = fault_page ? page_folio(fault_page) : NULL;
+	struct folio *new_fault_folio = NULL;
+
+	if (folio != fault_folio)
+		folio_get(folio);
+
+	pte_unmap_unlock(ptep, hmm_vma_walk->ptl);
+	hmm_vma_walk->ptelocked = false;
+
+	if (folio != fault_folio)
+		folio_lock(folio);
+
+	ret = split_folio(folio);
+	if (ret) {
+		if (folio != fault_folio) {
+			folio_unlock(folio);
+			folio_put(folio);
+		}
+		return ret;
+	}
+
+	new_fault_folio = fault_page ? page_folio(fault_page) : NULL;
+
+	/*
+	 * Ensure the lock is held on the correct
+	 * folio after the split
+	 */
+	if (!new_fault_folio) {
+		folio_unlock(folio);
+		folio_put(folio);
+	} else if (folio != new_fault_folio) {
+		if (new_fault_folio != fault_folio) {
+			folio_get(new_fault_folio);
+			folio_lock(new_fault_folio);
+		}
+		folio_unlock(folio);
+		folio_put(folio);
+	}
+
+	return 0;
+}
+
 static int hmm_vma_handle_migrate_prepare_pmd(const struct mm_walk *walk,
 					      pmd_t *pmdp,
 					      unsigned long start,
@@ -499,6 +556,11 @@ static int hmm_vma_handle_migrate_prepare_pmd(const struct mm_walk *walk,
 	return 0;
 }
 
+/*
+ * Install migration entries if migration requested, either from fault
+ * or migrate paths.
+ *
+ */
 static int hmm_vma_handle_migrate_prepare(const struct mm_walk *walk,
 					  pmd_t *pmdp,
 					  pte_t *ptep,
@@ -506,8 +568,206 @@ static int hmm_vma_handle_migrate_prepare(const struct mm_walk *walk,
 					  unsigned long *hmm_pfn,
 					  bool *unmapped)
 {
-	// TODO: implement migration entry insertion
+	struct hmm_vma_walk *hmm_vma_walk = walk->private;
+	struct hmm_range *range = hmm_vma_walk->range;
+	struct migrate_vma *migrate = range->migrate;
+	struct mm_struct *mm = walk->vma->vm_mm;
+	struct folio *fault_folio = NULL;
+	enum migrate_vma_info minfo;
+	struct dev_pagemap *pgmap;
+	bool anon_exclusive;
+	struct folio *folio;
+	unsigned long pfn;
+	struct page *page;
+	softleaf_t entry;
+	pte_t pte, swp_pte;
+	bool writable = false;
+
+	// Do we want to migrate at all?
+	minfo = hmm_select_migrate(range);
+	if (!minfo)
+		return 0;
+
+	WARN_ON_ONCE(!migrate);
+	HMM_ASSERT_PTE_LOCKED(hmm_vma_walk, true);
+
+	fault_folio = migrate->fault_page ?
+		page_folio(migrate->fault_page) : NULL;
+
+	pte = ptep_get(ptep);
+
+	if (pte_none(pte)) {
+		if (vma_is_anonymous(walk->vma)) {
+			*hmm_pfn &= HMM_PFN_INOUT_FLAGS;
+			*hmm_pfn |= HMM_PFN_MIGRATE;
+			goto out;
+		}
+	}
+
+	if (!(hmm_pfn[0] & HMM_PFN_VALID))
+		goto out;
+
+	if (!pte_present(pte)) {
+		/*
+		 * Only care about unaddressable device page special
+		 * page table entry. Other special swap entries are not
+		 * migratable, and we ignore regular swapped page.
+		 */
+		entry = softleaf_from_pte(pte);
+		if (!softleaf_is_device_private(entry))
+			goto out;
+
+		if (!(minfo & MIGRATE_VMA_SELECT_DEVICE_PRIVATE))
+			goto out;
+
+		page = softleaf_to_page(entry);
+		folio = page_folio(page);
+		if (folio->pgmap->owner != migrate->pgmap_owner)
+			goto out;
+
+		if (folio_test_large(folio)) {
+			int ret;
+
+			ret = migrate_vma_split_folio(folio,
+						      migrate->fault_page,
+						      hmm_vma_walk,
+						      ptep);
+			if (ret)
+				goto out_error;
+			return -EAGAIN;
+		}
+
+		pfn = page_to_pfn(page);
+		if (softleaf_is_device_private_write(entry))
+			writable = true;
+	} else {
+		pfn = pte_pfn(pte);
+		if (is_zero_pfn(pfn) &&
+		    (minfo & MIGRATE_VMA_SELECT_SYSTEM)) {
+			*hmm_pfn = HMM_PFN_MIGRATE;
+			goto out;
+		}
+		page = vm_normal_page(walk->vma, addr, pte);
+		if (page && !is_zone_device_page(page) &&
+		    !(minfo & MIGRATE_VMA_SELECT_SYSTEM)) {
+			goto out;
+		} else if (page && is_device_coherent_page(page)) {
+			pgmap = page_pgmap(page);
+
+			if (!(minfo &
+			      MIGRATE_VMA_SELECT_DEVICE_COHERENT) ||
+			    pgmap->owner != migrate->pgmap_owner)
+				goto out;
+		}
+
+		folio = page ? page_folio(page) : NULL;
+		if (folio && folio_test_large(folio)) {
+			int ret;
+
+			ret = migrate_vma_split_folio(folio,
+						      migrate->fault_page,
+						      hmm_vma_walk,
+						      ptep);
+			if (ret)
+				goto out_error;
+			return -EAGAIN;
+		}
+
+		writable = pte_write(pte);
+	}
+
+	if (!page || !page->mapping)
+		goto out;
+
+	/*
+	 * By getting a reference on the folio we pin it and that blocks
+	 * any kind of migration. Side effect is that it "freezes" the
+	 * pte.
+	 *
+	 * We drop this reference after isolating the folio from the lru
+	 * for non device folio (device folio are not on the lru and thus
+	 * can't be dropped from it).
+	 */
+	folio = page_folio(page);
+	folio_get(folio);
+
+	/*
+	 * We rely on folio_trylock() to avoid deadlock between
+	 * concurrent migrations where each is waiting on the others
+	 * folio lock. If we can't immediately lock the folio we fail this
+	 * migration as it is only best effort anyway.
+	 *
+	 * If we can lock the folio it's safe to set up a migration entry
+	 * now. In the common case where the folio is mapped once in a
+	 * single process setting up the migration entry now is an
+	 * optimisation to avoid walking the rmap later with
+	 * try_to_migrate().
+	 */
+
+	if (fault_folio == folio || folio_trylock(folio)) {
+		anon_exclusive = folio_test_anon(folio) &&
+			PageAnonExclusive(page);
+
+		if (pte_present(pte))
+			flush_cache_page(walk->vma, addr, pfn);
+
+		if (anon_exclusive) {
+			pte = ptep_clear_flush(walk->vma, addr, ptep);
+
+			if (folio_try_share_anon_rmap_pte(folio, page)) {
+				set_pte_at(mm, addr, ptep, pte);
+				folio_unlock(folio);
+				folio_put(folio);
+				goto out;
+			}
+		} else {
+			pte = ptep_get_and_clear(mm, addr, ptep);
+		}
+
+		if (pte_present(pte) && pte_dirty(pte))
+			folio_mark_dirty(folio);
+
+		/* Setup special migration page table entry */
+		if (writable)
+			entry = make_writable_migration_entry(pfn);
+		else if (anon_exclusive)
+			entry = make_readable_exclusive_migration_entry(pfn);
+		else
+			entry = make_readable_migration_entry(pfn);
+
+		if (pte_present(pte)) {
+			if (pte_young(pte))
+				entry = make_migration_entry_young(entry);
+			if (pte_dirty(pte))
+				entry = make_migration_entry_dirty(entry);
+		}
+
+		swp_pte = swp_entry_to_pte(entry);
+		if (pte_present(pte)) {
+			if (pte_soft_dirty(pte))
+				swp_pte = pte_swp_mksoft_dirty(swp_pte);
+			if (pte_uffd(pte))
+				swp_pte = pte_swp_mkuffd(swp_pte);
+		} else {
+			if (pte_swp_soft_dirty(pte))
+				swp_pte = pte_swp_mksoft_dirty(swp_pte);
+			if (pte_swp_uffd(pte))
+				swp_pte = pte_swp_mkuffd(swp_pte);
+		}
+
+		set_pte_at(mm, addr, ptep, swp_pte);
+		folio_remove_rmap_pte(folio, page, walk->vma);
+		folio_put(folio);
+		*hmm_pfn |= HMM_PFN_MIGRATE;
+		if (pte_present(pte))
+			*unmapped = true;
+	} else {
+		folio_put(folio);
+	}
+out:
 	return 0;
+out_error:
+	return -EFAULT;
 }
 
 static int hmm_vma_walk_split(pmd_t *pmdp,
-- 
2.55.0


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

* [PATCH v14 07/12] mm/hmm: migrate collection in HMM pagewalk - pmd level
  2026-09-22  5:34 [PATCH 00/12] [PATCH v14 00/12] migrate on fault for device pages mpenttil
                   ` (5 preceding siblings ...)
  2026-09-22  5:34 ` [PATCH v14 06/12] mm/hmm: migrate collection in HMM pagewalk - pte level mpenttil
@ 2026-09-22  5:34 ` mpenttil
  2026-09-22  5:50   ` sashiko-bot
  2026-09-22  5:34 ` [PATCH v14 08/12] mm/hmm: add lazy MMU mode support for migration in HMM pagewalk mpenttil
                   ` (10 subsequent siblings)
  17 siblings, 1 reply; 35+ messages in thread
From: mpenttil @ 2026-09-22  5:34 UTC (permalink / raw)
  To: linux-mm
  Cc: dri-devel, intel-xe, linux-kernel, Mika Penttilä,
	David Hildenbrand, Jason Gunthorpe, Leon Romanovsky,
	Alistair Popple, Balbir Singh, Zi Yan, Matthew Brost,
	Andrew Morton, Lorenzo Stoakes, Liam R. Howlett, Vlastimil Babka,
	Mike Rapoport, Suren Baghdasaryan, Michal Hocko

From: Mika Penttilä <mpenttil@redhat.com>

Implement the needed hmm_vma_handle_migrate_prepare_pmd() function
which is mostly carried over from migrate_device.c's
migrate_vma_collect_huge_pmd() function.

With HMM pagewalk based migration, the idea is that
hmm_vma_handle_*() are responsible for faulting,
and the pfn collecting part. hmm_vma_handle_migrate_prepare*()
do the migration decisions (with HMM_PFN_MIGRATE), possibly split
folios, and insert migration ptes/pmds.

HMM pagewalk based migration is enabled in later commit, for now
now hmm_select_migrate() returns 0.

Cc: David Hildenbrand <david@kernel.org>
Cc: Jason Gunthorpe <jgg@nvidia.com>
Cc: Leon Romanovsky <leonro@nvidia.com>
Cc: Alistair Popple <apopple@nvidia.com>
Cc: Balbir Singh <balbirs@nvidia.com>
Cc: Zi Yan <ziy@nvidia.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Suggested-by: Alistair Popple <apopple@nvidia.com>
Signed-off-by: Mika Penttilä <mpenttil@redhat.com>
---
 mm/hmm.c | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 94 insertions(+), 2 deletions(-)

diff --git a/mm/hmm.c b/mm/hmm.c
index b3b79d13c797..a1459bd34c04 100644
--- a/mm/hmm.c
+++ b/mm/hmm.c
@@ -552,8 +552,100 @@ static int hmm_vma_handle_migrate_prepare_pmd(const struct mm_walk *walk,
 					      unsigned long end,
 					      unsigned long *hmm_pfn)
 {
-	// TODO: implement migration entry insertion
-	return 0;
+	struct hmm_vma_walk *hmm_vma_walk = walk->private;
+	struct hmm_range *range = hmm_vma_walk->range;
+	struct migrate_vma *migrate = range->migrate;
+	struct folio *fault_folio = NULL;
+	enum migrate_vma_info minfo;
+	struct folio *folio;
+	unsigned long i;
+	int r = 0;
+
+	// Do we want to migrate at all?
+	minfo = hmm_select_migrate(range);
+	if (!minfo)
+		return r;
+
+	WARN_ON_ONCE(!migrate);
+	HMM_ASSERT_PMD_LOCKED(hmm_vma_walk, true);
+
+	fault_folio = migrate->fault_page ?
+		page_folio(migrate->fault_page) : NULL;
+
+	if (pmd_none(*pmdp))
+		return hmm_pfns_fill(start, end, hmm_vma_walk, 0);
+
+	if (!(hmm_pfn[0] & HMM_PFN_VALID))
+		goto out;
+
+	if (pmd_trans_huge(*pmdp)) {
+		if (!(minfo & MIGRATE_VMA_SELECT_SYSTEM))
+			goto out;
+
+		folio = pmd_folio(*pmdp);
+		if (is_huge_zero_folio(folio))
+			return hmm_pfns_fill(start, end, hmm_vma_walk, 0);
+
+	} else if (!pmd_present(*pmdp)) {
+		const softleaf_t entry = softleaf_from_pmd(*pmdp);
+
+		if (!softleaf_is_device_private(entry))
+			goto out;
+
+		if (!(minfo & MIGRATE_VMA_SELECT_DEVICE_PRIVATE))
+			goto out;
+
+		folio = softleaf_to_folio(entry);
+		if (folio->pgmap->owner != migrate->pgmap_owner)
+			goto out;
+	} else {
+		hmm_vma_walk->last = start;
+		return -EBUSY;
+	}
+
+	folio_get(folio);
+
+	if (folio != fault_folio && unlikely(!folio_trylock(folio))) {
+		folio_put(folio);
+		hmm_pfns_fill(start, end, hmm_vma_walk, HMM_PFN_ERROR);
+		return 0;
+	}
+
+	if (thp_migration_supported() &&
+	    (migrate->flags & MIGRATE_VMA_SELECT_COMPOUND) &&
+	    (IS_ALIGNED(start, HPAGE_PMD_SIZE) &&
+	     IS_ALIGNED(end, HPAGE_PMD_SIZE))) {
+		struct page_vma_mapped_walk pvmw = {
+			.ptl = hmm_vma_walk->ptl,
+			.address = start,
+			.pmd = pmdp,
+			.vma = walk->vma,
+		};
+
+		hmm_pfn[0] |= HMM_PFN_MIGRATE | HMM_PFN_COMPOUND;
+
+		r = set_pmd_migration_entry(&pvmw, folio_page(folio, 0));
+		if (r) {
+			hmm_pfn[0] &= ~(HMM_PFN_MIGRATE | HMM_PFN_COMPOUND);
+			r = -ENOENT;  // fallback
+			goto unlock_out;
+		}
+		for (i = 1, start += PAGE_SIZE; start < end; start += PAGE_SIZE, i++)
+			hmm_pfn[i] &= HMM_PFN_INOUT_FLAGS;
+
+	} else {
+		r = -ENOENT;  // fallback
+		goto unlock_out;
+	}
+
+out:
+	return r;
+
+unlock_out:
+	if (folio != fault_folio)
+		folio_unlock(folio);
+	folio_put(folio);
+	goto out;
 }
 
 /*
-- 
2.55.0


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

* [PATCH v14 08/12] mm/hmm: add lazy MMU mode support for migration in HMM pagewalk
  2026-09-22  5:34 [PATCH 00/12] [PATCH v14 00/12] migrate on fault for device pages mpenttil
                   ` (6 preceding siblings ...)
  2026-09-22  5:34 ` [PATCH v14 07/12] mm/hmm: migrate collection in HMM pagewalk - pmd level mpenttil
@ 2026-09-22  5:34 ` mpenttil
  2026-09-22  5:51   ` sashiko-bot
  2026-09-22  5:34 ` [PATCH v14 09/12] mm/hmm: implement rollback for device page " mpenttil
                   ` (9 subsequent siblings)
  17 siblings, 1 reply; 35+ messages in thread
From: mpenttil @ 2026-09-22  5:34 UTC (permalink / raw)
  To: linux-mm
  Cc: dri-devel, intel-xe, linux-kernel, Mika Penttilä,
	David Hildenbrand, Jason Gunthorpe, Leon Romanovsky,
	Alistair Popple, Balbir Singh, Zi Yan, Matthew Brost,
	Andrew Morton, Lorenzo Stoakes, Liam R. Howlett, Vlastimil Babka,
	Mike Rapoport, Suren Baghdasaryan, Michal Hocko

From: Mika Penttilä <mpenttil@redhat.com>

Add calls to lazy_mmu_mode_enable() and lazy_mmu_mode_disable()
while doing migration.

Cc: David Hildenbrand <david@kernel.org>
Cc: Jason Gunthorpe <jgg@nvidia.com>
Cc: Leon Romanovsky <leonro@nvidia.com>
Cc: Alistair Popple <apopple@nvidia.com>
Cc: Balbir Singh <balbirs@nvidia.com>
Cc: Zi Yan <ziy@nvidia.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Suggested-by: Alistair Popple <apopple@nvidia.com>
Signed-off-by: Mika Penttilä <mpenttil@redhat.com>
---
 mm/hmm.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/mm/hmm.c b/mm/hmm.c
index a1459bd34c04..a67a23e54551 100644
--- a/mm/hmm.c
+++ b/mm/hmm.c
@@ -371,6 +371,7 @@ static int hmm_vma_handle_pte(struct mm_walk *walk, unsigned long addr,
 		/* Report error for everything else */
 
 		if (hmm_vma_walk->ptelocked) {
+			lazy_mmu_mode_disable();
 			pte_unmap_unlock(ptep, hmm_vma_walk->ptl);
 			hmm_vma_walk->ptelocked = false;
 		} else {
@@ -394,6 +395,7 @@ static int hmm_vma_handle_pte(struct mm_walk *walk, unsigned long addr,
 	    !is_zero_pfn(pte_pfn(pte))) {
 		if (hmm_pte_need_fault(hmm_vma_walk, pfn_req_flags, 0)) {
 			if (hmm_vma_walk->ptelocked) {
+				lazy_mmu_mode_disable();
 				pte_unmap_unlock(ptep, hmm_vma_walk->ptl);
 				hmm_vma_walk->ptelocked = false;
 			} else {
@@ -413,6 +415,7 @@ static int hmm_vma_handle_pte(struct mm_walk *walk, unsigned long addr,
 
 fault:
 	if (hmm_vma_walk->ptelocked) {
+		lazy_mmu_mode_disable();
 		pte_unmap_unlock(ptep, hmm_vma_walk->ptl);
 		hmm_vma_walk->ptelocked = false;
 	} else {
@@ -510,6 +513,7 @@ static int migrate_vma_split_folio(struct folio *folio,
 	if (folio != fault_folio)
 		folio_get(folio);
 
+	lazy_mmu_mode_disable();
 	pte_unmap_unlock(ptep, hmm_vma_walk->ptl);
 	hmm_vma_walk->ptelocked = false;
 
@@ -1135,8 +1139,10 @@ static int hmm_vma_walk_pmd(pmd_t *pmdp,
 
 	if (minfo) {
 		ptep = pte_offset_map_lock(mm, pmdp, addr, &hmm_vma_walk->ptl);
-		if (ptep)
+		if (ptep) {
+			lazy_mmu_mode_enable();
 			hmm_vma_walk->ptelocked = true;
+		}
 	} else {
 		ptep = pte_offset_map(pmdp, addr);
 	}
@@ -1178,6 +1184,7 @@ static int hmm_vma_walk_pmd(pmd_t *pmdp,
 		flush_tlb_range(walk->vma, start, addr);
 
 	if (hmm_vma_walk->ptelocked) {
+		lazy_mmu_mode_disable();
 		pte_unmap_unlock(ptep - 1, hmm_vma_walk->ptl);
 		hmm_vma_walk->ptelocked = false;
 	} else {
-- 
2.55.0


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

* [PATCH v14 09/12] mm/hmm: implement rollback for device page migration in HMM pagewalk
  2026-09-22  5:34 [PATCH 00/12] [PATCH v14 00/12] migrate on fault for device pages mpenttil
                   ` (7 preceding siblings ...)
  2026-09-22  5:34 ` [PATCH v14 08/12] mm/hmm: add lazy MMU mode support for migration in HMM pagewalk mpenttil
@ 2026-09-22  5:34 ` mpenttil
  2026-09-22  5:34 ` [PATCH v14 10/12] mm: enable device page migration from " mpenttil
                   ` (8 subsequent siblings)
  17 siblings, 0 replies; 35+ messages in thread
From: mpenttil @ 2026-09-22  5:34 UTC (permalink / raw)
  To: linux-mm
  Cc: dri-devel, intel-xe, linux-kernel, Mika Penttilä,
	David Hildenbrand, Jason Gunthorpe, Leon Romanovsky,
	Alistair Popple, Balbir Singh, Zi Yan, Matthew Brost,
	Andrew Morton, Lorenzo Stoakes, Liam R. Howlett, Vlastimil Babka,
	Mike Rapoport, Suren Baghdasaryan, Michal Hocko

From: Mika Penttilä <mpenttil@redhat.com>

During the migration pagewalk, the PTE table could be cleared
and/or changed into PMD leaf or even another PTE table while
dropped locks.

In these cases the possibly inserted migration ptes are gone.
We have to however undo the collecting done so far, so unlock
the folios and drop reference taken.

During the pagewalk we notice such scenarios if going to
recollect a pfn but have already committed to migrate the entry
with HMM_PFN_MIGRATE, in which case rollback.
If we encounter migration ptes they are just skipped to
allow for restart own walks.

Cc: David Hildenbrand <david@kernel.org>
Cc: Jason Gunthorpe <jgg@nvidia.com>
Cc: Leon Romanovsky <leonro@nvidia.com>
Cc: Alistair Popple <apopple@nvidia.com>
Cc: Balbir Singh <balbirs@nvidia.com>
Cc: Zi Yan <ziy@nvidia.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Suggested-by: Alistair Popple <apopple@nvidia.com>
Signed-off-by: Mika Penttilä <mpenttil@redhat.com>
---
 include/linux/hmm.h | 22 +++++++++++++
 mm/hmm.c            | 76 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 98 insertions(+)

diff --git a/include/linux/hmm.h b/include/linux/hmm.h
index 4f56f3419cb4..b08ebc1343dd 100644
--- a/include/linux/hmm.h
+++ b/include/linux/hmm.h
@@ -111,6 +111,28 @@ static inline unsigned int hmm_pfn_to_map_order(unsigned long hmm_pfn)
 	return (hmm_pfn >> HMM_PFN_ORDER_SHIFT) & 0x1F;
 }
 
+/*
+ * hmm_pfn_collected() - is this pfn entry prepared for migration ?
+ * If collected the folio's refcount is increased and the folio
+ * is locked.
+ */
+static inline bool hmm_pfn_collected(unsigned long hmm_pfn)
+{
+	return (hmm_pfn & (HMM_PFN_VALID | HMM_PFN_MIGRATE)) ==
+		(HMM_PFN_VALID | HMM_PFN_MIGRATE);
+}
+
+/*
+ * hmm_pfn_rollback_collected() - undoes the collection of hmm_pfn
+ *
+ * Note for total rollback the folio's refcount has to be put
+ * and folio has to be unlocked.
+ */
+static inline unsigned long hmm_pfn_rollback_collected(unsigned long hmm_pfn)
+{
+	return hmm_pfn & ~(HMM_PFN_VALID | HMM_PFN_MIGRATE | HMM_PFN_COMPOUND);
+}
+
 /*
  * struct hmm_range - track invalidation lock on virtual address range
  *
diff --git a/mm/hmm.c b/mm/hmm.c
index a67a23e54551..e64444cbc62a 100644
--- a/mm/hmm.c
+++ b/mm/hmm.c
@@ -93,6 +93,11 @@ enum {
 			      HMM_PFN_P2PDMA_BUS,
 };
 
+static void hmm_vma_handle_migrate_prepare_rollback(const struct hmm_vma_walk *hmm_vma_walk,
+						    unsigned long start,
+						    unsigned long end,
+						    unsigned long *hmm_pfn);
+
 static int hmm_pfns_fill(unsigned long addr, unsigned long end,
 			 struct hmm_vma_walk *hmm_vma_walk, unsigned long cpu_flags)
 {
@@ -109,6 +114,8 @@ static int hmm_pfns_fill(unsigned long addr, unsigned long end,
 		}
 	}
 
+	hmm_vma_handle_migrate_prepare_rollback(hmm_vma_walk, addr, end, &range->hmm_pfns[i]);
+
 	if (migrate && thp_migration_supported() &&
 	    (minfo & MIGRATE_VMA_SELECT_COMPOUND) &&
 	    IS_ALIGNED(addr, HPAGE_PMD_SIZE) &&
@@ -280,6 +287,8 @@ static int hmm_vma_handle_pmd(struct mm_walk *walk, unsigned long addr,
 		return hmm_record_fault(addr, end, required_fault, walk);
 	}
 
+	hmm_vma_handle_migrate_prepare_rollback(hmm_vma_walk, addr,
+						end, hmm_pfns);
 	pfn = pmd_pfn(pmd) + ((addr & ~PMD_MASK) >> PAGE_SHIFT);
 	for (i = 0; addr < end; addr += PAGE_SIZE, i++, pfn++) {
 		hmm_pfns[i] &= HMM_PFN_INOUT_FLAGS;
@@ -410,6 +419,9 @@ static int hmm_vma_handle_pte(struct mm_walk *walk, unsigned long addr,
 
 	new_pfn_flags = pte_pfn(pte) | cpu_flags;
 out:
+	hmm_vma_handle_migrate_prepare_rollback(hmm_vma_walk, addr,
+						addr + PAGE_SIZE,
+						hmm_pfn);
 	*hmm_pfn = (*hmm_pfn & HMM_PFN_INOUT_FLAGS) | new_pfn_flags;
 	return 0;
 
@@ -448,6 +460,9 @@ static int hmm_vma_handle_absent_pmd(struct mm_walk *walk, unsigned long start,
 		if (softleaf_is_device_private_write(entry))
 			cpu_flags |= HMM_PFN_WRITE;
 
+		hmm_vma_handle_migrate_prepare_rollback(hmm_vma_walk,
+							start, end,
+							hmm_pfns);
 		/*
 		 * Fully populate the PFN list though subsequent PFNs could be
 		 * inferred, because drivers which are not yet aware of large
@@ -550,6 +565,48 @@ static int migrate_vma_split_folio(struct folio *folio,
 	return 0;
 }
 
+/*
+ * Due to dropping ptl locks for splitting for instance, would we
+ * overwrite already collected pfns? This could happen when pmd
+ * pointing to a page table has vanished and been replaced
+ * with a leaf pmd, or another page table.
+ * In that case unref and unlock the folios,
+ * the pfns of which were collected from the disappeared
+ * page tables.
+ */
+static void hmm_vma_handle_migrate_prepare_rollback(const struct hmm_vma_walk *hmm_vma_walk,
+						    unsigned long start,
+						    unsigned long end,
+						    unsigned long *hmm_pfn)
+{
+	struct hmm_range *range = hmm_vma_walk->range;
+	struct migrate_vma *migrate = range->migrate;
+	struct folio *fault_folio = NULL;
+	enum migrate_vma_info minfo;
+	struct folio *folio;
+	unsigned long i;
+
+	minfo = hmm_select_migrate(range);
+	if (!minfo)
+		return;
+
+	WARN_ON_ONCE(!migrate);
+
+	fault_folio = migrate->fault_page ?
+		page_folio(migrate->fault_page) : NULL;
+
+	for (i = 0; start < end; start += PAGE_SIZE, i++) {
+		if (hmm_pfn_collected(hmm_pfn[i])) {
+			folio = page_folio(hmm_pfn_to_page(hmm_pfn[i]));
+			if (folio != fault_folio)
+				folio_unlock(folio);
+			folio_put(folio);
+			hmm_pfn[i] = hmm_pfn_rollback_collected(hmm_pfn[i]);
+
+		}
+	}
+}
+
 static int hmm_vma_handle_migrate_prepare_pmd(const struct mm_walk *walk,
 					      pmd_t *pmdp,
 					      unsigned long start,
@@ -693,6 +750,11 @@ static int hmm_vma_handle_migrate_prepare(const struct mm_walk *walk,
 	pte = ptep_get(ptep);
 
 	if (pte_none(pte)) {
+		hmm_vma_handle_migrate_prepare_rollback(hmm_vma_walk,
+							addr,
+							addr + PAGE_SIZE,
+							hmm_pfn);
+
 		if (vma_is_anonymous(walk->vma)) {
 			*hmm_pfn &= HMM_PFN_INOUT_FLAGS;
 			*hmm_pfn |= HMM_PFN_MIGRATE;
@@ -740,6 +802,10 @@ static int hmm_vma_handle_migrate_prepare(const struct mm_walk *walk,
 		pfn = pte_pfn(pte);
 		if (is_zero_pfn(pfn) &&
 		    (minfo & MIGRATE_VMA_SELECT_SYSTEM)) {
+			hmm_vma_handle_migrate_prepare_rollback(hmm_vma_walk,
+								addr,
+								addr + PAGE_SIZE,
+								hmm_pfn);
 			*hmm_pfn = HMM_PFN_MIGRATE;
 			goto out;
 		}
@@ -916,6 +982,13 @@ static int hmm_vma_walk_split(pmd_t *pmdp,
 	return ret;
 }
 #else
+static void hmm_vma_handle_migrate_prepare_rollback(const struct hmm_vma_walk *hmm_vma_walk,
+						    unsigned long start,
+						    unsigned long end,
+						    unsigned long *hmm_pfn)
+{
+}
+
 static int hmm_vma_handle_migrate_prepare_pmd(const struct mm_walk *walk,
 					      pmd_t *pmdp,
 					      unsigned long start,
@@ -1142,6 +1215,9 @@ static int hmm_vma_walk_pmd(pmd_t *pmdp,
 		if (ptep) {
 			lazy_mmu_mode_enable();
 			hmm_vma_walk->ptelocked = true;
+		} else {
+			/* The pte table is gone */
+			hmm_vma_handle_migrate_prepare_rollback(walk->private, addr, end, hmm_pfns);
 		}
 	} else {
 		ptep = pte_offset_map(pmdp, addr);
-- 
2.55.0


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

* [PATCH v14 10/12] mm: enable device page migration from HMM pagewalk
  2026-09-22  5:34 [PATCH 00/12] [PATCH v14 00/12] migrate on fault for device pages mpenttil
                   ` (8 preceding siblings ...)
  2026-09-22  5:34 ` [PATCH v14 09/12] mm/hmm: implement rollback for device page " mpenttil
@ 2026-09-22  5:34 ` mpenttil
  2026-09-22  5:58   ` sashiko-bot
  2026-09-22  5:34 ` [PATCH v14 11/12] lib/test_hmm: add a new testcase for the migrate on fault mpenttil
                   ` (7 subsequent siblings)
  17 siblings, 1 reply; 35+ messages in thread
From: mpenttil @ 2026-09-22  5:34 UTC (permalink / raw)
  To: linux-mm
  Cc: dri-devel, intel-xe, linux-kernel, Mika Penttilä,
	David Hildenbrand, Jason Gunthorpe, Leon Romanovsky,
	Alistair Popple, Balbir Singh, Zi Yan, Matthew Brost,
	Andrew Morton, Lorenzo Stoakes, Liam R. Howlett, Vlastimil Babka,
	Mike Rapoport, Suren Baghdasaryan, Michal Hocko

From: Mika Penttilä <mpenttil@redhat.com>

HMM pagewalk has now the machinery to do the first phase of
device page migration, collecting the pfns and installing
migration ptes.

Enable migration in hmm_range_fault(), and change migrate_vma_setup()
to use HMM pagewalk path. Two new flags, MIGRATE_VMA_FAULT and
MIGRATE_VMA_WRITE are introduced for migrate_vma_setup(),
to request for faulting missing pages, and requesting write
access.

Also, the migrate_vma_collect*() based paths are now unused,
so delete them.

Cc: David Hildenbrand <david@kernel.org>
Cc: Jason Gunthorpe <jgg@nvidia.com>
Cc: Leon Romanovsky <leonro@nvidia.com>
Cc: Alistair Popple <apopple@nvidia.com>
Cc: Balbir Singh <balbirs@nvidia.com>
Cc: Zi Yan <ziy@nvidia.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Suggested-by: Alistair Popple <apopple@nvidia.com>
Signed-off-by: Mika Penttilä <mpenttil@redhat.com>
---
 include/linux/migrate.h |  10 +-
 mm/hmm.c                |  33 ++-
 mm/migrate_device.c     | 562 ++++------------------------------------
 3 files changed, 83 insertions(+), 522 deletions(-)

diff --git a/include/linux/migrate.h b/include/linux/migrate.h
index 01c5f62a56e9..c73e41625ac2 100644
--- a/include/linux/migrate.h
+++ b/include/linux/migrate.h
@@ -180,6 +180,8 @@ enum migrate_vma_info {
 	MIGRATE_VMA_SELECT_DEVICE_PRIVATE = 1 << 1,
 	MIGRATE_VMA_SELECT_DEVICE_COHERENT = 1 << 2,
 	MIGRATE_VMA_SELECT_COMPOUND = 1 << 3,
+	MIGRATE_VMA_FAULT = 1 << 4,
+	MIGRATE_VMA_WRITE = 1 << 5,
 };
 
 struct migrate_vma {
@@ -217,10 +219,14 @@ struct migrate_vma {
 	struct page		*fault_page;
 };
 
-// TODO: enable migration
 static inline enum migrate_vma_info hmm_select_migrate(struct hmm_range *range)
 {
-	return 0;
+	enum migrate_vma_info minfo;
+
+	minfo = (range->default_flags & HMM_PFN_REQ_MIGRATE) ?
+		range->migrate->flags : 0;
+
+	return minfo;
 }
 
 #ifdef CONFIG_MMU_NOTIFIER
diff --git a/mm/hmm.c b/mm/hmm.c
index e64444cbc62a..87ebd2500df6 100644
--- a/mm/hmm.c
+++ b/mm/hmm.c
@@ -1562,14 +1562,43 @@ static int hmm_range_fault_locked(struct hmm_range *range, bool *locked)
  *		the invalidation to finish.
  * -EFAULT:     A page was requested to be valid and could not be made valid
  *              ie it has no backing VMA or it is illegal to access
+ * -ERANGE:     The range crosses multiple VMAs, or space for hmm_pfns array
+ *              is too low.
  *
  * This is similar to get_user_pages(), except that it can read the page tables
  * without mutating them (ie causing faults).
  *
  * The mmap lock must be held by the caller and will remain held on return.
  * New users should prefer hmm_range_fault_unlocked_timeout() unless they
- * specifically need to keep the mmap lock held across the call. This helper
- * cannot support VMAs whose fault handlers need to drop the mmap lock.
+ * specifically need to keep the mmap lock held across the call like while
+ * migrating. This helper cannot support VMAs whose fault handlers need to
+ * drop the mmap lock.
+ *
+ * If want to do migration after faulting, call hmm_range_fault() with
+ * range.default_flags of HMM_PFN_REQ_MIGRATE, and optionally
+ * HMM_PFN_REQ_FAULT|HMM_PFN_REQ_WRITE, and initialize range->migrate field.
+ * range->migrate->vma will be populated during the call,
+ * and must be stable across the whole migrate process, which is
+ * why mmap_lock must be held around this call.
+ *
+ * When HMM_PFN_REQ_MIGRATE is set, migration collection may be partial on
+ * return and the caller takes responsibility for completing or aborting it.
+ *
+ * On success, the caller must call migrate_hmm_range_setup() and may then
+ * proceed with the normal migrate_vma sequence: prepare destination pages,
+ * call migrate_vma_pages(), update device mappings as needed, and finally
+ * call migrate_vma_finalize().
+ *
+ * On -EBUSY, the caller may retry hmm_range_fault() using the same range and
+ * PFN array without undoing entries collected by the previous attempt. If
+ * the caller stops retrying, it must abort the partial migration.
+ *
+ * On any other error, or when abandoning a retry, the caller must call
+ * migrate_hmm_range_setup(), migrate_vma_pages() with no valid destination
+ * entries, and migrate_vma_finalize() to abort the partial migration.
+ *
+ * The mmap read lock must remain held until the migration has either been
+ * completed or aborted.
  */
 int hmm_range_fault(struct hmm_range *range)
 {
diff --git a/mm/migrate_device.c b/mm/migrate_device.c
index 43e571e82cca..1e1a592e1267 100644
--- a/mm/migrate_device.c
+++ b/mm/migrate_device.c
@@ -18,519 +18,6 @@
 #include <asm/tlbflush.h>
 #include "internal.h"
 
-static int migrate_vma_collect_skip(unsigned long start,
-				    unsigned long end,
-				    struct mm_walk *walk)
-{
-	struct migrate_vma *migrate = walk->private;
-	unsigned long addr;
-
-	for (addr = start; addr < end; addr += PAGE_SIZE) {
-		migrate->dst[migrate->npages] = 0;
-		migrate->src[migrate->npages++] = 0;
-	}
-
-	return 0;
-}
-
-static int migrate_vma_collect_hole(unsigned long start,
-				    unsigned long end,
-				    __always_unused int depth,
-				    struct mm_walk *walk)
-{
-	struct migrate_vma *migrate = walk->private;
-	unsigned long addr;
-
-	/* Only allow populating anonymous memory. */
-	if (!vma_is_anonymous(walk->vma))
-		return migrate_vma_collect_skip(start, end, walk);
-
-	if (thp_migration_supported() &&
-		(migrate->flags & MIGRATE_VMA_SELECT_COMPOUND) &&
-		(IS_ALIGNED(start, HPAGE_PMD_SIZE) &&
-		 IS_ALIGNED(end, HPAGE_PMD_SIZE))) {
-		migrate->src[migrate->npages] = MIGRATE_PFN_MIGRATE |
-						MIGRATE_PFN_COMPOUND;
-		migrate->dst[migrate->npages] = 0;
-		migrate->npages++;
-		migrate->cpages++;
-
-		/*
-		 * Collect the remaining entries as holes, in case we
-		 * need to split later
-		 */
-		return migrate_vma_collect_skip(start + PAGE_SIZE, end, walk);
-	}
-
-	for (addr = start; addr < end; addr += PAGE_SIZE) {
-		migrate->src[migrate->npages] = MIGRATE_PFN_MIGRATE;
-		migrate->dst[migrate->npages] = 0;
-		migrate->npages++;
-		migrate->cpages++;
-	}
-
-	return 0;
-}
-
-/**
- * migrate_vma_split_folio() - Helper function to split a THP folio
- * @folio: the folio to split
- * @fault_page: struct page associated with the fault if any
- *
- * If @folio is not the folio containing @fault_page, the caller must hold a
- * reference on @folio. The helper consumes that reference.
- *
- * Returns 0 on success
- */
-static int migrate_vma_split_folio(struct folio *folio,
-				   struct page *fault_page)
-{
-	int ret;
-	struct folio *fault_folio = fault_page ? page_folio(fault_page) : NULL;
-	struct folio *new_fault_folio = NULL;
-
-	if (folio != fault_folio)
-		folio_lock(folio);
-
-	ret = split_folio(folio);
-	if (ret) {
-		if (folio != fault_folio) {
-			folio_unlock(folio);
-			folio_put(folio);
-		}
-		return ret;
-	}
-
-	new_fault_folio = fault_page ? page_folio(fault_page) : NULL;
-
-	/*
-	 * Ensure the lock is held on the correct
-	 * folio after the split
-	 */
-	if (!new_fault_folio) {
-		folio_unlock(folio);
-		folio_put(folio);
-	} else if (folio != new_fault_folio) {
-		if (new_fault_folio != fault_folio) {
-			folio_get(new_fault_folio);
-			folio_lock(new_fault_folio);
-		}
-		folio_unlock(folio);
-		folio_put(folio);
-	}
-
-	return 0;
-}
-
-/** migrate_vma_collect_huge_pmd - collect THP pages without splitting the
- * folio for device private pages.
- * @pmdp: pointer to pmd entry
- * @start: start address of the range for migration
- * @end: end address of the range for migration
- * @walk: mm_walk callback structure
- * @fault_folio: folio associated with the fault if any
- *
- * Collect the huge pmd entry at @pmdp for migration and set the
- * MIGRATE_PFN_COMPOUND flag in the migrate src entry to indicate that
- * migration will occur at HPAGE_PMD granularity
- */
-static int migrate_vma_collect_huge_pmd(pmd_t *pmdp, unsigned long start,
-					unsigned long end, struct mm_walk *walk,
-					struct folio *fault_folio)
-{
-	struct mm_struct *mm = walk->mm;
-	struct folio *folio;
-	struct migrate_vma *migrate = walk->private;
-	spinlock_t *ptl;
-	int ret;
-	unsigned long write = 0;
-
-	ptl = pmd_lock(mm, pmdp);
-	if (pmd_none(*pmdp)) {
-		spin_unlock(ptl);
-		return migrate_vma_collect_hole(start, end, -1, walk);
-	}
-
-	if (pmd_trans_huge(*pmdp)) {
-		if (!(migrate->flags & MIGRATE_VMA_SELECT_SYSTEM)) {
-			spin_unlock(ptl);
-			return migrate_vma_collect_skip(start, end, walk);
-		}
-
-		folio = pmd_folio(*pmdp);
-		if (is_huge_zero_folio(folio)) {
-			spin_unlock(ptl);
-			return migrate_vma_collect_hole(start, end, -1, walk);
-		}
-		if (pmd_write(*pmdp))
-			write = MIGRATE_PFN_WRITE;
-	} else if (!pmd_present(*pmdp)) {
-		const softleaf_t entry = softleaf_from_pmd(*pmdp);
-
-		if (!softleaf_is_device_private(entry) ||
-		    !(migrate->flags & MIGRATE_VMA_SELECT_DEVICE_PRIVATE)) {
-			spin_unlock(ptl);
-			return migrate_vma_collect_skip(start, end, walk);
-		}
-
-		folio = softleaf_to_folio(entry);
-		if (folio->pgmap->owner != migrate->pgmap_owner) {
-			spin_unlock(ptl);
-			return migrate_vma_collect_skip(start, end, walk);
-		}
-
-		if (softleaf_is_device_private_write(entry))
-			write = MIGRATE_PFN_WRITE;
-	} else {
-		spin_unlock(ptl);
-		return -EAGAIN;
-	}
-
-	folio_get(folio);
-	if (folio != fault_folio && unlikely(!folio_trylock(folio))) {
-		spin_unlock(ptl);
-		folio_put(folio);
-		return migrate_vma_collect_skip(start, end, walk);
-	}
-
-	if (thp_migration_supported() &&
-		(migrate->flags & MIGRATE_VMA_SELECT_COMPOUND) &&
-		(IS_ALIGNED(start, HPAGE_PMD_SIZE) &&
-		 IS_ALIGNED(end, HPAGE_PMD_SIZE))) {
-
-		struct page_vma_mapped_walk pvmw = {
-			.ptl = ptl,
-			.address = start,
-			.pmd = pmdp,
-			.vma = walk->vma,
-		};
-
-		unsigned long pfn = page_to_pfn(folio_page(folio, 0));
-
-		migrate->src[migrate->npages] = migrate_pfn(pfn) | write
-						| MIGRATE_PFN_MIGRATE
-						| MIGRATE_PFN_COMPOUND;
-		migrate->dst[migrate->npages++] = 0;
-		migrate->cpages++;
-		ret = set_pmd_migration_entry(&pvmw, folio_page(folio, 0));
-		if (ret) {
-			migrate->npages--;
-			migrate->cpages--;
-			migrate->src[migrate->npages] = 0;
-			migrate->dst[migrate->npages] = 0;
-			goto fallback;
-		}
-		migrate_vma_collect_skip(start + PAGE_SIZE, end, walk);
-		spin_unlock(ptl);
-		return 0;
-	}
-
-fallback:
-	spin_unlock(ptl);
-	if (!folio_test_large(folio))
-		goto done;
-	ret = split_folio(folio);
-	if (fault_folio != folio)
-		folio_unlock(folio);
-	folio_put(folio);
-	if (ret)
-		return migrate_vma_collect_skip(start, end, walk);
-	if (pmd_none(pmdp_get_lockless(pmdp)))
-		return migrate_vma_collect_hole(start, end, -1, walk);
-
-done:
-	return -ENOENT;
-}
-
-static int migrate_vma_collect_pmd(pmd_t *pmdp,
-				   unsigned long start,
-				   unsigned long end,
-				   struct mm_walk *walk)
-{
-	struct migrate_vma *migrate = walk->private;
-	struct vm_area_struct *vma = walk->vma;
-	struct mm_struct *mm = vma->vm_mm;
-	unsigned long addr = start, unmapped = 0;
-	spinlock_t *ptl;
-	struct folio *fault_folio = migrate->fault_page ?
-		page_folio(migrate->fault_page) : NULL;
-	pte_t *ptep;
-
-again:
-	if (pmd_trans_huge(*pmdp) || !pmd_present(*pmdp)) {
-		int ret = migrate_vma_collect_huge_pmd(pmdp, start, end, walk, fault_folio);
-
-		if (ret == -EAGAIN)
-			goto again;
-		if (ret == 0)
-			return 0;
-	}
-
-	ptep = pte_offset_map_lock(mm, pmdp, start, &ptl);
-	if (!ptep)
-		goto again;
-	lazy_mmu_mode_enable();
-	ptep += (addr - start) / PAGE_SIZE;
-
-	for (; addr < end; addr += PAGE_SIZE, ptep++) {
-		struct dev_pagemap *pgmap;
-		unsigned long mpfn = 0, pfn;
-		struct folio *folio;
-		struct page *page;
-		softleaf_t entry;
-		pte_t pte;
-
-		pte = ptep_get(ptep);
-
-		if (pte_none(pte)) {
-			if (vma_is_anonymous(vma)) {
-				mpfn = MIGRATE_PFN_MIGRATE;
-				migrate->cpages++;
-			}
-			goto next;
-		}
-
-		if (!pte_present(pte)) {
-			/*
-			 * Only care about unaddressable device page special
-			 * page table entry. Other special swap entries are not
-			 * migratable, and we ignore regular swapped page.
-			 */
-			entry = softleaf_from_pte(pte);
-			if (!softleaf_is_device_private(entry))
-				goto next;
-
-			page = softleaf_to_page(entry);
-			pgmap = page_pgmap(page);
-			if (!(migrate->flags &
-				MIGRATE_VMA_SELECT_DEVICE_PRIVATE) ||
-			    pgmap->owner != migrate->pgmap_owner)
-				goto next;
-
-			folio = page_folio(page);
-			if (folio_test_large(folio)) {
-				int ret;
-
-				/* migrate_vma_split_folio() consumes this reference */
-				if (folio != fault_folio)
-					folio_get(folio);
-				lazy_mmu_mode_disable();
-				pte_unmap_unlock(ptep, ptl);
-				ret = migrate_vma_split_folio(folio,
-							  migrate->fault_page);
-
-				if (ret) {
-					if (unmapped)
-						flush_tlb_range(walk->vma, start, end);
-
-					return migrate_vma_collect_skip(addr, end, walk);
-				}
-
-				goto again;
-			}
-
-			mpfn = migrate_pfn(page_to_pfn(page)) |
-					MIGRATE_PFN_MIGRATE;
-			if (softleaf_is_device_private_write(entry))
-				mpfn |= MIGRATE_PFN_WRITE;
-		} else {
-			pfn = pte_pfn(pte);
-			if (is_zero_pfn(pfn) &&
-			    (migrate->flags & MIGRATE_VMA_SELECT_SYSTEM)) {
-				mpfn = MIGRATE_PFN_MIGRATE;
-				migrate->cpages++;
-				goto next;
-			}
-			page = vm_normal_page(migrate->vma, addr, pte);
-			if (page && !is_zone_device_page(page) &&
-			    !(migrate->flags & MIGRATE_VMA_SELECT_SYSTEM)) {
-				goto next;
-			} else if (page && is_device_coherent_page(page)) {
-				pgmap = page_pgmap(page);
-
-				if (!(migrate->flags &
-					MIGRATE_VMA_SELECT_DEVICE_COHERENT) ||
-					pgmap->owner != migrate->pgmap_owner)
-					goto next;
-			}
-			folio = page ? page_folio(page) : NULL;
-			if (folio && folio_test_large(folio)) {
-				int ret;
-
-				/* migrate_vma_split_folio() consumes this reference */
-				if (folio != fault_folio)
-					folio_get(folio);
-				lazy_mmu_mode_disable();
-				pte_unmap_unlock(ptep, ptl);
-				ret = migrate_vma_split_folio(folio,
-							  migrate->fault_page);
-
-				if (ret) {
-					if (unmapped)
-						flush_tlb_range(walk->vma, start, end);
-
-					return migrate_vma_collect_skip(addr, end, walk);
-				}
-
-				goto again;
-			}
-			mpfn = migrate_pfn(pfn) | MIGRATE_PFN_MIGRATE;
-			mpfn |= pte_write(pte) ? MIGRATE_PFN_WRITE : 0;
-		}
-
-		if (!page || !page->mapping) {
-			mpfn = 0;
-			goto next;
-		}
-
-		/*
-		 * By getting a reference on the folio we pin it and that blocks
-		 * any kind of migration. Side effect is that it "freezes" the
-		 * pte.
-		 *
-		 * We drop this reference after isolating the folio from the lru
-		 * for non device folio (device folio are not on the lru and thus
-		 * can't be dropped from it).
-		 */
-		folio = page_folio(page);
-		folio_get(folio);
-
-		/*
-		 * We rely on folio_trylock() to avoid deadlock between
-		 * concurrent migrations where each is waiting on the others
-		 * folio lock. If we can't immediately lock the folio we fail this
-		 * migration as it is only best effort anyway.
-		 *
-		 * If we can lock the folio it's safe to set up a migration entry
-		 * now. In the common case where the folio is mapped once in a
-		 * single process setting up the migration entry now is an
-		 * optimisation to avoid walking the rmap later with
-		 * try_to_migrate().
-		 */
-		if (fault_folio == folio || folio_trylock(folio)) {
-			bool anon_exclusive;
-			pte_t swp_pte;
-
-			if (pte_present(pte))
-				flush_cache_page(vma, addr, pte_pfn(pte));
-			anon_exclusive = folio_test_anon(folio) &&
-					  PageAnonExclusive(page);
-			if (anon_exclusive) {
-				pte = ptep_clear_flush(vma, addr, ptep);
-
-				if (folio_try_share_anon_rmap_pte(folio, page)) {
-					set_pte_at(mm, addr, ptep, pte);
-					if (fault_folio != folio)
-						folio_unlock(folio);
-					folio_put(folio);
-					mpfn = 0;
-					goto next;
-				}
-			} else {
-				pte = ptep_get_and_clear(mm, addr, ptep);
-			}
-
-			migrate->cpages++;
-
-			/* Set the dirty flag on the folio now the pte is gone. */
-			if (pte_present(pte) && pte_dirty(pte))
-				folio_mark_dirty(folio);
-
-			/* Setup special migration page table entry */
-			if (mpfn & MIGRATE_PFN_WRITE)
-				entry = make_writable_migration_entry(
-							page_to_pfn(page));
-			else if (anon_exclusive)
-				entry = make_readable_exclusive_migration_entry(
-							page_to_pfn(page));
-			else
-				entry = make_readable_migration_entry(
-							page_to_pfn(page));
-			if (pte_present(pte)) {
-				if (pte_young(pte))
-					entry = make_migration_entry_young(entry);
-				if (pte_dirty(pte))
-					entry = make_migration_entry_dirty(entry);
-			}
-			swp_pte = swp_entry_to_pte(entry);
-			if (pte_present(pte)) {
-				if (pte_soft_dirty(pte))
-					swp_pte = pte_swp_mksoft_dirty(swp_pte);
-				if (pte_uffd(pte))
-					swp_pte = pte_swp_mkuffd(swp_pte);
-			} else {
-				if (pte_swp_soft_dirty(pte))
-					swp_pte = pte_swp_mksoft_dirty(swp_pte);
-				if (pte_swp_uffd(pte))
-					swp_pte = pte_swp_mkuffd(swp_pte);
-			}
-			set_pte_at(mm, addr, ptep, swp_pte);
-
-			/*
-			 * This is like regular unmap: we remove the rmap and
-			 * drop the folio refcount. The folio won't be freed, as
-			 * we took a reference just above.
-			 */
-			folio_remove_rmap_pte(folio, page, vma);
-			folio_put(folio);
-
-			if (pte_present(pte))
-				unmapped++;
-		} else {
-			folio_put(folio);
-			mpfn = 0;
-		}
-
-next:
-		migrate->dst[migrate->npages] = 0;
-		migrate->src[migrate->npages++] = mpfn;
-	}
-
-	/* Only flush the TLB if we actually modified any entries */
-	if (unmapped)
-		flush_tlb_range(walk->vma, start, end);
-
-	lazy_mmu_mode_disable();
-	pte_unmap_unlock(ptep - 1, ptl);
-
-	return 0;
-}
-
-static const struct mm_walk_ops migrate_vma_walk_ops = {
-	.pmd_entry		= migrate_vma_collect_pmd,
-	.pte_hole		= migrate_vma_collect_hole,
-	.walk_lock		= PGWALK_RDLOCK,
-};
-
-/*
- * migrate_vma_collect() - collect pages over a range of virtual addresses
- * @migrate: migrate struct containing all migration information
- *
- * This will walk the CPU page table. For each virtual address backed by a
- * valid page, it updates the src array and takes a reference on the page, in
- * order to pin the page until we lock it and unmap it.
- */
-static void migrate_vma_collect(struct migrate_vma *migrate)
-{
-	struct mmu_notifier_range range;
-
-	/*
-	 * Note that the pgmap_owner is passed to the mmu notifier callback so
-	 * that the registered device driver can skip invalidating device
-	 * private page mappings that won't be migrated.
-	 */
-	mmu_notifier_range_init_owner(&range, MMU_NOTIFY_MIGRATE, 0,
-		migrate->vma->vm_mm, migrate->start, migrate->end,
-		migrate->pgmap_owner);
-	mmu_notifier_invalidate_range_start(&range);
-
-	walk_page_range_vma(migrate->vma, migrate->start, migrate->end,
-			&migrate_vma_walk_ops, migrate);
-
-	mmu_notifier_invalidate_range_end(&range);
-	migrate->end = migrate->start + (migrate->npages << PAGE_SHIFT);
-}
-
 /*
  * migrate_vma_check_page() - check if page is pinned or not
  * @page: struct page to check
@@ -677,8 +164,9 @@ static void migrate_vma_unmap(struct migrate_vma *migrate)
  * migrate_vma_setup() - prepare to migrate a range of memory
  * @args: contains the vma, start, and pfns arrays for the migration
  *
- * Returns: negative errno on failures, 0 when 0 or more pages were migrated
- * without an error.
+ * Returns: -EINVAL on invalid arguments, 0 otherwise. A 0 return does not
+ * imply anything was collected; on return @args->cpages holds the number of
+ * pages prepared for migration (possibly 0). See the note on faulting below.
  *
  * Prepare to migrate a range of memory virtual address range by collecting all
  * the pages backing each virtual address in the range, saving them inside the
@@ -688,6 +176,20 @@ static void migrate_vma_unmap(struct migrate_vma *migrate)
  * corresponding src array entry.  Then restores any pages that are pinned, by
  * remapping and unlocking those pages.
  *
+ * By default migrate_vma_setup() is best-effort: virtual addresses that cannot
+ * be collected are left with an empty src[] entry and the rest of the range
+ * still proceeds.
+ *
+ * The optional flags MIGRATE_VMA_FAULT and MIGRATE_VMA_WRITE in @args->flags
+ * additionally fault in missing pages before collecting them, for read and for
+ * write respectively. Unlike the best-effort default, if such a fault cannot be
+ * satisfied the whole range is aborted: the partial collection is rolled back,
+ * @args->src is cleared, @args->cpages and @args->npages are reset to 0,
+ * and migrate_vma_setup() still returns 0. The fault error is therefore not
+ * observable through this interface. Callers that need to act on fault failures
+ * should instead drive the migration directly via hmm_range_fault() followed by
+ * migrate_hmm_range_setup(), which preserves the error code.
+ *
  * The caller should then allocate destination memory and copy source memory to
  * it for all those entries (ie with MIGRATE_PFN_VALID and MIGRATE_PFN_MIGRATE
  * flag set).  Once these are allocated and copied, the caller must update each
@@ -739,10 +241,20 @@ static void migrate_vma_unmap(struct migrate_vma *migrate)
  */
 int migrate_vma_setup(struct migrate_vma *args)
 {
+	int ret;
 	long nr_pages = (args->end - args->start) >> PAGE_SHIFT;
+	struct hmm_range range = {
+		.notifier = NULL,
+		.hmm_pfns = args->src,
+		.dev_private_owner = args->pgmap_owner,
+		.migrate = args,
+		.default_flags = HMM_PFN_REQ_MIGRATE
+	};
 
 	args->start &= PAGE_MASK;
 	args->end &= PAGE_MASK;
+	range.start = args->start;
+	range.end = args->end;
 	if (!args->vma || is_vm_hugetlb_page(args->vma) ||
 	    (args->vma->vm_flags & VM_SPECIAL) || vma_is_dax(args->vma))
 		return -EINVAL;
@@ -764,10 +276,24 @@ int migrate_vma_setup(struct migrate_vma *args)
 	args->cpages = 0;
 	args->npages = 0;
 
-	migrate_vma_collect(args);
+	if (args->flags & MIGRATE_VMA_FAULT)
+		range.default_flags |= HMM_PFN_REQ_FAULT;
 
-	if (args->cpages)
-		migrate_vma_unmap(args);
+	if (args->flags & MIGRATE_VMA_WRITE)
+		range.default_flags |= HMM_PFN_REQ_FAULT | HMM_PFN_REQ_WRITE;
+
+	ret = hmm_range_fault(&range);
+
+	migrate_hmm_range_setup(&range);
+
+	/* Remove migration PTEs */
+	if (ret) {
+		migrate_vma_pages(args);
+		migrate_vma_finalize(args);
+		memset(args->src, 0, sizeof(*args->src) * nr_pages);
+		args->cpages = 0;
+		args->npages = 0;
+	}
 
 	/*
 	 * At this point pages are locked and unmapped, and thus they have
-- 
2.55.0


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

* [PATCH v14 11/12] lib/test_hmm: add a new testcase for the migrate on fault
  2026-09-22  5:34 [PATCH 00/12] [PATCH v14 00/12] migrate on fault for device pages mpenttil
                   ` (9 preceding siblings ...)
  2026-09-22  5:34 ` [PATCH v14 10/12] mm: enable device page migration from " mpenttil
@ 2026-09-22  5:34 ` mpenttil
  2026-09-22  6:09   ` sashiko-bot
  2026-09-22  5:34 ` [PATCH v14 12/12] Documentation/mm/hmm: document migration through hmm_range_fault() mpenttil
                   ` (6 subsequent siblings)
  17 siblings, 1 reply; 35+ messages in thread
From: mpenttil @ 2026-09-22  5:34 UTC (permalink / raw)
  To: linux-mm
  Cc: dri-devel, intel-xe, linux-kernel, Mika Penttilä,
	David Hildenbrand, Jason Gunthorpe, Leon Romanovsky,
	Alistair Popple, Balbir Singh, Zi Yan, Matthew Brost,
	Andrew Morton, Lorenzo Stoakes, Liam R. Howlett, Vlastimil Babka,
	Mike Rapoport, Suren Baghdasaryan, Michal Hocko, Marco Pagani

From: Mika Penttilä <mpenttil@redhat.com>

Enhance the hmm test driver (lib/test_hmm) with migrate on fault case.

Cc: David Hildenbrand <david@kernel.org>
Cc: Jason Gunthorpe <jgg@nvidia.com>
Cc: Leon Romanovsky <leonro@nvidia.com>
Cc: Alistair Popple <apopple@nvidia.com>
Cc: Balbir Singh <balbirs@nvidia.com>
Cc: Zi Yan <ziy@nvidia.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Signed-off-by: Marco Pagani <marpagan@redhat.com>
Signed-off-by: Mika Penttilä <mpenttil@redhat.com>
---
 lib/test_hmm.c                         | 130 ++++++++++++++++++++++++-
 lib/test_hmm_uapi.h                    |  21 ++--
 tools/testing/selftests/mm/hmm-tests.c |  54 ++++++++++
 3 files changed, 191 insertions(+), 14 deletions(-)

diff --git a/lib/test_hmm.c b/lib/test_hmm.c
index cd88e8177d0a..b39522c05d83 100644
--- a/lib/test_hmm.c
+++ b/lib/test_hmm.c
@@ -36,6 +36,7 @@
 #define DMIRROR_RANGE_FAULT_TIMEOUT	1000
 #define DEVMEM_CHUNK_SIZE		(256 * 1024 * 1024U)
 #define DEVMEM_CHUNKS_RESERVE		16
+#define PFNS_ARRAY_SIZE			64
 
 /*
  * For device_private pages, dpage is just a dummy struct page
@@ -355,6 +356,7 @@ static int dmirror_range_fault(struct dmirror *dmirror,
 	struct mm_struct *mm = dmirror->notifier.mm;
 	unsigned long timeout =
 		jiffies + msecs_to_jiffies(HMM_RANGE_DEFAULT_TIMEOUT);
+	bool migrate = range->default_flags & HMM_PFN_REQ_MIGRATE;
 	int ret;
 
 	while (true) {
@@ -364,9 +366,15 @@ static int dmirror_range_fault(struct dmirror *dmirror,
 		}
 
 		range->notifier_seq = mmu_interval_read_begin(range->notifier);
-		mmap_read_lock(mm);
-		ret = hmm_range_fault(range);
-		mmap_read_unlock(mm);
+
+		/* mmap lock held for whole migrate on fault operation */
+		if (!migrate) {
+			mmap_read_lock(mm);
+			ret = hmm_range_fault(range);
+			mmap_read_unlock(mm);
+		} else {
+			ret = hmm_range_fault(range);
+		}
 		if (ret) {
 			if (ret == -EBUSY)
 				continue;
@@ -382,7 +390,9 @@ static int dmirror_range_fault(struct dmirror *dmirror,
 		break;
 	}
 
-	ret = dmirror_do_fault(dmirror, range);
+	/* update device page table after migration */
+	if (!migrate)
+		ret = dmirror_do_fault(dmirror, range);
 
 	mutex_unlock(&dmirror->mutex);
 out:
@@ -1377,6 +1387,114 @@ static int dmirror_migrate_to_device(struct dmirror *dmirror,
 	return ret;
 }
 
+static int do_fault_and_migrate(struct dmirror *dmirror, struct hmm_range *range)
+{
+	struct migrate_vma *migrate = range->migrate;
+	int ret;
+
+	mmap_read_lock(dmirror->notifier.mm);
+
+	/* Fault-in pages for migration */
+	ret = dmirror_range_fault(dmirror, range);
+	/*
+	 * Set this up even on error: hmm_range_fault() may have collected
+	 * part of the range before failing.
+	 */
+	migrate_hmm_range_setup(range);
+	if (ret) {
+		/*
+		 * dst[] entries are empty, so this marks every collected migration
+		 * as failed. finalize then restores the source mappings and drops
+		 * the associated locks/references.
+		 */
+		migrate_vma_pages(migrate);
+		migrate_vma_finalize(migrate);
+		goto out;
+	}
+
+	pr_debug("Migrating from sys mem to device mem\n");
+
+	dmirror_migrate_alloc_and_copy(migrate, dmirror);
+	migrate_vma_pages(migrate);
+	dmirror_migrate_finalize_and_map(migrate, dmirror);
+	migrate_vma_finalize(migrate);
+out:
+	mmap_read_unlock(dmirror->notifier.mm);
+	return ret;
+}
+
+static int dmirror_fault_and_migrate_to_device(struct dmirror *dmirror,
+					       struct hmm_dmirror_cmd *cmd)
+{
+	unsigned long start, size, end, next;
+	unsigned long src_pfns[PFNS_ARRAY_SIZE] = { 0 };
+	unsigned long dst_pfns[PFNS_ARRAY_SIZE] = { 0 };
+	struct migrate_vma migrate = { 0 };
+	struct hmm_range range = { 0 };
+	struct dmirror_bounce bounce;
+	int ret = 0;
+
+	/* Whole range */
+	start = cmd->addr;
+	size = cmd->npages << PAGE_SHIFT;
+	end = start + size;
+
+	if (!mmget_not_zero(dmirror->notifier.mm)) {
+		ret = -EFAULT;
+		goto out;
+	}
+
+	migrate.pgmap_owner = dmirror->mdevice;
+	migrate.src = src_pfns;
+	migrate.dst = dst_pfns;
+	migrate.flags = MIGRATE_VMA_SELECT_SYSTEM;
+
+	range.migrate = &migrate;
+	range.hmm_pfns = src_pfns;
+	range.pfn_flags_mask = 0;
+	range.default_flags = HMM_PFN_REQ_FAULT | HMM_PFN_REQ_MIGRATE;
+	range.dev_private_owner = dmirror->mdevice;
+	range.notifier = &dmirror->notifier;
+
+	for (next = start; next < end; next = range.end) {
+		range.start = next;
+		range.end = min(end, next + (PFNS_ARRAY_SIZE << PAGE_SHIFT));
+
+		pr_debug("Fault and migrate range start:%#lx end:%#lx\n",
+			 range.start, range.end);
+
+		ret = do_fault_and_migrate(dmirror, &range);
+		if (ret)
+			goto out_mmput;
+	}
+
+	/*
+	 * Return the migrated data for verification.
+	 * Only for pages in device zone
+	 */
+	ret = dmirror_bounce_init(&bounce, start, size);
+	if (ret)
+		goto out_mmput;
+
+	mutex_lock(&dmirror->mutex);
+	ret = dmirror_do_read(dmirror, start, end, &bounce);
+	mutex_unlock(&dmirror->mutex);
+	if (ret == 0) {
+		ret = copy_to_user(u64_to_user_ptr(cmd->ptr), bounce.ptr, bounce.size);
+		if (ret)
+			ret = -EFAULT;
+	}
+
+	cmd->cpages = bounce.cpages;
+	dmirror_bounce_fini(&bounce);
+
+
+out_mmput:
+	mmput(dmirror->notifier.mm);
+out:
+	return ret;
+}
+
 static void dmirror_mkentry(struct dmirror *dmirror, struct hmm_range *range,
 			    unsigned char *perm, unsigned long entry)
 {
@@ -1643,6 +1761,10 @@ static long dmirror_fops_unlocked_ioctl(struct file *filp,
 		ret = dmirror_migrate_to_device(dmirror, &cmd);
 		break;
 
+	case HMM_DMIRROR_MIGRATE_ON_FAULT_TO_DEV:
+		ret = dmirror_fault_and_migrate_to_device(dmirror, &cmd);
+		break;
+
 	case HMM_DMIRROR_MIGRATE_TO_SYS:
 		ret = dmirror_migrate_to_system(dmirror, &cmd);
 		break;
diff --git a/lib/test_hmm_uapi.h b/lib/test_hmm_uapi.h
index ea9b0ec404fb..67d267a3b999 100644
--- a/lib/test_hmm_uapi.h
+++ b/lib/test_hmm_uapi.h
@@ -29,16 +29,17 @@ struct hmm_dmirror_cmd {
 };
 
 /* Expose the address space of the calling process through hmm device file */
-#define HMM_DMIRROR_READ		_IOWR('H', 0x00, struct hmm_dmirror_cmd)
-#define HMM_DMIRROR_WRITE		_IOWR('H', 0x01, struct hmm_dmirror_cmd)
-#define HMM_DMIRROR_MIGRATE_TO_DEV	_IOWR('H', 0x02, struct hmm_dmirror_cmd)
-#define HMM_DMIRROR_MIGRATE_TO_SYS	_IOWR('H', 0x03, struct hmm_dmirror_cmd)
-#define HMM_DMIRROR_SNAPSHOT		_IOWR('H', 0x04, struct hmm_dmirror_cmd)
-#define HMM_DMIRROR_EXCLUSIVE		_IOWR('H', 0x05, struct hmm_dmirror_cmd)
-#define HMM_DMIRROR_CHECK_EXCLUSIVE	_IOWR('H', 0x06, struct hmm_dmirror_cmd)
-#define HMM_DMIRROR_RELEASE		_IOWR('H', 0x07, struct hmm_dmirror_cmd)
-#define HMM_DMIRROR_FLAGS		_IOWR('H', 0x08, struct hmm_dmirror_cmd)
-#define HMM_DMIRROR_READ_UNLOCKED	_IOWR('H', 0x09, struct hmm_dmirror_cmd)
+#define HMM_DMIRROR_READ			_IOWR('H', 0x00, struct hmm_dmirror_cmd)
+#define HMM_DMIRROR_WRITE			_IOWR('H', 0x01, struct hmm_dmirror_cmd)
+#define HMM_DMIRROR_MIGRATE_TO_DEV		_IOWR('H', 0x02, struct hmm_dmirror_cmd)
+#define HMM_DMIRROR_MIGRATE_TO_SYS		_IOWR('H', 0x03, struct hmm_dmirror_cmd)
+#define HMM_DMIRROR_SNAPSHOT			_IOWR('H', 0x04, struct hmm_dmirror_cmd)
+#define HMM_DMIRROR_EXCLUSIVE			_IOWR('H', 0x05, struct hmm_dmirror_cmd)
+#define HMM_DMIRROR_CHECK_EXCLUSIVE		_IOWR('H', 0x06, struct hmm_dmirror_cmd)
+#define HMM_DMIRROR_RELEASE			_IOWR('H', 0x07, struct hmm_dmirror_cmd)
+#define HMM_DMIRROR_FLAGS			_IOWR('H', 0x08, struct hmm_dmirror_cmd)
+#define HMM_DMIRROR_READ_UNLOCKED		_IOWR('H', 0x09, struct hmm_dmirror_cmd)
+#define HMM_DMIRROR_MIGRATE_ON_FAULT_TO_DEV	_IOWR('H', 0x0a, struct hmm_dmirror_cmd)
 
 #define HMM_DMIRROR_FLAG_FAIL_ALLOC	(1ULL << 0)
 
diff --git a/tools/testing/selftests/mm/hmm-tests.c b/tools/testing/selftests/mm/hmm-tests.c
index e2642eca0d02..a2d1b8f494b6 100644
--- a/tools/testing/selftests/mm/hmm-tests.c
+++ b/tools/testing/selftests/mm/hmm-tests.c
@@ -334,6 +334,13 @@ static int hmm_migrate_sys_to_dev(int fd,
 	return hmm_dmirror_cmd(fd, HMM_DMIRROR_MIGRATE_TO_DEV, buffer, npages);
 }
 
+static int hmm_migrate_on_fault_sys_to_dev(int fd,
+					   struct hmm_buffer *buffer,
+					   unsigned long npages)
+{
+	return hmm_dmirror_cmd(fd, HMM_DMIRROR_MIGRATE_ON_FAULT_TO_DEV, buffer, npages);
+}
+
 static int hmm_migrate_dev_to_sys(int fd,
 				   struct hmm_buffer *buffer,
 				   unsigned long npages)
@@ -938,6 +945,53 @@ TEST_F(hmm, migrate)
 	hmm_buffer_free(buffer);
 }
 
+
+/*
+ * Fault and migrate anonymous memory to device private memory.
+ */
+TEST_F(hmm, migrate_on_fault)
+{
+	struct hmm_buffer *buffer;
+	unsigned long npages;
+	unsigned long size;
+	unsigned long i;
+	int *ptr;
+	int ret;
+
+	npages = ALIGN(HMM_BUFFER_SIZE, self->page_size) >> self->page_shift;
+	ASSERT_NE(npages, 0);
+	size = npages << self->page_shift;
+
+	buffer = malloc(sizeof(*buffer));
+	ASSERT_NE(buffer, NULL);
+
+	buffer->fd = -1;
+	buffer->size = size;
+	buffer->mirror = malloc(size);
+	ASSERT_NE(buffer->mirror, NULL);
+
+	buffer->ptr = mmap(NULL, size,
+			   PROT_READ | PROT_WRITE,
+			   MAP_PRIVATE | MAP_ANONYMOUS,
+			   buffer->fd, 0);
+	ASSERT_NE(buffer->ptr, MAP_FAILED);
+
+	/* Initialize buffer in system memory. */
+	for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i)
+		ptr[i] = i;
+
+	/* Fault and migrate memory to device. */
+	ret = hmm_migrate_on_fault_sys_to_dev(self->fd, buffer, npages);
+	ASSERT_EQ(ret, 0);
+	ASSERT_EQ(buffer->cpages, npages);
+
+	/* Check what the device read. */
+	for (i = 0, ptr = buffer->mirror; i < size / sizeof(*ptr); ++i)
+		ASSERT_EQ(ptr[i], i);
+
+	hmm_buffer_free(buffer);
+}
+
 /*
  * Migrate private file memory to device private memory.
  */
-- 
2.55.0


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

* [PATCH v14 12/12] Documentation/mm/hmm: document migration through hmm_range_fault()
  2026-09-22  5:34 [PATCH 00/12] [PATCH v14 00/12] migrate on fault for device pages mpenttil
                   ` (10 preceding siblings ...)
  2026-09-22  5:34 ` [PATCH v14 11/12] lib/test_hmm: add a new testcase for the migrate on fault mpenttil
@ 2026-09-22  5:34 ` mpenttil
  2026-09-22  5:41 ` ✗ CI.checkpatch: warning for Migrate on fault for device pages (rev6) Patchwork
                   ` (5 subsequent siblings)
  17 siblings, 0 replies; 35+ messages in thread
From: mpenttil @ 2026-09-22  5:34 UTC (permalink / raw)
  To: linux-mm
  Cc: dri-devel, intel-xe, linux-kernel, Mika Penttilä,
	David Hildenbrand, Jason Gunthorpe, Leon Romanovsky,
	Alistair Popple, Balbir Singh, Zi Yan, Matthew Brost,
	Andrew Morton, Lorenzo Stoakes, Liam R. Howlett, Vlastimil Babka,
	Mike Rapoport, Suren Baghdasaryan, Michal Hocko

From: Mika Penttilä <mpenttil@redhat.com>

Describe the two new MIGRATE_VMA_FAULT / MIGRATE_VMA_WRITE flags of
migrate_vma_setup(), and add a section on driving the migration
collection phase directly from hmm_range_fault() via HMM_PFN_REQ_MIGRATE
and migrate_hmm_range_setup().

Signed-off-by: Mika Penttilä <mpenttil@redhat.com>
---
 Documentation/mm/hmm.rst | 39 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 39 insertions(+)

diff --git a/Documentation/mm/hmm.rst b/Documentation/mm/hmm.rst
index fc1b8dc19825..58424e5f5873 100644
--- a/Documentation/mm/hmm.rst
+++ b/Documentation/mm/hmm.rst
@@ -348,6 +348,13 @@ between device driver specific code and shared common code:
    Currently only anonymous private VMA ranges can be migrated to or from
    system memory and device private memory.
 
+   By default only pages already present are collected. Two additional flags
+   ask migrate_vma_setup() to fault in missing pages first:
+
+   * ``MIGRATE_VMA_FAULT`` faults in missing pages with read access.
+   * ``MIGRATE_VMA_WRITE`` faults in missing pages with write access
+     (implies faulting).
+
    One of the first steps migrate_vma_setup() does is to invalidate other
    device's MMUs with the ``mmu_notifier_invalidate_range_start()`` and
    ``mmu_notifier_invalidate_range_end()`` calls around the page table
@@ -427,6 +434,38 @@ between device driver specific code and shared common code:
 
    The lock can now be released.
 
+Migration collection through hmm_range_fault()
+==============================================
+
+The collection phase of migration (steps 1 and 2 above) can also be driven by
+hmm_range_fault() directly, sharing its page table walk. This lets a driver
+fault in and collect a range for migration in one walk, which is useful for
+migrate on fault.
+
+To do so, the driver sets ``HMM_PFN_REQ_MIGRATE`` in ``range->default_flags``
+and points ``range->migrate`` at a ``struct migrate_vma`` it has filled in
+(``flags``, ``src``, ``dst``, ``pgmap_owner``). Usually ``HMM_PFN_REQ_FAULT``
+(and ``HMM_PFN_REQ_WRITE``) is set as well, so missing pages are faulted in
+before being collected. The mmap_read_lock() has to be held for the whole
+migration, since the vma must stay stable.
+
+hmm_range_fault() collects the entries the same way migrate_vma_setup() does,
+taking a folio reference, locking it and installing a migration PTE. Collected
+entries are marked with ``HMM_PFN_VALID | HMM_PFN_MIGRATE`` in
+``range->hmm_pfns``. If the page tables change while locks are dropped the
+partially collected entries are rolled back automatically.
+
+After hmm_range_fault() returns, the driver calls::
+
+    void migrate_hmm_range_setup(struct hmm_range *range);
+
+to translate ``range->hmm_pfns`` into ``migrate->src[]`` (``migrate->dst[]`` is
+zeroed) and initialize ``migrate->cpages`` and ``migrate->npages``. From here on
+the ``range->migrate`` struct is ready for the rest of the flow (steps 3
+onwards), i.e. migrate_vma_pages() and migrate_vma_finalize(). This should be
+called even on error, since hmm_range_fault() may have collected part of the
+range before failing.
+
 Exclusive access memory
 =======================
 
-- 
2.55.0


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

* ✗ CI.checkpatch: warning for Migrate on fault for device pages (rev6)
  2026-09-22  5:34 [PATCH 00/12] [PATCH v14 00/12] migrate on fault for device pages mpenttil
                   ` (11 preceding siblings ...)
  2026-09-22  5:34 ` [PATCH v14 12/12] Documentation/mm/hmm: document migration through hmm_range_fault() mpenttil
@ 2026-09-22  5:41 ` Patchwork
  2026-09-22  5:43 ` ✓ CI.KUnit: success " Patchwork
                   ` (4 subsequent siblings)
  17 siblings, 0 replies; 35+ messages in thread
From: Patchwork @ 2026-09-22  5:41 UTC (permalink / raw)
  To: mpenttil; +Cc: intel-xe

== Series Details ==

Series: Migrate on fault for device pages (rev6)
URL   : https://patchwork.freedesktop.org/series/165953/
State : warning

== Summary ==

+ KERNEL=/kernel
+ git clone https://gitlab.freedesktop.org/drm/maintainer-tools mt
Cloning into 'mt'...
warning: redirecting to https://gitlab.freedesktop.org/drm/maintainer-tools.git/
+ git -C mt rev-list -n1 origin/master
6bef5ce5c74dc76b4ee69ab2832c0d1fd63c91c7
+ cd /kernel
+ git config --global --add safe.directory /kernel
+ git log -n1
commit 37abc623899e8e6a1e29c95a9c55281edc979e35
Author: Mika Penttilä <mpenttil@redhat.com>
Date:   Tue Sep 22 08:34:21 2026 +0300

    Documentation/mm/hmm: document migration through hmm_range_fault()
    
    Describe the two new MIGRATE_VMA_FAULT / MIGRATE_VMA_WRITE flags of
    migrate_vma_setup(), and add a section on driving the migration
    collection phase directly from hmm_range_fault() via HMM_PFN_REQ_MIGRATE
    and migrate_hmm_range_setup().
    
    Signed-off-by: Mika Penttilä <mpenttil@redhat.com>
+ /mt/dim checkpatch dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04 drm-intel
2549541686b9 mm/Kconfig: changes for migrate on fault for device pages
9d869e31097c mm: add helper to convert HMM pfn to migrate pfn
-:179: CHECK:BRACES: Blank lines aren't necessary before a close brace '}'
#179: FILE: mm/migrate_device.c:1584:
+
+}

total: 0 errors, 0 warnings, 1 checks, 138 lines checked
56ef952d875a mm/hmm: preparations for HMM to participate in migration
-:189: CHECK:UNNECESSARY_PARENTHESES: Unnecessary parentheses around 'hmm_vma_walk->vma != walk->vma'
#189: FILE: mm/hmm.c:420:
+	if (hmm_vma_walk->vma && (hmm_vma_walk->vma != walk->vma))

-:211: CHECK:BRACES: Blank lines aren't necessary after an open brace '{'
#211: FILE: mm/hmm.c:442:
+{
+

total: 0 errors, 0 warnings, 2 checks, 258 lines checked
babdfdf65f17 mm/hmm: do the plumbing for HMM to participate in migration
-:47: CHECK:UNCOMMENTED_DEFINITION: spinlock_t definition without comment
#47: FILE: mm/hmm.c:52:
+	spinlock_t			*ptl;

-:55: CHECK:MACRO_ARG_PRECEDENCE: Macro argument 'locked' may be better as '(locked)' to avoid precedence issues
#55: FILE: mm/hmm.c:74:
+#define HMM_ASSERT_PTE_LOCKED(hmm_vma_walk, locked)		\
+	WARN_ON_ONCE((hmm_vma_walk)->ptelocked != locked)

-:58: CHECK:MACRO_ARG_PRECEDENCE: Macro argument 'locked' may be better as '(locked)' to avoid precedence issues
#58: FILE: mm/hmm.c:77:
+#define HMM_ASSERT_PMD_LOCKED(hmm_vma_walk, locked)		\
+	WARN_ON_ONCE((hmm_vma_walk)->pmdlocked != locked)

-:61: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'hmm_vma_walk' - possible side-effects?
#61: FILE: mm/hmm.c:80:
+#define HMM_ASSERT_UNLOCKED(hmm_vma_walk)			\
+	WARN_ON_ONCE((hmm_vma_walk)->ptelocked ||		\
+		     (hmm_vma_walk)->pmdlocked)

-:92: CHECK:SPACING: spaces preferred around that '-' (ctx:VxV)
#92: FILE: mm/hmm.c:116:
+		end-addr == HPAGE_PMD_SIZE) {
 		   ^

-:216: CHECK:BRACES: braces {} should be used on all arms of this statement
#216: FILE: mm/hmm.c:464:
+		if (softleaf_is_device_private(entry)) {
[...]
 		else
[...]

-:334: CHECK:BRACES: braces {} should be used on all arms of this statement
#334: FILE: mm/hmm.c:625:
+	if (minfo) {
[...]
+	} else
[...]

-:338: CHECK:BRACES: Unbalanced braces around else statement
#338: FILE: mm/hmm.c:629:
+	} else

-:455: CHECK:BRACES: Blank lines aren't necessary before a close brace '}'
#455: FILE: mm/hmm.c:724:
+
+	}

total: 0 errors, 0 warnings, 9 checks, 494 lines checked
bd8b1d36eec5 mm/hmm: implement folio split for migrate needs in HMM pagewalk
-:39: CHECK:UNCOMMENTED_DEFINITION: spinlock_t definition without comment
#39: FILE: mm/hmm.c:521:
+	spinlock_t *ptl;

total: 0 errors, 0 warnings, 1 checks, 54 lines checked
473aa0c03ac2 mm/hmm: migrate collection in HMM pagewalk - pte level
7d91037a5f88 mm/hmm: migrate collection in HMM pagewalk - pmd level
781c02917e09 mm/hmm: add lazy MMU mode support for migration in HMM pagewalk
3064a5a59e73 mm/hmm: implement rollback for device page migration in HMM pagewalk
-:163: CHECK:BRACES: Blank lines aren't necessary before a close brace '}'
#163: FILE: mm/hmm.c:606:
+
+		}

total: 0 errors, 0 warnings, 1 checks, 164 lines checked
f26a7a295a3b mm: enable device page migration from HMM pagewalk
15198e9f4a06 lib/test_hmm: add a new testcase for the migrate on fault
-:176: CHECK:LINE_SPACING: Please don't use multiple blank lines
#176: FILE: lib/test_hmm.c:1491:
+
+

-:251: CHECK:LINE_SPACING: Please don't use multiple blank lines
#251: FILE: tools/testing/selftests/mm/hmm-tests.c:948:
 
+

total: 0 errors, 0 warnings, 2 checks, 259 lines checked
37abc623899e Documentation/mm/hmm: document migration through hmm_range_fault()



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

* ✓ CI.KUnit: success for Migrate on fault for device pages (rev6)
  2026-09-22  5:34 [PATCH 00/12] [PATCH v14 00/12] migrate on fault for device pages mpenttil
                   ` (12 preceding siblings ...)
  2026-09-22  5:41 ` ✗ CI.checkpatch: warning for Migrate on fault for device pages (rev6) Patchwork
@ 2026-09-22  5:43 ` Patchwork
  2026-09-22  6:00 ` ✗ CI.checksparse: warning " Patchwork
                   ` (3 subsequent siblings)
  17 siblings, 0 replies; 35+ messages in thread
From: Patchwork @ 2026-09-22  5:43 UTC (permalink / raw)
  To: mpenttil; +Cc: intel-xe

== Series Details ==

Series: Migrate on fault for device pages (rev6)
URL   : https://patchwork.freedesktop.org/series/165953/
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
[05:41:41] Configuring KUnit Kernel ...
Generating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[05:41:45] 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
[05:42:06] Starting KUnit Kernel (1/1)...
[05:42:06] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[05:42:06] ============= refcount_interrupt (4 subtests) ==============
[05:42:06] [PASSED] test_single_irq_change
[05:42:06] [PASSED] test_nested_irq_change
[05:42:06] [PASSED] test_multiple_irq_change
[05:42:06] [PASSED] test_irq_save
[05:42:06] =============== [PASSED] refcount_interrupt ================
[05:42:06] ================= gpu_buddy (14 subtests) ==================
[05:42:06] [PASSED] gpu_test_buddy_alloc_limit
[05:42:06] [PASSED] gpu_test_buddy_alloc_optimistic
[05:42:06] [PASSED] gpu_test_buddy_alloc_pessimistic
[05:42:06] [PASSED] gpu_test_buddy_alloc_pathological
[05:42:06] [PASSED] gpu_test_buddy_alloc_contiguous
[05:42:06] [PASSED] gpu_test_buddy_alloc_clear
[05:42:06] [PASSED] gpu_test_buddy_alloc_range
[05:42:07] [PASSED] gpu_test_buddy_alloc_range_bias
[05:42:07] [PASSED] gpu_test_buddy_fragmentation_performance
[05:42:08] [PASSED] gpu_test_buddy_dirty_tracker_performance
[05:42:08] [PASSED] gpu_test_buddy_alloc_exceeds_max_order
[05:42:08] [PASSED] gpu_test_buddy_offset_aligned_allocation
[05:42:08] [PASSED] gpu_test_buddy_subtree_offset_alignment_stress
[05:42:08] [PASSED] gpu_test_buddy_addr_to_block
[05:42:08] ==================== [PASSED] gpu_buddy ====================
[05:42:08] ============================================================
[05:42:08] Testing complete. Ran 18 tests: passed: 18
[05:42:08] Elapsed time: 27.311s total, 4.469s configuring, 20.674s building, 2.097s 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
[05:42:08] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[05:42:10] 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
[05:42:45] Starting KUnit Kernel (1/1)...
[05:42:45] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[05:42:45] ============= refcount_interrupt (4 subtests) ==============
[05:42:45] [PASSED] test_single_irq_change
[05:42:45] [PASSED] test_nested_irq_change
[05:42:45] [PASSED] test_multiple_irq_change
[05:42:45] [PASSED] test_irq_save
[05:42:45] =============== [PASSED] refcount_interrupt ================
[05:42:45] ================== guc_buf (11 subtests) ===================
[05:42:45] [PASSED] test_smallest
[05:42:45] [PASSED] test_largest
[05:42:45] [PASSED] test_granular
[05:42:45] [PASSED] test_unique
[05:42:45] [PASSED] test_overlap
[05:42:45] [PASSED] test_reusable
[05:42:45] [PASSED] test_too_big
[05:42:45] [PASSED] test_flush
[05:42:45] [PASSED] test_lookup
[05:42:45] [PASSED] test_data
[05:42:45] [PASSED] test_class
[05:42:45] ===================== [PASSED] guc_buf =====================
[05:42:45] =================== guc_dbm (7 subtests) ===================
[05:42:45] [PASSED] test_empty
[05:42:45] [PASSED] test_default
[05:42:45] ======================== test_size  ========================
[05:42:45] [PASSED] 4
[05:42:45] [PASSED] 8
[05:42:45] [PASSED] 32
[05:42:45] [PASSED] 256
[05:42:45] ==================== [PASSED] test_size ====================
[05:42:45] ======================= test_reuse  ========================
[05:42:45] [PASSED] 4
[05:42:45] [PASSED] 8
[05:42:45] [PASSED] 32
[05:42:45] [PASSED] 256
[05:42:45] =================== [PASSED] test_reuse ====================
[05:42:45] =================== test_range_overlap  ====================
[05:42:45] [PASSED] 4
[05:42:45] [PASSED] 8
[05:42:45] [PASSED] 32
[05:42:45] [PASSED] 256
[05:42:45] =============== [PASSED] test_range_overlap ================
[05:42:45] =================== test_range_compact  ====================
[05:42:45] [PASSED] 4
[05:42:45] [PASSED] 8
[05:42:45] [PASSED] 32
[05:42:45] [PASSED] 256
[05:42:45] =============== [PASSED] test_range_compact ================
[05:42:45] ==================== test_range_spare  =====================
[05:42:45] [PASSED] 4
[05:42:45] [PASSED] 8
[05:42:45] [PASSED] 32
[05:42:45] [PASSED] 256
[05:42:45] ================ [PASSED] test_range_spare =================
[05:42:45] ===================== [PASSED] guc_dbm =====================
[05:42:45] =================== guc_idm (6 subtests) ===================
[05:42:45] [PASSED] bad_init
[05:42:45] [PASSED] no_init
[05:42:45] [PASSED] init_fini
[05:42:45] [PASSED] check_used
[05:42:45] [PASSED] check_quota
[05:42:45] [PASSED] check_all
[05:42:45] ===================== [PASSED] guc_idm =====================
[05:42:45] ============== guc_klv_helpers (13 subtests) ===============
[05:42:45] [PASSED] test_count
[05:42:45] [PASSED] test_encode_u32
[05:42:45] [PASSED] test_encode_u64
[05:42:45] [PASSED] test_encode_string
[05:42:45] [PASSED] test_encode_object_raw
[05:42:45] [PASSED] test_encode_object_klv
[05:42:45] [PASSED] test_encode_object_nested
[05:42:45] [PASSED] test_encode_object_basic
[05:42:45] ===================== test_decode_u16  =====================
[05:42:45] [PASSED] empty
[05:42:45] [PASSED] valid
[05:42:45] [PASSED] max
[05:42:45] [PASSED] big
[05:42:45] [PASSED] long
[05:42:45] ================= [PASSED] test_decode_u16 =================
[05:42:45] ===================== test_decode_u32  =====================
[05:42:45] [PASSED] empty
[05:42:45] [PASSED] valid
[05:42:45] [PASSED] max
[05:42:45] [PASSED] long
[05:42:45] ================= [PASSED] test_decode_u32 =================
[05:42:45] ===================== test_decode_u64  =====================
[05:42:45] [PASSED] empty
[05:42:45] [PASSED] short
[05:42:45] [PASSED] valid
[05:42:45] [PASSED] max
[05:42:45] [PASSED] long
[05:42:45] ================= [PASSED] test_decode_u64 =================
[05:42:45] ===================== test_decode_str  =====================
[05:42:45] [PASSED] empty
[05:42:45] [PASSED] one
[05:42:45] [PASSED] one_trash
[05:42:45] [PASSED] two
[05:42:45] [PASSED] two_trash
[05:42:45] [PASSED] three
[05:42:45] [PASSED] dword
[05:42:45] [PASSED] four
[05:42:45] [PASSED] five
[05:42:45] [PASSED] six
[05:42:45] [PASSED] seven
[05:42:45] [PASSED] qword
[05:42:45] ================= [PASSED] test_decode_str =================
[05:42:45] [PASSED] test_print
[05:42:45] ================= [PASSED] guc_klv_helpers =================
[05:42:45] =================== xe_log (4 subtests) ====================
[05:42:45] [PASSED] demo_cper
[05:42:45] [PASSED] demo_dmesg
[05:42:45] ======================= test_dmesg  ========================
[05:42:45] [PASSED] test_fatal
[05:42:45] [PASSED] test_fatal_tile
[05:42:45] [PASSED] test_fatal_gt
[05:42:45] [PASSED] test_fatal_comp
[05:42:45] [PASSED] test_fatal_comp_tile
[05:42:45] [PASSED] test_fatal_comp_gt
[05:42:45] [PASSED] test_fatal_all
[05:42:45] [PASSED] test_recoverable
[05:42:45] [PASSED] test_recoverable_tile
[05:42:45] [PASSED] test_recoverable_gt
[05:42:45] [PASSED] test_recoverable_comp
[05:42:45] [PASSED] test_recoverable_comp_tile
[05:42:45] [PASSED] test_recoverable_comp_gt
[05:42:45] [PASSED] test_recoverable_all
[05:42:45] [PASSED] test_info
[05:42:45] [PASSED] test_info_tile
[05:42:45] [PASSED] test_info_gt
[05:42:45] [PASSED] test_info_err
[05:42:45] [PASSED] test_info_comp
[05:42:45] [PASSED] test_info_comp_tile
[05:42:45] [PASSED] test_info_comp_gt
[05:42:45] [PASSED] test_info_all
[05:42:45] [PASSED] test_hw_fatal
[05:42:45] [PASSED] test_hw_recoverable
[05:42:45] [PASSED] test_hw_corrected
[05:42:45] [PASSED] test_hw_informational
[05:42:45] =================== [PASSED] test_dmesg ====================
[05:42:45] ====================== test_invalid  =======================
[05:42:45] [SKIPPED] no-component no-location no-warn (requires CONFIG_DRM_XE_DEBUG)
[05:42:45] [SKIPPED] reserved location (requires CONFIG_DRM_XE_DEBUG)
[05:42:45] [SKIPPED] unknown location (requires CONFIG_DRM_XE_DEBUG)
[05:42:45] [SKIPPED] nonzero-device-id location (requires CONFIG_DRM_XE_DEBUG)
[05:42:45] [SKIPPED] invalid-tile-id location (requires CONFIG_DRM_XE_DEBUG)
[05:42:45] [SKIPPED] invalid-gt-id location (requires CONFIG_DRM_XE_DEBUG)
[05:42:45] [SKIPPED] unknown component class (requires CONFIG_DRM_XE_DEBUG)
[05:42:45] [SKIPPED] unknown system component (requires CONFIG_DRM_XE_DEBUG)
[05:42:45] [SKIPPED] unknown hardware component (requires CONFIG_DRM_XE_DEBUG)
[05:42:45] [SKIPPED] unknown component and location (requires CONFIG_DRM_XE_DEBUG)
[05:42:45] ================== [SKIPPED] test_invalid ==================
[05:42:45] ===================== [PASSED] xe_log ======================
[05:42:45] ================== no_relay (3 subtests) ===================
[05:42:45] [PASSED] xe_drops_guc2pf_if_not_ready
[05:42:45] [PASSED] xe_drops_guc2vf_if_not_ready
[05:42:45] [PASSED] xe_rejects_send_if_not_ready
[05:42:45] ==================== [PASSED] no_relay =====================
[05:42:45] ================== pf_relay (14 subtests) ==================
[05:42:45] [PASSED] pf_rejects_guc2pf_too_short
[05:42:45] [PASSED] pf_rejects_guc2pf_too_long
[05:42:45] [PASSED] pf_rejects_guc2pf_no_payload
[05:42:45] [PASSED] pf_fails_no_payload
[05:42:45] [PASSED] pf_fails_bad_origin
[05:42:45] [PASSED] pf_fails_bad_type
[05:42:45] [PASSED] pf_txn_reports_error
[05:42:45] [PASSED] pf_txn_sends_pf2guc
[05:42:45] [PASSED] pf_sends_pf2guc
[05:42:45] [SKIPPED] pf_loopback_nop (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[05:42:45] [SKIPPED] pf_loopback_echo (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[05:42:45] [SKIPPED] pf_loopback_fail (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[05:42:45] [SKIPPED] pf_loopback_busy (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[05:42:45] [SKIPPED] pf_loopback_retry (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[05:42:45] ==================== [PASSED] pf_relay =====================
[05:42:45] ================== vf_relay (3 subtests) ===================
[05:42:45] [PASSED] vf_rejects_guc2vf_too_short
[05:42:45] [PASSED] vf_rejects_guc2vf_too_long
[05:42:45] [PASSED] vf_rejects_guc2vf_no_payload
[05:42:45] ==================== [PASSED] vf_relay =====================
[05:42:45] ================ pf_gt_config (9 subtests) =================
[05:42:45] [PASSED] fair_contexts_1vf
[05:42:45] [PASSED] fair_doorbells_1vf
[05:42:45] [PASSED] fair_ggtt_1vf
[05:42:45] ====================== fair_vram_1vf  ======================
[05:42:45] [PASSED] 3.50 GiB
[05:42:45] [PASSED] 11.5 GiB
[05:42:45] [PASSED] 15.5 GiB
[05:42:45] [PASSED] 31.5 GiB
[05:42:45] [PASSED] 63.5 GiB
[05:42:45] [PASSED] 1.91 GiB
[05:42:45] ================== [PASSED] fair_vram_1vf ==================
[05:42:45] ================ fair_vram_1vf_admin_only  =================
[05:42:45] [PASSED] 3.50 GiB
[05:42:45] [PASSED] 11.5 GiB
[05:42:45] [PASSED] 15.5 GiB
[05:42:45] [PASSED] 31.5 GiB
[05:42:45] [PASSED] 63.5 GiB
[05:42:45] [PASSED] 1.91 GiB
[05:42:45] ============ [PASSED] fair_vram_1vf_admin_only =============
[05:42:45] ====================== fair_contexts  ======================
[05:42:45] [PASSED] 1 VF
[05:42:45] [PASSED] 2 VFs
[05:42:45] [PASSED] 3 VFs
[05:42:45] [PASSED] 4 VFs
[05:42:45] [PASSED] 5 VFs
[05:42:45] [PASSED] 6 VFs
[05:42:45] [PASSED] 7 VFs
[05:42:45] [PASSED] 8 VFs
[05:42:45] [PASSED] 9 VFs
[05:42:45] [PASSED] 10 VFs
[05:42:45] [PASSED] 11 VFs
[05:42:45] [PASSED] 12 VFs
[05:42:45] [PASSED] 13 VFs
[05:42:45] [PASSED] 14 VFs
[05:42:45] [PASSED] 15 VFs
[05:42:45] [PASSED] 16 VFs
[05:42:45] [PASSED] 17 VFs
[05:42:45] [PASSED] 18 VFs
[05:42:45] [PASSED] 19 VFs
[05:42:45] [PASSED] 20 VFs
[05:42:45] [PASSED] 21 VFs
[05:42:45] [PASSED] 22 VFs
[05:42:45] [PASSED] 23 VFs
[05:42:45] [PASSED] 24 VFs
[05:42:45] [PASSED] 25 VFs
[05:42:45] [PASSED] 26 VFs
[05:42:45] [PASSED] 27 VFs
[05:42:45] [PASSED] 28 VFs
[05:42:45] [PASSED] 29 VFs
[05:42:45] [PASSED] 30 VFs
[05:42:45] [PASSED] 31 VFs
[05:42:45] [PASSED] 32 VFs
[05:42:45] [PASSED] 33 VFs
[05:42:45] [PASSED] 34 VFs
[05:42:45] [PASSED] 35 VFs
[05:42:45] [PASSED] 36 VFs
[05:42:45] [PASSED] 37 VFs
[05:42:45] [PASSED] 38 VFs
[05:42:45] [PASSED] 39 VFs
[05:42:45] [PASSED] 40 VFs
[05:42:45] [PASSED] 41 VFs
[05:42:45] [PASSED] 42 VFs
[05:42:45] [PASSED] 43 VFs
[05:42:45] [PASSED] 44 VFs
[05:42:45] [PASSED] 45 VFs
[05:42:45] [PASSED] 46 VFs
[05:42:45] [PASSED] 47 VFs
[05:42:45] [PASSED] 48 VFs
[05:42:45] [PASSED] 49 VFs
[05:42:45] [PASSED] 50 VFs
[05:42:45] [PASSED] 51 VFs
[05:42:45] [PASSED] 52 VFs
[05:42:45] [PASSED] 53 VFs
[05:42:45] [PASSED] 54 VFs
[05:42:45] [PASSED] 55 VFs
[05:42:45] [PASSED] 56 VFs
[05:42:45] [PASSED] 57 VFs
[05:42:45] [PASSED] 58 VFs
[05:42:45] [PASSED] 59 VFs
[05:42:45] [PASSED] 60 VFs
[05:42:45] [PASSED] 61 VFs
[05:42:45] [PASSED] 62 VFs
[05:42:45] [PASSED] 63 VFs
[05:42:45] ================== [PASSED] fair_contexts ==================
[05:42:45] ===================== fair_doorbells  ======================
[05:42:45] [PASSED] 1 VF
[05:42:45] [PASSED] 2 VFs
[05:42:45] [PASSED] 3 VFs
[05:42:45] [PASSED] 4 VFs
[05:42:45] [PASSED] 5 VFs
[05:42:45] [PASSED] 6 VFs
[05:42:45] [PASSED] 7 VFs
[05:42:45] [PASSED] 8 VFs
[05:42:45] [PASSED] 9 VFs
[05:42:45] [PASSED] 10 VFs
[05:42:45] [PASSED] 11 VFs
[05:42:45] [PASSED] 12 VFs
[05:42:45] [PASSED] 13 VFs
[05:42:45] [PASSED] 14 VFs
[05:42:45] [PASSED] 15 VFs
[05:42:45] [PASSED] 16 VFs
[05:42:45] [PASSED] 17 VFs
[05:42:45] [PASSED] 18 VFs
[05:42:45] [PASSED] 19 VFs
[05:42:45] [PASSED] 20 VFs
[05:42:45] [PASSED] 21 VFs
[05:42:45] [PASSED] 22 VFs
[05:42:45] [PASSED] 23 VFs
[05:42:45] [PASSED] 24 VFs
[05:42:45] [PASSED] 25 VFs
[05:42:45] [PASSED] 26 VFs
[05:42:45] [PASSED] 27 VFs
[05:42:45] [PASSED] 28 VFs
[05:42:45] [PASSED] 29 VFs
[05:42:45] [PASSED] 30 VFs
[05:42:45] [PASSED] 31 VFs
[05:42:45] [PASSED] 32 VFs
[05:42:45] [PASSED] 33 VFs
[05:42:45] [PASSED] 34 VFs
[05:42:45] [PASSED] 35 VFs
[05:42:45] [PASSED] 36 VFs
[05:42:45] [PASSED] 37 VFs
[05:42:45] [PASSED] 38 VFs
[05:42:45] [PASSED] 39 VFs
[05:42:45] [PASSED] 40 VFs
[05:42:45] [PASSED] 41 VFs
[05:42:45] [PASSED] 42 VFs
[05:42:45] [PASSED] 43 VFs
[05:42:45] [PASSED] 44 VFs
[05:42:45] [PASSED] 45 VFs
[05:42:45] [PASSED] 46 VFs
[05:42:45] [PASSED] 47 VFs
[05:42:45] [PASSED] 48 VFs
[05:42:45] [PASSED] 49 VFs
[05:42:45] [PASSED] 50 VFs
[05:42:45] [PASSED] 51 VFs
[05:42:45] [PASSED] 52 VFs
[05:42:45] [PASSED] 53 VFs
[05:42:45] [PASSED] 54 VFs
[05:42:45] [PASSED] 55 VFs
[05:42:45] [PASSED] 56 VFs
[05:42:45] [PASSED] 57 VFs
[05:42:45] [PASSED] 58 VFs
[05:42:45] [PASSED] 59 VFs
[05:42:45] [PASSED] 60 VFs
[05:42:45] [PASSED] 61 VFs
[05:42:45] [PASSED] 62 VFs
[05:42:45] [PASSED] 63 VFs
[05:42:45] ================= [PASSED] fair_doorbells ==================
[05:42:45] ======================== fair_ggtt  ========================
[05:42:45] [PASSED] 1 VF
[05:42:45] [PASSED] 2 VFs
[05:42:45] [PASSED] 3 VFs
[05:42:45] [PASSED] 4 VFs
[05:42:45] [PASSED] 5 VFs
[05:42:45] [PASSED] 6 VFs
[05:42:45] [PASSED] 7 VFs
[05:42:45] [PASSED] 8 VFs
[05:42:45] [PASSED] 9 VFs
[05:42:45] [PASSED] 10 VFs
[05:42:45] [PASSED] 11 VFs
[05:42:45] [PASSED] 12 VFs
[05:42:45] [PASSED] 13 VFs
[05:42:46] [PASSED] 14 VFs
[05:42:46] [PASSED] 15 VFs
[05:42:46] [PASSED] 16 VFs
[05:42:46] [PASSED] 17 VFs
[05:42:46] [PASSED] 18 VFs
[05:42:46] [PASSED] 19 VFs
[05:42:46] [PASSED] 20 VFs
[05:42:46] [PASSED] 21 VFs
[05:42:46] [PASSED] 22 VFs
[05:42:46] [PASSED] 23 VFs
[05:42:46] [PASSED] 24 VFs
[05:42:46] [PASSED] 25 VFs
[05:42:46] [PASSED] 26 VFs
[05:42:46] [PASSED] 27 VFs
[05:42:46] [PASSED] 28 VFs
[05:42:46] [PASSED] 29 VFs
[05:42:46] [PASSED] 30 VFs
[05:42:46] [PASSED] 31 VFs
[05:42:46] [PASSED] 32 VFs
[05:42:46] [PASSED] 33 VFs
[05:42:46] [PASSED] 34 VFs
[05:42:46] [PASSED] 35 VFs
[05:42:46] [PASSED] 36 VFs
[05:42:46] [PASSED] 37 VFs
[05:42:46] [PASSED] 38 VFs
[05:42:46] [PASSED] 39 VFs
[05:42:46] [PASSED] 40 VFs
[05:42:46] [PASSED] 41 VFs
[05:42:46] [PASSED] 42 VFs
[05:42:46] [PASSED] 43 VFs
[05:42:46] [PASSED] 44 VFs
[05:42:46] [PASSED] 45 VFs
[05:42:46] [PASSED] 46 VFs
[05:42:46] [PASSED] 47 VFs
[05:42:46] [PASSED] 48 VFs
[05:42:46] [PASSED] 49 VFs
[05:42:46] [PASSED] 50 VFs
[05:42:46] [PASSED] 51 VFs
[05:42:46] [PASSED] 52 VFs
[05:42:46] [PASSED] 53 VFs
[05:42:46] [PASSED] 54 VFs
[05:42:46] [PASSED] 55 VFs
[05:42:46] [PASSED] 56 VFs
[05:42:46] [PASSED] 57 VFs
[05:42:46] [PASSED] 58 VFs
[05:42:46] [PASSED] 59 VFs
[05:42:46] [PASSED] 60 VFs
[05:42:46] [PASSED] 61 VFs
[05:42:46] [PASSED] 62 VFs
[05:42:46] [PASSED] 63 VFs
[05:42:46] ==================== [PASSED] fair_ggtt ====================
[05:42:46] ======================== fair_vram  ========================
[05:42:46] [PASSED] 1 VF
[05:42:46] [PASSED] 2 VFs
[05:42:46] [PASSED] 3 VFs
[05:42:46] [PASSED] 4 VFs
[05:42:46] [PASSED] 5 VFs
[05:42:46] [PASSED] 6 VFs
[05:42:46] [PASSED] 7 VFs
[05:42:46] [PASSED] 8 VFs
[05:42:46] [PASSED] 9 VFs
[05:42:46] [PASSED] 10 VFs
[05:42:46] [PASSED] 11 VFs
[05:42:46] [PASSED] 12 VFs
[05:42:46] [PASSED] 13 VFs
[05:42:46] [PASSED] 14 VFs
[05:42:46] [PASSED] 15 VFs
[05:42:46] [PASSED] 16 VFs
[05:42:46] [PASSED] 17 VFs
[05:42:46] [PASSED] 18 VFs
[05:42:46] [PASSED] 19 VFs
[05:42:46] [PASSED] 20 VFs
[05:42:46] [PASSED] 21 VFs
[05:42:46] [PASSED] 22 VFs
[05:42:46] [PASSED] 23 VFs
[05:42:46] [PASSED] 24 VFs
[05:42:46] [PASSED] 25 VFs
[05:42:46] [PASSED] 26 VFs
[05:42:46] [PASSED] 27 VFs
[05:42:46] [PASSED] 28 VFs
[05:42:46] [PASSED] 29 VFs
[05:42:46] [PASSED] 30 VFs
[05:42:46] [PASSED] 31 VFs
[05:42:46] [PASSED] 32 VFs
[05:42:46] [PASSED] 33 VFs
[05:42:46] [PASSED] 34 VFs
[05:42:46] [PASSED] 35 VFs
[05:42:46] [PASSED] 36 VFs
[05:42:46] [PASSED] 37 VFs
[05:42:46] [PASSED] 38 VFs
[05:42:46] [PASSED] 39 VFs
[05:42:46] [PASSED] 40 VFs
[05:42:46] [PASSED] 41 VFs
[05:42:46] [PASSED] 42 VFs
[05:42:46] [PASSED] 43 VFs
[05:42:46] [PASSED] 44 VFs
[05:42:46] [PASSED] 45 VFs
[05:42:46] [PASSED] 46 VFs
[05:42:46] [PASSED] 47 VFs
[05:42:46] [PASSED] 48 VFs
[05:42:46] [PASSED] 49 VFs
[05:42:46] [PASSED] 50 VFs
[05:42:46] [PASSED] 51 VFs
[05:42:46] [PASSED] 52 VFs
[05:42:46] [PASSED] 53 VFs
[05:42:46] [PASSED] 54 VFs
[05:42:46] [PASSED] 55 VFs
[05:42:46] [PASSED] 56 VFs
[05:42:46] [PASSED] 57 VFs
[05:42:46] [PASSED] 58 VFs
[05:42:46] [PASSED] 59 VFs
[05:42:46] [PASSED] 60 VFs
[05:42:46] [PASSED] 61 VFs
[05:42:46] [PASSED] 62 VFs
[05:42:46] [PASSED] 63 VFs
[05:42:46] ==================== [PASSED] fair_vram ====================
[05:42:46] ================== [PASSED] pf_gt_config ===================
[05:42:46] ===================== lmtt (1 subtest) =====================
[05:42:46] ======================== test_ops  =========================
[05:42:46] [PASSED] 2-level
[05:42:46] [PASSED] multi-level
[05:42:46] ==================== [PASSED] test_ops =====================
[05:42:46] ====================== [PASSED] lmtt =======================
[05:42:46] ================= sriov_packet (1 subtest) =================
[05:42:46] [PASSED] test_descriptor_init
[05:42:46] ================== [PASSED] sriov_packet ===================
[05:42:46] ================= pf_service (11 subtests) =================
[05:42:46] [PASSED] pf_negotiate_any
[05:42:46] [PASSED] pf_negotiate_base_match
[05:42:46] [PASSED] pf_negotiate_base_newer
[05:42:46] [PASSED] pf_negotiate_base_next
[05:42:46] [SKIPPED] pf_negotiate_base_older (no older minor)
[05:42:46] [PASSED] pf_negotiate_base_prev
[05:42:46] [PASSED] pf_negotiate_latest_match
[05:42:46] [PASSED] pf_negotiate_latest_newer
[05:42:46] [PASSED] pf_negotiate_latest_next
[05:42:46] [SKIPPED] pf_negotiate_latest_older (no older minor)
[05:42:46] [SKIPPED] pf_negotiate_latest_prev (no prev major)
[05:42:46] =================== [PASSED] pf_service ====================
[05:42:46] ================= xe_guc_g2g (2 subtests) ==================
[05:42:46] ============== xe_live_guc_g2g_kunit_default  ==============
[05:42:46] ========= [SKIPPED] xe_live_guc_g2g_kunit_default ==========
[05:42:46] ============== xe_live_guc_g2g_kunit_allmem  ===============
[05:42:46] ========== [SKIPPED] xe_live_guc_g2g_kunit_allmem ==========
[05:42:46] =================== [SKIPPED] xe_guc_g2g ===================
[05:42:46] =================== xe_mocs (2 subtests) ===================
[05:42:46] ================ xe_live_mocs_kernel_kunit  ================
[05:42:46] =========== [SKIPPED] xe_live_mocs_kernel_kunit ============
[05:42:46] ================ xe_live_mocs_reset_kunit  =================
[05:42:46] ============ [SKIPPED] xe_live_mocs_reset_kunit ============
[05:42:46] ==================== [SKIPPED] xe_mocs =====================
[05:42:46] ================= xe_migrate (2 subtests) ==================
[05:42:46] ================= xe_migrate_sanity_kunit  =================
[05:42:46] ============ [SKIPPED] xe_migrate_sanity_kunit =============
[05:42:46] ================== xe_validate_ccs_kunit  ==================
[05:42:46] ============= [SKIPPED] xe_validate_ccs_kunit ==============
[05:42:46] =================== [SKIPPED] xe_migrate ===================
[05:42:46] ================== xe_dma_buf (1 subtest) ==================
[05:42:46] ==================== xe_dma_buf_kunit  =====================
[05:42:46] ================ [SKIPPED] xe_dma_buf_kunit ================
[05:42:46] =================== [SKIPPED] xe_dma_buf ===================
[05:42:46] ================= xe_bo_shrink (1 subtest) =================
[05:42:46] =================== xe_bo_shrink_kunit  ====================
[05:42:46] =============== [SKIPPED] xe_bo_shrink_kunit ===============
[05:42:46] ================== [SKIPPED] xe_bo_shrink ==================
[05:42:46] ==================== xe_bo (2 subtests) ====================
[05:42:46] ================== xe_ccs_migrate_kunit  ===================
[05:42:46] ============== [SKIPPED] xe_ccs_migrate_kunit ==============
[05:42:46] ==================== xe_bo_evict_kunit  ====================
[05:42:46] =============== [SKIPPED] xe_bo_evict_kunit ================
[05:42:46] ===================== [SKIPPED] xe_bo ======================
[05:42:46] =================== xe_any (9 subtests) ====================
[05:42:46] [PASSED] test_to_xe
[05:42:46] [PASSED] test_to_dev
[05:42:46] [PASSED] test_to_pdev
[05:42:46] [PASSED] test_to_drm
[05:42:46] [PASSED] test_if_pdev
[05:42:46] [PASSED] test_if_xe
[05:42:46] [PASSED] test_if_tile
[05:42:46] [PASSED] test_if_gt
[05:42:46] [PASSED] test_to_id
[05:42:46] ===================== [PASSED] xe_any ======================
[05:42:46] ==================== args (13 subtests) ====================
[05:42:46] [PASSED] count_args_test
[05:42:46] [PASSED] call_args_example
[05:42:46] [PASSED] call_args_test
[05:42:46] [PASSED] drop_first_arg_example
[05:42:46] [PASSED] drop_first_arg_test
[05:42:46] [PASSED] first_arg_example
[05:42:46] [PASSED] first_arg_test
[05:42:46] [PASSED] last_arg_example
[05:42:46] [PASSED] last_arg_test
[05:42:46] [PASSED] pick_arg_example
[05:42:46] [PASSED] if_args_example
[05:42:46] [PASSED] if_args_test
[05:42:46] [PASSED] sep_comma_example
[05:42:46] ====================== [PASSED] args =======================
[05:42:46] =================== xe_pci (3 subtests) ====================
[05:42:46] ==================== check_graphics_ip  ====================
[05:42:46] [PASSED] 12.00 Xe_LP
[05:42:46] [PASSED] 12.10 Xe_LP+
[05:42:46] [PASSED] 12.55 Xe_HPG
[05:42:46] [PASSED] 12.60 Xe_HPC
[05:42:46] [PASSED] 12.70 Xe_LPG
[05:42:46] [PASSED] 12.71 Xe_LPG
[05:42:46] [PASSED] 12.74 Xe_LPG+
[05:42:46] [PASSED] 20.01 Xe2_HPG
[05:42:46] [PASSED] 20.02 Xe2_HPG
[05:42:46] [PASSED] 20.04 Xe2_LPG
[05:42:46] [PASSED] 30.00 Xe3_LPG
[05:42:46] [PASSED] 30.01 Xe3_LPG
[05:42:46] [PASSED] 30.03 Xe3_LPG
[05:42:46] [PASSED] 30.04 Xe3_LPG
[05:42:46] [PASSED] 30.05 Xe3_LPG
[05:42:46] [PASSED] 35.10 Xe3p_LPG
[05:42:46] [PASSED] 35.11 Xe3p_XPC
[05:42:46] ================ [PASSED] check_graphics_ip ================
[05:42:46] ===================== check_media_ip  ======================
[05:42:46] [PASSED] 12.00 Xe_M
[05:42:46] [PASSED] 12.55 Xe_HPM
[05:42:46] [PASSED] 13.00 Xe_LPM+
[05:42:46] [PASSED] 13.01 Xe2_HPM
[05:42:46] [PASSED] 20.00 Xe2_LPM
[05:42:46] [PASSED] 30.00 Xe3_LPM
[05:42:46] [PASSED] 30.02 Xe3_LPM
[05:42:46] [PASSED] 35.00 Xe3p_LPM
[05:42:46] [PASSED] 35.03 Xe3p_HPM
[05:42:46] ================= [PASSED] check_media_ip ==================
[05:42:46] =================== check_platform_desc  ===================
[05:42:46] [PASSED] 0x9A60 (TIGERLAKE)
[05:42:46] [PASSED] 0x9A68 (TIGERLAKE)
[05:42:46] [PASSED] 0x9A70 (TIGERLAKE)
[05:42:46] [PASSED] 0x9A40 (TIGERLAKE)
[05:42:46] [PASSED] 0x9A49 (TIGERLAKE)
[05:42:46] [PASSED] 0x9A59 (TIGERLAKE)
[05:42:46] [PASSED] 0x9A78 (TIGERLAKE)
[05:42:46] [PASSED] 0x9AC0 (TIGERLAKE)
[05:42:46] [PASSED] 0x9AC9 (TIGERLAKE)
[05:42:46] [PASSED] 0x9AD9 (TIGERLAKE)
[05:42:46] [PASSED] 0x9AF8 (TIGERLAKE)
[05:42:46] [PASSED] 0x4C80 (ROCKETLAKE)
[05:42:46] [PASSED] 0x4C8A (ROCKETLAKE)
[05:42:46] [PASSED] 0x4C8B (ROCKETLAKE)
[05:42:46] [PASSED] 0x4C8C (ROCKETLAKE)
[05:42:46] [PASSED] 0x4C90 (ROCKETLAKE)
[05:42:46] [PASSED] 0x4C9A (ROCKETLAKE)
[05:42:46] [PASSED] 0x4680 (ALDERLAKE_S)
[05:42:46] [PASSED] 0x4682 (ALDERLAKE_S)
[05:42:46] [PASSED] 0x4688 (ALDERLAKE_S)
[05:42:46] [PASSED] 0x468A (ALDERLAKE_S)
[05:42:46] [PASSED] 0x468B (ALDERLAKE_S)
[05:42:46] [PASSED] 0x4690 (ALDERLAKE_S)
[05:42:46] [PASSED] 0x4692 (ALDERLAKE_S)
[05:42:46] [PASSED] 0x4693 (ALDERLAKE_S)
[05:42:46] [PASSED] 0x46A0 (ALDERLAKE_P)
[05:42:46] [PASSED] 0x46A1 (ALDERLAKE_P)
[05:42:46] [PASSED] 0x46A2 (ALDERLAKE_P)
[05:42:46] [PASSED] 0x46A3 (ALDERLAKE_P)
[05:42:46] [PASSED] 0x46A6 (ALDERLAKE_P)
[05:42:46] [PASSED] 0x46A8 (ALDERLAKE_P)
[05:42:46] [PASSED] 0x46AA (ALDERLAKE_P)
[05:42:46] [PASSED] 0x462A (ALDERLAKE_P)
[05:42:46] [PASSED] 0x4626 (ALDERLAKE_P)
[05:42:46] [PASSED] 0x4628 (ALDERLAKE_P)
[05:42:46] [PASSED] 0x46B0 (ALDERLAKE_P)
[05:42:46] [PASSED] 0x46B1 (ALDERLAKE_P)
[05:42:46] [PASSED] 0x46B2 (ALDERLAKE_P)
[05:42:46] [PASSED] 0x46B3 (ALDERLAKE_P)
[05:42:46] [PASSED] 0x46C0 (ALDERLAKE_P)
[05:42:46] [PASSED] 0x46C1 (ALDERLAKE_P)
[05:42:46] [PASSED] 0x46C2 (ALDERLAKE_P)
[05:42:46] [PASSED] 0x46C3 (ALDERLAKE_P)
[05:42:46] [PASSED] 0x46D0 (ALDERLAKE_N)
[05:42:46] [PASSED] 0x46D1 (ALDERLAKE_N)
[05:42:46] [PASSED] 0x46D2 (ALDERLAKE_N)
[05:42:46] [PASSED] 0x46D3 (ALDERLAKE_N)
[05:42:46] [PASSED] 0x46D4 (ALDERLAKE_N)
[05:42:46] [PASSED] 0xA721 (ALDERLAKE_P)
[05:42:46] [PASSED] 0xA7A1 (ALDERLAKE_P)
[05:42:46] [PASSED] 0xA7A9 (ALDERLAKE_P)
[05:42:46] [PASSED] 0xA7AC (ALDERLAKE_P)
[05:42:46] [PASSED] 0xA7AD (ALDERLAKE_P)
[05:42:46] [PASSED] 0xA720 (ALDERLAKE_P)
[05:42:46] [PASSED] 0xA7A0 (ALDERLAKE_P)
[05:42:46] [PASSED] 0xA7A8 (ALDERLAKE_P)
[05:42:46] [PASSED] 0xA7AA (ALDERLAKE_P)
[05:42:46] [PASSED] 0xA7AB (ALDERLAKE_P)
[05:42:46] [PASSED] 0xA780 (ALDERLAKE_S)
[05:42:46] [PASSED] 0xA781 (ALDERLAKE_S)
[05:42:46] [PASSED] 0xA782 (ALDERLAKE_S)
[05:42:46] [PASSED] 0xA783 (ALDERLAKE_S)
[05:42:46] [PASSED] 0xA788 (ALDERLAKE_S)
[05:42:46] [PASSED] 0xA789 (ALDERLAKE_S)
[05:42:46] [PASSED] 0xA78A (ALDERLAKE_S)
[05:42:46] [PASSED] 0xA78B (ALDERLAKE_S)
[05:42:46] [PASSED] 0x4905 (DG1)
[05:42:46] [PASSED] 0x4906 (DG1)
[05:42:46] [PASSED] 0x4907 (DG1)
[05:42:46] [PASSED] 0x4908 (DG1)
[05:42:46] [PASSED] 0x4909 (DG1)
[05:42:46] [PASSED] 0x56C0 (DG2)
[05:42:46] [PASSED] 0x56C2 (DG2)
[05:42:46] [PASSED] 0x56C1 (DG2)
[05:42:46] [PASSED] 0x7D51 (METEORLAKE)
[05:42:46] [PASSED] 0x7DD1 (METEORLAKE)
[05:42:46] [PASSED] 0x7D41 (METEORLAKE)
[05:42:46] [PASSED] 0x7D67 (METEORLAKE)
[05:42:46] [PASSED] 0xB640 (METEORLAKE)
[05:42:46] [PASSED] 0x56A0 (DG2)
[05:42:46] [PASSED] 0x56A1 (DG2)
[05:42:46] [PASSED] 0x56A2 (DG2)
[05:42:46] [PASSED] 0x56BE (DG2)
[05:42:46] [PASSED] 0x56BF (DG2)
[05:42:46] [PASSED] 0x5690 (DG2)
[05:42:46] [PASSED] 0x5691 (DG2)
[05:42:46] [PASSED] 0x5692 (DG2)
[05:42:46] [PASSED] 0x56A5 (DG2)
[05:42:46] [PASSED] 0x56A6 (DG2)
[05:42:46] [PASSED] 0x56B0 (DG2)
[05:42:46] [PASSED] 0x56B1 (DG2)
[05:42:46] [PASSED] 0x56BA (DG2)
[05:42:46] [PASSED] 0x56BB (DG2)
[05:42:46] [PASSED] 0x56BC (DG2)
[05:42:46] [PASSED] 0x56BD (DG2)
[05:42:46] [PASSED] 0x5693 (DG2)
[05:42:46] [PASSED] 0x5694 (DG2)
[05:42:46] [PASSED] 0x5695 (DG2)
[05:42:46] [PASSED] 0x56A3 (DG2)
[05:42:46] [PASSED] 0x56A4 (DG2)
[05:42:46] [PASSED] 0x56B2 (DG2)
[05:42:46] [PASSED] 0x56B3 (DG2)
[05:42:46] [PASSED] 0x5696 (DG2)
[05:42:46] [PASSED] 0x5697 (DG2)
[05:42:46] [PASSED] 0xB69 (PVC)
[05:42:46] [PASSED] 0xB6E (PVC)
[05:42:46] [PASSED] 0xBD4 (PVC)
[05:42:46] [PASSED] 0xBD5 (PVC)
[05:42:46] [PASSED] 0xBD6 (PVC)
[05:42:46] [PASSED] 0xBD7 (PVC)
[05:42:46] [PASSED] 0xBD8 (PVC)
[05:42:46] [PASSED] 0xBD9 (PVC)
[05:42:46] [PASSED] 0xBDA (PVC)
[05:42:46] [PASSED] 0xBDB (PVC)
[05:42:46] [PASSED] 0xBE0 (PVC)
[05:42:46] [PASSED] 0xBE1 (PVC)
[05:42:46] [PASSED] 0xBE5 (PVC)
[05:42:46] [PASSED] 0x7D40 (METEORLAKE)
[05:42:46] [PASSED] 0x7D45 (METEORLAKE)
[05:42:46] [PASSED] 0x7D55 (METEORLAKE)
[05:42:46] [PASSED] 0x7D60 (METEORLAKE)
[05:42:46] [PASSED] 0x7DD5 (METEORLAKE)
[05:42:46] [PASSED] 0x6420 (LUNARLAKE)
[05:42:46] [PASSED] 0x64A0 (LUNARLAKE)
[05:42:46] [PASSED] 0x64B0 (LUNARLAKE)
[05:42:46] [PASSED] 0xE202 (BATTLEMAGE)
[05:42:46] [PASSED] 0xE209 (BATTLEMAGE)
[05:42:46] [PASSED] 0xE20B (BATTLEMAGE)
[05:42:46] [PASSED] 0xE20C (BATTLEMAGE)
[05:42:46] [PASSED] 0xE20D (BATTLEMAGE)
[05:42:46] [PASSED] 0xE210 (BATTLEMAGE)
[05:42:46] [PASSED] 0xE211 (BATTLEMAGE)
[05:42:46] [PASSED] 0xE212 (BATTLEMAGE)
[05:42:46] [PASSED] 0xE216 (BATTLEMAGE)
[05:42:46] [PASSED] 0xE220 (BATTLEMAGE)
[05:42:46] [PASSED] 0xE221 (BATTLEMAGE)
[05:42:46] [PASSED] 0xE222 (BATTLEMAGE)
[05:42:46] [PASSED] 0xE223 (BATTLEMAGE)
[05:42:46] [PASSED] 0xB080 (PANTHERLAKE)
[05:42:46] [PASSED] 0xB081 (PANTHERLAKE)
[05:42:46] [PASSED] 0xB082 (PANTHERLAKE)
[05:42:46] [PASSED] 0xB083 (PANTHERLAKE)
[05:42:46] [PASSED] 0xB084 (PANTHERLAKE)
[05:42:46] [PASSED] 0xB085 (PANTHERLAKE)
[05:42:46] [PASSED] 0xB086 (PANTHERLAKE)
[05:42:46] [PASSED] 0xB087 (PANTHERLAKE)
[05:42:46] [PASSED] 0xB08F (PANTHERLAKE)
[05:42:46] [PASSED] 0xB090 (PANTHERLAKE)
[05:42:46] [PASSED] 0xB0A0 (PANTHERLAKE)
[05:42:46] [PASSED] 0xB0B0 (PANTHERLAKE)
[05:42:46] [PASSED] 0xFD80 (PANTHERLAKE)
[05:42:46] [PASSED] 0xFD81 (PANTHERLAKE)
[05:42:46] [PASSED] 0xD740 (NOVALAKE_S)
[05:42:46] [PASSED] 0xD741 (NOVALAKE_S)
[05:42:46] [PASSED] 0xD742 (NOVALAKE_S)
[05:42:46] [PASSED] 0xD743 (NOVALAKE_S)
[05:42:46] [PASSED] 0xD745 (NOVALAKE_S)
[05:42:46] [PASSED] 0xD74A (NOVALAKE_S)
[05:42:46] [PASSED] 0xD74B (NOVALAKE_S)
[05:42:46] [PASSED] 0x674C (CRESCENTISLAND)
[05:42:46] [PASSED] 0x674D (CRESCENTISLAND)
[05:42:46] [PASSED] 0x674E (CRESCENTISLAND)
[05:42:46] [PASSED] 0x674F (CRESCENTISLAND)
[05:42:46] [PASSED] 0x6750 (CRESCENTISLAND)
[05:42:46] [PASSED] 0xD750 (NOVALAKE_P)
[05:42:46] [PASSED] 0xD751 (NOVALAKE_P)
[05:42:46] [PASSED] 0xD752 (NOVALAKE_P)
[05:42:46] [PASSED] 0xD753 (NOVALAKE_P)
[05:42:46] [PASSED] 0xD754 (NOVALAKE_P)
[05:42:46] [PASSED] 0xD755 (NOVALAKE_P)
[05:42:46] [PASSED] 0xD756 (NOVALAKE_P)
[05:42:46] [PASSED] 0xD757 (NOVALAKE_P)
[05:42:46] [PASSED] 0xD75F (NOVALAKE_P)
[05:42:46] =============== [PASSED] check_platform_desc ===============
[05:42:46] ===================== [PASSED] xe_pci ======================
[05:42:46] ============= xe_rtp_tables_test (5 subtests) ==============
[05:42:46] ================== xe_rtp_table_gt_test  ===================
[05:42:46] [PASSED] gt_was/14011060649
[05:42:46] [PASSED] gt_was/14011059788
[05:42:46] [PASSED] gt_was/14015795083
[05:42:46] [PASSED] gt_was/16021867713
[05:42:46] [PASSED] gt_was/14019449301
[05:42:46] [PASSED] gt_was/16028005424
[05:42:46] [PASSED] gt_was/14026578760
[05:42:46] [PASSED] gt_was/1409420604
[05:42:46] [PASSED] gt_was/1408615072
[05:42:46] [PASSED] gt_was/22010523718
[05:42:46] [PASSED] gt_was/14011006942
[05:42:46] [PASSED] gt_was/14014830051
[05:42:46] [PASSED] gt_was/18018781329
[05:42:46] [PASSED] gt_was/1509235366
[05:42:46] [PASSED] gt_was/18018781329
[05:42:46] [PASSED] gt_was/16016694945
[05:42:46] [PASSED] gt_was/14018575942
[05:42:46] [PASSED] gt_was/22016670082
[05:42:46] [PASSED] gt_was/22016670082
[05:42:46] [PASSED] gt_was/14017421178
[05:42:46] [PASSED] gt_was/16025250150
[05:42:46] [PASSED] gt_was/14021871409
[05:42:46] [PASSED] gt_was/16021865536
[05:42:46] [PASSED] gt_was/14021486841
[05:42:46] [PASSED] gt_was/14025160223
[05:42:46] [PASSED] gt_was/14026144927, 16029437861, 14026127056
[05:42:46] [PASSED] gt_was/14025635424
[05:42:46] [PASSED] gt_was/16028005424
[05:42:46] ============== [PASSED] xe_rtp_table_gt_test ===============
[05:42:46] ================== xe_rtp_table_gt_test  ===================
[05:42:46] [PASSED] gt_tunings/Tuning: Blend Fill Caching Optimization Disable
[05:42:46] [PASSED] gt_tunings/Tuning: 32B Access Enable
[05:42:46] [PASSED] gt_tunings/Tuning: L3 cache
[05:42:46] [PASSED] gt_tunings/Tuning: L3 cache - media
[05:42:46] [PASSED] gt_tunings/Tuning: Compression Overfetch
[05:42:46] [PASSED] gt_tunings/Tuning: Compression Overfetch - media
[05:42:46] [PASSED] gt_tunings/Tuning: Enable compressible partial write overfetch in L3
[05:42:46] [PASSED] gt_tunings/Tuning: Enable compressible partial write overfetch in L3 - media
[05:42:46] [PASSED] gt_tunings/Tuning: L2 Overfetch Compressible Only
[05:42:46] [PASSED] gt_tunings/Tuning: L2 Overfetch Compressible Only - media
[05:42:46] [PASSED] gt_tunings/Tuning: Stateless compression control
[05:42:46] [PASSED] gt_tunings/Tuning: Stateless compression control - media
[05:42:46] [PASSED] gt_tunings/Tuning: L3 RW flush all Cache
[05:42:46] [PASSED] gt_tunings/Tuning: L3 RW flush all cache - media
[05:42:46] [PASSED] gt_tunings/Tuning: Set STLB Bank Hash Mode to 4KB
[05:42:46] ============== [PASSED] xe_rtp_table_gt_test ===============
[05:42:46] ================== xe_rtp_table_oob_test  ==================
[05:42:46] [PASSED] oob_was/1607983814
[05:42:46] [PASSED] oob_was/16010904313
[05:42:46] [PASSED] oob_was/18022495364
[05:42:46] [PASSED] oob_was/22012773006
[05:42:46] [PASSED] oob_was/14014475959
[05:42:46] [PASSED] oob_was/22011391025
[05:42:46] [PASSED] oob_was/22012727170
[05:42:46] [PASSED] oob_was/22012727685
[05:42:46] [PASSED] oob_was/22016596838
[05:42:46] [PASSED] oob_was/18020744125
[05:42:46] [PASSED] oob_was/1409600907
[05:42:46] [PASSED] oob_was/22014953428
[05:42:46] [PASSED] oob_was/16017236439
[05:42:46] [PASSED] oob_was/14019821291
[05:42:46] [PASSED] oob_was/14015076503
[05:42:46] [PASSED] oob_was/14018913170
[05:42:46] [PASSED] oob_was/14018094691
[05:42:46] [PASSED] oob_was/18024947630
[05:42:46] [PASSED] oob_was/16022287689
[05:42:46] [PASSED] oob_was/13011645652
[05:42:46] [PASSED] oob_was/14022293748
[05:42:46] [PASSED] oob_was/22019794406
[05:42:46] [PASSED] oob_was/22019338487
[05:42:46] [PASSED] oob_was/16023588340
[05:42:46] [PASSED] oob_was/14019789679
[05:42:46] [PASSED] oob_was/14022866841
[05:42:46] [PASSED] oob_was/16021333562
[05:42:46] [PASSED] oob_was/14016712196
[05:42:46] [PASSED] oob_was/14015568240
[05:42:46] [PASSED] oob_was/18013179988
[05:42:46] [PASSED] oob_was/1508761755
[05:42:46] [PASSED] oob_was/16023105232
[05:42:46] [PASSED] oob_was/16026508708
[05:42:46] [PASSED] oob_was/14020001231
[05:42:46] [PASSED] oob_was/16023683509
[05:42:46] [PASSED] oob_was/14025515070
[05:42:46] [PASSED] oob_was/15015404425_disable
[05:42:46] [PASSED] oob_was/16026007364
[05:42:46] [PASSED] oob_was/14020316580
[05:42:46] [PASSED] oob_was/14025883347
[05:42:46] [PASSED] oob_was/16029380221
[05:42:46] [PASSED] oob_was/22022079272
[05:42:46] [PASSED] oob_was/16029897822
[05:42:46] [PASSED] oob_was/14027054324
[05:42:46] ============== [PASSED] xe_rtp_table_oob_test ==============
[05:42:46] ================ xe_rtp_table_dev_oob_test  ================
[05:42:46] [PASSED] device_oob_was/22010954014
[05:42:46] [PASSED] device_oob_was/15015404425
[05:42:46] [PASSED] device_oob_was/22019338487_display
[05:42:46] [PASSED] device_oob_was/14022085890
[05:42:46] [PASSED] device_oob_was/14026539277
[05:42:46] [PASSED] device_oob_was/14026633728
[05:42:46] [PASSED] device_oob_was/14026746987
[05:42:46] [PASSED] device_oob_was/14026779378
[05:42:46] ============ [PASSED] xe_rtp_table_dev_oob_test ============
[05:42:46] ========== xe_rtp_table_missing_upper_bound_test  ==========
[05:42:46] [PASSED] register_whitelist/WaAllowPMDepthAndInvocationCountAccessFromUMD, 1408556865
[05:42:46] [PASSED] register_whitelist/1508744258, 14012131227, 1808121037
[05:42:46] [PASSED] register_whitelist/1806527549
[05:42:46] [PASSED] register_whitelist/allow_read_ctx_timestamp
[05:42:46] [PASSED] register_whitelist/allow_read_queue_timestamp
[05:42:46] [PASSED] register_whitelist/16014440446
[05:42:46] [PASSED] register_whitelist/16017236439
[05:42:46] [PASSED] register_whitelist/16020183090
[05:42:46] [PASSED] register_whitelist/14024997852
[05:42:46] [PASSED] register_whitelist/14024997852
[05:42:46] ====== [PASSED] xe_rtp_table_missing_upper_bound_test ======
[05:42:46] =============== [PASSED] xe_rtp_tables_test ================
[05:42:46] =================== xe_rtp (3 subtests) ====================
[05:42:46] =================== xe_rtp_rules_tests  ====================
[05:42:46] [PASSED] no
[05:42:46] [PASSED] yes
[05:42:46] [PASSED] no-and-no
[05:42:46] [PASSED] no-and-yes
[05:42:46] [PASSED] yes-and-no
[05:42:46] [PASSED] yes-and-yes
[05:42:46] [PASSED] no-or-no
[05:42:46] [PASSED] no-or-yes
[05:42:46] [PASSED] yes-or-no
[05:42:46] [PASSED] yes-or-yes
[05:42:46] [PASSED] no-yes-or-yes-no
[05:42:46] [PASSED] no-yes-or-yes-yes
[05:42:46] [PASSED] yes-yes-or-no-yes
[05:42:46] [PASSED] yes-yes-or-yes-yes
[05:42:46] [PASSED] no-no-or-yes-or-no
[05:42:46] [PASSED] or
[05:42:46] [PASSED] or-yes
[05:42:46] [PASSED] or-no
[05:42:46] [PASSED] yes-or
[05:42:46] [PASSED] no-or
[05:42:46] [PASSED] no-or-or-yes
[05:42:46] [PASSED] yes-or-or-no
[05:42:46] [PASSED] no-or-or-no
[05:42:46] [PASSED] missing-context-engine-class
[05:42:46] [PASSED] missing-context-engine-class-or-yes
[05:42:46] [PASSED] missing-context-engine-class-or-or-yes
[05:42:46] =============== [PASSED] xe_rtp_rules_tests ================
[05:42:46] =============== xe_rtp_process_to_sr_tests  ================
[05:42:46] [PASSED] coalesce-same-reg
[05:42:46] [PASSED] coalesce-same-reg-literal-and-func
[05:42:46] [PASSED] no-match-no-add
[05:42:46] [PASSED] two-regs-two-entries
[05:42:46] [PASSED] clr-one-set-other
[05:42:46] [PASSED] set-field
[05:42:46] [PASSED] conflict-duplicate
[05:42:46] [PASSED] conflict-not-disjoint
[05:42:46] [PASSED] conflict-not-disjoint-literal-and-func
[05:42:46] [PASSED] conflict-reg-type
[05:42:46] [PASSED] bad-mcr-reg-forced-to-regular
[05:42:46] [PASSED] bad-regular-reg-forced-to-mcr
[05:42:46] =========== [PASSED] xe_rtp_process_to_sr_tests ============
[05:42:46] ================== xe_rtp_process_tests  ===================
[05:42:46] [PASSED] active1
[05:42:46] [PASSED] active2
[05:42:46] [PASSED] active-inactive
[05:42:46] [PASSED] inactive-active
[05:42:46] [PASSED] inactive-active-inactive
[05:42:46] [PASSED] inactive-inactive-inactive
[05:42:46] ============== [PASSED] xe_rtp_process_tests ===============
[05:42:46] ===================== [PASSED] xe_rtp ======================
[05:42:46] ==================== xe_wa (1 subtest) =====================
[05:42:46] ======================== xe_wa_gt  =========================
[05:42:46] [PASSED] TIGERLAKE B0
[05:42:46] [PASSED] DG1 A0
[05:42:46] [PASSED] DG1 B0
[05:42:46] [PASSED] ALDERLAKE_S A0
[05:42:46] [PASSED] ALDERLAKE_S B0
[05:42:46] [PASSED] ALDERLAKE_S C0
[05:42:46] [PASSED] ALDERLAKE_S D0
[05:42:46] [PASSED] ALDERLAKE_P A0
[05:42:46] [PASSED] ALDERLAKE_P B0
[05:42:46] [PASSED] ALDERLAKE_P C0
[05:42:46] [PASSED] ALDERLAKE_S RPLS D0
[05:42:46] [PASSED] ALDERLAKE_P RPLU E0
[05:42:46] [PASSED] DG2 G10 C0
[05:42:46] [PASSED] DG2 G11 B1
[05:42:46] [PASSED] DG2 G12 A1
[05:42:46] [PASSED] METEORLAKE 12.70(Xe_LPG) A0 13.00(Xe_LPM+) A0
[05:42:46] [PASSED] METEORLAKE 12.71(Xe_LPG) A0 13.00(Xe_LPM+) A0
[05:42:46] [PASSED] METEORLAKE 12.74(Xe_LPG+) A0 13.00(Xe_LPM+) A0
[05:42:46] [PASSED] LUNARLAKE 20.04(Xe2_LPG) A0 20.00(Xe2_LPM) A0
[05:42:46] [PASSED] LUNARLAKE 20.04(Xe2_LPG) B0 20.00(Xe2_LPM) A0
[05:42:46] [PASSED] BATTLEMAGE 20.01(Xe2_HPG) A0 13.01(Xe2_HPM) A1
[05:42:46] [PASSED] PANTHERLAKE 30.00(Xe3_LPG) A0 30.00(Xe3_LPM) A0
[05:42:46] ==================== [PASSED] xe_wa_gt =====================
[05:42:46] ====================== [PASSED] xe_wa ======================
[05:42:46] ============================================================
[05:42:46] Testing complete. Ran 819 tests: passed: 791, skipped: 28
[05:42:46] Elapsed time: 37.348s total, 1.848s configuring, 34.734s building, 0.719s 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
[05:42:46] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[05:42:48] 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
[05:43:13] Starting KUnit Kernel (1/1)...
[05:43:13] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[05:43:13] ============= refcount_interrupt (4 subtests) ==============
[05:43:13] [PASSED] test_single_irq_change
[05:43:13] [PASSED] test_nested_irq_change
[05:43:13] [PASSED] test_multiple_irq_change
[05:43:13] [PASSED] test_irq_save
[05:43:13] =============== [PASSED] refcount_interrupt ================
[05:43:13] ============ drm_test_pick_cmdline (2 subtests) ============
[05:43:13] [PASSED] drm_test_pick_cmdline_res_1920_1080_60
[05:43:13] =============== drm_test_pick_cmdline_named  ===============
[05:43:13] [PASSED] NTSC
[05:43:13] [PASSED] NTSC-J
[05:43:13] [PASSED] PAL
[05:43:13] [PASSED] PAL-M
[05:43:13] =========== [PASSED] drm_test_pick_cmdline_named ===========
[05:43:13] ============== [PASSED] drm_test_pick_cmdline ==============
[05:43:13] == drm_test_atomic_get_connector_for_encoder (1 subtest) ===
[05:43:13] [PASSED] drm_test_drm_atomic_get_connector_for_encoder
[05:43:13] ==== [PASSED] drm_test_atomic_get_connector_for_encoder ====
[05:43:13] =========== drm_validate_clone_mode (2 subtests) ===========
[05:43:13] ============== drm_test_check_in_clone_mode  ===============
[05:43:13] [PASSED] in_clone_mode
[05:43:13] [PASSED] not_in_clone_mode
[05:43:13] ========== [PASSED] drm_test_check_in_clone_mode ===========
[05:43:13] =============== drm_test_check_valid_clones  ===============
[05:43:13] [PASSED] not_in_clone_mode
[05:43:13] [PASSED] valid_clone
[05:43:13] [PASSED] invalid_clone
[05:43:13] =========== [PASSED] drm_test_check_valid_clones ===========
[05:43:13] ============= [PASSED] drm_validate_clone_mode =============
[05:43:13] ============= drm_validate_modeset (1 subtest) =============
[05:43:13] [PASSED] drm_test_check_connector_changed_modeset
[05:43:13] ============== [PASSED] drm_validate_modeset ===============
[05:43:13] ====== drm_test_bridge_get_current_state (1 subtest) =======
[05:43:13] [PASSED] drm_test_drm_bridge_get_current_state_atomic
[05:43:13] ======== [PASSED] drm_test_bridge_get_current_state ========
[05:43:13] ====== drm_test_bridge_helper_reset_crtc (3 subtests) ======
[05:43:13] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic
[05:43:13] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic_disabled
[05:43:13] [PASSED] drm_test_drm_bridge_helper_hdmi_output_bus_fmts
[05:43:13] ======== [PASSED] drm_test_bridge_helper_reset_crtc ========
[05:43:13] ============== drm_bridge_alloc (2 subtests) ===============
[05:43:13] [PASSED] drm_test_drm_bridge_alloc_basic
[05:43:13] [PASSED] drm_test_drm_bridge_alloc_get_put
[05:43:13] ================ [PASSED] drm_bridge_alloc =================
[05:43:13] ============= drm_bridge_bus_fmt (5 subtests) ==============
[05:43:13] [PASSED] drm_test_bridge_rgb_yuv_rgb
[05:43:13] [PASSED] drm_test_bridge_must_convert_to_yuv444
[05:43:13] [PASSED] drm_test_bridge_hdmi_auto_rgb
[05:43:13] [PASSED] drm_test_bridge_auto_first
[05:43:13] [PASSED] drm_test_bridge_rgb_yuv_no_path
[05:43:13] =============== [PASSED] drm_bridge_bus_fmt ================
[05:43:13] ============= drm_cmdline_parser (40 subtests) =============
[05:43:13] [PASSED] drm_test_cmdline_force_d_only
[05:43:13] [PASSED] drm_test_cmdline_force_D_only_dvi
[05:43:13] [PASSED] drm_test_cmdline_force_D_only_hdmi
[05:43:13] [PASSED] drm_test_cmdline_force_D_only_not_digital
[05:43:13] [PASSED] drm_test_cmdline_force_e_only
[05:43:13] [PASSED] drm_test_cmdline_res
[05:43:13] [PASSED] drm_test_cmdline_res_vesa
[05:43:13] [PASSED] drm_test_cmdline_res_vesa_rblank
[05:43:13] [PASSED] drm_test_cmdline_res_rblank
[05:43:13] [PASSED] drm_test_cmdline_res_bpp
[05:43:13] [PASSED] drm_test_cmdline_res_refresh
[05:43:13] [PASSED] drm_test_cmdline_res_bpp_refresh
[05:43:13] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced
[05:43:13] [PASSED] drm_test_cmdline_res_bpp_refresh_margins
[05:43:13] [PASSED] drm_test_cmdline_res_bpp_refresh_force_off
[05:43:13] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on
[05:43:13] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_analog
[05:43:13] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_digital
[05:43:13] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced_margins_force_on
[05:43:13] [PASSED] drm_test_cmdline_res_margins_force_on
[05:43:13] [PASSED] drm_test_cmdline_res_vesa_margins
[05:43:13] [PASSED] drm_test_cmdline_name
[05:43:13] [PASSED] drm_test_cmdline_name_bpp
[05:43:13] [PASSED] drm_test_cmdline_name_option
[05:43:13] [PASSED] drm_test_cmdline_name_bpp_option
[05:43:13] [PASSED] drm_test_cmdline_rotate_0
[05:43:13] [PASSED] drm_test_cmdline_rotate_90
[05:43:13] [PASSED] drm_test_cmdline_rotate_180
[05:43:13] [PASSED] drm_test_cmdline_rotate_270
[05:43:13] [PASSED] drm_test_cmdline_hmirror
[05:43:13] [PASSED] drm_test_cmdline_vmirror
[05:43:13] [PASSED] drm_test_cmdline_margin_options
[05:43:13] [PASSED] drm_test_cmdline_multiple_options
[05:43:13] [PASSED] drm_test_cmdline_bpp_extra_and_option
[05:43:13] [PASSED] drm_test_cmdline_extra_and_option
[05:43:13] [PASSED] drm_test_cmdline_freestanding_options
[05:43:13] [PASSED] drm_test_cmdline_freestanding_force_e_and_options
[05:43:13] [PASSED] drm_test_cmdline_panel_orientation
[05:43:13] ================ drm_test_cmdline_invalid  =================
[05:43:13] [PASSED] margin_only
[05:43:13] [PASSED] interlace_only
[05:43:13] [PASSED] res_missing_x
[05:43:13] [PASSED] res_missing_y
[05:43:13] [PASSED] res_bad_y
[05:43:13] [PASSED] res_missing_y_bpp
[05:43:13] [PASSED] res_bad_bpp
[05:43:13] [PASSED] res_bad_refresh
[05:43:13] [PASSED] res_bpp_refresh_force_on_off
[05:43:13] [PASSED] res_invalid_mode
[05:43:13] [PASSED] res_bpp_wrong_place_mode
[05:43:13] [PASSED] name_bpp_refresh
[05:43:13] [PASSED] name_refresh
[05:43:13] [PASSED] name_refresh_wrong_mode
[05:43:13] [PASSED] name_refresh_invalid_mode
[05:43:13] [PASSED] rotate_multiple
[05:43:13] [PASSED] rotate_invalid_val
[05:43:13] [PASSED] rotate_truncated
[05:43:13] [PASSED] invalid_option
[05:43:13] [PASSED] invalid_tv_option
[05:43:13] [PASSED] truncated_tv_option
[05:43:13] ============ [PASSED] drm_test_cmdline_invalid =============
[05:43:13] =============== drm_test_cmdline_tv_options  ===============
[05:43:13] [PASSED] NTSC
[05:43:13] [PASSED] NTSC_443
[05:43:13] [PASSED] NTSC_J
[05:43:13] [PASSED] PAL
[05:43:13] [PASSED] PAL_M
[05:43:13] [PASSED] PAL_N
[05:43:13] [PASSED] SECAM
[05:43:13] [PASSED] MONO_525
[05:43:13] [PASSED] MONO_625
[05:43:13] =========== [PASSED] drm_test_cmdline_tv_options ===========
[05:43:13] =============== [PASSED] drm_cmdline_parser ================
[05:43:13] ========== drmm_connector_hdmi_init (20 subtests) ==========
[05:43:13] [PASSED] drm_test_connector_hdmi_init_valid
[05:43:13] [PASSED] drm_test_connector_hdmi_init_bpc_8
[05:43:13] [PASSED] drm_test_connector_hdmi_init_bpc_10
[05:43:13] [PASSED] drm_test_connector_hdmi_init_bpc_12
[05:43:13] [PASSED] drm_test_connector_hdmi_init_bpc_invalid
[05:43:13] [PASSED] drm_test_connector_hdmi_init_bpc_null
[05:43:13] [PASSED] drm_test_connector_hdmi_init_formats_empty
[05:43:13] [PASSED] drm_test_connector_hdmi_init_formats_no_rgb
[05:43:13] === drm_test_connector_hdmi_init_formats_yuv420_allowed  ===
[05:43:13] [PASSED] supported_formats=0x9 yuv420_allowed=1
[05:43:13] [PASSED] supported_formats=0x9 yuv420_allowed=0
[05:43:13] [PASSED] supported_formats=0x5 yuv420_allowed=1
[05:43:13] [PASSED] supported_formats=0x5 yuv420_allowed=0
[05:43:13] === [PASSED] drm_test_connector_hdmi_init_formats_yuv420_allowed ===
[05:43:13] [PASSED] drm_test_connector_hdmi_init_null_ddc
[05:43:13] [PASSED] drm_test_connector_hdmi_init_null_product
[05:43:13] [PASSED] drm_test_connector_hdmi_init_null_vendor
[05:43:13] [PASSED] drm_test_connector_hdmi_init_product_length_exact
[05:43:13] [PASSED] drm_test_connector_hdmi_init_product_length_too_long
[05:43:13] [PASSED] drm_test_connector_hdmi_init_product_valid
[05:43:13] [PASSED] drm_test_connector_hdmi_init_vendor_length_exact
[05:43:13] [PASSED] drm_test_connector_hdmi_init_vendor_length_too_long
[05:43:13] [PASSED] drm_test_connector_hdmi_init_vendor_valid
[05:43:13] ========= drm_test_connector_hdmi_init_type_valid  =========
[05:43:13] [PASSED] HDMI-A
[05:43:13] [PASSED] HDMI-B
[05:43:13] ===== [PASSED] drm_test_connector_hdmi_init_type_valid =====
[05:43:13] ======== drm_test_connector_hdmi_init_type_invalid  ========
[05:43:13] [PASSED] Unknown
[05:43:13] [PASSED] VGA
[05:43:13] [PASSED] DVI-I
[05:43:13] [PASSED] DVI-D
[05:43:13] [PASSED] DVI-A
[05:43:13] [PASSED] Composite
[05:43:13] [PASSED] SVIDEO
[05:43:13] [PASSED] LVDS
[05:43:13] [PASSED] Component
[05:43:13] [PASSED] DIN
[05:43:13] [PASSED] DP
[05:43:13] [PASSED] TV
[05:43:13] [PASSED] eDP
[05:43:13] [PASSED] Virtual
[05:43:13] [PASSED] DSI
[05:43:13] [PASSED] DPI
[05:43:13] [PASSED] Writeback
[05:43:13] [PASSED] SPI
[05:43:13] [PASSED] USB
[05:43:13] ==== [PASSED] drm_test_connector_hdmi_init_type_invalid ====
[05:43:13] ============ [PASSED] drmm_connector_hdmi_init =============
[05:43:13] ============= drmm_connector_init (3 subtests) =============
[05:43:13] [PASSED] drm_test_drmm_connector_init
[05:43:13] [PASSED] drm_test_drmm_connector_init_null_ddc
[05:43:13] ========= drm_test_drmm_connector_init_type_valid  =========
[05:43:13] [PASSED] Unknown
[05:43:13] [PASSED] VGA
[05:43:13] [PASSED] DVI-I
[05:43:13] [PASSED] DVI-D
[05:43:13] [PASSED] DVI-A
[05:43:13] [PASSED] Composite
[05:43:13] [PASSED] SVIDEO
[05:43:13] [PASSED] LVDS
[05:43:13] [PASSED] Component
[05:43:13] [PASSED] DIN
[05:43:13] [PASSED] DP
[05:43:13] [PASSED] HDMI-A
[05:43:13] [PASSED] HDMI-B
[05:43:13] [PASSED] TV
[05:43:13] [PASSED] eDP
[05:43:13] [PASSED] Virtual
[05:43:13] [PASSED] DSI
[05:43:13] [PASSED] DPI
[05:43:13] [PASSED] Writeback
[05:43:13] [PASSED] SPI
[05:43:13] [PASSED] USB
[05:43:13] ===== [PASSED] drm_test_drmm_connector_init_type_valid =====
[05:43:13] =============== [PASSED] drmm_connector_init ===============
[05:43:13] ========= drm_connector_dynamic_init (6 subtests) ==========
[05:43:13] [PASSED] drm_test_drm_connector_dynamic_init
[05:43:13] [PASSED] drm_test_drm_connector_dynamic_init_null_ddc
[05:43:13] [PASSED] drm_test_drm_connector_dynamic_init_not_added
[05:43:13] [PASSED] drm_test_drm_connector_dynamic_init_properties
[05:43:13] ===== drm_test_drm_connector_dynamic_init_type_valid  ======
[05:43:13] [PASSED] Unknown
[05:43:13] [PASSED] VGA
[05:43:13] [PASSED] DVI-I
[05:43:13] [PASSED] DVI-D
[05:43:13] [PASSED] DVI-A
[05:43:13] [PASSED] Composite
[05:43:13] [PASSED] SVIDEO
[05:43:13] [PASSED] LVDS
[05:43:13] [PASSED] Component
[05:43:13] [PASSED] DIN
[05:43:13] [PASSED] DP
[05:43:13] [PASSED] HDMI-A
[05:43:13] [PASSED] HDMI-B
[05:43:13] [PASSED] TV
[05:43:13] [PASSED] eDP
[05:43:13] [PASSED] Virtual
[05:43:13] [PASSED] DSI
[05:43:13] [PASSED] DPI
[05:43:13] [PASSED] Writeback
[05:43:13] [PASSED] SPI
[05:43:13] [PASSED] USB
[05:43:13] = [PASSED] drm_test_drm_connector_dynamic_init_type_valid ==
[05:43:13] ======== drm_test_drm_connector_dynamic_init_name  =========
[05:43:13] [PASSED] Unknown
[05:43:13] [PASSED] VGA
[05:43:13] [PASSED] DVI-I
[05:43:13] [PASSED] DVI-D
[05:43:13] [PASSED] DVI-A
[05:43:13] [PASSED] Composite
[05:43:13] [PASSED] SVIDEO
[05:43:13] [PASSED] LVDS
[05:43:13] [PASSED] Component
[05:43:13] [PASSED] DIN
[05:43:13] [PASSED] DP
[05:43:13] [PASSED] HDMI-A
[05:43:13] [PASSED] HDMI-B
[05:43:13] [PASSED] TV
[05:43:13] [PASSED] eDP
[05:43:13] [PASSED] Virtual
[05:43:13] [PASSED] DSI
[05:43:13] [PASSED] DPI
[05:43:13] [PASSED] Writeback
[05:43:13] [PASSED] SPI
[05:43:13] [PASSED] USB
[05:43:13] ==== [PASSED] drm_test_drm_connector_dynamic_init_name =====
[05:43:13] =========== [PASSED] drm_connector_dynamic_init ============
[05:43:13] ==== drm_connector_dynamic_register_early (4 subtests) =====
[05:43:13] [PASSED] drm_test_drm_connector_dynamic_register_early_on_list
[05:43:13] [PASSED] drm_test_drm_connector_dynamic_register_early_defer
[05:43:13] [PASSED] drm_test_drm_connector_dynamic_register_early_no_init
[05:43:13] [PASSED] drm_test_drm_connector_dynamic_register_early_no_mode_object
[05:43:13] ====== [PASSED] drm_connector_dynamic_register_early =======
[05:43:13] ======= drm_connector_dynamic_register (7 subtests) ========
[05:43:13] [PASSED] drm_test_drm_connector_dynamic_register_on_list
[05:43:13] [PASSED] drm_test_drm_connector_dynamic_register_no_defer
[05:43:13] [PASSED] drm_test_drm_connector_dynamic_register_no_init
[05:43:13] [PASSED] drm_test_drm_connector_dynamic_register_mode_object
[05:43:13] [PASSED] drm_test_drm_connector_dynamic_register_sysfs
[05:43:13] [PASSED] drm_test_drm_connector_dynamic_register_sysfs_name
[05:43:13] [PASSED] drm_test_drm_connector_dynamic_register_debugfs
[05:43:13] ========= [PASSED] drm_connector_dynamic_register ==========
[05:43:13] = drm_connector_attach_broadcast_rgb_property (2 subtests) =
[05:43:13] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property
[05:43:13] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property_hdmi_connector
[05:43:13] === [PASSED] drm_connector_attach_broadcast_rgb_property ===
[05:43:13] ========== drm_get_tv_mode_from_name (2 subtests) ==========
[05:43:13] ========== drm_test_get_tv_mode_from_name_valid  ===========
[05:43:13] [PASSED] NTSC
[05:43:13] [PASSED] NTSC-443
[05:43:13] [PASSED] NTSC-J
[05:43:13] [PASSED] PAL
[05:43:13] [PASSED] PAL-M
[05:43:13] [PASSED] PAL-N
[05:43:13] [PASSED] SECAM
[05:43:13] [PASSED] Mono
[05:43:13] ====== [PASSED] drm_test_get_tv_mode_from_name_valid =======
[05:43:13] [PASSED] drm_test_get_tv_mode_from_name_truncated
[05:43:13] ============ [PASSED] drm_get_tv_mode_from_name ============
[05:43:13] = drm_test_connector_hdmi_compute_mode_clock (12 subtests) =
[05:43:13] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb
[05:43:13] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc
[05:43:13] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc_vic_1
[05:43:13] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc
[05:43:13] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc_vic_1
[05:43:13] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_double
[05:43:13] = drm_test_connector_hdmi_compute_mode_clock_yuv420_valid  =
[05:43:13] [PASSED] VIC 96
[05:43:13] [PASSED] VIC 97
[05:43:13] [PASSED] VIC 101
[05:43:13] [PASSED] VIC 102
[05:43:13] [PASSED] VIC 106
[05:43:13] [PASSED] VIC 107
[05:43:13] === [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_valid ===
[05:43:13] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_10_bpc
[05:43:13] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_12_bpc
[05:43:13] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_8_bpc
[05:43:13] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_10_bpc
[05:43:13] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_12_bpc
[05:43:13] === [PASSED] drm_test_connector_hdmi_compute_mode_clock ====
[05:43:13] == drm_hdmi_connector_get_broadcast_rgb_name (2 subtests) ==
[05:43:13] === drm_test_drm_hdmi_connector_get_broadcast_rgb_name  ====
[05:43:13] [PASSED] Automatic
[05:43:13] [PASSED] Full
[05:43:13] [PASSED] Limited 16:235
[05:43:13] === [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name ===
[05:43:13] [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name_invalid
[05:43:13] ==== [PASSED] drm_hdmi_connector_get_broadcast_rgb_name ====
[05:43:13] == drm_hdmi_connector_get_output_format_name (2 subtests) ==
[05:43:13] === drm_test_drm_hdmi_connector_get_output_format_name  ====
[05:43:13] [PASSED] RGB
[05:43:13] [PASSED] YUV 4:2:0
[05:43:13] [PASSED] YUV 4:2:2
[05:43:13] [PASSED] YUV 4:4:4
[05:43:13] === [PASSED] drm_test_drm_hdmi_connector_get_output_format_name ===
[05:43:13] [PASSED] drm_test_drm_hdmi_connector_get_output_format_name_invalid
[05:43:13] ==== [PASSED] drm_hdmi_connector_get_output_format_name ====
[05:43:13] ============= drm_damage_helper (21 subtests) ==============
[05:43:13] [PASSED] drm_test_damage_iter_no_damage
[05:43:13] [PASSED] drm_test_damage_iter_no_damage_fractional_src
[05:43:13] [PASSED] drm_test_damage_iter_no_damage_src_moved
[05:43:13] [PASSED] drm_test_damage_iter_no_damage_fractional_src_moved
[05:43:13] [PASSED] drm_test_damage_iter_no_damage_not_visible
[05:43:13] [PASSED] drm_test_damage_iter_no_damage_no_crtc
[05:43:13] [PASSED] drm_test_damage_iter_no_damage_no_fb
[05:43:13] [PASSED] drm_test_damage_iter_simple_damage
[05:43:13] [PASSED] drm_test_damage_iter_single_damage
[05:43:13] [PASSED] drm_test_damage_iter_single_damage_intersect_src
[05:43:13] [PASSED] drm_test_damage_iter_single_damage_outside_src
[05:43:13] [PASSED] drm_test_damage_iter_single_damage_fractional_src
[05:43:13] [PASSED] drm_test_damage_iter_single_damage_intersect_fractional_src
[05:43:13] [PASSED] drm_test_damage_iter_single_damage_outside_fractional_src
[05:43:13] [PASSED] drm_test_damage_iter_single_damage_src_moved
[05:43:13] [PASSED] drm_test_damage_iter_single_damage_fractional_src_moved
[05:43:13] [PASSED] drm_test_damage_iter_damage
[05:43:13] [PASSED] drm_test_damage_iter_damage_one_intersect
[05:43:13] [PASSED] drm_test_damage_iter_damage_one_outside
[05:43:13] [PASSED] drm_test_damage_iter_damage_src_moved
[05:43:13] [PASSED] drm_test_damage_iter_damage_not_visible
[05:43:13] ================ [PASSED] drm_damage_helper ================
[05:43:13] ============== drm_dp_mst_helper (3 subtests) ==============
[05:43:13] ============== drm_test_dp_mst_calc_pbn_mode  ==============
[05:43:13] [PASSED] Clock 154000 BPP 30 DSC disabled
[05:43:13] [PASSED] Clock 234000 BPP 30 DSC disabled
[05:43:13] [PASSED] Clock 297000 BPP 24 DSC disabled
[05:43:13] [PASSED] Clock 332880 BPP 24 DSC enabled
[05:43:13] [PASSED] Clock 324540 BPP 24 DSC enabled
[05:43:13] ========== [PASSED] drm_test_dp_mst_calc_pbn_mode ==========
[05:43:13] ============== drm_test_dp_mst_calc_pbn_div  ===============
[05:43:13] [PASSED] Link rate 2000000 lane count 4
[05:43:13] [PASSED] Link rate 2000000 lane count 2
[05:43:13] [PASSED] Link rate 2000000 lane count 1
[05:43:13] [PASSED] Link rate 1350000 lane count 4
[05:43:13] [PASSED] Link rate 1350000 lane count 2
[05:43:13] [PASSED] Link rate 1350000 lane count 1
[05:43:13] [PASSED] Link rate 1000000 lane count 4
[05:43:13] [PASSED] Link rate 1000000 lane count 2
[05:43:13] [PASSED] Link rate 1000000 lane count 1
[05:43:13] [PASSED] Link rate 810000 lane count 4
[05:43:13] [PASSED] Link rate 810000 lane count 2
[05:43:13] [PASSED] Link rate 810000 lane count 1
[05:43:13] [PASSED] Link rate 540000 lane count 4
[05:43:13] [PASSED] Link rate 540000 lane count 2
[05:43:13] [PASSED] Link rate 540000 lane count 1
[05:43:13] [PASSED] Link rate 270000 lane count 4
[05:43:13] [PASSED] Link rate 270000 lane count 2
[05:43:13] [PASSED] Link rate 270000 lane count 1
[05:43:13] [PASSED] Link rate 162000 lane count 4
[05:43:13] [PASSED] Link rate 162000 lane count 2
[05:43:13] [PASSED] Link rate 162000 lane count 1
[05:43:13] ========== [PASSED] drm_test_dp_mst_calc_pbn_div ===========
[05:43:13] ========= drm_test_dp_mst_sideband_msg_req_decode  =========
[05:43:13] [PASSED] DP_ENUM_PATH_RESOURCES with port number
[05:43:13] [PASSED] DP_POWER_UP_PHY with port number
[05:43:13] [PASSED] DP_POWER_DOWN_PHY with port number
[05:43:13] [PASSED] DP_ALLOCATE_PAYLOAD with SDP stream sinks
[05:43:13] [PASSED] DP_ALLOCATE_PAYLOAD with port number
[05:43:13] [PASSED] DP_ALLOCATE_PAYLOAD with VCPI
[05:43:13] [PASSED] DP_ALLOCATE_PAYLOAD with PBN
[05:43:13] [PASSED] DP_QUERY_PAYLOAD with port number
[05:43:13] [PASSED] DP_QUERY_PAYLOAD with VCPI
[05:43:13] [PASSED] DP_REMOTE_DPCD_READ with port number
[05:43:13] [PASSED] DP_REMOTE_DPCD_READ with DPCD address
[05:43:13] [PASSED] DP_REMOTE_DPCD_READ with max number of bytes
[05:43:13] [PASSED] DP_REMOTE_DPCD_WRITE with port number
[05:43:13] [PASSED] DP_REMOTE_DPCD_WRITE with DPCD address
[05:43:13] [PASSED] DP_REMOTE_DPCD_WRITE with data array
[05:43:13] [PASSED] DP_REMOTE_I2C_READ with port number
[05:43:13] [PASSED] DP_REMOTE_I2C_READ with I2C device ID
[05:43:13] [PASSED] DP_REMOTE_I2C_READ with transactions array
[05:43:13] [PASSED] DP_REMOTE_I2C_WRITE with port number
[05:43:13] [PASSED] DP_REMOTE_I2C_WRITE with I2C device ID
[05:43:13] [PASSED] DP_REMOTE_I2C_WRITE with data array
[05:43:13] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream ID
[05:43:13] [PASSED] DP_QUERY_STREAM_ENC_STATUS with client ID
[05:43:13] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream event
[05:43:13] [PASSED] DP_QUERY_STREAM_ENC_STATUS with valid stream event
[05:43:13] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream behavior
[05:43:13] [PASSED] DP_QUERY_STREAM_ENC_STATUS with a valid stream behavior
[05:43:13] ===== [PASSED] drm_test_dp_mst_sideband_msg_req_decode =====
[05:43:13] ================ [PASSED] drm_dp_mst_helper ================
[05:43:13] ================== drm_exec (7 subtests) ===================
[05:43:13] [PASSED] sanitycheck
[05:43:13] [PASSED] test_lock
[05:43:13] [PASSED] test_lock_unlock
[05:43:13] [PASSED] test_duplicates
[05:43:13] [PASSED] test_prepare
[05:43:13] [PASSED] test_prepare_array
[05:43:13] [PASSED] test_multiple_loops
[05:43:13] ==================== [PASSED] drm_exec =====================
[05:43:13] =========== drm_format_helper_test (17 subtests) ===========
[05:43:13] ============== drm_test_fb_xrgb8888_to_gray8  ==============
[05:43:13] [PASSED] single_pixel_source_buffer
[05:43:13] [PASSED] single_pixel_clip_rectangle
[05:43:13] [PASSED] well_known_colors
[05:43:13] [PASSED] destination_pitch
[05:43:13] ========== [PASSED] drm_test_fb_xrgb8888_to_gray8 ==========
[05:43:13] ============= drm_test_fb_xrgb8888_to_rgb332  ==============
[05:43:13] [PASSED] single_pixel_source_buffer
[05:43:13] [PASSED] single_pixel_clip_rectangle
[05:43:13] [PASSED] well_known_colors
[05:43:13] [PASSED] destination_pitch
[05:43:13] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb332 ==========
[05:43:13] ============= drm_test_fb_xrgb8888_to_rgb565  ==============
[05:43:13] [PASSED] single_pixel_source_buffer
[05:43:13] [PASSED] single_pixel_clip_rectangle
[05:43:13] [PASSED] well_known_colors
[05:43:13] [PASSED] destination_pitch
[05:43:13] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb565 ==========
[05:43:13] ============ drm_test_fb_xrgb8888_to_xrgb1555  =============
[05:43:13] [PASSED] single_pixel_source_buffer
[05:43:13] [PASSED] single_pixel_clip_rectangle
[05:43:13] [PASSED] well_known_colors
[05:43:13] [PASSED] destination_pitch
[05:43:13] ======== [PASSED] drm_test_fb_xrgb8888_to_xrgb1555 =========
[05:43:13] ============ drm_test_fb_xrgb8888_to_argb1555  =============
[05:43:13] [PASSED] single_pixel_source_buffer
[05:43:13] [PASSED] single_pixel_clip_rectangle
[05:43:13] [PASSED] well_known_colors
[05:43:13] [PASSED] destination_pitch
[05:43:13] ======== [PASSED] drm_test_fb_xrgb8888_to_argb1555 =========
[05:43:13] ============ drm_test_fb_xrgb8888_to_rgba5551  =============
[05:43:13] [PASSED] single_pixel_source_buffer
[05:43:13] [PASSED] single_pixel_clip_rectangle
[05:43:13] [PASSED] well_known_colors
[05:43:13] [PASSED] destination_pitch
[05:43:13] ======== [PASSED] drm_test_fb_xrgb8888_to_rgba5551 =========
[05:43:13] ============= drm_test_fb_xrgb8888_to_rgb888  ==============
[05:43:13] [PASSED] single_pixel_source_buffer
[05:43:13] [PASSED] single_pixel_clip_rectangle
[05:43:13] [PASSED] well_known_colors
[05:43:13] [PASSED] destination_pitch
[05:43:13] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb888 ==========
[05:43:13] ============= drm_test_fb_xrgb8888_to_bgr888  ==============
[05:43:13] [PASSED] single_pixel_source_buffer
[05:43:13] [PASSED] single_pixel_clip_rectangle
[05:43:13] [PASSED] well_known_colors
[05:43:13] [PASSED] destination_pitch
[05:43:13] ========= [PASSED] drm_test_fb_xrgb8888_to_bgr888 ==========
[05:43:13] ============ drm_test_fb_xrgb8888_to_argb8888  =============
[05:43:13] [PASSED] single_pixel_source_buffer
[05:43:13] [PASSED] single_pixel_clip_rectangle
[05:43:13] [PASSED] well_known_colors
[05:43:13] [PASSED] destination_pitch
[05:43:13] ======== [PASSED] drm_test_fb_xrgb8888_to_argb8888 =========
[05:43:13] =========== drm_test_fb_xrgb8888_to_xrgb2101010  ===========
[05:43:13] [PASSED] single_pixel_source_buffer
[05:43:13] [PASSED] single_pixel_clip_rectangle
[05:43:13] [PASSED] well_known_colors
[05:43:13] [PASSED] destination_pitch
[05:43:13] ======= [PASSED] drm_test_fb_xrgb8888_to_xrgb2101010 =======
[05:43:13] =========== drm_test_fb_xrgb8888_to_argb2101010  ===========
[05:43:13] [PASSED] single_pixel_source_buffer
[05:43:13] [PASSED] single_pixel_clip_rectangle
[05:43:13] [PASSED] well_known_colors
[05:43:13] [PASSED] destination_pitch
[05:43:13] ======= [PASSED] drm_test_fb_xrgb8888_to_argb2101010 =======
[05:43:13] ============== drm_test_fb_xrgb8888_to_mono  ===============
[05:43:13] [PASSED] single_pixel_source_buffer
[05:43:13] [PASSED] single_pixel_clip_rectangle
[05:43:13] [PASSED] well_known_colors
[05:43:13] [PASSED] destination_pitch
[05:43:13] ========== [PASSED] drm_test_fb_xrgb8888_to_mono ===========
[05:43:13] ==================== drm_test_fb_swab  =====================
[05:43:13] [PASSED] single_pixel_source_buffer
[05:43:13] [PASSED] single_pixel_clip_rectangle
[05:43:13] [PASSED] well_known_colors
[05:43:13] [PASSED] destination_pitch
[05:43:13] ================ [PASSED] drm_test_fb_swab =================
[05:43:13] ============ drm_test_fb_xrgb8888_to_xbgr8888  =============
[05:43:13] [PASSED] single_pixel_source_buffer
[05:43:13] [PASSED] single_pixel_clip_rectangle
[05:43:13] [PASSED] well_known_colors
[05:43:13] [PASSED] destination_pitch
[05:43:13] ======== [PASSED] drm_test_fb_xrgb8888_to_xbgr8888 =========
[05:43:13] ============ drm_test_fb_xrgb8888_to_abgr8888  =============
[05:43:13] [PASSED] single_pixel_source_buffer
[05:43:13] [PASSED] single_pixel_clip_rectangle
[05:43:13] [PASSED] well_known_colors
[05:43:13] [PASSED] destination_pitch
[05:43:13] ======== [PASSED] drm_test_fb_xrgb8888_to_abgr8888 =========
[05:43:13] ================= drm_test_fb_clip_offset  =================
[05:43:13] [PASSED] pass through
[05:43:13] [PASSED] horizontal offset
[05:43:13] [PASSED] vertical offset
[05:43:13] [PASSED] horizontal and vertical offset
[05:43:13] [PASSED] horizontal offset (custom pitch)
[05:43:13] [PASSED] vertical offset (custom pitch)
[05:43:13] [PASSED] horizontal and vertical offset (custom pitch)
[05:43:13] ============= [PASSED] drm_test_fb_clip_offset =============
[05:43:13] =================== drm_test_fb_memcpy  ====================
[05:43:13] [PASSED] single_pixel_source_buffer: XR24 little-endian (0x34325258)
[05:43:13] [PASSED] single_pixel_source_buffer: XRA8 little-endian (0x38415258)
[05:43:13] [PASSED] single_pixel_source_buffer: YU24 little-endian (0x34325559)
[05:43:13] [PASSED] single_pixel_clip_rectangle: XB24 little-endian (0x34324258)
[05:43:13] [PASSED] single_pixel_clip_rectangle: XRA8 little-endian (0x38415258)
[05:43:13] [PASSED] single_pixel_clip_rectangle: YU24 little-endian (0x34325559)
[05:43:13] [PASSED] well_known_colors: XB24 little-endian (0x34324258)
[05:43:13] [PASSED] well_known_colors: XRA8 little-endian (0x38415258)
[05:43:13] [PASSED] well_known_colors: YU24 little-endian (0x34325559)
[05:43:13] [PASSED] destination_pitch: XB24 little-endian (0x34324258)
[05:43:13] [PASSED] destination_pitch: XRA8 little-endian (0x38415258)
[05:43:13] [PASSED] destination_pitch: YU24 little-endian (0x34325559)
[05:43:13] =============== [PASSED] drm_test_fb_memcpy ================
[05:43:13] ============= [PASSED] drm_format_helper_test ==============
[05:43:13] ================= drm_format (18 subtests) =================
[05:43:13] [PASSED] drm_test_format_block_width_invalid
[05:43:13] [PASSED] drm_test_format_block_width_one_plane
[05:43:13] [PASSED] drm_test_format_block_width_two_plane
[05:43:13] [PASSED] drm_test_format_block_width_three_plane
[05:43:13] [PASSED] drm_test_format_block_width_tiled
[05:43:13] [PASSED] drm_test_format_block_height_invalid
[05:43:13] [PASSED] drm_test_format_block_height_one_plane
[05:43:13] [PASSED] drm_test_format_block_height_two_plane
[05:43:13] [PASSED] drm_test_format_block_height_three_plane
[05:43:13] [PASSED] drm_test_format_block_height_tiled
[05:43:13] [PASSED] drm_test_format_min_pitch_invalid
[05:43:13] [PASSED] drm_test_format_min_pitch_one_plane_8bpp
[05:43:13] [PASSED] drm_test_format_min_pitch_one_plane_16bpp
[05:43:13] [PASSED] drm_test_format_min_pitch_one_plane_24bpp
[05:43:13] [PASSED] drm_test_format_min_pitch_one_plane_32bpp
[05:43:13] [PASSED] drm_test_format_min_pitch_two_plane
[05:43:13] [PASSED] drm_test_format_min_pitch_three_plane_8bpp
[05:43:13] [PASSED] drm_test_format_min_pitch_tiled
[05:43:13] =================== [PASSED] drm_format ====================
[05:43:13] ============== drm_framebuffer (10 subtests) ===============
[05:43:13] ========== drm_test_framebuffer_check_src_coords  ==========
[05:43:13] [PASSED] Success: source fits into fb
[05:43:13] [PASSED] Fail: overflowing fb with x-axis coordinate
[05:43:13] [PASSED] Fail: overflowing fb with y-axis coordinate
[05:43:13] [PASSED] Fail: overflowing fb with source width
[05:43:13] [PASSED] Fail: overflowing fb with source height
[05:43:13] ====== [PASSED] drm_test_framebuffer_check_src_coords ======
[05:43:13] [PASSED] drm_test_framebuffer_cleanup
[05:43:13] =============== drm_test_framebuffer_create  ===============
[05:43:13] [PASSED] ABGR8888 normal sizes
[05:43:13] [PASSED] ABGR8888 max sizes
[05:43:13] [PASSED] ABGR8888 pitch greater than min required
[05:43:13] [PASSED] ABGR8888 pitch less than min required
[05:43:13] [PASSED] ABGR8888 Invalid width
[05:43:13] [PASSED] ABGR8888 Invalid buffer handle
[05:43:13] [PASSED] No pixel format
[05:43:13] [PASSED] ABGR8888 Width 0
[05:43:13] [PASSED] ABGR8888 Height 0
[05:43:13] [PASSED] ABGR8888 Out of bound height * pitch combination
[05:43:13] [PASSED] ABGR8888 Large buffer offset
[05:43:13] [PASSED] ABGR8888 Buffer offset for inexistent plane
[05:43:13] [PASSED] ABGR8888 Invalid flag
[05:43:13] [PASSED] ABGR8888 Set DRM_MODE_FB_MODIFIERS without modifiers
[05:43:13] [PASSED] ABGR8888 Valid buffer modifier
[05:43:13] [PASSED] ABGR8888 Invalid buffer modifier(DRM_FORMAT_MOD_SAMSUNG_64_32_TILE)
[05:43:13] [PASSED] ABGR8888 Extra pitches without DRM_MODE_FB_MODIFIERS
[05:43:13] [PASSED] ABGR8888 Extra pitches with DRM_MODE_FB_MODIFIERS
[05:43:13] [PASSED] NV12 Normal sizes
[05:43:13] [PASSED] NV12 Max sizes
[05:43:13] [PASSED] NV12 Invalid pitch
[05:43:13] [PASSED] NV12 Invalid modifier/missing DRM_MODE_FB_MODIFIERS flag
[05:43:13] [PASSED] NV12 different  modifier per-plane
[05:43:13] [PASSED] NV12 with DRM_FORMAT_MOD_SAMSUNG_64_32_TILE
[05:43:13] [PASSED] NV12 Valid modifiers without DRM_MODE_FB_MODIFIERS
[05:43:13] [PASSED] NV12 Modifier for inexistent plane
[05:43:13] [PASSED] NV12 Handle for inexistent plane
[05:43:13] [PASSED] NV12 Handle for inexistent plane without DRM_MODE_FB_MODIFIERS
[05:43:13] [PASSED] YVU420 DRM_MODE_FB_MODIFIERS set without modifier
[05:43:13] [PASSED] YVU420 Normal sizes
[05:43:13] [PASSED] YVU420 Max sizes
[05:43:13] [PASSED] YVU420 Invalid pitch
[05:43:13] [PASSED] YVU420 Different pitches
[05:43:13] [PASSED] YVU420 Different buffer offsets/pitches
[05:43:13] [PASSED] YVU420 Modifier set just for plane 0, without DRM_MODE_FB_MODIFIERS
[05:43:13] [PASSED] YVU420 Modifier set just for planes 0, 1, without DRM_MODE_FB_MODIFIERS
[05:43:13] [PASSED] YVU420 Modifier set just for plane 0, 1, with DRM_MODE_FB_MODIFIERS
[05:43:13] [PASSED] YVU420 Valid modifier
[05:43:13] [PASSED] YVU420 Different modifiers per plane
[05:43:13] [PASSED] YVU420 Modifier for inexistent plane
[05:43:13] [PASSED] YUV420_10BIT Invalid modifier(DRM_FORMAT_MOD_LINEAR)
[05:43:13] [PASSED] X0L2 Normal sizes
[05:43:13] [PASSED] X0L2 Max sizes
[05:43:13] [PASSED] X0L2 Invalid pitch
[05:43:13] [PASSED] X0L2 Pitch greater than minimum required
[05:43:13] [PASSED] X0L2 Handle for inexistent plane
[05:43:13] [PASSED] X0L2 Offset for inexistent plane, without DRM_MODE_FB_MODIFIERS set
[05:43:13] [PASSED] X0L2 Modifier without DRM_MODE_FB_MODIFIERS set
[05:43:13] [PASSED] X0L2 Valid modifier
[05:43:13] [PASSED] X0L2 Modifier for inexistent plane
[05:43:13] =========== [PASSED] drm_test_framebuffer_create ===========
[05:43:13] [PASSED] drm_test_framebuffer_free
[05:43:13] [PASSED] drm_test_framebuffer_init
[05:43:13] [PASSED] drm_test_framebuffer_init_bad_format
[05:43:13] [PASSED] drm_test_framebuffer_init_dev_mismatch
[05:43:13] [PASSED] drm_test_framebuffer_lookup
[05:43:13] [PASSED] drm_test_framebuffer_lookup_inexistent
[05:43:13] [PASSED] drm_test_framebuffer_modifiers_not_supported
[05:43:13] ================= [PASSED] drm_framebuffer =================
[05:43:13] ================ drm_gem_shmem (8 subtests) ================
[05:43:13] [PASSED] drm_gem_shmem_test_obj_create
[05:43:13] [PASSED] drm_gem_shmem_test_obj_create_private
[05:43:13] [PASSED] drm_gem_shmem_test_pin_pages
[05:43:13] [PASSED] drm_gem_shmem_test_vmap
[05:43:13] [PASSED] drm_gem_shmem_test_get_sg_table
[05:43:13] [PASSED] drm_gem_shmem_test_get_pages_sgt
[05:43:13] [PASSED] drm_gem_shmem_test_madvise
[05:43:13] [PASSED] drm_gem_shmem_test_purge
[05:43:13] ================== [PASSED] drm_gem_shmem ==================
[05:43:13] === drm_atomic_helper_connector_hdmi_check (29 subtests) ===
[05:43:13] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode
[05:43:13] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode_vic_1
[05:43:13] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode
[05:43:13] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode_vic_1
[05:43:13] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode
[05:43:13] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode_vic_1
[05:43:13] ====== drm_test_check_broadcast_rgb_cea_mode_yuv420  =======
[05:43:13] [PASSED] Automatic
[05:43:13] [PASSED] Full
[05:43:13] [PASSED] Limited 16:235
[05:43:13] == [PASSED] drm_test_check_broadcast_rgb_cea_mode_yuv420 ===
[05:43:13] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_changed
[05:43:13] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_not_changed
[05:43:13] [PASSED] drm_test_check_disable_connector
[05:43:13] [PASSED] drm_test_check_hdmi_funcs_reject_rate
[05:43:13] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_rgb
[05:43:13] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_yuv420
[05:43:13] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv422
[05:43:13] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv420
[05:43:13] [PASSED] drm_test_check_driver_unsupported_fallback_yuv420
[05:43:13] [PASSED] drm_test_check_output_bpc_crtc_mode_changed
[05:43:13] [PASSED] drm_test_check_output_bpc_crtc_mode_not_changed
[05:43:13] [PASSED] drm_test_check_output_bpc_dvi
[05:43:13] [PASSED] drm_test_check_output_bpc_format_vic_1
[05:43:13] [PASSED] drm_test_check_output_bpc_format_display_8bpc_only
[05:43:13] [PASSED] drm_test_check_output_bpc_format_display_rgb_only
[05:43:13] [PASSED] drm_test_check_output_bpc_format_driver_8bpc_only
[05:43:13] [PASSED] drm_test_check_output_bpc_format_driver_rgb_only
[05:43:13] [PASSED] drm_test_check_tmds_char_rate_rgb_8bpc
[05:43:13] [PASSED] drm_test_check_tmds_char_rate_rgb_10bpc
[05:43:13] [PASSED] drm_test_check_tmds_char_rate_rgb_12bpc
[05:43:13] ============ drm_test_check_hdmi_color_format  =============
[05:43:13] [PASSED] AUTO -> RGB
[05:43:13] [PASSED] YCBCR422 -> YUV422
[05:43:13] [PASSED] YCBCR420 -> YUV420
[05:43:13] [PASSED] YCBCR444 -> YUV444
[05:43:13] [PASSED] RGB -> RGB
[05:43:13] ======== [PASSED] drm_test_check_hdmi_color_format =========
[05:43:13] ======== drm_test_check_hdmi_color_format_420_only  ========
[05:43:13] [PASSED] RGB should fail
[05:43:13] [PASSED] YUV444 should fail
[05:43:13] [PASSED] YUV422 should fail
[05:43:13] [PASSED] YUV420 should work
[05:43:13] ==== [PASSED] drm_test_check_hdmi_color_format_420_only ====
[05:43:13] ===== [PASSED] drm_atomic_helper_connector_hdmi_check ======
[05:43:13] === drm_atomic_helper_connector_hdmi_reset (6 subtests) ====
[05:43:13] [PASSED] drm_test_check_broadcast_rgb_value
[05:43:13] [PASSED] drm_test_check_bpc_8_value
[05:43:13] [PASSED] drm_test_check_bpc_10_value
[05:43:13] [PASSED] drm_test_check_bpc_12_value
[05:43:13] [PASSED] drm_test_check_format_value
[05:43:13] [PASSED] drm_test_check_tmds_char_value
[05:43:13] ===== [PASSED] drm_atomic_helper_connector_hdmi_reset ======
[05:43:13] = drm_atomic_helper_connector_hdmi_mode_valid (7 subtests) =
[05:43:13] [PASSED] drm_test_check_mode_valid
[05:43:13] [PASSED] drm_test_check_mode_valid_reject
[05:43:13] [PASSED] drm_test_check_mode_valid_reject_rate
[05:43:13] [PASSED] drm_test_check_mode_valid_reject_max_clock
[05:43:13] [PASSED] drm_test_check_mode_valid_yuv420_only_max_clock
[05:43:13] [PASSED] drm_test_check_mode_valid_reject_yuv420_only_connector
[05:43:13] [PASSED] drm_test_check_mode_valid_accept_yuv420_also_connector_rgb
[05:43:13] === [PASSED] drm_atomic_helper_connector_hdmi_mode_valid ===
[05:43:13] = drm_atomic_helper_connector_hdmi_infoframes (5 subtests) =
[05:43:13] [PASSED] drm_test_check_infoframes
[05:43:13] [PASSED] drm_test_check_reject_avi_infoframe
[05:43:13] [PASSED] drm_test_check_reject_hdr_infoframe_bpc_8
[05:43:13] [PASSED] drm_test_check_reject_hdr_infoframe_bpc_10
[05:43:13] [PASSED] drm_test_check_reject_audio_infoframe
[05:43:13] === [PASSED] drm_atomic_helper_connector_hdmi_infoframes ===
[05:43:13] ================= drm_managed (2 subtests) =================
[05:43:13] [PASSED] drm_test_managed_release_action
[05:43:13] [PASSED] drm_test_managed_run_action
[05:43:13] =================== [PASSED] drm_managed ===================
[05:43:13] =================== drm_mm (6 subtests) ====================
[05:43:13] [PASSED] drm_test_mm_init
[05:43:13] [PASSED] drm_test_mm_debug
[05:43:13] [PASSED] drm_test_mm_align32
[05:43:13] [PASSED] drm_test_mm_align64
[05:43:13] [PASSED] drm_test_mm_lowest
[05:43:13] [PASSED] drm_test_mm_highest
[05:43:13] ===================== [PASSED] drm_mm ======================
[05:43:13] ============= drm_modes_analog_tv (5 subtests) =============
[05:43:13] [PASSED] drm_test_modes_analog_tv_mono_576i
[05:43:13] [PASSED] drm_test_modes_analog_tv_ntsc_480i
[05:43:13] [PASSED] drm_test_modes_analog_tv_ntsc_480i_inlined
[05:43:13] [PASSED] drm_test_modes_analog_tv_pal_576i
[05:43:13] [PASSED] drm_test_modes_analog_tv_pal_576i_inlined
[05:43:13] =============== [PASSED] drm_modes_analog_tv ===============
[05:43:13] ============== drm_panic_helper (3 subtests) ===============
[05:43:13] ============= drm_test_panic_screen_user_map  ==============
[05:43:13] [PASSED] Panic screen user, mode: 1024 x 768 	XR24 little-endian (0x34325258)
[05:43:13] [PASSED] Panic screen user, mode: 494 x 494 	XR24 little-endian (0x34325258)
[05:43:13] [PASSED] Panic screen user, mode: 1920 x 1080 	XR24 little-endian (0x34325258)
[05:43:13] [PASSED] Panic screen user, mode: 1024 x 768 	RG16 little-endian (0x36314752)
[05:43:13] [PASSED] Panic screen user, mode: 1024 x 768 	RG24 little-endian (0x34324752)
[05:43:13] [PASSED] Panic screen kmsg, mode: 1024 x 768 	XR24 little-endian (0x34325258)
[05:43:13] [PASSED] Panic screen kmsg, mode: 494 x 494 	XR24 little-endian (0x34325258)
[05:43:13] [PASSED] Panic screen kmsg, mode: 1920 x 1080 	XR24 little-endian (0x34325258)
[05:43:13] [PASSED] Panic screen kmsg, mode: 1024 x 768 	RG16 little-endian (0x36314752)
[05:43:13] [PASSED] Panic screen kmsg, mode: 1024 x 768 	RG24 little-endian (0x34324752)
[05:43:13] ========= [PASSED] drm_test_panic_screen_user_map ==========
[05:43:13] ============= drm_test_panic_screen_user_page  =============
[05:43:13] [PASSED] Panic screen user, mode: 1024 x 768 	XR24 little-endian (0x34325258)
[05:43:13] [PASSED] Panic screen user, mode: 494 x 494 	XR24 little-endian (0x34325258)
[05:43:13] [PASSED] Panic screen user, mode: 1920 x 1080 	XR24 little-endian (0x34325258)
[05:43:13] [PASSED] Panic screen user, mode: 1024 x 768 	RG16 little-endian (0x36314752)
[05:43:13] [PASSED] Panic screen user, mode: 1024 x 768 	RG24 little-endian (0x34324752)
[05:43:13] [PASSED] Panic screen kmsg, mode: 1024 x 768 	XR24 little-endian (0x34325258)
[05:43:13] [PASSED] Panic screen kmsg, mode: 494 x 494 	XR24 little-endian (0x34325258)
[05:43:13] [PASSED] Panic screen kmsg, mode: 1920 x 1080 	XR24 little-endian (0x34325258)
[05:43:13] [PASSED] Panic screen kmsg, mode: 1024 x 768 	RG16 little-endian (0x36314752)
[05:43:13] [PASSED] Panic screen kmsg, mode: 1024 x 768 	RG24 little-endian (0x34324752)
[05:43:13] ========= [PASSED] drm_test_panic_screen_user_page =========
[05:43:13] ========== drm_test_panic_screen_user_set_pixel  ===========
[05:43:13] [PASSED] Panic screen user, mode: 1024 x 768 	XR24 little-endian (0x34325258)
[05:43:13] [PASSED] Panic screen user, mode: 494 x 494 	XR24 little-endian (0x34325258)
[05:43:13] [PASSED] Panic screen user, mode: 1920 x 1080 	XR24 little-endian (0x34325258)
[05:43:13] [PASSED] Panic screen user, mode: 1024 x 768 	RG16 little-endian (0x36314752)
[05:43:13] [PASSED] Panic screen user, mode: 1024 x 768 	RG24 little-endian (0x34324752)
[05:43:13] [PASSED] Panic screen kmsg, mode: 1024 x 768 	XR24 little-endian (0x34325258)
[05:43:13] [PASSED] Panic screen kmsg, mode: 494 x 494 	XR24 little-endian (0x34325258)
[05:43:13] [PASSED] Panic screen kmsg, mode: 1920 x 1080 	XR24 little-endian (0x34325258)
[05:43:13] [PASSED] Panic screen kmsg, mode: 1024 x 768 	RG16 little-endian (0x36314752)
[05:43:13] [PASSED] Panic screen kmsg, mode: 1024 x 768 	RG24 little-endian (0x34324752)
[05:43:13] ====== [PASSED] drm_test_panic_screen_user_set_pixel =======
[05:43:13] ================ [PASSED] drm_panic_helper =================
[05:43:13] ============== drm_plane_helper (2 subtests) ===============
[05:43:13] =============== drm_test_check_plane_state  ================
[05:43:13] [PASSED] clipping_simple
[05:43:13] [PASSED] clipping_rotate_reflect
[05:43:13] [PASSED] positioning_simple
[05:43:13] [PASSED] upscaling
[05:43:13] [PASSED] downscaling
[05:43:13] [PASSED] rounding1
[05:43:13] [PASSED] rounding2
[05:43:13] [PASSED] rounding3
[05:43:13] [PASSED] rounding4
[05:43:13] =========== [PASSED] drm_test_check_plane_state ============
[05:43:13] =========== drm_test_check_invalid_plane_state  ============
[05:43:13] [PASSED] positioning_invalid
[05:43:13] [PASSED] upscaling_invalid
[05:43:13] [PASSED] downscaling_invalid
[05:43:13] ======= [PASSED] drm_test_check_invalid_plane_state ========
[05:43:13] ================ [PASSED] drm_plane_helper =================
[05:43:13] ====== drm_connector_helper_tv_get_modes (1 subtest) =======
[05:43:13] ====== drm_test_connector_helper_tv_get_modes_check  =======
[05:43:13] [PASSED] None
[05:43:13] [PASSED] PAL
[05:43:13] [PASSED] NTSC
[05:43:13] [PASSED] Both, NTSC Default
[05:43:13] [PASSED] Both, PAL Default
[05:43:13] [PASSED] Both, NTSC Default, with PAL on command-line
[05:43:13] [PASSED] Both, PAL Default, with NTSC on command-line
[05:43:13] == [PASSED] drm_test_connector_helper_tv_get_modes_check ===
[05:43:13] ======== [PASSED] drm_connector_helper_tv_get_modes ========
[05:43:13] ================== drm_rect (9 subtests) ===================
[05:43:13] [PASSED] drm_test_rect_clip_scaled_div_by_zero
[05:43:13] [PASSED] drm_test_rect_clip_scaled_not_clipped
[05:43:13] [PASSED] drm_test_rect_clip_scaled_clipped
[05:43:13] [PASSED] drm_test_rect_clip_scaled_signed_vs_unsigned
[05:43:13] ================= drm_test_rect_intersect  =================
[05:43:13] [PASSED] top-left x bottom-right: 2x2+1+1 x 2x2+0+0
[05:43:13] [PASSED] top-right x bottom-left: 2x2+0+0 x 2x2+1-1
[05:43:13] [PASSED] bottom-left x top-right: 2x2+1-1 x 2x2+0+0
[05:43:13] [PASSED] bottom-right x top-left: 2x2+0+0 x 2x2+1+1
[05:43:13] [PASSED] right x left: 2x1+0+0 x 3x1+1+0
[05:43:13] [PASSED] left x right: 3x1+1+0 x 2x1+0+0
[05:43:13] [PASSED] up x bottom: 1x2+0+0 x 1x3+0-1
[05:43:13] [PASSED] bottom x up: 1x3+0-1 x 1x2+0+0
[05:43:13] [PASSED] touching corner: 1x1+0+0 x 2x2+1+1
[05:43:13] [PASSED] touching side: 1x1+0+0 x 1x1+1+0
[05:43:13] [PASSED] equal rects: 2x2+0+0 x 2x2+0+0
[05:43:13] [PASSED] inside another: 2x2+0+0 x 1x1+1+1
[05:43:13] [PASSED] far away: 1x1+0+0 x 1x1+3+6
[05:43:13] [PASSED] points intersecting: 0x0+5+10 x 0x0+5+10
[05:43:13] [PASSED] points not intersecting: 0x0+0+0 x 0x0+5+10
[05:43:13] ============= [PASSED] drm_test_rect_intersect =============
[05:43:13] ================ drm_test_rect_calc_hscale  ================
[05:43:13] [PASSED] normal use
[05:43:13] [PASSED] out of max range
[05:43:13] [PASSED] out of min range
[05:43:13] [PASSED] zero dst
[05:43:13] [PASSED] negative src
[05:43:13] [PASSED] negative dst
[05:43:13] ============ [PASSED] drm_test_rect_calc_hscale ============
[05:43:13] ================ drm_test_rect_calc_vscale  ================
[05:43:13] [PASSED] normal use
[05:43:13] [PASSED] out of max range
[05:43:13] [PASSED] out of min range
[05:43:13] [PASSED] zero dst
[05:43:13] [PASSED] negative src
[05:43:13] [PASSED] negative dst
[05:43:13] ============ [PASSED] drm_test_rect_calc_vscale ============
[05:43:13] ================== drm_test_rect_rotate  ===================
[05:43:13] [PASSED] reflect-x
[05:43:13] [PASSED] reflect-y
[05:43:13] [PASSED] rotate-0
[05:43:13] [PASSED] rotate-90
[05:43:13] [PASSED] rotate-180
[05:43:13] [PASSED] rotate-270
[05:43:13] ============== [PASSED] drm_test_rect_rotate ===============
[05:43:13] ================ drm_test_rect_rotate_inv  =================
[05:43:13] [PASSED] reflect-x
[05:43:13] [PASSED] reflect-y
[05:43:13] [PASSED] rotate-0
[05:43:13] [PASSED] rotate-90
[05:43:13] [PASSED] rotate-180
[05:43:13] [PASSED] rotate-270
[05:43:13] ============ [PASSED] drm_test_rect_rotate_inv =============
[05:43:13] ==================== [PASSED] drm_rect =====================
[05:43:13] ============ drm_sysfb_modeset_test (1 subtest) ============
[05:43:13] ============ drm_test_sysfb_build_fourcc_list  =============
[05:43:13] [PASSED] no native formats
[05:43:13] [PASSED] XRGB8888 as native format
[05:43:13] [PASSED] remove duplicates
[05:43:13] [PASSED] convert alpha formats
[05:43:13] [PASSED] random formats
[05:43:13] ======== [PASSED] drm_test_sysfb_build_fourcc_list =========
[05:43:13] ============= [PASSED] drm_sysfb_modeset_test ==============
[05:43:13] ================== drm_fixp (2 subtests) ===================
[05:43:13] [PASSED] drm_test_int2fixp
[05:43:13] [PASSED] drm_test_sm2fixp
[05:43:13] ==================== [PASSED] drm_fixp =====================
[05:43:13] ============================================================
[05:43:13] Testing complete. Ran 671 tests: passed: 671
[05:43:14] Elapsed time: 27.617s total, 1.817s configuring, 25.331s building, 0.418s 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
[05:43:14] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[05:43:15] 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
[05:43:26] Starting KUnit Kernel (1/1)...
[05:43:26] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[05:43:26] ============= refcount_interrupt (4 subtests) ==============
[05:43:26] [PASSED] test_single_irq_change
[05:43:26] [PASSED] test_nested_irq_change
[05:43:26] [PASSED] test_multiple_irq_change
[05:43:26] [PASSED] test_irq_save
[05:43:26] =============== [PASSED] refcount_interrupt ================
[05:43:26] ================= ttm_device (5 subtests) ==================
[05:43:26] [PASSED] ttm_device_init_basic
[05:43:26] [PASSED] ttm_device_init_multiple
[05:43:26] [PASSED] ttm_device_fini_basic
[05:43:26] [PASSED] ttm_device_init_no_vma_man
[05:43:26] ================== ttm_device_init_pools  ==================
[05:43:26] [PASSED] No DMA allocations, no DMA32 required
[05:43:26] [PASSED] DMA allocations, DMA32 required
[05:43:26] [PASSED] No DMA allocations, DMA32 required
[05:43:26] [PASSED] DMA allocations, no DMA32 required
[05:43:26] ============== [PASSED] ttm_device_init_pools ==============
[05:43:26] =================== [PASSED] ttm_device ====================
[05:43:26] ================== ttm_pool (8 subtests) ===================
[05:43:26] ================== ttm_pool_alloc_basic  ===================
[05:43:26] [PASSED] One page
[05:43:26] [PASSED] More than one page
[05:43:26] [PASSED] Above the allocation limit
[05:43:26] [PASSED] One page, with coherent DMA mappings enabled
[05:43:26] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[05:43:26] ============== [PASSED] ttm_pool_alloc_basic ===============
[05:43:26] ============== ttm_pool_alloc_basic_dma_addr  ==============
[05:43:26] [PASSED] One page
[05:43:26] [PASSED] More than one page
[05:43:26] [PASSED] Above the allocation limit
[05:43:26] [PASSED] One page, with coherent DMA mappings enabled
[05:43:26] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[05:43:26] ========== [PASSED] ttm_pool_alloc_basic_dma_addr ==========
[05:43:26] [PASSED] ttm_pool_alloc_order_caching_match
[05:43:26] [PASSED] ttm_pool_alloc_caching_mismatch
[05:43:26] [PASSED] ttm_pool_alloc_order_mismatch
[05:43:26] [PASSED] ttm_pool_free_dma_alloc
[05:43:26] [PASSED] ttm_pool_free_no_dma_alloc
[05:43:26] [PASSED] ttm_pool_fini_basic
[05:43:26] ==================== [PASSED] ttm_pool =====================
[05:43:26] ================ ttm_resource (8 subtests) =================
[05:43:26] ================= ttm_resource_init_basic  =================
[05:43:26] [PASSED] Init resource in TTM_PL_SYSTEM
[05:43:26] [PASSED] Init resource in TTM_PL_VRAM
[05:43:26] [PASSED] Init resource in a private placement
[05:43:26] [PASSED] Init resource in TTM_PL_SYSTEM, set placement flags
[05:43:26] ============= [PASSED] ttm_resource_init_basic =============
[05:43:26] [PASSED] ttm_resource_init_pinned
[05:43:26] [PASSED] ttm_resource_fini_basic
[05:43:26] [PASSED] ttm_resource_manager_init_basic
[05:43:26] [PASSED] ttm_resource_manager_usage_basic
[05:43:26] [PASSED] ttm_resource_manager_set_used_basic
[05:43:26] [PASSED] ttm_sys_man_alloc_basic
[05:43:26] [PASSED] ttm_sys_man_free_basic
[05:43:26] ================== [PASSED] ttm_resource ===================
[05:43:26] =================== ttm_tt (15 subtests) ===================
[05:43:26] ==================== ttm_tt_init_basic  ====================
[05:43:26] [PASSED] Page-aligned size
[05:43:26] [PASSED] Extra pages requested
[05:43:26] ================ [PASSED] ttm_tt_init_basic ================
[05:43:26] [PASSED] ttm_tt_init_misaligned
[05:43:26] [PASSED] ttm_tt_fini_basic
[05:43:26] [PASSED] ttm_tt_fini_sg
[05:43:26] [PASSED] ttm_tt_fini_shmem
[05:43:26] [PASSED] ttm_tt_create_basic
[05:43:26] [PASSED] ttm_tt_create_invalid_bo_type
[05:43:26] [PASSED] ttm_tt_create_ttm_exists
[05:43:26] [PASSED] ttm_tt_create_failed
[05:43:26] [PASSED] ttm_tt_destroy_basic
[05:43:26] [PASSED] ttm_tt_populate_null_ttm
[05:43:26] [PASSED] ttm_tt_populate_populated_ttm
[05:43:26] [PASSED] ttm_tt_unpopulate_basic
[05:43:26] [PASSED] ttm_tt_unpopulate_empty_ttm
[05:43:26] [PASSED] ttm_tt_swapin_basic
[05:43:26] ===================== [PASSED] ttm_tt ======================
[05:43:26] =================== ttm_bo (14 subtests) ===================
[05:43:26] =========== ttm_bo_reserve_optimistic_no_ticket  ===========
[05:43:26] [PASSED] Cannot be interrupted and sleeps
[05:43:26] [PASSED] Cannot be interrupted, locks straight away
[05:43:26] [PASSED] Can be interrupted, sleeps
[05:43:26] ======= [PASSED] ttm_bo_reserve_optimistic_no_ticket =======
[05:43:26] [PASSED] ttm_bo_reserve_locked_no_sleep
[05:43:26] [PASSED] ttm_bo_reserve_no_wait_ticket
[05:43:26] [PASSED] ttm_bo_reserve_double_resv
[05:43:26] [PASSED] ttm_bo_reserve_interrupted
[05:43:26] [PASSED] ttm_bo_reserve_deadlock
[05:43:26] [PASSED] ttm_bo_unreserve_basic
[05:43:26] [PASSED] ttm_bo_unreserve_pinned
[05:43:26] [PASSED] ttm_bo_unreserve_bulk
[05:43:26] [PASSED] ttm_bo_fini_basic
[05:43:26] [PASSED] ttm_bo_fini_shared_resv
[05:43:26] [PASSED] ttm_bo_pin_basic
[05:43:26] [PASSED] ttm_bo_pin_unpin_resource
[05:43:26] [PASSED] ttm_bo_multiple_pin_one_unpin
[05:43:26] ===================== [PASSED] ttm_bo ======================
[05:43:26] ============== ttm_bo_validate (22 subtests) ===============
[05:43:26] ============== ttm_bo_init_reserved_sys_man  ===============
[05:43:26] [PASSED] Buffer object for userspace
[05:43:26] [PASSED] Kernel buffer object
[05:43:26] [PASSED] Shared buffer object
[05:43:26] ========== [PASSED] ttm_bo_init_reserved_sys_man ===========
[05:43:26] ============== ttm_bo_init_reserved_mock_man  ==============
[05:43:26] [PASSED] Buffer object for userspace
[05:43:26] [PASSED] Kernel buffer object
[05:43:26] [PASSED] Shared buffer object
[05:43:26] ========== [PASSED] ttm_bo_init_reserved_mock_man ==========
[05:43:26] [PASSED] ttm_bo_init_reserved_resv
[05:43:26] ================== ttm_bo_validate_basic  ==================
[05:43:26] [PASSED] Buffer object for userspace
[05:43:26] [PASSED] Kernel buffer object
[05:43:26] [PASSED] Shared buffer object
[05:43:26] ============== [PASSED] ttm_bo_validate_basic ==============
[05:43:26] [PASSED] ttm_bo_validate_invalid_placement
[05:43:26] ============= ttm_bo_validate_same_placement  ==============
[05:43:26] [PASSED] System manager
[05:43:26] [PASSED] VRAM manager
[05:43:26] ========= [PASSED] ttm_bo_validate_same_placement ==========
[05:43:26] [PASSED] ttm_bo_validate_failed_alloc
[05:43:26] [PASSED] ttm_bo_validate_pinned
[05:43:26] [PASSED] ttm_bo_validate_busy_placement
[05:43:26] ================ ttm_bo_validate_multihop  =================
[05:43:26] [PASSED] Buffer object for userspace
[05:43:26] [PASSED] Kernel buffer object
[05:43:26] [PASSED] Shared buffer object
[05:43:26] ============ [PASSED] ttm_bo_validate_multihop =============
[05:43:26] ========== ttm_bo_validate_no_placement_signaled  ==========
[05:43:26] [PASSED] Buffer object in system domain, no page vector
[05:43:26] [PASSED] Buffer object in system domain with an existing page vector
[05:43:26] ====== [PASSED] ttm_bo_validate_no_placement_signaled ======
[05:43:26] ======== ttm_bo_validate_no_placement_not_signaled  ========
[05:43:26] [PASSED] Buffer object for userspace
[05:43:26] [PASSED] Kernel buffer object
[05:43:26] [PASSED] Shared buffer object
[05:43:26] ==== [PASSED] ttm_bo_validate_no_placement_not_signaled ====
[05:43:26] [PASSED] ttm_bo_validate_move_fence_signaled
[05:43:26] ========= ttm_bo_validate_move_fence_not_signaled  =========
[05:43:26] [PASSED] Waits for GPU
[05:43:26] [PASSED] Tries to lock straight away
[05:43:26] ===== [PASSED] ttm_bo_validate_move_fence_not_signaled =====
[05:43:26] [PASSED] ttm_bo_validate_swapout
[05:43:26] [PASSED] ttm_bo_validate_happy_evict
[05:43:26] [PASSED] ttm_bo_validate_all_pinned_evict
[05:43:26] [PASSED] ttm_bo_validate_allowed_only_evict
[05:43:26] [PASSED] ttm_bo_validate_deleted_evict
[05:43:26] [PASSED] ttm_bo_validate_busy_domain_evict
[05:43:26] [PASSED] ttm_bo_validate_evict_gutting
[05:43:26] [PASSED] ttm_bo_validate_recrusive_evict
[05:43:26] ================= [PASSED] ttm_bo_validate =================
[05:43:26] ============================================================
[05:43:26] Testing complete. Ran 106 tests: passed: 106
[05:43:26] Elapsed time: 12.254s total, 1.792s configuring, 10.247s building, 0.180s running

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

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



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

* Re: [PATCH v14 01/12] mm/Kconfig: changes for migrate on fault for device pages
  2026-09-22  5:34 ` [PATCH v14 01/12] mm/Kconfig: changes for " mpenttil
@ 2026-09-22  5:44   ` sashiko-bot
  2026-09-22 22:27   ` Balbir Singh
  1 sibling, 0 replies; 35+ messages in thread
From: sashiko-bot @ 2026-09-22  5:44 UTC (permalink / raw)
  To: mpenttil; +Cc: dri-devel, intel-xe

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Low] mm/Kconfig: DEVICE_MIGRATION selects HMM_MIRROR without MMU dependency
--

commit 3e1dfa1b4fc87fd67c61777c9c5e43b8e801f019
Author: Mika Penttilä <mpenttil@redhat.com>

mm/Kconfig: changes for migrate on fault for device pages

This commit explicitly enables HMM for the unified HMM/migrate_device
page table walk in migrate_device, since HMM depends on MMU notifiers.

> diff --git a/mm/Kconfig b/mm/Kconfig
> index 604c58199acbf..b7a485beb9a78 100644
> --- a/mm/Kconfig
> +++ b/mm/Kconfig
> @@ -687,6 +687,7 @@ config MIGRATION
>  
>  config DEVICE_MIGRATION
>  	def_bool MIGRATION && ZONE_DEVICE
> +	select HMM_MIRROR

[Severity: Low]
Does this regression violate Kconfig dependency rules by selecting HMM_MIRROR
without inheriting its dependencies?

In mm/Kconfig under DEVICE_MIGRATION, HMM_MIRROR is selected but its MMU
dependency is not included.

While currently unreachable because nothing currently selects DEVICE_MIGRATION,
if another config unconditionally uses select DEVICE_MIGRATION in the future,
it forces DEVICE_MIGRATION=y (bypassing the def_bool logic).

This would subsequently force HMM_MIRROR=y on non-MMU architectures, causing
unmet dependency warnings and potential build failures.

The Kconfig subsystem rules require that any config using select must explicitly
inherit the selected symbol's dependencies.

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260922053421.4092027-1-mpenttil@redhat.com?part=1

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

* Re: [PATCH v14 05/12] mm/hmm: implement folio split for migrate needs in HMM pagewalk
  2026-09-22  5:34 ` [PATCH v14 05/12] mm/hmm: implement folio split for migrate needs in HMM pagewalk mpenttil
@ 2026-09-22  5:47   ` sashiko-bot
  0 siblings, 0 replies; 35+ messages in thread
From: sashiko-bot @ 2026-09-22  5:47 UTC (permalink / raw)
  To: mpenttil; +Cc: intel-xe, dri-devel

Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
- [High] mm: livelock in hmm_vma_walk_split() due to refcount elevation before trylock
- [High] mm: lock leak and VM_BUG_ON in hmm_vma_walk_split() for tail fault_page
- [Medium] mm: spurious migration failure in hmm_vma_walk_split() from TOCTOU split
--

commit ecf2b8c21903b70112c2f8a92121be600dc85ab2
Author: Mika Penttilä <mpenttil@redhat.com>

mm/hmm: implement folio split for migrate needs in HMM pagewalk

Implement the helper to split PMD size folios during pagewalk.
Splitting is needed if the start and end addresses are
not PMD aligned, or setting up pmd migration entry fails.

> diff --git a/mm/hmm.c b/mm/hmm.c
> index 4805c88347e67..e6469ef4ae6ad 100644
> --- a/mm/hmm.c
> +++ b/mm/hmm.c
> @@ -514,10 +514,51 @@ static int hmm_vma_walk_split(pmd_t *pmdp,

[ ... ]

> +	folio = pmd_folio(*pmdp);
> +	if (is_huge_zero_folio(folio)) {
> +		spin_unlock(ptl);
> +		split_huge_pmd(walk->vma, pmdp, addr);
> +	} else {
> +		folio_get(folio);
> +		spin_unlock(ptl);
> +
> +		if (folio != fault_folio) {
> +			if (unlikely(!folio_trylock(folio))) {

[Severity: High]
Does this create a livelock under contention?

If multiple threads race in hmm_vma_walk_split(), Thread B might elevate the
refcount here before Thread A (which already holds the lock) calls
split_folio(). When Thread A calls split_folio(), the inflated refcount will
cause split_folio() to fail with -EAGAIN. Thread A returns -EAGAIN and drops
the lock, while Thread B fails folio_trylock() and returns -EBUSY. Both can
then retry infinitely.

Could we attempt folio_trylock() before elevating the refcount?

> +				folio_put(folio);
> +				ret = -EBUSY;
> +				goto out;
> +			}
> +		}  else {
> +			folio_put(folio);
> +		}
> +
> +		ret = split_folio(folio);

[Severity: Medium]
Will this spuriously fail migration if the folio is split concurrently?

If another thread concurrently splits the THP during the lockless window
before we acquire the lock, split_folio() will return -EINVAL. Passing this
error up to hmm_vma_walk_pmd() aborts the pagewalk and marks the range with
HMM_PFN_ERROR instead of treating it as a condition to retry the walk with
the new PTEs.

[Severity: High]
Does this correctly handle cases where fault_page was a tail page?

If hmm_vma_walk_split() is called with migrate->fault_page as a tail page,
fault_folio is resolved as the head page. Before the split,
fault_folio == folio evaluates to true, so we bypass unlocking the folio on
the assumption the caller owns the lock.

However, split_folio() leaves the new order-0 tail pages unlocked.
When the caller subsequently uses the now order-0 fault_page and calls
folio_unlock(page_folio(fault_page)), it will crash with
VM_BUG_ON_FOLIO(!folio_test_locked(folio)) because the tail page is
unlocked. In addition, the original head page lock will be permanently
leaked.

> +		if (fault_folio != folio) {
> +			folio_unlock(folio);
> +			folio_put(folio);
> +		}
> +	}
> +out:
> +	return ret;
> +}

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260922053421.4092027-1-mpenttil@redhat.com?part=5

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

* Re: [PATCH v14 06/12] mm/hmm: migrate collection in HMM pagewalk - pte level
  2026-09-22  5:34 ` [PATCH v14 06/12] mm/hmm: migrate collection in HMM pagewalk - pte level mpenttil
@ 2026-09-22  5:47   ` sashiko-bot
  0 siblings, 0 replies; 35+ messages in thread
From: sashiko-bot @ 2026-09-22  5:47 UTC (permalink / raw)
  To: mpenttil; +Cc: dri-devel, intel-xe

Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
- [High] mm: hmm: double unlock of caller-locked fault_folio on rmap share failure
- [High] mm: hmm: livelock in large folio split due to refcount inflation before locking
- [High] mm: hmm: kernel crash due to split_folio() on non-folio compound pages
--

commit 5d5a85160b145735bf86c066185b4f70abea7ca4
Author: Mika Penttilä <mpenttil@redhat.com>

mm/hmm: migrate collection in HMM pagewalk - pte level
    
Implement hmm_vma_handle_migrate_prepare() and migrate_vma_split_folio() for
HMM pagewalk-based migration. The hmm_vma_handle_migrate_prepare() function
is responsible for migration decisions, possibly splitting folios, and
inserting migration entries.

> diff --git a/mm/hmm.c b/mm/hmm.c
> index e6469ef4ae6ad..b3b79d13c7978 100644
> --- a/mm/hmm.c
> +++ b/mm/hmm.c
[ ... ]
> +static int migrate_vma_split_folio(struct folio *folio,
> +				   struct page *fault_page,
> +				   struct hmm_vma_walk *hmm_vma_walk,
> +				   pte_t *ptep)
> +{
> +	int ret;
> +	struct folio *fault_folio = fault_page ? page_folio(fault_page) : NULL;
> +	struct folio *new_fault_folio = NULL;
> +
> +	if (folio != fault_folio)
> +		folio_get(folio);
> +
> +	pte_unmap_unlock(ptep, hmm_vma_walk->ptl);
> +	hmm_vma_walk->ptelocked = false;
> +
> +	if (folio != fault_folio)
> +		folio_lock(folio);
> +
> +	ret = split_folio(folio);

[Severity: High]
Does taking the reference via folio_get() before blocking on folio_lock()
create a livelock when multiple threads fault on the same large folio?

If multiple threads execute migrate_vma_split_folio() simultaneously, they
would all elevate the refcount and block on the lock. When the lock is finally
acquired, split_folio() expects the refcount to be exactly
folio_expected_ref_count() + 1. The extra references held by the waiting
threads would cause split_folio() to return -EAGAIN repeatedly, preventing
forward progress.

[ ... ]
> +static int hmm_vma_handle_migrate_prepare(const struct mm_walk *walk,
> +					  pmd_t *pmdp,
> +					  pte_t *ptep,
> +					  unsigned long addr,
> +					  unsigned long *hmm_pfn,
> +					  bool *unmapped)
> +{
[ ... ]
> +	} else {
> +		pfn = pte_pfn(pte);
> +		if (is_zero_pfn(pfn) &&
> +		    (minfo & MIGRATE_VMA_SELECT_SYSTEM)) {
> +			*hmm_pfn = HMM_PFN_MIGRATE;
> +			goto out;
> +		}
> +		page = vm_normal_page(walk->vma, addr, pte);
> +		if (page && !is_zone_device_page(page) &&
> +		    !(minfo & MIGRATE_VMA_SELECT_SYSTEM)) {
> +			goto out;
> +		} else if (page && is_device_coherent_page(page)) {
> +			pgmap = page_pgmap(page);
> +
> +			if (!(minfo &
> +			      MIGRATE_VMA_SELECT_DEVICE_COHERENT) ||
> +			    pgmap->owner != migrate->pgmap_owner)
> +				goto out;
> +		}
> +
> +		folio = page ? page_folio(page) : NULL;
> +		if (folio && folio_test_large(folio)) {
> +			int ret;
> +
> +			ret = migrate_vma_split_folio(folio,
> +						      migrate->fault_page,
> +						      hmm_vma_walk,
> +						      ptep);

[Severity: High]
Can this split_folio() crash if a driver mapped a raw compound page into the
VMA using vm_insert_page()?

The large folio check here uses folio_test_large() which returns true for any
compound page (since PG_head is set). However, page_folio() blindly casts
compound pages. If the compound page lacks initialized folio metadata (like a
valid mapping or LRU state), splitting it will corrupt memory. The structural
validation gate checking for a valid mapping (!page || !page->mapping) is only
performed after this split attempt.

> +			if (ret)
> +				goto out_error;
> +			return -EAGAIN;
> +		}
> +
> +		writable = pte_write(pte);
> +	}
> +
> +	if (!page || !page->mapping)
> +		goto out;
[ ... ]
> +	if (fault_folio == folio || folio_trylock(folio)) {
> +		anon_exclusive = folio_test_anon(folio) &&
> +			PageAnonExclusive(page);
> +
> +		if (pte_present(pte))
> +			flush_cache_page(walk->vma, addr, pfn);
> +
> +		if (anon_exclusive) {
> +			pte = ptep_clear_flush(walk->vma, addr, ptep);
> +
> +			if (folio_try_share_anon_rmap_pte(folio, page)) {
> +				set_pte_at(mm, addr, ptep, pte);
> +				folio_unlock(folio);

[Severity: High]
Does this error path unconditionally unlock a folio that the caller might hold
the lock for?

When entering this block, if fault_folio == folio, the code bypasses calling
folio_trylock(folio) because the caller already owns the lock. If
folio_try_share_anon_rmap_pte() subsequently fails, calling folio_unlock()
here would destroy the caller's lock state, causing a double-unlock crash
when the caller attempts to unlock it later.

> +				folio_put(folio);
> +				goto out;
> +			}
> +		} else {
> +			pte = ptep_get_and_clear(mm, addr, ptep);
> +		}
[ ... ]

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260922053421.4092027-1-mpenttil@redhat.com?part=6

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

* Re: [PATCH v14 03/12] mm/hmm: preparations for HMM to participate in migration
  2026-09-22  5:34 ` [PATCH v14 03/12] mm/hmm: preparations for HMM to participate in migration mpenttil
@ 2026-09-22  5:49   ` sashiko-bot
  0 siblings, 0 replies; 35+ messages in thread
From: sashiko-bot @ 2026-09-22  5:49 UTC (permalink / raw)
  To: mpenttil; +Cc: dri-devel, intel-xe

Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
- [High] mm: hmm: migration range start address truncated on page walk retry
- [High] mm: hmm: unbalanced MMU notifier invalidation when dev_private_owner is NULL
- [High] mm: hmm: NULL pointer dereference in hmm_range_fault_unlocked_timeout
--

commit 7ddb4b8635599a4339659239ade3b1bbc78ceec7
Author: Mika Penttilä <mpenttil@redhat.com>

    mm/hmm: preparations for HMM to participate in migration
    
    For migration to happen after hmm_range_fault(), the vma has to
    retrieved. Luckily, pagewalk already resolves that for us, so
    just have to save it for further use. For migration, mmap_lock
    has to be hold for the whole operation, so vma stays stable.

> diff --git a/mm/hmm.c b/mm/hmm.c
> index 2f1e98c6b6440..be39d2e5403ab 100644
> --- a/mm/hmm.c
> +++ b/mm/hmm.c

[ ... ]

> @@ -400,6 +407,57 @@ static int hmm_vma_handle_absent_pmd(struct mm_walk *walk, unsigned long start,
>  }
>  #endif  /* CONFIG_ARCH_HAS_PMD_SOFTLEAVES */
>  
> +static int hmm_vma_capture_migrate_range(unsigned long start,
> +					 unsigned long end,
> +					 struct mm_walk *walk)
> +{
> +	struct hmm_vma_walk *hmm_vma_walk = walk->private;
> +	struct hmm_range *range = hmm_vma_walk->range;
> +
> +	if (!hmm_select_migrate(range))
> +		return 0;
> +
> +	if (hmm_vma_walk->vma && (hmm_vma_walk->vma != walk->vma))
> +		return -ERANGE;
> +
> +	hmm_vma_walk->vma = walk->vma;
> +	hmm_vma_walk->start = start;

[Severity: High]
Is the tracked start address unconditionally overwritten on every walk restart?

If the walk requires a retry, returning -EBUSY, the outer loop restarts
walk_page_range() from the intermediate faulting address. On retry, could this
clobber the tracking start with the intermediate address, leading to a
truncated start address?

> +	hmm_vma_walk->end = end;
> +
> +	if (end - start > range->end - range->start)
> +		return -ERANGE;
> +
> +	if (!hmm_vma_walk->mmu_range.owner) {

[Severity: High]
Could using the owner field as an initialization flag be problematic here?

If range->dev_private_owner is legitimately NULL, mmu_range.owner becomes
NULL. If a page fault retry occurs, the check passes again, causing a
duplicate mmu_notifier_invalidate_range_start(). Can this cause unbalanced
MMU notifier invalidation?

> +		mmu_notifier_range_init_owner(&hmm_vma_walk->mmu_range, MMU_NOTIFY_MIGRATE, 0,
> +					      walk->vma->vm_mm, start, end,
> +					      range->dev_private_owner);
> +		mmu_notifier_invalidate_range_start(&hmm_vma_walk->mmu_range);
> +	}
> +
> +	return 0;
> +}
> +
> +static void hmm_vma_post_range_fault(struct hmm_vma_walk *hmm_vma_walk)
> +{
> +
> +	struct hmm_range *range = hmm_vma_walk->range;
> +
> +	if (hmm_select_migrate(range) &&
> +	    hmm_vma_walk->mmu_range.owner) {

[Severity: High]
Are we missing a call to mmu_notifier_invalidate_range_end() if the owner is
NULL?

Assuming a NULL owner means the invalidation was never started could
permanently leak the invalidation if dev_private_owner is legitimately NULL.

> +		/*
> +		 *  The migrate_vma path has the following initialized,
> +		 *  so take care of fault path below.
> +		 */
> +		if (range->notifier) {
> +			hmm_fill_migrate_vma(range,
> +					     hmm_vma_walk->vma,
> +					     hmm_vma_walk->start,

[Severity: High]
Will this propagate the truncated start address back to the caller's migration
struct?

If the walk was retried and the start address was clobbered in
hmm_vma_capture_migrate_range(), it could cause the migration setup to
miscalculate the page count and read from the wrong array offset.

> +					     hmm_vma_walk->end);
> +		}
> +		mmu_notifier_invalidate_range_end(&hmm_vma_walk->mmu_range);
> +	}
> +}

[ ... ]

> @@ -694,19 +757,31 @@ static int hmm_range_fault_locked(struct hmm_range *range, bool *locked)
>  {
>  	struct hmm_vma_walk hmm_vma_walk = {
>  		.range = range,
> -		.locked = locked,
> +		.mmlocked = locked,
>  		.last = range->start,
>  	};
> -	struct mm_struct *mm = range->notifier->mm;
> +	/*
> +	 *  Could be serving a device fault or come from migrate
> +	 *  entry point. For the former we have not resolved the vma
> +	 *  yet, and the latter we don't have a notifier (but have a vma).
> +	 *
> +	 */
> +	struct mm_struct *mm = hmm_range_fault_mm(range);

[Severity: High]
How does this API change affect hmm_range_fault_unlocked_timeout()?

The patch modifies the HMM API to allow range->notifier to be NULL for
migration entry points, handling it gracefully here with
hmm_range_fault_mm(). However, looking at hmm_range_fault_unlocked_timeout()
in mm/hmm.c:

int hmm_range_fault_unlocked_timeout(struct hmm_range *range,
                                     unsigned long timeout)
{
        struct mm_struct *mm = range->notifier->mm;

It unconditionally dereferences range->notifier->mm at its very first line. Can
this trigger a NULL pointer dereference if driver code passes a migration range
with a NULL notifier to the unlocked variant?

>  	int ret;
>  
> +	/* Migration is incompatible with mmap lock drop */
> +	if (locked && hmm_select_migrate(range))
> +		return -EINVAL;
> +

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260922053421.4092027-1-mpenttil@redhat.com?part=3

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

* Re: [PATCH v14 04/12] mm/hmm: do the plumbing for HMM to participate in migration
  2026-09-22  5:34 ` [PATCH v14 04/12] mm/hmm: do the plumbing " mpenttil
@ 2026-09-22  5:50   ` sashiko-bot
  0 siblings, 0 replies; 35+ messages in thread
From: sashiko-bot @ 2026-09-22  5:50 UTC (permalink / raw)
  To: mpenttil; +Cc: dri-devel, intel-xe

Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [Critical] mm: missing TLB flush on error path in hmm_vma_walk_pmd()
- [High] mm: unbalanced mmu_notifier_invalidate_range_start() on -EINTR
--

commit 7a6e1d53570e6b253761aafa0e2f9a00e3b80665
Author: Mika Penttilä <mpenttil@redhat.com>
Subject: mm/hmm: do the plumbing for HMM to participate in migration

This commit prepares hmm_range_fault() and pagewalk callbacks for migration
by adding hmm_vma_handle_migrate_prepare_pmd() and managing PMD and PTE
locks across the pagewalk.

diff --git a/mm/hmm.c b/mm/hmm.c
index be39d2e5403ab..4805c88347e67 100644
--- a/mm/hmm.c
+++ b/mm/hmm.c
@@ -398,15 +480,72 @@ static int hmm_vma_handle_absent_pmd(struct mm_walk *walk, unsigned long start,
[ ... ]
> +static int hmm_vma_capture_migrate_range(unsigned long start,
> +					 unsigned long end,
> +					 struct mm_walk *walk)
> +{
> +	struct hmm_vma_walk *hmm_vma_walk = walk->private;
> +	struct hmm_range *range = hmm_vma_walk->range;
[ ... ]
> +	if (!hmm_vma_walk->mmu_range.owner) {
> +		mmu_notifier_range_init_owner(&hmm_vma_walk->mmu_range, MMU_NOTIFY_MIGRATE, 0,
> +					      walk->vma->vm_mm, start, end,
> +					      range->dev_private_owner);
> +		mmu_notifier_invalidate_range_start(&hmm_vma_walk->mmu_range);
> +	}
> +
> +	return 0;
> +}

[Severity: High]
Does this mmu_notifier_invalidate_range_start() become unbalanced if the
fault path is interrupted?

When hmm_vma_capture_migrate_range() sets up the active range, the matching
mmu_notifier_invalidate_range_end() happens in hmm_vma_post_range_fault() at
the end of hmm_range_fault_locked().

However, hmm_range_fault_locked() has an early return for fatal signals:

mm/hmm.c:hmm_range_fault_locked() {
    ...
		if (ret == HMM_FAULT_PENDING) {
			ret = hmm_do_fault(mm, &hmm_vma_walk);
			if (ret == HMM_FAULT_UNLOCKED) {
				if (fatal_signal_pending(current))
					return -EINTR;
    ...

If we take this -EINTR return, does the MMU notifier range remain active
permanently, potentially hanging other invalidation threads?

@@ -465,46 +604,128 @@ static int hmm_vma_walk_pmd(pmd_t *pmdp,
[ ... ]
>  	for (; addr < end; addr += PAGE_SIZE, ptep++, hmm_pfns++) {
> -		int r;
>  
>  		r = hmm_vma_handle_pte(walk, addr, end, pmdp, ptep, hmm_pfns);
>  		if (r) {
> -			/* hmm_vma_handle_pte() did pte_unmap() */
> +			/* hmm_vma_handle_pte() did pte_unmap() / pte_unmap_unlock */
>  			return r;
>  		}

[Severity: Critical]
Can this early return bypass the TLB flush for pages unmapped in previous
iterations?

If hmm_vma_handle_migrate_prepare() sets unmapped = true in an earlier loop
iteration, and then hmm_vma_handle_pte() returns an error on a subsequent
iteration, we immediately return r here.

Does this leave stale TLB entries in place for the previously unmapped pages,
since we skip the flush_tlb_range(walk->vma, start, addr) at the end of the
function?

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260922053421.4092027-1-mpenttil@redhat.com?part=4

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

* Re: [PATCH v14 07/12] mm/hmm: migrate collection in HMM pagewalk - pmd level
  2026-09-22  5:34 ` [PATCH v14 07/12] mm/hmm: migrate collection in HMM pagewalk - pmd level mpenttil
@ 2026-09-22  5:50   ` sashiko-bot
  0 siblings, 0 replies; 35+ messages in thread
From: sashiko-bot @ 2026-09-22  5:50 UTC (permalink / raw)
  To: mpenttil; +Cc: dri-devel, intel-xe

Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
- [Critical] mm: set_pmd_migration_entry() uses wrong subpage for >2MB folios
- [High] mm: pmd_folio() dereferences bogus pointer for non-present PMD leaf entries
- [High] mm: unreachable device-private PMD branch causes infinite fault loops
--

commit 191891c0dfbd0707d81f83e9fa9b79a00e1693ac
Author: Mika Penttilä <mpenttil@redhat.com>

mm/hmm: migrate collection in HMM pagewalk - pmd level

Implement hmm_vma_handle_migrate_prepare_pmd() for HMM pagewalk migration.
It makes migration decisions, possibly splits folios, and inserts migration
pmds.

> diff --git a/mm/hmm.c b/mm/hmm.c
> index b3b79d13c7978..a1459bd34c04e 100644
> --- a/mm/hmm.c
> +++ b/mm/hmm.c
> @@ -552,8 +552,100 @@ static int hmm_vma_handle_migrate_prepare_pmd(const struct mm_walk *walk,
[ ... ]
> +	if (pmd_trans_huge(*pmdp)) {
> +		if (!(minfo & MIGRATE_VMA_SELECT_SYSTEM))
> +			goto out;
> +
> +		folio = pmd_folio(*pmdp);

[Severity: High]
Does this code handle non-present PMD leaf entries correctly?

When pmd_trans_huge() is called, it can return true for non-present PMD leaf
entries like migration or device-private swap entries because they have the
huge bit set. If that happens, this path will unconditionally call
pmd_folio(), which can produce a bogus struct page pointer because swap
metadata is interpreted as a PFN. Could this lead to an invalid memory access
if userspace triggers HMM migration on memory regions with these entries?

> +		if (is_huge_zero_folio(folio))
> +			return hmm_pfns_fill(start, end, hmm_vma_walk, 0);
> +
> +	} else if (!pmd_present(*pmdp)) {

[Severity: High]
Is this branch actually reachable for device-private PMDs?

According to the MM subsystem guide, pmd_present() returns true for
non-present PMD leaf entries, which includes device-private entries. That
would make !pmd_present(*pmdp) evaluate to false. If device-private PMDs
bypass the huge PMD check and fail this condition, they will fall through to
the final else block and return -EBUSY. Returning -EBUSY causes the outer
walk_page_range() loop in hmm_range_fault_locked() to retry the same address
indefinitely. Can this cause a denial of service via an infinite loop?

> +		const softleaf_t entry = softleaf_from_pmd(*pmdp);
[ ... ]
> +	if (thp_migration_supported() &&
> +	    (migrate->flags & MIGRATE_VMA_SELECT_COMPOUND) &&
> +	    (IS_ALIGNED(start, HPAGE_PMD_SIZE) &&
> +	     IS_ALIGNED(end, HPAGE_PMD_SIZE))) {
> +		struct page_vma_mapped_walk pvmw = {
> +			.ptl = hmm_vma_walk->ptl,
> +			.address = start,
> +			.pmd = pmdp,
> +			.vma = walk->vma,
> +		};
> +
> +		hmm_pfn[0] |= HMM_PFN_MIGRATE | HMM_PFN_COMPOUND;
> +
> +		r = set_pmd_migration_entry(&pvmw, folio_page(folio, 0));

[Severity: Critical]
Will this use the correct subpage for folios larger than 2MB?

For file-backed folios that are larger than PMD size (e.g., 1GB), they can
be mapped by multiple PMDs. Using folio_page(folio, 0) always evaluates to
the head page of the large folio, regardless of which 2MB chunk the PMD
actually maps. Since set_pmd_migration_entry() uses page_to_pfn() on the
provided page, all PMD migration entries for the large folio might encode
the PFN of the head chunk. Upon migration restoration, could this silently
corrupt data by mapping all PMDs to the first 2MB chunk's physical memory?
Would it be safer to use pmd_page(*pmdp) here to get the specific subpage?

> +		if (r) {
> +			hmm_pfn[0] &= ~(HMM_PFN_MIGRATE | HMM_PFN_COMPOUND);
> +			r = -ENOENT;  // fallback

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260922053421.4092027-1-mpenttil@redhat.com?part=7

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

* Re: [PATCH v14 08/12] mm/hmm: add lazy MMU mode support for migration in HMM pagewalk
  2026-09-22  5:34 ` [PATCH v14 08/12] mm/hmm: add lazy MMU mode support for migration in HMM pagewalk mpenttil
@ 2026-09-22  5:51   ` sashiko-bot
  0 siblings, 0 replies; 35+ messages in thread
From: sashiko-bot @ 2026-09-22  5:51 UTC (permalink / raw)
  To: mpenttil; +Cc: dri-devel, intel-xe

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] mm: missing TLB flush on hmm_vma_handle_pte error path during migration
--

commit cabe68b53951d20b6fe5d611bd88bef73ab4ed62
Author: Mika Penttilä <mpenttil@redhat.com>

mm/hmm: add lazy MMU mode support for migration in HMM pagewalk

This commit adds calls to lazy_mmu_mode_enable() and lazy_mmu_mode_disable()
while performing migration in the HMM pagewalk paths.

> diff --git a/mm/hmm.c b/mm/hmm.c
> index a1459bd34c04e..a67a23e545512 100644
> --- a/mm/hmm.c
> +++ b/mm/hmm.c

[ ... ]

> @@ -1178,6 +1184,7 @@ static int hmm_vma_walk_pmd(pmd_t *pmdp,
>  		flush_tlb_range(walk->vma, start, addr);

[Severity: High]
Does this skip a necessary TLB flush on the error path during migration?

If hmm_range_fault() with migration enabled successfully unmaps a page in the
loop of hmm_vma_walk_pmd(), and then in the next loop iteration (for the same
PMD), hmm_vma_handle_pte() encounters a page requiring a fault, it drops the
PTE lock and returns an error:

hmm_vma_walk_pmd() {
        ...
        for (; addr < end; addr += PAGE_SIZE, ptep++, hmm_pfns++) {
                r = hmm_vma_handle_pte(walk, addr, end, pmdp, ptep, hmm_pfns);
                if (r) {
                        /* hmm_vma_handle_pte() did pte_unmap() / pte_unmap_unlock */
                        return r;
                }
        ...
}

Because the loop terminates with an immediate return, it completely bypasses
the flush_tlb_range() check shown below. Could this leave stale TLB entries
mapping old physical pages despite the page tables pointing to migration
entries, potentially causing data corruption if writes to the old page are
lost?

>  
>  	if (hmm_vma_walk->ptelocked) {
> +		lazy_mmu_mode_disable();
>  		pte_unmap_unlock(ptep - 1, hmm_vma_walk->ptl);
>  		hmm_vma_walk->ptelocked = false;
>  	} else {

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260922053421.4092027-1-mpenttil@redhat.com?part=8

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

* Re: [PATCH v14 10/12] mm: enable device page migration from HMM pagewalk
  2026-09-22  5:34 ` [PATCH v14 10/12] mm: enable device page migration from " mpenttil
@ 2026-09-22  5:58   ` sashiko-bot
  0 siblings, 0 replies; 35+ messages in thread
From: sashiko-bot @ 2026-09-22  5:58 UTC (permalink / raw)
  To: mpenttil; +Cc: dri-devel, intel-xe

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] mm: unbalanced mmu_notifier in hmm_range_fault during migration
--

commit 3e05399d761177583ed386d43f42e228c070f447
Author: Mika Penttilä <mpenttil@redhat.com>

mm: enable device page migration from HMM pagewalk

This patch integrates HMM pagewalk machinery into the first phase of device
page migration by enabling migration in hmm_range_fault(). It updates
migrate_vma_setup() to use the HMM pagewalk path and removes the older
migrate_vma_collect() paths. Two new flags, MIGRATE_VMA_FAULT and
MIGRATE_VMA_WRITE, are introduced for faulting missing pages and requesting
write access.

> diff --git a/mm/migrate_device.c b/mm/migrate_device.c
> index 43e571e82ccad..1e1a592e12672 100644
> --- a/mm/migrate_device.c
> +++ b/mm/migrate_device.c
[ ... ]
> @@ -739,10 +241,20 @@ static void migrate_vma_unmap(struct migrate_vma *migrate)
>   */
>  int migrate_vma_setup(struct migrate_vma *args)
>  {
> +	int ret;
>  	long nr_pages = (args->end - args->start) >> PAGE_SHIFT;
> +	struct hmm_range range = {
> +		.notifier = NULL,
> +		.hmm_pfns = args->src,
> +		.dev_private_owner = args->pgmap_owner,

[Severity: High]
Does this code cause a permanent MMU notifier imbalance when args->pgmap_owner
is NULL?

If a caller invokes migrate_vma_setup() with args->pgmap_owner set to NULL
(which is standard for migrations not involving device-private memory, such as
PowerPC KVM secure guest page-in), range.dev_private_owner is also NULL.

In mm/hmm.c:hmm_vma_capture_migrate_range(), the code checks:

	if (!hmm_vma_walk->mmu_range.owner) {
		mmu_notifier_range_init_owner(&hmm_vma_walk->mmu_range, MMU_NOTIFY_MIGRATE, 0,
					      walk->vma->vm_mm, start, end,
					      range->dev_private_owner);
		mmu_notifier_invalidate_range_start(&hmm_vma_walk->mmu_range);
	}

Because mmu_range is zero-initialized, this condition is true. It calls
mmu_notifier_range_init_owner(), which assigns the NULL dev_private_owner
to hmm_vma_walk->mmu_range.owner. mmu_notifier_invalidate_range_start() is
then called.

Additionally, if the range spans multiple VMAs, invalidate_range_start is
called multiple times because the sentinel remains NULL.

Later, in mm/hmm.c:hmm_vma_post_range_fault():

	if (hmm_select_migrate(range) &&
	    hmm_vma_walk->mmu_range.owner) {
		mmu_notifier_invalidate_range_end(&hmm_vma_walk->mmu_range);
	}

Because mmu_range.owner remains NULL, this condition evaluates to false,
completely skipping the required mmu_notifier_invalidate_range_end() call.

A skipped invalidate_range_end() leaves the invalidation count permanently
elevated, causing any subsequent operation on that memory range requiring
mmu_interval_read_retry() or VMA teardown to block indefinitely.

> +		.migrate = args,
> +		.default_flags = HMM_PFN_REQ_MIGRATE
> +	};
>  
>  	args->start &= PAGE_MASK;
>  	args->end &= PAGE_MASK;
[ ... ]

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260922053421.4092027-1-mpenttil@redhat.com?part=10

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

* ✗ CI.checksparse: warning for Migrate on fault for device pages (rev6)
  2026-09-22  5:34 [PATCH 00/12] [PATCH v14 00/12] migrate on fault for device pages mpenttil
                   ` (13 preceding siblings ...)
  2026-09-22  5:43 ` ✓ CI.KUnit: success " Patchwork
@ 2026-09-22  6:00 ` Patchwork
  2026-09-22  7:08 ` ✓ Xe.CI.BAT: success " Patchwork
                   ` (2 subsequent siblings)
  17 siblings, 0 replies; 35+ messages in thread
From: Patchwork @ 2026-09-22  6:00 UTC (permalink / raw)
  To: mpenttil; +Cc: intel-xe

== Series Details ==

Series: Migrate on fault for device pages (rev6)
URL   : https://patchwork.freedesktop.org/series/165953/
State : warning

== Summary ==

+ trap cleanup EXIT
+ KERNEL=/kernel
+ MT=/root/linux/maintainer-tools
+ git clone https://gitlab.freedesktop.org/drm/maintainer-tools /root/linux/maintainer-tools
Cloning into '/root/linux/maintainer-tools'...
warning: redirecting to https://gitlab.freedesktop.org/drm/maintainer-tools.git/
+ make -C /root/linux/maintainer-tools
make: Entering directory '/root/linux/maintainer-tools'
cc -O2 -g -Wextra -o remap-log remap-log.c
make: Leaving directory '/root/linux/maintainer-tools'
+ cd /kernel
+ git config --global --add safe.directory /kernel
+ /root/linux/maintainer-tools/dim sparse --fast dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04
Sparse version: 0.6.4 (Ubuntu: 0.6.4-4ubuntu3)
Fast mode used, each commit won't be checked separately.
+/kernel/Makefile:1300: C=1 specified, but sparse is not available or not up to date

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



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

* Re: [PATCH v14 11/12] lib/test_hmm: add a new testcase for the migrate on fault
  2026-09-22  5:34 ` [PATCH v14 11/12] lib/test_hmm: add a new testcase for the migrate on fault mpenttil
@ 2026-09-22  6:09   ` sashiko-bot
  0 siblings, 0 replies; 35+ messages in thread
From: sashiko-bot @ 2026-09-22  6:09 UTC (permalink / raw)
  To: mpenttil; +Cc: dri-devel, intel-xe

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] mm: test_hmm: UAF due to concurrent unmaps during migration
--

commit 561fbddf4a910a84fca4e2648f745dbccb247398
Author: Mika Penttilä <mpenttil@redhat.com>

lib/test_hmm: add a new testcase for the migrate on fault

This commit enhances the hmm test driver (lib/test_hmm) with a new test
case for migrate on fault. It adds a new ioctl and test code to fault and
migrate anonymous memory to device private memory.

> diff --git a/lib/test_hmm.c b/lib/test_hmm.c
> index cd88e8177d0ab..b39522c05d832 100644
> --- a/lib/test_hmm.c
> +++ b/lib/test_hmm.c
[ ... ]
> @@ -382,7 +390,9 @@ static int dmirror_range_fault(struct dmirror *dmirror,
>  		break;
>  	}
>  
> -	ret = dmirror_do_fault(dmirror, range);
> +	/* update device page table after migration */
> +	if (!migrate)
> +		ret = dmirror_do_fault(dmirror, range);
>  
>  	mutex_unlock(&dmirror->mutex);
>  out:

[Severity: High]
Does skipping the page table update here leave us vulnerable to concurrent
unmaps during migration?

When migrate is true, the dmirror->mutex is dropped here without verifying
the final sequence or updating the device page table. This opens a race
window.

[ ... ]
> @@ -1377,6 +1387,114 @@ static int dmirror_migrate_to_device(struct dmirror *dmirror,
>  	return ret;
>  }
>  
> +static int do_fault_and_migrate(struct dmirror *dmirror, struct hmm_range *range)
> +{
> +	struct migrate_vma *migrate = range->migrate;
> +	int ret;
> +
> +	mmap_read_lock(dmirror->notifier.mm);
> +
> +	/* Fault-in pages for migration */
> +	ret = dmirror_range_fault(dmirror, range);
[ ... ]
> +	pr_debug("Migrating from sys mem to device mem\n");
> +
> +	dmirror_migrate_alloc_and_copy(migrate, dmirror);
> +	migrate_vma_pages(migrate);
> +	dmirror_migrate_finalize_and_map(migrate, dmirror);
> +	migrate_vma_finalize(migrate);

[Severity: High]
Can this sequence lead to a use-after-free of device pages if a concurrent
unmap occurs after we dropped the mutex in dmirror_range_fault()?

While mmap_read_lock() is held here, a concurrent madvise(MADV_DONTNEED)
could still execute (since it only requires the read lock or per-VMA lock)
and clear the newly installed migration PTEs, triggering the MMU interval
notifier.

Since the interval notifier invalidation would see an empty dmirror->pt (as
we haven't mapped the pages yet), it would take no action. 

Then, dmirror_migrate_finalize_and_map() inserts the newly allocated device
pages into dmirror->pt blindly, without re-checking
mmu_interval_read_retry(). 

When migrate_vma_finalize() runs, it would fail to map the device page into
the CPU page table because the migration PTE is gone, dropping the final
reference and freeing the page while it is still mapped in the device
page table.

> +out:
> +	mmap_read_unlock(dmirror->notifier.mm);
> +	return ret;
> +}

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260922053421.4092027-1-mpenttil@redhat.com?part=11

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

* ✓ Xe.CI.BAT: success for Migrate on fault for device pages (rev6)
  2026-09-22  5:34 [PATCH 00/12] [PATCH v14 00/12] migrate on fault for device pages mpenttil
                   ` (14 preceding siblings ...)
  2026-09-22  6:00 ` ✗ CI.checksparse: warning " Patchwork
@ 2026-09-22  7:08 ` Patchwork
  2026-09-22 15:03 ` ✗ Xe.CI.FULL: failure " Patchwork
  2026-09-23  2:27 ` [PATCH 00/12] [PATCH v14 00/12] migrate on fault for device pages Andrew Morton
  17 siblings, 0 replies; 35+ messages in thread
From: Patchwork @ 2026-09-22  7:08 UTC (permalink / raw)
  To: mpenttil; +Cc: intel-xe

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

== Series Details ==

Series: Migrate on fault for device pages (rev6)
URL   : https://patchwork.freedesktop.org/series/165953/
State : success

== Summary ==

CI Bug Log - changes from xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04_BAT -> xe-pw-165953v6_BAT
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  

Participating hosts (15 -> 14)
------------------------------

  Missing    (1): bat-adlp-7 

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

  Here are the changes found in xe-pw-165953v6_BAT that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@runner@aborted:
    - bat-wcl-1:          NOTRUN -> [FAIL][1] ([Intel XE#9062])
   [1]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/bat-wcl-1/igt@runner@aborted.html

  * igt@xe_exec_fault_mode@twice-userptr-rebind-prefetch:
    - bat-bmg-1:          [PASS][2] -> [DMESG-WARN][3] ([Intel XE#9331])
   [2]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/bat-bmg-1/igt@xe_exec_fault_mode@twice-userptr-rebind-prefetch.html
   [3]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/bat-bmg-1/igt@xe_exec_fault_mode@twice-userptr-rebind-prefetch.html

  
#### Possible fixes ####

  * igt@xe_exec_fault_mode@twice-userptr-invalidate-prefetch:
    - bat-bmg-1:          [DMESG-WARN][4] ([Intel XE#9331]) -> [PASS][5]
   [4]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/bat-bmg-1/igt@xe_exec_fault_mode@twice-userptr-invalidate-prefetch.html
   [5]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/bat-bmg-1/igt@xe_exec_fault_mode@twice-userptr-invalidate-prefetch.html

  
  [Intel XE#9062]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9062
  [Intel XE#9331]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9331


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

  * Linux: xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04 -> xe-pw-165953v6

  IGT_9105: 9105
  xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04: dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04
  xe-pw-165953v6: 165953v6

== Logs ==

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

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

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

* ✗ Xe.CI.FULL: failure for Migrate on fault for device pages (rev6)
  2026-09-22  5:34 [PATCH 00/12] [PATCH v14 00/12] migrate on fault for device pages mpenttil
                   ` (15 preceding siblings ...)
  2026-09-22  7:08 ` ✓ Xe.CI.BAT: success " Patchwork
@ 2026-09-22 15:03 ` Patchwork
  2026-09-23  2:27 ` [PATCH 00/12] [PATCH v14 00/12] migrate on fault for device pages Andrew Morton
  17 siblings, 0 replies; 35+ messages in thread
From: Patchwork @ 2026-09-22 15:03 UTC (permalink / raw)
  To: mpenttil; +Cc: intel-xe

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

== Series Details ==

Series: Migrate on fault for device pages (rev6)
URL   : https://patchwork.freedesktop.org/series/165953/
State : failure

== Summary ==

CI Bug Log - changes from xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04_FULL -> xe-pw-165953v6_FULL
====================================================

Summary
-------

  **FAILURE**

  Serious unknown changes coming with xe-pw-165953v6_FULL absolutely need to be
  verified manually.
  
  If you think the reported changes have nothing to do with the changes
  introduced in xe-pw-165953v6_FULL, please notify your bug team (I915-ci-infra@lists.freedesktop.org) to allow them
  to document this new failure mode, which will reduce false positives in CI.

  

Participating hosts (3 -> 3)
------------------------------

  No changes in participating hosts

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

  Here are the unknown changes that may have been introduced in xe-pw-165953v6_FULL:

### IGT changes ###

#### Possible regressions ####

  * igt@kms_async_flips@async-flip-dpms:
    - shard-ptl:          [PASS][1] -> [SKIP][2] +4 other tests skip
   [1]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-ptl-4/igt@kms_async_flips@async-flip-dpms.html
   [2]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-ptl-8/igt@kms_async_flips@async-flip-dpms.html

  * igt@xe_pm@d3hot-mmap-system:
    - shard-ptl:          [PASS][3] -> [FAIL][4]
   [3]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-ptl-4/igt@xe_pm@d3hot-mmap-system.html
   [4]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-ptl-8/igt@xe_pm@d3hot-mmap-system.html

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

  Here are the changes found in xe-pw-165953v6_FULL that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@core_hotunplug@hotrebind-lateclose-with-load:
    - shard-bmg:          [PASS][5] -> [ABORT][6] ([Intel XE#8007])
   [5]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-bmg-7/igt@core_hotunplug@hotrebind-lateclose-with-load.html
   [6]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-9/igt@core_hotunplug@hotrebind-lateclose-with-load.html

  * igt@intel_hwmon@hwmon-read:
    - shard-lnl:          NOTRUN -> [SKIP][7] ([Intel XE#1125] / [Intel XE#7312])
   [7]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-5/igt@intel_hwmon@hwmon-read.html

  * igt@kms_atomic_transition@plane-all-modeset-transition@pipe-a-dp-2:
    - shard-bmg:          [PASS][8] -> [FAIL][9] ([Intel XE#8098]) +1 other test fail
   [8]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-bmg-7/igt@kms_atomic_transition@plane-all-modeset-transition@pipe-a-dp-2.html
   [9]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-9/igt@kms_atomic_transition@plane-all-modeset-transition@pipe-a-dp-2.html

  * igt@kms_big_fb@linear-16bpp-rotate-270:
    - shard-lnl:          NOTRUN -> [SKIP][10] ([Intel XE#1407])
   [10]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-5/igt@kms_big_fb@linear-16bpp-rotate-270.html

  * igt@kms_big_fb@linear-8bpp-rotate-90:
    - shard-bmg:          NOTRUN -> [SKIP][11] ([Intel XE#2327]) +3 other tests skip
   [11]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@kms_big_fb@linear-8bpp-rotate-90.html

  * igt@kms_big_fb@linear-max-hw-stride-64bpp-rotate-180-hflip:
    - shard-bmg:          NOTRUN -> [SKIP][12] ([Intel XE#7059] / [Intel XE#7085])
   [12]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@kms_big_fb@linear-max-hw-stride-64bpp-rotate-180-hflip.html
    - shard-lnl:          NOTRUN -> [SKIP][13] ([Intel XE#7059] / [Intel XE#7085])
   [13]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-5/igt@kms_big_fb@linear-max-hw-stride-64bpp-rotate-180-hflip.html

  * igt@kms_big_fb@yf-tiled-32bpp-rotate-0:
    - shard-bmg:          NOTRUN -> [SKIP][14] ([Intel XE#1124]) +3 other tests skip
   [14]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@kms_big_fb@yf-tiled-32bpp-rotate-0.html

  * igt@kms_big_fb@yf-tiled-max-hw-stride-64bpp-rotate-180-hflip-async-flip:
    - shard-lnl:          NOTRUN -> [SKIP][15] ([Intel XE#1124]) +5 other tests skip
   [15]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-1/igt@kms_big_fb@yf-tiled-max-hw-stride-64bpp-rotate-180-hflip-async-flip.html

  * igt@kms_bw@connected-linear-tiling-3-displays-target-3840x2160p:
    - shard-lnl:          NOTRUN -> [SKIP][16] ([Intel XE#7679])
   [16]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-5/igt@kms_bw@connected-linear-tiling-3-displays-target-3840x2160p.html
    - shard-bmg:          NOTRUN -> [SKIP][17] ([Intel XE#7679])
   [17]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@kms_bw@connected-linear-tiling-3-displays-target-3840x2160p.html

  * igt@kms_bw@linear-tiling-3-displays-target-1920x1080p:
    - shard-lnl:          NOTRUN -> [SKIP][18] ([Intel XE#367])
   [18]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-5/igt@kms_bw@linear-tiling-3-displays-target-1920x1080p.html
    - shard-bmg:          NOTRUN -> [SKIP][19] ([Intel XE#367]) +1 other test skip
   [19]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@kms_bw@linear-tiling-3-displays-target-1920x1080p.html

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

  * igt@kms_ccs@crc-primary-rotation-180-4-tiled-mtl-rc-ccs:
    - shard-lnl:          NOTRUN -> [SKIP][21] ([Intel XE#2887]) +3 other tests skip
   [21]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-7/igt@kms_ccs@crc-primary-rotation-180-4-tiled-mtl-rc-ccs.html

  * igt@kms_ccs@crc-primary-suspend-4-tiled-lnl-ccs@pipe-a-dp-2:
    - shard-bmg:          NOTRUN -> [SKIP][22] ([Intel XE#2652]) +17 other tests skip
   [22]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@kms_ccs@crc-primary-suspend-4-tiled-lnl-ccs@pipe-a-dp-2.html

  * igt@kms_ccs@crc-primary-suspend-yf-tiled-ccs:
    - shard-bmg:          NOTRUN -> [SKIP][23] ([Intel XE#3432])
   [23]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@kms_ccs@crc-primary-suspend-yf-tiled-ccs.html

  * igt@kms_chamelium_color@degamma:
    - shard-bmg:          NOTRUN -> [SKIP][24] ([Intel XE#2325] / [Intel XE#7358])
   [24]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@kms_chamelium_color@degamma.html
    - shard-lnl:          NOTRUN -> [SKIP][25] ([Intel XE#306] / [Intel XE#7358]) +1 other test skip
   [25]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-5/igt@kms_chamelium_color@degamma.html

  * igt@kms_chamelium_color_pipeline@plane-fixed-matrix-yuv-rgb-bt601-lim:
    - shard-bmg:          NOTRUN -> [SKIP][26] ([Intel XE#7358]) +1 other test skip
   [26]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@kms_chamelium_color_pipeline@plane-fixed-matrix-yuv-rgb-bt601-lim.html

  * igt@kms_chamelium_frames@hdmi-crc-single:
    - shard-bmg:          NOTRUN -> [SKIP][27] ([Intel XE#2252]) +2 other tests skip
   [27]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@kms_chamelium_frames@hdmi-crc-single.html

  * igt@kms_chamelium_hpd@hdmi-hpd-storm-disable:
    - shard-lnl:          NOTRUN -> [SKIP][28] ([Intel XE#373]) +2 other tests skip
   [28]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-7/igt@kms_chamelium_hpd@hdmi-hpd-storm-disable.html

  * igt@kms_color_pipeline@plane-lut1d-post-ctm3x4@pipe-a-plane-4:
    - shard-lnl:          NOTRUN -> [SKIP][29] ([Intel XE#6969]) +5 other tests skip
   [29]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-5/igt@kms_color_pipeline@plane-lut1d-post-ctm3x4@pipe-a-plane-4.html

  * igt@kms_color_pipeline@plane-lut1d-post-ctm3x4@pipe-b-plane-4:
    - shard-bmg:          NOTRUN -> [SKIP][30] ([Intel XE#6969]) +7 other tests skip
   [30]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@kms_color_pipeline@plane-lut1d-post-ctm3x4@pipe-b-plane-4.html

  * igt@kms_content_protection@atomic-dpms-hdcp14:
    - shard-lnl:          NOTRUN -> [SKIP][31] ([Intel XE#7642])
   [31]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-5/igt@kms_content_protection@atomic-dpms-hdcp14.html

  * igt@kms_content_protection@atomic-dpms-hdcp14@pipe-a-dp-2:
    - shard-bmg:          NOTRUN -> [FAIL][32] ([Intel XE#3304] / [Intel XE#7374]) +1 other test fail
   [32]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@kms_content_protection@atomic-dpms-hdcp14@pipe-a-dp-2.html

  * igt@kms_content_protection@dp-mst-lic-type-0:
    - shard-bmg:          NOTRUN -> [SKIP][33] ([Intel XE#2390] / [Intel XE#6974])
   [33]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@kms_content_protection@dp-mst-lic-type-0.html

  * igt@kms_cursor_crc@cursor-offscreen-32x32:
    - shard-bmg:          NOTRUN -> [SKIP][34] ([Intel XE#2320]) +4 other tests skip
   [34]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@kms_cursor_crc@cursor-offscreen-32x32.html
    - shard-lnl:          NOTRUN -> [SKIP][35] ([Intel XE#1424]) +2 other tests skip
   [35]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-5/igt@kms_cursor_crc@cursor-offscreen-32x32.html

  * igt@kms_dp_linktrain_fallback@dsc-fallback:
    - shard-bmg:          NOTRUN -> [SKIP][36] ([Intel XE#4331] / [Intel XE#7227])
   [36]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-2/igt@kms_dp_linktrain_fallback@dsc-fallback.html

  * igt@kms_dp_linktrain_fallback@uhbr-to-hbr-fallback:
    - shard-lnl:          NOTRUN -> [SKIP][37] ([Intel XE#9009])
   [37]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-7/igt@kms_dp_linktrain_fallback@uhbr-to-hbr-fallback.html

  * igt@kms_dsc@dsc-with-output-formats:
    - shard-lnl:          NOTRUN -> [SKIP][38] ([Intel XE#8265])
   [38]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-7/igt@kms_dsc@dsc-with-output-formats.html

  * igt@kms_dsc@dsc-with-output-formats-bigjoiner:
    - shard-bmg:          NOTRUN -> [SKIP][39] ([Intel XE#8265]) +2 other tests skip
   [39]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@kms_dsc@dsc-with-output-formats-bigjoiner.html

  * igt@kms_fbc_dirty_rect@fbc-dirty-rectangle-different-formats:
    - shard-bmg:          NOTRUN -> [SKIP][40] ([Intel XE#4422] / [Intel XE#7442])
   [40]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@kms_fbc_dirty_rect@fbc-dirty-rectangle-different-formats.html

  * igt@kms_flip@2x-flip-vs-dpms-on-nop-interruptible:
    - shard-lnl:          NOTRUN -> [SKIP][41] ([Intel XE#1421]) +1 other test skip
   [41]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-5/igt@kms_flip@2x-flip-vs-dpms-on-nop-interruptible.html

  * igt@kms_flip@flip-vs-expired-vblank@b-edp1:
    - shard-ptl:          [PASS][42] -> [FAIL][43] ([Intel XE#3321]) +1 other test fail
   [42]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-ptl-5/igt@kms_flip@flip-vs-expired-vblank@b-edp1.html
   [43]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-ptl-7/igt@kms_flip@flip-vs-expired-vblank@b-edp1.html

  * igt@kms_flip@flip-vs-suspend:
    - shard-bmg:          [PASS][44] -> [INCOMPLETE][45] ([Intel XE#2049] / [Intel XE#2597] / [Intel XE#8155]) +1 other test incomplete
   [44]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-bmg-1/igt@kms_flip@flip-vs-suspend.html
   [45]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-6/igt@kms_flip@flip-vs-suspend.html

  * igt@kms_flip@wf_vblank-ts-check@b-dp2:
    - shard-bmg:          [PASS][46] -> [FAIL][47] ([Intel XE#3098]) +1 other test fail
   [46]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-bmg-2/igt@kms_flip@wf_vblank-ts-check@b-dp2.html
   [47]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-3/igt@kms_flip@wf_vblank-ts-check@b-dp2.html

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

  * igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-64bpp-yftile-upscaling:
    - shard-bmg:          NOTRUN -> [SKIP][49] ([Intel XE#7178] / [Intel XE#7351])
   [49]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-10/igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-64bpp-yftile-upscaling.html

  * igt@kms_flip_scaled_crc@flip-64bpp-linear-to-32bpp-linear-downscaling:
    - shard-lnl:          NOTRUN -> [SKIP][50] ([Intel XE#1397] / [Intel XE#1745] / [Intel XE#7385] / [Intel XE#9144])
   [50]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-5/igt@kms_flip_scaled_crc@flip-64bpp-linear-to-32bpp-linear-downscaling.html

  * igt@kms_flip_scaled_crc@flip-64bpp-linear-to-32bpp-linear-downscaling@pipe-a-default-mode:
    - shard-lnl:          NOTRUN -> [SKIP][51] ([Intel XE#1397] / [Intel XE#7385] / [Intel XE#9144])
   [51]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-5/igt@kms_flip_scaled_crc@flip-64bpp-linear-to-32bpp-linear-downscaling@pipe-a-default-mode.html

  * igt@kms_frontbuffer_tracking@drrs-argb161616f-draw-blt:
    - shard-bmg:          NOTRUN -> [SKIP][52] ([Intel XE#7061] / [Intel XE#7356]) +4 other tests skip
   [52]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@kms_frontbuffer_tracking@drrs-argb161616f-draw-blt.html
    - shard-lnl:          NOTRUN -> [SKIP][53] ([Intel XE#7061] / [Intel XE#7356]) +1 other test skip
   [53]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-5/igt@kms_frontbuffer_tracking@drrs-argb161616f-draw-blt.html

  * igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-draw-render:
    - shard-bmg:          NOTRUN -> [SKIP][54] ([Intel XE#4141]) +6 other tests skip
   [54]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-10/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-indfb-scaledprimary:
    - shard-lnl:          NOTRUN -> [SKIP][55] ([Intel XE#6312] / [Intel XE#651]) +5 other tests skip
   [55]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-1/igt@kms_frontbuffer_tracking@fbcdrrs-indfb-scaledprimary.html

  * igt@kms_frontbuffer_tracking@fbcdrrshdr-stridechange:
    - shard-bmg:          NOTRUN -> [SKIP][56] ([Intel XE#2311]) +23 other tests skip
   [56]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@kms_frontbuffer_tracking@fbcdrrshdr-stridechange.html
    - shard-lnl:          NOTRUN -> [SKIP][57] ([Intel XE#6312]) +4 other tests skip
   [57]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-5/igt@kms_frontbuffer_tracking@fbcdrrshdr-stridechange.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-pri-indfb-draw-blt:
    - shard-lnl:          NOTRUN -> [SKIP][58] ([Intel XE#656] / [Intel XE#7905]) +13 other tests skip
   [58]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-5/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-pri-indfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@fbcpsr-tiling-y:
    - shard-lnl:          NOTRUN -> [SKIP][59] ([Intel XE#1469] / [Intel XE#7399])
   [59]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-7/igt@kms_frontbuffer_tracking@fbcpsr-tiling-y.html

  * igt@kms_frontbuffer_tracking@fbcpsrhdr-2p-scndscrn-shrfb-msflip-blt:
    - shard-lnl:          NOTRUN -> [SKIP][60] ([Intel XE#7905]) +19 other tests skip
   [60]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-5/igt@kms_frontbuffer_tracking@fbcpsrhdr-2p-scndscrn-shrfb-msflip-blt.html

  * igt@kms_frontbuffer_tracking@hdr-abgr161616f-draw-blt:
    - shard-bmg:          NOTRUN -> [SKIP][61] ([Intel XE#7061]) +1 other test skip
   [61]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@kms_frontbuffer_tracking@hdr-abgr161616f-draw-blt.html

  * igt@kms_frontbuffer_tracking@psrhdr-1p-primscrn-indfb-plflip-blt:
    - shard-lnl:          NOTRUN -> [SKIP][62] ([Intel XE#7865]) +13 other tests skip
   [62]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-5/igt@kms_frontbuffer_tracking@psrhdr-1p-primscrn-indfb-plflip-blt.html

  * igt@kms_frontbuffer_tracking@psrhdr-1p-primscrn-pri-shrfb-draw-render:
    - shard-bmg:          NOTRUN -> [SKIP][63] ([Intel XE#2313]) +23 other tests skip
   [63]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@kms_frontbuffer_tracking@psrhdr-1p-primscrn-pri-shrfb-draw-render.html

  * igt@kms_frontbuffer_tracking@psrhdr-abgr161616f-draw-mmap-wc:
    - shard-lnl:          NOTRUN -> [SKIP][64] ([Intel XE#7061]) +1 other test skip
   [64]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-1/igt@kms_frontbuffer_tracking@psrhdr-abgr161616f-draw-mmap-wc.html

  * igt@kms_hdmi_audio_bw@suspend-disk-audio-recovery:
    - shard-bmg:          NOTRUN -> [FAIL][65] ([Intel XE#9346])
   [65]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@kms_hdmi_audio_bw@suspend-disk-audio-recovery.html

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

  * igt@kms_plane@pixel-format-y-tiled-gen12-mc-ccs-modifier-source-clamping:
    - shard-bmg:          NOTRUN -> [SKIP][67] ([Intel XE#7283]) +3 other tests skip
   [67]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@kms_plane@pixel-format-y-tiled-gen12-mc-ccs-modifier-source-clamping.html

  * igt@kms_plane_scaling@2x-scaler-multi-pipe:
    - shard-lnl:          NOTRUN -> [SKIP][68] ([Intel XE#309] / [Intel XE#7343])
   [68]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-5/igt@kms_plane_scaling@2x-scaler-multi-pipe.html

  * igt@kms_plane_scaling@planes-unity-scaling-downscale-factor-0-5@pipe-a:
    - shard-lnl:          NOTRUN -> [SKIP][69] ([Intel XE#2763] / [Intel XE#6886]) +3 other tests skip
   [69]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-5/igt@kms_plane_scaling@planes-unity-scaling-downscale-factor-0-5@pipe-a.html

  * igt@kms_psr2_sf@fbc-pr-overlay-plane-update-sf-dmg-area:
    - shard-bmg:          NOTRUN -> [SKIP][70] ([Intel XE#1489])
   [70]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@kms_psr2_sf@fbc-pr-overlay-plane-update-sf-dmg-area.html

  * igt@kms_psr2_sf@pr-plane-move-sf-dmg-area:
    - shard-lnl:          NOTRUN -> [SKIP][71] ([Intel XE#2893] / [Intel XE#7304]) +1 other test skip
   [71]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-7/igt@kms_psr2_sf@pr-plane-move-sf-dmg-area.html

  * igt@kms_psr2_su@page_flip-p010:
    - shard-bmg:          NOTRUN -> [SKIP][72] ([Intel XE#2387] / [Intel XE#7429])
   [72]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@kms_psr2_su@page_flip-p010.html
    - shard-lnl:          NOTRUN -> [SKIP][73] ([Intel XE#1128] / [Intel XE#7413])
   [73]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-5/igt@kms_psr2_su@page_flip-p010.html

  * igt@kms_psr@fbc-psr-suspend:
    - shard-bmg:          NOTRUN -> [SKIP][74] ([Intel XE#2234] / [Intel XE#2850]) +3 other tests skip
   [74]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@kms_psr@fbc-psr-suspend.html

  * igt@kms_psr@fbc-psr2-basic:
    - shard-lnl:          NOTRUN -> [SKIP][75] ([Intel XE#1406] / [Intel XE#7345]) +1 other test skip
   [75]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-1/igt@kms_psr@fbc-psr2-basic.html

  * igt@kms_psr@fbc-psr2-basic@edp-1:
    - shard-lnl:          NOTRUN -> [SKIP][76] ([Intel XE#1406] / [Intel XE#4609] / [Intel XE#7345]) +1 other test skip
   [76]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-1/igt@kms_psr@fbc-psr2-basic@edp-1.html

  * igt@kms_psr@pr-no-drrs:
    - shard-lnl:          NOTRUN -> [SKIP][77] ([Intel XE#1406]) +2 other tests skip
   [77]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-5/igt@kms_psr@pr-no-drrs.html

  * igt@kms_rotation_crc@bad-pixel-format:
    - shard-bmg:          NOTRUN -> [SKIP][78] ([Intel XE#3904] / [Intel XE#7342])
   [78]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@kms_rotation_crc@bad-pixel-format.html
    - shard-lnl:          NOTRUN -> [SKIP][79] ([Intel XE#3414] / [Intel XE#3904] / [Intel XE#7342])
   [79]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-5/igt@kms_rotation_crc@bad-pixel-format.html

  * igt@kms_sharpness_filter@filter-dpms:
    - shard-bmg:          NOTRUN -> [SKIP][80] ([Intel XE#6503])
   [80]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@kms_sharpness_filter@filter-dpms.html

  * igt@kms_tiled_display@basic-test-pattern:
    - shard-bmg:          NOTRUN -> [FAIL][81] ([Intel XE#1729] / [Intel XE#7424])
   [81]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-10/igt@kms_tiled_display@basic-test-pattern.html

  * igt@kms_vrr@flip-suspend@pipe-a-edp-1:
    - shard-ptl:          [PASS][82] -> [FAIL][83] ([Intel XE#4227] / [Intel XE#7397]) +1 other test fail
   [82]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-ptl-5/igt@kms_vrr@flip-suspend@pipe-a-edp-1.html
   [83]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-ptl-7/igt@kms_vrr@flip-suspend@pipe-a-edp-1.html

  * igt@xe_evict@evict-beng-mixed-many-threads-small:
    - shard-bmg:          [PASS][84] -> [INCOMPLETE][85] ([Intel XE#6321] / [Intel XE#8355])
   [84]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-bmg-2/igt@xe_evict@evict-beng-mixed-many-threads-small.html
   [85]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-3/igt@xe_evict@evict-beng-mixed-many-threads-small.html

  * igt@xe_evict@evict-beng-mixed-threads-large-multi-vm:
    - shard-lnl:          NOTRUN -> [SKIP][86] ([Intel XE#6540] / [Intel XE#688]) +1 other test skip
   [86]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-5/igt@xe_evict@evict-beng-mixed-threads-large-multi-vm.html

  * igt@xe_evict@evict-threads-small-multi-queue:
    - shard-bmg:          NOTRUN -> [SKIP][87] ([Intel XE#8370])
   [87]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-10/igt@xe_evict@evict-threads-small-multi-queue.html

  * igt@xe_exec_balancer@once-parallel-userptr-rebind:
    - shard-lnl:          NOTRUN -> [SKIP][88] ([Intel XE#7482]) +8 other tests skip
   [88]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-5/igt@xe_exec_balancer@once-parallel-userptr-rebind.html

  * igt@xe_exec_basic@multigpu-no-exec-rebind:
    - shard-bmg:          NOTRUN -> [SKIP][89] ([Intel XE#2322] / [Intel XE#7372]) +2 other tests skip
   [89]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@xe_exec_basic@multigpu-no-exec-rebind.html
    - shard-lnl:          NOTRUN -> [SKIP][90] ([Intel XE#1392])
   [90]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-5/igt@xe_exec_basic@multigpu-no-exec-rebind.html

  * igt@xe_exec_fault_mode@twice-multi-queue-userptr-invalidate-race:
    - shard-lnl:          NOTRUN -> [SKIP][91] ([Intel XE#8374]) +8 other tests skip
   [91]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-7/igt@xe_exec_fault_mode@twice-multi-queue-userptr-invalidate-race.html

  * igt@xe_exec_fault_mode@twice-multi-queue-userptr-rebind-prefetch:
    - shard-bmg:          NOTRUN -> [SKIP][92] ([Intel XE#8374]) +4 other tests skip
   [92]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@xe_exec_fault_mode@twice-multi-queue-userptr-rebind-prefetch.html

  * igt@xe_exec_multi_queue@one-queue-preempt-mode-fault-dyn-priority-smem:
    - shard-bmg:          NOTRUN -> [SKIP][93] ([Intel XE#8364]) +12 other tests skip
   [93]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@xe_exec_multi_queue@one-queue-preempt-mode-fault-dyn-priority-smem.html

  * igt@xe_exec_multi_queue@one-queue-preempt-mode-fault-priority:
    - shard-lnl:          NOTRUN -> [SKIP][94] ([Intel XE#8364]) +14 other tests skip
   [94]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-5/igt@xe_exec_multi_queue@one-queue-preempt-mode-fault-priority.html

  * igt@xe_exec_reset@multi-queue-long-spin-many-queue-switch:
    - shard-lnl:          NOTRUN -> [SKIP][95] ([Intel XE#8369])
   [95]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-5/igt@xe_exec_reset@multi-queue-long-spin-many-queue-switch.html
    - shard-bmg:          NOTRUN -> [SKIP][96] ([Intel XE#8369])
   [96]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@xe_exec_reset@multi-queue-long-spin-many-queue-switch.html

  * igt@xe_exec_system_allocator@many-stride-malloc-prefetch-madvise:
    - shard-bmg:          [PASS][97] -> [DMESG-WARN][98] ([Intel XE#9309])
   [97]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-bmg-4/igt@xe_exec_system_allocator@many-stride-malloc-prefetch-madvise.html
   [98]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-4/igt@xe_exec_system_allocator@many-stride-malloc-prefetch-madvise.html

  * igt@xe_exec_system_allocator@pat-index-madvise-pat-idx-uc-comp-multi-vma:
    - shard-lnl:          NOTRUN -> [SKIP][99] ([Intel XE#6196])
   [99]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-5/igt@xe_exec_system_allocator@pat-index-madvise-pat-idx-uc-comp-multi-vma.html

  * igt@xe_exec_system_allocator@threads-shared-vm-many-execqueues-mmap-shared-remap-dontunmap-eocheck:
    - shard-bmg:          NOTRUN -> [DMESG-WARN][100] ([Intel XE#9331]) +27 other tests dmesg-warn
   [100]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@xe_exec_system_allocator@threads-shared-vm-many-execqueues-mmap-shared-remap-dontunmap-eocheck.html

  * igt@xe_exec_system_allocator@twice-mmap-free-madvise:
    - shard-bmg:          [PASS][101] -> [DMESG-WARN][102] ([Intel XE#9331]) +39 other tests dmesg-warn
   [101]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-bmg-7/igt@xe_exec_system_allocator@twice-mmap-free-madvise.html
   [102]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-9/igt@xe_exec_system_allocator@twice-mmap-free-madvise.html

  * igt@xe_exec_threads@threads-hang-userptr-invalidate-race:
    - shard-lnl:          [PASS][103] -> [FAIL][104] ([Intel XE#9096])
   [103]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-lnl-8/igt@xe_exec_threads@threads-hang-userptr-invalidate-race.html
   [104]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-6/igt@xe_exec_threads@threads-hang-userptr-invalidate-race.html

  * igt@xe_exec_threads@threads-multi-queue-cm-fd-userptr-invalidate-race:
    - shard-lnl:          NOTRUN -> [SKIP][105] ([Intel XE#8378]) +1 other test skip
   [105]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-7/igt@xe_exec_threads@threads-multi-queue-cm-fd-userptr-invalidate-race.html

  * igt@xe_exec_threads@threads-multi-queue-mixed-userptr-rebind:
    - shard-bmg:          NOTRUN -> [SKIP][106] ([Intel XE#8378]) +3 other tests skip
   [106]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@xe_exec_threads@threads-multi-queue-mixed-userptr-rebind.html

  * igt@xe_fault_injection@exec-queue-create-fail-xe_pxp_exec_queue_add:
    - shard-bmg:          NOTRUN -> [SKIP][107] ([Intel XE#6281] / [Intel XE#7426])
   [107]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-10/igt@xe_fault_injection@exec-queue-create-fail-xe_pxp_exec_queue_add.html

  * igt@xe_gpgpu_fill@offset-4x4:
    - shard-bmg:          NOTRUN -> [SKIP][108] ([Intel XE#7954])
   [108]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@xe_gpgpu_fill@offset-4x4.html

  * igt@xe_live_ktest@xe_eudebug:
    - shard-lnl:          NOTRUN -> [SKIP][109] ([Intel XE#2833])
   [109]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-1/igt@xe_live_ktest@xe_eudebug.html

  * igt@xe_module_load@load:
    - shard-lnl:          ([PASS][110], [PASS][111], [PASS][112], [PASS][113], [PASS][114], [PASS][115], [PASS][116], [PASS][117], [PASS][118], [PASS][119], [PASS][120], [PASS][121], [PASS][122], [PASS][123], [PASS][124], [PASS][125], [PASS][126], [PASS][127], [PASS][128], [PASS][129], [PASS][130], [PASS][131], [PASS][132], [PASS][133], [PASS][134]) -> ([PASS][135], [SKIP][136], [PASS][137], [PASS][138], [PASS][139], [PASS][140], [PASS][141], [PASS][142], [PASS][143], [PASS][144], [PASS][145], [PASS][146], [PASS][147], [PASS][148], [PASS][149], [PASS][150], [PASS][151], [PASS][152], [PASS][153], [PASS][154], [PASS][155], [PASS][156], [PASS][157], [PASS][158], [PASS][159], [PASS][160]) ([Intel XE#378] / [Intel XE#7405])
   [110]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-lnl-5/igt@xe_module_load@load.html
   [111]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-lnl-2/igt@xe_module_load@load.html
   [112]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-lnl-1/igt@xe_module_load@load.html
   [113]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-lnl-2/igt@xe_module_load@load.html
   [114]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-lnl-8/igt@xe_module_load@load.html
   [115]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-lnl-3/igt@xe_module_load@load.html
   [116]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-lnl-3/igt@xe_module_load@load.html
   [117]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-lnl-3/igt@xe_module_load@load.html
   [118]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-lnl-4/igt@xe_module_load@load.html
   [119]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-lnl-4/igt@xe_module_load@load.html
   [120]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-lnl-4/igt@xe_module_load@load.html
   [121]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-lnl-3/igt@xe_module_load@load.html
   [122]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-lnl-2/igt@xe_module_load@load.html
   [123]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-lnl-6/igt@xe_module_load@load.html
   [124]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-lnl-6/igt@xe_module_load@load.html
   [125]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-lnl-1/igt@xe_module_load@load.html
   [126]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-lnl-8/igt@xe_module_load@load.html
   [127]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-lnl-6/igt@xe_module_load@load.html
   [128]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-lnl-1/igt@xe_module_load@load.html
   [129]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-lnl-7/igt@xe_module_load@load.html
   [130]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-lnl-8/igt@xe_module_load@load.html
   [131]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-lnl-7/igt@xe_module_load@load.html
   [132]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-lnl-7/igt@xe_module_load@load.html
   [133]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-lnl-5/igt@xe_module_load@load.html
   [134]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-lnl-5/igt@xe_module_load@load.html
   [135]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-5/igt@xe_module_load@load.html
   [136]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-5/igt@xe_module_load@load.html
   [137]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-2/igt@xe_module_load@load.html
   [138]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-2/igt@xe_module_load@load.html
   [139]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-4/igt@xe_module_load@load.html
   [140]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-4/igt@xe_module_load@load.html
   [141]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-4/igt@xe_module_load@load.html
   [142]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-8/igt@xe_module_load@load.html
   [143]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-6/igt@xe_module_load@load.html
   [144]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-3/igt@xe_module_load@load.html
   [145]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-3/igt@xe_module_load@load.html
   [146]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-8/igt@xe_module_load@load.html
   [147]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-3/igt@xe_module_load@load.html
   [148]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-8/igt@xe_module_load@load.html
   [149]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-5/igt@xe_module_load@load.html
   [150]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-5/igt@xe_module_load@load.html
   [151]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-6/igt@xe_module_load@load.html
   [152]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-1/igt@xe_module_load@load.html
   [153]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-7/igt@xe_module_load@load.html
   [154]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-7/igt@xe_module_load@load.html
   [155]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-6/igt@xe_module_load@load.html
   [156]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-7/igt@xe_module_load@load.html
   [157]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-2/igt@xe_module_load@load.html
   [158]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-7/igt@xe_module_load@load.html
   [159]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-1/igt@xe_module_load@load.html
   [160]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-1/igt@xe_module_load@load.html
    - shard-bmg:          ([PASS][161], [PASS][162], [PASS][163], [PASS][164], [PASS][165], [PASS][166], [PASS][167], [PASS][168], [PASS][169], [PASS][170], [PASS][171], [PASS][172], [PASS][173], [PASS][174], [PASS][175], [PASS][176], [PASS][177], [PASS][178], [PASS][179], [PASS][180], [PASS][181], [PASS][182], [PASS][183], [PASS][184], [PASS][185]) -> ([PASS][186], [PASS][187], [PASS][188], [PASS][189], [PASS][190], [PASS][191], [PASS][192], [PASS][193], [PASS][194], [PASS][195], [PASS][196], [PASS][197], [PASS][198], [PASS][199], [PASS][200], [PASS][201], [PASS][202], [PASS][203], [PASS][204], [PASS][205], [PASS][206], [PASS][207], [SKIP][208], [PASS][209], [PASS][210], [PASS][211]) ([Intel XE#2457] / [Intel XE#7405])
   [161]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-bmg-4/igt@xe_module_load@load.html
   [162]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-bmg-9/igt@xe_module_load@load.html
   [163]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-bmg-4/igt@xe_module_load@load.html
   [164]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-bmg-1/igt@xe_module_load@load.html
   [165]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-bmg-3/igt@xe_module_load@load.html
   [166]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-bmg-3/igt@xe_module_load@load.html
   [167]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-bmg-3/igt@xe_module_load@load.html
   [168]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-bmg-8/igt@xe_module_load@load.html
   [169]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-bmg-8/igt@xe_module_load@load.html
   [170]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-bmg-10/igt@xe_module_load@load.html
   [171]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-bmg-8/igt@xe_module_load@load.html
   [172]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-bmg-4/igt@xe_module_load@load.html
   [173]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-bmg-1/igt@xe_module_load@load.html
   [174]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-bmg-7/igt@xe_module_load@load.html
   [175]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-bmg-7/igt@xe_module_load@load.html
   [176]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-bmg-9/igt@xe_module_load@load.html
   [177]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-bmg-6/igt@xe_module_load@load.html
   [178]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-bmg-6/igt@xe_module_load@load.html
   [179]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-bmg-2/igt@xe_module_load@load.html
   [180]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-bmg-2/igt@xe_module_load@load.html
   [181]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-bmg-2/igt@xe_module_load@load.html
   [182]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-bmg-9/igt@xe_module_load@load.html
   [183]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-bmg-5/igt@xe_module_load@load.html
   [184]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-bmg-5/igt@xe_module_load@load.html
   [185]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-bmg-7/igt@xe_module_load@load.html
   [186]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-6/igt@xe_module_load@load.html
   [187]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-3/igt@xe_module_load@load.html
   [188]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-3/igt@xe_module_load@load.html
   [189]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-3/igt@xe_module_load@load.html
   [190]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-2/igt@xe_module_load@load.html
   [191]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-9/igt@xe_module_load@load.html
   [192]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-6/igt@xe_module_load@load.html
   [193]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-2/igt@xe_module_load@load.html
   [194]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-2/igt@xe_module_load@load.html
   [195]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-7/igt@xe_module_load@load.html
   [196]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-7/igt@xe_module_load@load.html
   [197]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-4/igt@xe_module_load@load.html
   [198]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-4/igt@xe_module_load@load.html
   [199]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-9/igt@xe_module_load@load.html
   [200]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-9/igt@xe_module_load@load.html
   [201]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@xe_module_load@load.html
   [202]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@xe_module_load@load.html
   [203]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@xe_module_load@load.html
   [204]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-5/igt@xe_module_load@load.html
   [205]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-5/igt@xe_module_load@load.html
   [206]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-8/igt@xe_module_load@load.html
   [207]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-8/igt@xe_module_load@load.html
   [208]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@xe_module_load@load.html
   [209]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-7/igt@xe_module_load@load.html
   [210]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-10/igt@xe_module_load@load.html
   [211]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-10/igt@xe_module_load@load.html

  * igt@xe_multigpu_svm@mgpu-coherency-basic:
    - shard-lnl:          NOTRUN -> [SKIP][212] ([Intel XE#6964])
   [212]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-1/igt@xe_multigpu_svm@mgpu-coherency-basic.html

  * igt@xe_multigpu_svm@mgpu-latency-prefetch:
    - shard-bmg:          NOTRUN -> [SKIP][213] ([Intel XE#6964])
   [213]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-10/igt@xe_multigpu_svm@mgpu-latency-prefetch.html

  * igt@xe_page_reclaim@pde-vs-pd:
    - shard-bmg:          NOTRUN -> [SKIP][214] ([Intel XE#7793]) +2 other tests skip
   [214]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@xe_page_reclaim@pde-vs-pd.html
    - shard-lnl:          NOTRUN -> [SKIP][215] ([Intel XE#7793]) +1 other test skip
   [215]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-5/igt@xe_page_reclaim@pde-vs-pd.html

  * igt@xe_pat@pat-index-xelpg:
    - shard-bmg:          NOTRUN -> [SKIP][216] ([Intel XE#2236] / [Intel XE#7590])
   [216]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-10/igt@xe_pat@pat-index-xelpg.html

  * igt@xe_pat@xa-app-transient-media-off:
    - shard-bmg:          NOTRUN -> [SKIP][217] ([Intel XE#7590]) +1 other test skip
   [217]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@xe_pat@xa-app-transient-media-off.html

  * igt@xe_pm@d3cold-multiple-execs:
    - shard-bmg:          NOTRUN -> [SKIP][218] ([Intel XE#2284] / [Intel XE#7370])
   [218]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@xe_pm@d3cold-multiple-execs.html
    - shard-lnl:          NOTRUN -> [SKIP][219] ([Intel XE#2284] / [Intel XE#366] / [Intel XE#7370])
   [219]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-5/igt@xe_pm@d3cold-multiple-execs.html

  * igt@xe_pm@d3hot-i2c:
    - shard-bmg:          NOTRUN -> [SKIP][220] ([Intel XE#5742] / [Intel XE#7328] / [Intel XE#7400])
   [220]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-2/igt@xe_pm@d3hot-i2c.html

  * igt@xe_pm@s3-vm-bind-prefetch:
    - shard-bmg:          [PASS][221] -> [INCOMPLETE][222] ([Intel XE#8175])
   [221]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-bmg-1/igt@xe_pm@s3-vm-bind-prefetch.html
   [222]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-6/igt@xe_pm@s3-vm-bind-prefetch.html

  * igt@xe_pm@s3-vm-bind-unbind-all:
    - shard-lnl:          NOTRUN -> [SKIP][223] ([Intel XE#584] / [Intel XE#7369])
   [223]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-5/igt@xe_pm@s3-vm-bind-unbind-all.html

  * igt@xe_query@multigpu-query-cs-cycles:
    - shard-bmg:          NOTRUN -> [SKIP][224] ([Intel XE#944]) +2 other tests skip
   [224]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@xe_query@multigpu-query-cs-cycles.html
    - shard-lnl:          NOTRUN -> [SKIP][225] ([Intel XE#944])
   [225]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-5/igt@xe_query@multigpu-query-cs-cycles.html

  * igt@xe_sriov_admin@sched-priority-vf-write-denied:
    - shard-lnl:          NOTRUN -> [SKIP][226] ([Intel XE#7174])
   [226]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-7/igt@xe_sriov_admin@sched-priority-vf-write-denied.html

  * igt@xe_sriov_scheduling@nonpreempt-engine-resets-low-priority:
    - shard-lnl:          NOTRUN -> [SKIP][227] ([Intel XE#8339])
   [227]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-7/igt@xe_sriov_scheduling@nonpreempt-engine-resets-low-priority.html

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

  * igt@xe_wedged@basic-wedged:
    - shard-lnl:          NOTRUN -> [DMESG-WARN][229] ([Intel XE#8963])
   [229]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-5/igt@xe_wedged@basic-wedged.html
    - shard-bmg:          NOTRUN -> [DMESG-WARN][230] ([Intel XE#8963])
   [230]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@xe_wedged@basic-wedged.html

  
#### Possible fixes ####

  * igt@kms_ccs@crc-primary-suspend-4-tiled-bmg-ccs:
    - shard-bmg:          [INCOMPLETE][231] ([Intel XE#7084] / [Intel XE#8150]) -> [PASS][232] +1 other test pass
   [231]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-bmg-3/igt@kms_ccs@crc-primary-suspend-4-tiled-bmg-ccs.html
   [232]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-2/igt@kms_ccs@crc-primary-suspend-4-tiled-bmg-ccs.html

  * igt@kms_fbcon_fbt@fbc-suspend:
    - shard-lnl:          [ABORT][233] ([Intel XE#9230]) -> [PASS][234]
   [233]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-lnl-3/igt@kms_fbcon_fbt@fbc-suspend.html
   [234]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-7/igt@kms_fbcon_fbt@fbc-suspend.html

  * igt@kms_flip@flip-vs-expired-vblank-interruptible:
    - shard-bmg:          [FAIL][235] ([Intel XE#3321]) -> [PASS][236] +1 other test pass
   [235]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-bmg-6/igt@kms_flip@flip-vs-expired-vblank-interruptible.html
   [236]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-10/igt@kms_flip@flip-vs-expired-vblank-interruptible.html

  * igt@kms_flip@flip-vs-expired-vblank@a-edp1:
    - shard-lnl:          [FAIL][237] ([Intel XE#301]) -> [PASS][238]
   [237]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-lnl-4/igt@kms_flip@flip-vs-expired-vblank@a-edp1.html
   [238]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-5/igt@kms_flip@flip-vs-expired-vblank@a-edp1.html

  * igt@kms_flip@flip-vs-expired-vblank@c-edp1:
    - shard-lnl:          [FAIL][239] ([Intel XE#301] / [Intel XE#3149]) -> [PASS][240]
   [239]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-lnl-4/igt@kms_flip@flip-vs-expired-vblank@c-edp1.html
   [240]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-5/igt@kms_flip@flip-vs-expired-vblank@c-edp1.html

  * igt@kms_hdr@invalid-hdr:
    - shard-bmg:          [SKIP][241] ([Intel XE#1503]) -> [PASS][242]
   [241]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-bmg-9/igt@kms_hdr@invalid-hdr.html
   [242]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-2/igt@kms_hdr@invalid-hdr.html

  * igt@kms_pipe_crc_basic@suspend-read-crc:
    - shard-bmg:          [ABORT][243] ([Intel XE#9093]) -> [PASS][244] +1 other test pass
   [243]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-bmg-3/igt@kms_pipe_crc_basic@suspend-read-crc.html
   [244]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@kms_pipe_crc_basic@suspend-read-crc.html

  * igt@kms_pm_dc@dc5-dpms-suspend-resume:
    - shard-bmg:          [INCOMPLETE][245] ([Intel XE#9314]) -> [PASS][246]
   [245]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-bmg-6/igt@kms_pm_dc@dc5-dpms-suspend-resume.html
   [246]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-10/igt@kms_pm_dc@dc5-dpms-suspend-resume.html

  * igt@kms_vrr@flipline@pipe-a-edp-1:
    - shard-ptl:          [FAIL][247] ([Intel XE#4227] / [Intel XE#7397]) -> [PASS][248] +1 other test pass
   [247]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-ptl-4/igt@kms_vrr@flipline@pipe-a-edp-1.html
   [248]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-ptl-4/igt@kms_vrr@flipline@pipe-a-edp-1.html

  * igt@xe_configfs@ctx-restore-post-bb-invalid:
    - shard-bmg:          [ABORT][249] ([Intel XE#8007]) -> [PASS][250]
   [249]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-bmg-6/igt@xe_configfs@ctx-restore-post-bb-invalid.html
   [250]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-1/igt@xe_configfs@ctx-restore-post-bb-invalid.html

  * igt@xe_exec_fault_mode@many-bindexecqueue-userptr-rebind:
    - shard-bmg:          [DMESG-WARN][251] ([Intel XE#9331]) -> [PASS][252] +37 other tests pass
   [251]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-bmg-6/igt@xe_exec_fault_mode@many-bindexecqueue-userptr-rebind.html
   [252]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-bmg-10/igt@xe_exec_fault_mode@many-bindexecqueue-userptr-rebind.html

  * igt@xe_module_load@load:
    - shard-ptl:          ([PASS][253], [PASS][254], [PASS][255], [PASS][256], [PASS][257], [PASS][258], [PASS][259], [PASS][260], [PASS][261], [PASS][262], [SKIP][263], [PASS][264], [PASS][265], [PASS][266], [PASS][267], [PASS][268], [PASS][269], [PASS][270], [PASS][271], [PASS][272], [PASS][273], [PASS][274], [PASS][275], [PASS][276], [PASS][277], [PASS][278]) ([Intel XE#9286]) -> ([PASS][279], [PASS][280], [PASS][281], [PASS][282], [PASS][283], [PASS][284], [PASS][285], [PASS][286], [PASS][287], [PASS][288], [PASS][289], [PASS][290], [PASS][291], [PASS][292], [PASS][293], [PASS][294], [PASS][295], [PASS][296], [PASS][297], [PASS][298], [PASS][299], [PASS][300], [PASS][301], [PASS][302], [PASS][303])
   [253]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-ptl-3/igt@xe_module_load@load.html
   [254]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-ptl-3/igt@xe_module_load@load.html
   [255]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-ptl-6/igt@xe_module_load@load.html
   [256]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-ptl-5/igt@xe_module_load@load.html
   [257]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-ptl-5/igt@xe_module_load@load.html
   [258]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-ptl-6/igt@xe_module_load@load.html
   [259]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-ptl-5/igt@xe_module_load@load.html
   [260]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-ptl-4/igt@xe_module_load@load.html
   [261]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-ptl-4/igt@xe_module_load@load.html
   [262]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-ptl-4/igt@xe_module_load@load.html
   [263]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-ptl-5/igt@xe_module_load@load.html
   [264]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-ptl-1/igt@xe_module_load@load.html
   [265]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-ptl-1/igt@xe_module_load@load.html
   [266]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-ptl-6/igt@xe_module_load@load.html
   [267]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-ptl-7/igt@xe_module_load@load.html
   [268]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-ptl-7/igt@xe_module_load@load.html
   [269]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-ptl-7/igt@xe_module_load@load.html
   [270]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-ptl-1/igt@xe_module_load@load.html
   [271]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-ptl-2/igt@xe_module_load@load.html
   [272]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-ptl-2/igt@xe_module_load@load.html
   [273]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-ptl-8/igt@xe_module_load@load.html
   [274]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-ptl-8/igt@xe_module_load@load.html
   [275]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-ptl-8/igt@xe_module_load@load.html
   [276]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-ptl-4/igt@xe_module_load@load.html
   [277]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-ptl-2/igt@xe_module_load@load.html
   [278]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-ptl-3/igt@xe_module_load@load.html
   [279]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-ptl-3/igt@xe_module_load@load.html
   [280]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-ptl-5/igt@xe_module_load@load.html
   [281]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-ptl-3/igt@xe_module_load@load.html
   [282]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-ptl-3/igt@xe_module_load@load.html
   [283]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-ptl-1/igt@xe_module_load@load.html
   [284]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-ptl-5/igt@xe_module_load@load.html
   [285]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-ptl-5/igt@xe_module_load@load.html
   [286]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-ptl-1/igt@xe_module_load@load.html
   [287]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-ptl-4/igt@xe_module_load@load.html
   [288]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-ptl-4/igt@xe_module_load@load.html
   [289]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-ptl-4/igt@xe_module_load@load.html
   [290]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-ptl-1/igt@xe_module_load@load.html
   [291]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-ptl-1/igt@xe_module_load@load.html
   [292]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-ptl-6/igt@xe_module_load@load.html
   [293]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-ptl-6/igt@xe_module_load@load.html
   [294]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-ptl-6/igt@xe_module_load@load.html
   [295]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-ptl-2/igt@xe_module_load@load.html
   [296]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-ptl-8/igt@xe_module_load@load.html
   [297]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-ptl-2/igt@xe_module_load@load.html
   [298]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-ptl-8/igt@xe_module_load@load.html
   [299]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-ptl-8/igt@xe_module_load@load.html
   [300]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-ptl-2/igt@xe_module_load@load.html
   [301]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-ptl-7/igt@xe_module_load@load.html
   [302]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-ptl-7/igt@xe_module_load@load.html
   [303]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-ptl-7/igt@xe_module_load@load.html

  
#### Warnings ####

  * igt@kms_flip@flip-vs-expired-vblank:
    - shard-lnl:          [FAIL][304] ([Intel XE#301] / [Intel XE#3149]) -> [FAIL][305] ([Intel XE#301])
   [304]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04/shard-lnl-4/igt@kms_flip@flip-vs-expired-vblank.html
   [305]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165953v6/shard-lnl-5/igt@kms_flip@flip-vs-expired-vblank.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#1469]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1469
  [Intel XE#1489]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1489
  [Intel XE#1503]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1503
  [Intel XE#1729]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1729
  [Intel XE#1745]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1745
  [Intel XE#2049]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2049
  [Intel XE#2234]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2234
  [Intel XE#2236]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2236
  [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#2320]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2320
  [Intel XE#2322]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2322
  [Intel XE#2325]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2325
  [Intel XE#2327]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2327
  [Intel XE#2387]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2387
  [Intel XE#2390]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2390
  [Intel XE#2457]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2457
  [Intel XE#2597]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2597
  [Intel XE#2652]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2652
  [Intel XE#2763]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2763
  [Intel XE#2833]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2833
  [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#309]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/309
  [Intel XE#3098]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3098
  [Intel XE#3149]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3149
  [Intel XE#3304]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3304
  [Intel XE#3321]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3321
  [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#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#378]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/378
  [Intel XE#3904]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3904
  [Intel XE#4141]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4141
  [Intel XE#4227]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4227
  [Intel XE#4331]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4331
  [Intel XE#4422]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4422
  [Intel XE#4609]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4609
  [Intel XE#5742]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5742
  [Intel XE#584]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/584
  [Intel XE#6196]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6196
  [Intel XE#6281]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6281
  [Intel XE#6312]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6312
  [Intel XE#6321]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6321
  [Intel XE#6503]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6503
  [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#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#6969]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6969
  [Intel XE#6974]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6974
  [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#7084]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7084
  [Intel XE#7085]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7085
  [Intel XE#7174]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7174
  [Intel XE#7178]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7178
  [Intel XE#7227]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7227
  [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#7328]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7328
  [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#7345]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7345
  [Intel XE#7351]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7351
  [Intel XE#7356]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7356
  [Intel XE#7358]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7358
  [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#7374]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7374
  [Intel XE#7385]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7385
  [Intel XE#7397]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7397
  [Intel XE#7399]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7399
  [Intel XE#7400]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7400
  [Intel XE#7405]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7405
  [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#7426]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7426
  [Intel XE#7429]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7429
  [Intel XE#7442]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7442
  [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#7679]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7679
  [Intel XE#7724]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7724
  [Intel XE#7793]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7793
  [Intel XE#7865]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7865
  [Intel XE#7905]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7905
  [Intel XE#7954]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7954
  [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#8150]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8150
  [Intel XE#8155]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8155
  [Intel XE#8175]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8175
  [Intel XE#8265]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8265
  [Intel XE#8339]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8339
  [Intel XE#8355]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8355
  [Intel XE#8364]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8364
  [Intel XE#8369]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8369
  [Intel XE#8370]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8370
  [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#8963]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8963
  [Intel XE#9009]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9009
  [Intel XE#9093]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9093
  [Intel XE#9096]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9096
  [Intel XE#9144]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9144
  [Intel XE#9230]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9230
  [Intel XE#9286]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9286
  [Intel XE#9309]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9309
  [Intel XE#9314]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9314
  [Intel XE#9331]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9331
  [Intel XE#9346]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9346
  [Intel XE#944]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/944


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

  * Linux: xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04 -> xe-pw-165953v6

  IGT_9105: 9105
  xe-5801-dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04: dfe5a8188de9aaddd4e46b0f2410d0bccd5c1c04
  xe-pw-165953v6: 165953v6

== Logs ==

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

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

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

* Re: [PATCH v14 01/12] mm/Kconfig: changes for migrate on fault for device pages
  2026-09-22  5:34 ` [PATCH v14 01/12] mm/Kconfig: changes for " mpenttil
  2026-09-22  5:44   ` sashiko-bot
@ 2026-09-22 22:27   ` Balbir Singh
  2026-09-23  5:42     ` Mika Penttilä
  1 sibling, 1 reply; 35+ messages in thread
From: Balbir Singh @ 2026-09-22 22:27 UTC (permalink / raw)
  To: mpenttil, linux-mm
  Cc: dri-devel, intel-xe, linux-kernel, David Hildenbrand,
	Jason Gunthorpe, Leon Romanovsky, Alistair Popple, Zi Yan,
	Matthew Brost, Andrew Morton, Lorenzo Stoakes, Liam R. Howlett,
	Vlastimil Babka, Mike Rapoport, Suren Baghdasaryan, Michal Hocko

On 9/22/26 3:34 PM, mpenttil@redhat.com wrote:
> From: Mika Penttilä <mpenttil@redhat.com>
> 
> HMM depends on MMU notifiers. With the unified HMM/migrate_device
> page table walk migrate_device needs HMM enabled.
> Enable them explicitly to avoid breaking random configs.
> 
> Cc: Andrew Morton <akpm@linux-foundation.org>
> Cc: David Hildenbrand <david@kernel.org>
> Cc: Lorenzo Stoakes <ljs@kernel.org>
> Cc: "Liam R. Howlett" <Liam.Howlett@oracle.com>
> Cc: Vlastimil Babka <vbabka@suse.cz>
> Cc: Mike Rapoport <rppt@kernel.org>
> Cc: Suren Baghdasaryan <surenb@google.com>
> Cc: Michal Hocko <mhocko@suse.com>
> Signed-off-by: Mika Penttilä <mpenttil@redhat.com>
> Acked-by: David Hildenbrand (Arm) <david@kernel.org>
> ---
>  mm/Kconfig | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/mm/Kconfig b/mm/Kconfig
> index 604c58199acb..b7a485beb9a7 100644
> --- a/mm/Kconfig
> +++ b/mm/Kconfig
> @@ -687,6 +687,7 @@ config MIGRATION
>  
>  config DEVICE_MIGRATION
>  	def_bool MIGRATION && ZONE_DEVICE
> +	select HMM_MIRROR
>  
>  config ARCH_ENABLE_HUGEPAGE_MIGRATION
>  	bool


Acked-by: Balbir Singh <balbirs@nvidia.com>

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

* Re: [PATCH 00/12] [PATCH v14 00/12] migrate on fault for device pages
  2026-09-22  5:34 [PATCH 00/12] [PATCH v14 00/12] migrate on fault for device pages mpenttil
                   ` (16 preceding siblings ...)
  2026-09-22 15:03 ` ✗ Xe.CI.FULL: failure " Patchwork
@ 2026-09-23  2:27 ` Andrew Morton
  2026-09-23  5:29   ` Mika Penttilä
  17 siblings, 1 reply; 35+ messages in thread
From: Andrew Morton @ 2026-09-23  2:27 UTC (permalink / raw)
  To: mpenttil
  Cc: linux-mm, dri-devel, intel-xe, linux-kernel, David Hildenbrand,
	Jason Gunthorpe, Leon Romanovsky, Alistair Popple, Balbir Singh,
	Zi Yan, Matthew Brost, Lorenzo Stoakes, Liam R. Howlett,
	Vlastimil Babka, Mike Rapoport, Suren Baghdasaryan, Michal Hocko

On Tue, 22 Sep 2026 08:34:09 +0300 mpenttil@redhat.com wrote:

> From: Mika Penttilä <mpenttil@redhat.com>
> 
> Currently, the way device page faulting and migration works
> is not optimal, if you want to do both fault handling and
> migration at once.
> 
> Being able to migrate not present pages (or pages mapped with incorrect
> permissions, eg. COW) to the GPU requires doing either of the
> following sequences:
> 
> 1. hmm_range_fault() - fault in non-present pages with correct permissions, etc.
> 2. migrate_vma_*() - migrate the pages
> 
> Or:
> 
> 1. migrate_vma_*() - migrate present pages
> 2. If non-present pages detected by migrate_vma_*():
>    a) call hmm_range_fault() to fault pages in
>    b) call migrate_vma_*() again to migrate now present pages
> 
> The problem with the first sequence is that you always have to do two
> page walks even when most of the time the pages are present or zero page
> mappings so the common case takes a performance hit.
> 
> The second sequence is better for the common case, but far worse if
> pages aren't present because now you have to walk the page tables three
> times (once to find the page is not present, once so hmm_range_fault()
> can find a non-present page to fault in and once again to setup the
> migration). It is also tricky to code correctly. One page table walk
> could costs over 1000 cpu cycles on X86-64, which is a significant hit.
> 
> We should be able to walk the page table once, faulting
> pages in as required and replacing them with migration entries if
> requested.

Sounds sensible.

> Tested in X86-64 VM with HMM test device, passing the selftests.
> For performance, the migrate throughput tests from the selftests
> show similar numbers (within error margin) as unmodified kernel.

But no performance benefits are demonstrated?



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

* Re: [PATCH 00/12] [PATCH v14 00/12] migrate on fault for device pages
  2026-09-23  2:27 ` [PATCH 00/12] [PATCH v14 00/12] migrate on fault for device pages Andrew Morton
@ 2026-09-23  5:29   ` Mika Penttilä
  2026-09-23 21:19     ` Andrew Morton
  0 siblings, 1 reply; 35+ messages in thread
From: Mika Penttilä @ 2026-09-23  5:29 UTC (permalink / raw)
  To: Andrew Morton
  Cc: linux-mm, dri-devel, intel-xe, linux-kernel, David Hildenbrand,
	Jason Gunthorpe, Leon Romanovsky, Alistair Popple, Balbir Singh,
	Zi Yan, Matthew Brost, Lorenzo Stoakes, Liam R. Howlett,
	Vlastimil Babka, Mike Rapoport, Suren Baghdasaryan, Michal Hocko


On 9/23/26 05:27, Andrew Morton wrote:

> On Tue, 22 Sep 2026 08:34:09 +0300 mpenttil@redhat.com wrote:
>
>> From: Mika Penttilä <mpenttil@redhat.com>
>>
>> Currently, the way device page faulting and migration works
>> is not optimal, if you want to do both fault handling and
>> migration at once.
>>
>> Being able to migrate not present pages (or pages mapped with incorrect
>> permissions, eg. COW) to the GPU requires doing either of the
>> following sequences:
>>
>> 1. hmm_range_fault() - fault in non-present pages with correct permissions, etc.
>> 2. migrate_vma_*() - migrate the pages
>>
>> Or:
>>
>> 1. migrate_vma_*() - migrate present pages
>> 2. If non-present pages detected by migrate_vma_*():
>>    a) call hmm_range_fault() to fault pages in
>>    b) call migrate_vma_*() again to migrate now present pages
>>
>> The problem with the first sequence is that you always have to do two
>> page walks even when most of the time the pages are present or zero page
>> mappings so the common case takes a performance hit.
>>
>> The second sequence is better for the common case, but far worse if
>> pages aren't present because now you have to walk the page tables three
>> times (once to find the page is not present, once so hmm_range_fault()
>> can find a non-present page to fault in and once again to setup the
>> migration). It is also tricky to code correctly. One page table walk
>> could costs over 1000 cpu cycles on X86-64, which is a significant hit.
>>
>> We should be able to walk the page table once, faulting
>> pages in as required and replacing them with migration entries if
>> requested.
> Sounds sensible.
>
>> Tested in X86-64 VM with HMM test device, passing the selftests.
>> For performance, the migrate throughput tests from the selftests
>> show similar numbers (within error margin) as unmodified kernel.
> But no performance benefits are demonstrated?

There are no performance regressions for current tests.
Real benefits come if want to do migrate on fault.
For migrate on fault today missing pages are collected as not-present and
the caller has to fault them and re-run migrate_vma_setup(); folding 
HMM_PFN_REQ_FAULT into the collecting walk removes that extra
fault+retry round-trip, dropping two page table walks. Page table walks
are not cheap. Not to mention simplified implementation for driver.
Also, the vma looked up as part of the walk is readily available for
migration, eliminating the need for explicit vma lookup - one more
performance benefit. Net effect two saved page table walks and
one vma lookup.
This series also addresses the vanished/reborn page table while
collecting problem which can crash current implementation.

--Mika


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

* Re: [PATCH v14 01/12] mm/Kconfig: changes for migrate on fault for device pages
  2026-09-22 22:27   ` Balbir Singh
@ 2026-09-23  5:42     ` Mika Penttilä
  0 siblings, 0 replies; 35+ messages in thread
From: Mika Penttilä @ 2026-09-23  5:42 UTC (permalink / raw)
  To: Balbir Singh, linux-mm
  Cc: dri-devel, intel-xe, linux-kernel, David Hildenbrand,
	Jason Gunthorpe, Leon Romanovsky, Alistair Popple, Zi Yan,
	Matthew Brost, Andrew Morton, Lorenzo Stoakes, Liam R. Howlett,
	Vlastimil Babka, Mike Rapoport, Suren Baghdasaryan, Michal Hocko


On 9/23/26 01:27, Balbir Singh wrote:

> On 9/22/26 3:34 PM, mpenttil@redhat.com wrote:
>> From: Mika Penttilä <mpenttil@redhat.com>
>>
>> HMM depends on MMU notifiers. With the unified HMM/migrate_device
>> page table walk migrate_device needs HMM enabled.
>> Enable them explicitly to avoid breaking random configs.
>>
>> Cc: Andrew Morton <akpm@linux-foundation.org>
>> Cc: David Hildenbrand <david@kernel.org>
>> Cc: Lorenzo Stoakes <ljs@kernel.org>
>> Cc: "Liam R. Howlett" <Liam.Howlett@oracle.com>
>> Cc: Vlastimil Babka <vbabka@suse.cz>
>> Cc: Mike Rapoport <rppt@kernel.org>
>> Cc: Suren Baghdasaryan <surenb@google.com>
>> Cc: Michal Hocko <mhocko@suse.com>
>> Signed-off-by: Mika Penttilä <mpenttil@redhat.com>
>> Acked-by: David Hildenbrand (Arm) <david@kernel.org>
>> ---
>>  mm/Kconfig | 1 +
>>  1 file changed, 1 insertion(+)
>>
>> diff --git a/mm/Kconfig b/mm/Kconfig
>> index 604c58199acb..b7a485beb9a7 100644
>> --- a/mm/Kconfig
>> +++ b/mm/Kconfig
>> @@ -687,6 +687,7 @@ config MIGRATION
>>  
>>  config DEVICE_MIGRATION
>>  	def_bool MIGRATION && ZONE_DEVICE
>> +	select HMM_MIRROR
>>  
>>  config ARCH_ENABLE_HUGEPAGE_MIGRATION
>>  	bool
>
> Acked-by: Balbir Singh <balbirs@nvidia.com>

Thanks Balbir!


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

* Re: [PATCH 00/12] [PATCH v14 00/12] migrate on fault for device pages
  2026-09-23  5:29   ` Mika Penttilä
@ 2026-09-23 21:19     ` Andrew Morton
  2026-09-23 23:24       ` Jason Gunthorpe
  2026-09-24  0:10       ` Mika Penttilä
  0 siblings, 2 replies; 35+ messages in thread
From: Andrew Morton @ 2026-09-23 21:19 UTC (permalink / raw)
  To: Mika Penttilä
  Cc: linux-mm, dri-devel, intel-xe, linux-kernel, David Hildenbrand,
	Jason Gunthorpe, Leon Romanovsky, Alistair Popple, Balbir Singh,
	Zi Yan, Matthew Brost, Lorenzo Stoakes, Liam R. Howlett,
	Vlastimil Babka, Mike Rapoport, Suren Baghdasaryan, Michal Hocko

On Wed, 23 Sep 2026 08:29:34 +0300 Mika Penttilä <mpenttil@redhat.com> wrote:

> 
> >> migration). It is also tricky to code correctly. One page table walk
> >> could costs over 1000 cpu cycles on X86-64, which is a significant hit.
> >>
> >> We should be able to walk the page table once, faulting
> >> pages in as required and replacing them with migration entries if
> >> requested.
> > Sounds sensible.
> >
> >> Tested in X86-64 VM with HMM test device, passing the selftests.
> >> For performance, the migrate throughput tests from the selftests
> >> show similar numbers (within error margin) as unmodified kernel.
> > But no performance benefits are demonstrated?
> 
> There are no performance regressions for current tests.
> Real benefits come if want to do migrate on fault.
> For migrate on fault today missing pages are collected as not-present and
> the caller has to fault them and re-run migrate_vma_setup(); folding 
> HMM_PFN_REQ_FAULT into the collecting walk removes that extra
> fault+retry round-trip, dropping two page table walks. Page table walks
> are not cheap. Not to mention simplified implementation for driver.
> Also, the vma looked up as part of the walk is readily available for
> migration, eliminating the need for explicit vma lookup - one more
> performance benefit. Net effect two saved page table walks and
> one vma lookup.

It certainly sounds that this series will result in performance
improvements, but have those improvements been quantified?

> This series also addresses the vanished/reborn page table while
> collecting problem which can crash current implementation.

Oh.  I didn't get that message from the v14 changelogs, and crashes in
the current implementation are not what we want.  In fact, addressing
those is more important than speeding things up.

Under what circumstances to these crashes occur?  Can/should we we fix
those in a minimal -stable backportable fashion before moving on to speedups?

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

* Re: [PATCH 00/12] [PATCH v14 00/12] migrate on fault for device pages
  2026-09-23 21:19     ` Andrew Morton
@ 2026-09-23 23:24       ` Jason Gunthorpe
  2026-09-24  0:14         ` Mika Penttilä
  2026-09-24  0:10       ` Mika Penttilä
  1 sibling, 1 reply; 35+ messages in thread
From: Jason Gunthorpe @ 2026-09-23 23:24 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Mika Penttilä, linux-mm, dri-devel, intel-xe, linux-kernel,
	David Hildenbrand, Leon Romanovsky, Alistair Popple, Balbir Singh,
	Zi Yan, Matthew Brost, Lorenzo Stoakes, Liam R. Howlett,
	Vlastimil Babka, Mike Rapoport, Suren Baghdasaryan, Michal Hocko

On Wed, Sep 23, 2026 at 02:19:36PM -0700, Andrew Morton wrote:
> On Wed, 23 Sep 2026 08:29:34 +0300 Mika Penttilä <mpenttil@redhat.com> wrote:
> 
> > 
> > >> migration). It is also tricky to code correctly. One page table walk
> > >> could costs over 1000 cpu cycles on X86-64, which is a significant hit.
> > >>
> > >> We should be able to walk the page table once, faulting
> > >> pages in as required and replacing them with migration entries if
> > >> requested.
> > > Sounds sensible.
> > >
> > >> Tested in X86-64 VM with HMM test device, passing the selftests.
> > >> For performance, the migrate throughput tests from the selftests
> > >> show similar numbers (within error margin) as unmodified kernel.
> > > But no performance benefits are demonstrated?
> > 
> > There are no performance regressions for current tests.
> > Real benefits come if want to do migrate on fault.
> > For migrate on fault today missing pages are collected as not-present and
> > the caller has to fault them and re-run migrate_vma_setup(); folding 
> > HMM_PFN_REQ_FAULT into the collecting walk removes that extra
> > fault+retry round-trip, dropping two page table walks. Page table walks
> > are not cheap. Not to mention simplified implementation for driver.
> > Also, the vma looked up as part of the walk is readily available for
> > migration, eliminating the need for explicit vma lookup - one more
> > performance benefit. Net effect two saved page table walks and
> > one vma lookup.
> 
> It certainly sounds that this series will result in performance
> improvements, but have those improvements been quantified?
> 
> > This series also addresses the vanished/reborn page table while
> > collecting problem which can crash current implementation.
> 
> Oh.  I didn't get that message from the v14 changelogs, and crashes in
> the current implementation are not what we want.  In fact, addressing
> those is more important than speeding things up.

Yeah, what is this about?

The series still has lots of sashiko remarks, are they legit?

Jason

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

* Re: [PATCH 00/12] [PATCH v14 00/12] migrate on fault for device pages
  2026-09-23 21:19     ` Andrew Morton
  2026-09-23 23:24       ` Jason Gunthorpe
@ 2026-09-24  0:10       ` Mika Penttilä
  1 sibling, 0 replies; 35+ messages in thread
From: Mika Penttilä @ 2026-09-24  0:10 UTC (permalink / raw)
  To: Andrew Morton
  Cc: linux-mm, dri-devel, intel-xe, linux-kernel, David Hildenbrand,
	Jason Gunthorpe, Leon Romanovsky, Alistair Popple, Balbir Singh,
	Zi Yan, Matthew Brost, Lorenzo Stoakes, Liam R. Howlett,
	Vlastimil Babka, Mike Rapoport, Suren Baghdasaryan, Michal Hocko


On 9/24/26 00:19, Andrew Morton wrote:

> On Wed, 23 Sep 2026 08:29:34 +0300 Mika Penttilä <mpenttil@redhat.com> wrote:
>
>>>> migration). It is also tricky to code correctly. One page table walk
>>>> could costs over 1000 cpu cycles on X86-64, which is a significant hit.
>>>>
>>>> We should be able to walk the page table once, faulting
>>>> pages in as required and replacing them with migration entries if
>>>> requested.
>>> Sounds sensible.
>>>
>>>> Tested in X86-64 VM with HMM test device, passing the selftests.
>>>> For performance, the migrate throughput tests from the selftests
>>>> show similar numbers (within error margin) as unmodified kernel.
>>> But no performance benefits are demonstrated?
>> There are no performance regressions for current tests.
>> Real benefits come if want to do migrate on fault.
>> For migrate on fault today missing pages are collected as not-present and
>> the caller has to fault them and re-run migrate_vma_setup(); folding 
>> HMM_PFN_REQ_FAULT into the collecting walk removes that extra
>> fault+retry round-trip, dropping two page table walks. Page table walks
>> are not cheap. Not to mention simplified implementation for driver.
>> Also, the vma looked up as part of the walk is readily available for
>> migration, eliminating the need for explicit vma lookup - one more
>> performance benefit. Net effect two saved page table walks and
>> one vma lookup.
> It certainly sounds that this series will result in performance
> improvements, but have those improvements been quantified?

Yes I think Alistair mentioned those walks showed clearly in perf traces
in his experiments, and that served as a motivation for this series


>
>> This series also addresses the vanished/reborn page table while
>> collecting problem which can crash current implementation.
> Oh.  I didn't get that message from the v14 changelogs, and crashes in
> the current implementation are not what we want.  In fact, addressing
> those is more important than speeding things up.
>
> Under what circumstances to these crashes occur?  Can/should we we fix
> those in a minimal -stable backportable fashion before moving on to speedups?

It is about races between concurrent MADV_DONTNEED and collecting, where the
collecting arrays overflow if page table is cleared, recycled and reinstantiated
as large page.
I am not sure if there is minimal fix to all the corner cases,
or would it be more like the approach in this series.

--Mika


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

* Re: [PATCH 00/12] [PATCH v14 00/12] migrate on fault for device pages
  2026-09-23 23:24       ` Jason Gunthorpe
@ 2026-09-24  0:14         ` Mika Penttilä
  0 siblings, 0 replies; 35+ messages in thread
From: Mika Penttilä @ 2026-09-24  0:14 UTC (permalink / raw)
  To: Jason Gunthorpe, Andrew Morton
  Cc: linux-mm, dri-devel, intel-xe, linux-kernel, David Hildenbrand,
	Leon Romanovsky, Alistair Popple, Balbir Singh, Zi Yan,
	Matthew Brost, Lorenzo Stoakes, Liam R. Howlett, Vlastimil Babka,
	Mike Rapoport, Suren Baghdasaryan, Michal Hocko


On 9/24/26 02:24, Jason Gunthorpe wrote:

> On Wed, Sep 23, 2026 at 02:19:36PM -0700, Andrew Morton wrote:
>> On Wed, 23 Sep 2026 08:29:34 +0300 Mika Penttilä <mpenttil@redhat.com> wrote:
>>
>>>>> migration). It is also tricky to code correctly. One page table walk
>>>>> could costs over 1000 cpu cycles on X86-64, which is a significant hit.
>>>>>
>>>>> We should be able to walk the page table once, faulting
>>>>> pages in as required and replacing them with migration entries if
>>>>> requested.
>>>> Sounds sensible.
>>>>
>>>>> Tested in X86-64 VM with HMM test device, passing the selftests.
>>>>> For performance, the migrate throughput tests from the selftests
>>>>> show similar numbers (within error margin) as unmodified kernel.
>>>> But no performance benefits are demonstrated?
>>> There are no performance regressions for current tests.
>>> Real benefits come if want to do migrate on fault.
>>> For migrate on fault today missing pages are collected as not-present and
>>> the caller has to fault them and re-run migrate_vma_setup(); folding 
>>> HMM_PFN_REQ_FAULT into the collecting walk removes that extra
>>> fault+retry round-trip, dropping two page table walks. Page table walks
>>> are not cheap. Not to mention simplified implementation for driver.
>>> Also, the vma looked up as part of the walk is readily available for
>>> migration, eliminating the need for explicit vma lookup - one more
>>> performance benefit. Net effect two saved page table walks and
>>> one vma lookup.
>> It certainly sounds that this series will result in performance
>> improvements, but have those improvements been quantified?
>>
>>> This series also addresses the vanished/reborn page table while
>>> collecting problem which can crash current implementation.
>> Oh.  I didn't get that message from the v14 changelogs, and crashes in
>> the current implementation are not what we want.  In fact, addressing
>> those is more important than speeding things up.
> Yeah, what is this about?
>
> The series still has lots of sashiko remarks, are they legit?

Some of them are legit some not. This was actually the first time sashiko
managed to apply the series. I will address all the remarks in v15 soon.

>
> Jason

--Mika


>


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

end of thread, other threads:[~2026-09-24  0:14 UTC | newest]

Thread overview: 35+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-22  5:34 [PATCH 00/12] [PATCH v14 00/12] migrate on fault for device pages mpenttil
2026-09-22  5:34 ` [PATCH v14 01/12] mm/Kconfig: changes for " mpenttil
2026-09-22  5:44   ` sashiko-bot
2026-09-22 22:27   ` Balbir Singh
2026-09-23  5:42     ` Mika Penttilä
2026-09-22  5:34 ` [PATCH v14 02/12] mm: add helper to convert HMM pfn to migrate pfn mpenttil
2026-09-22  5:34 ` [PATCH v14 03/12] mm/hmm: preparations for HMM to participate in migration mpenttil
2026-09-22  5:49   ` sashiko-bot
2026-09-22  5:34 ` [PATCH v14 04/12] mm/hmm: do the plumbing " mpenttil
2026-09-22  5:50   ` sashiko-bot
2026-09-22  5:34 ` [PATCH v14 05/12] mm/hmm: implement folio split for migrate needs in HMM pagewalk mpenttil
2026-09-22  5:47   ` sashiko-bot
2026-09-22  5:34 ` [PATCH v14 06/12] mm/hmm: migrate collection in HMM pagewalk - pte level mpenttil
2026-09-22  5:47   ` sashiko-bot
2026-09-22  5:34 ` [PATCH v14 07/12] mm/hmm: migrate collection in HMM pagewalk - pmd level mpenttil
2026-09-22  5:50   ` sashiko-bot
2026-09-22  5:34 ` [PATCH v14 08/12] mm/hmm: add lazy MMU mode support for migration in HMM pagewalk mpenttil
2026-09-22  5:51   ` sashiko-bot
2026-09-22  5:34 ` [PATCH v14 09/12] mm/hmm: implement rollback for device page " mpenttil
2026-09-22  5:34 ` [PATCH v14 10/12] mm: enable device page migration from " mpenttil
2026-09-22  5:58   ` sashiko-bot
2026-09-22  5:34 ` [PATCH v14 11/12] lib/test_hmm: add a new testcase for the migrate on fault mpenttil
2026-09-22  6:09   ` sashiko-bot
2026-09-22  5:34 ` [PATCH v14 12/12] Documentation/mm/hmm: document migration through hmm_range_fault() mpenttil
2026-09-22  5:41 ` ✗ CI.checkpatch: warning for Migrate on fault for device pages (rev6) Patchwork
2026-09-22  5:43 ` ✓ CI.KUnit: success " Patchwork
2026-09-22  6:00 ` ✗ CI.checksparse: warning " Patchwork
2026-09-22  7:08 ` ✓ Xe.CI.BAT: success " Patchwork
2026-09-22 15:03 ` ✗ Xe.CI.FULL: failure " Patchwork
2026-09-23  2:27 ` [PATCH 00/12] [PATCH v14 00/12] migrate on fault for device pages Andrew Morton
2026-09-23  5:29   ` Mika Penttilä
2026-09-23 21:19     ` Andrew Morton
2026-09-23 23:24       ` Jason Gunthorpe
2026-09-24  0:14         ` Mika Penttilä
2026-09-24  0:10       ` Mika Penttilä

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