Skip to contentSkip to conversation

mm: remove nth_page()

PATCH Applied David Hildenbrand 11 participants 77 messages Sep 1, 2025 – Oct 9, 2025

Subsystems (39)
lore
Share & tools
lore
#0 lore raw

v2 cover mm: remove nth_page()

This is based on mm-unstable.

I will only CC non-MM folks on the cover letter and the respective patch to not flood too many inboxes (the lists receive all patches).

--

As discussed recently with Linus, nth_page() is just nasty and we would like to remove it.

To recap, the reason we currently need nth_page() within a folio is because on some kernel configs (SPARSEMEM without SPARSEMEM_VMEMMAP), the memmap is allocated per memory section.

While buddy allocations cannot cross memory section boundaries, hugetlb and dax folios can.

So crossing a memory section means that "page++" could do the wrong thing. Instead, nth_page() on these problematic configs always goes from page->pfn, to the go from (++pfn)->page, which is rather nasty.

Likely, many people have no idea when nth_page() is required and when it might be dropped.

We refer to such problematic PFN ranges and "non-contiguous pages". If we only deal with "contiguous pages", there is not need for nth_page().

Besides that "obvious" folio case, we might end up using nth_page() within CMA allocations (again, could span memory sections), and in one corner case (kfence) when processing memblock allocations (again, could span memory sections).

So let's handle all that, add sanity checks, and remove nth_page().

Patch #1 -> #5 : stop making SPARSEMEM_VMEMMAP user-selectable + cleanups
Patch #6 -> #13 : disallow folios to have non-contiguous pages Patch #14 -> #20 : remove nth_page() usage within folios
Patch #22 : disallow CMA allocations of non-contiguous pages
Patch #23 -> #33 : sanity+check + remove nth_page() usage within SG entry
Patch #34 : sanity-check + remove nth_page() usage in
unpin_user_page_range_dirty_lock()

Patch #35        : remove nth_page() in kfence
Patch #36        : adjust stale comment regarding nth_page
Patch #37        : mm: remove nth_page()

A lot of this is inspired from the discussion at [1] between Linus, Jason and me, so cudos to them.

[1] https://lore.kernel.org/all/CAHk-=wiCYfNp4AJLBORU-c7ZyRBUp66W2-Et6cdQ4REx-GyQ_A@mail.gmail.com/T/#u

v1 -> v2:
* "fs: hugetlbfs: cleanup folio in adjust_range_hwpoison()" -> Add comment for loop and remove comment of function regarding

    copy_page_to_iter().

* Various smaller patch description tweaks I am not going to list for my sanity
* "mips: mm: convert __flush_dcache_pages() to __flush_dcache_folio_pages()"
-> Fix flush_dcache_page()
-> Drop "extern"
* "mm/gup: remove record_subpages()"
-> Added
* "mm/hugetlb: check for unreasonable folio sizes when registering hstate" -> Refine comment
* "mm/cma: refuse handing out non-contiguous page ranges"
-> Add comment above loop
* "mm/page_alloc: reject unreasonable folio/compound page sizes in alloc_contig_range_noprof()"
-> Added comment above check
* "mm/gup: drop nth_page() usage in unpin_user_page_range_dirty_lock()" -> Refined comment

RFC -> v1:
* "wireguard: selftests: remove CONFIG_SPARSEMEM_VMEMMAP=y from qemu kernel config"
-> Mention that it was never really relevant for the test
* "mm/mm_init: make memmap_init_compound() look more like prep_compound_page()"
-> Mention the setup of page links
* "mm: limit folio/compound page sizes in problematic kernel configs" -> Improve comment for PUD handling, mentioning hugetlb and dax
* "mm: simplify folio_page() and folio_page_idx()"
-> Call variable "n"
* "mm/hugetlb: cleanup hugetlb_folio_init_tail_vmemmap()"
-> Keep __init_single_page() and refer to the usage of
memblock_reserved_mark_noinit()
* "fs: hugetlbfs: cleanup folio in adjust_range_hwpoison()"
* "fs: hugetlbfs: remove nth_page() usage within folio in adjust_range_hwpoison()"
-> Separate nth_page() removal from cleanups
-> Further improve cleanups
* "io_uring/zcrx: remove nth_page() usage within folio"
-> Keep the io_copy_cache for now and limit to nth_page() removal
* "mm/gup: drop nth_page() usage within folio when recording subpages" -> Cleanup record_subpages as bit
* "mm/cma: refuse handing out non-contiguous page ranges"
-> Replace another instance of "pfn_to_page(pfn)" where we already have
the page
* "scatterlist: disallow non-contigous page ranges in a single SG entry" -> We have to EXPORT the symbol. I thought about moving it to mm_inline.h, but I really don't want to include that in include/linux/scatterlist.h
* "ata: libata-eh: drop nth_page() usage within SG entry"
* "mspro_block: drop nth_page() usage within SG entry"
* "memstick: drop nth_page() usage within SG entry"
* "mmc: drop nth_page() usage within SG entry"
-> Keep PAGE_SHIFT
* "scsi: scsi_lib: drop nth_page() usage within SG entry"
* "scsi: sg: drop nth_page() usage within SG entry"
-> Split patches, Keep PAGE_SHIFT
* "crypto: remove nth_page() usage within SG entry"
-> Keep PAGE_SHIFT
* "kfence: drop nth_page() usage"
-> Keep modifying i and use "start_pfn" only instead

David Hildenbrand (37):
mm: stop making SPARSEMEM_VMEMMAP user-selectable
arm64: Kconfig: drop superfluous "select SPARSEMEM_VMEMMAP" s390/Kconfig: drop superfluous "select SPARSEMEM_VMEMMAP" x86/Kconfig: drop superfluous "select SPARSEMEM_VMEMMAP"
wireguard: selftests: remove CONFIG_SPARSEMEM_VMEMMAP=y from qemu
kernel config
mm/page_alloc: reject unreasonable folio/compound page sizes in
alloc_contig_range_noprof()
mm/memremap: reject unreasonable folio/compound page sizes in
memremap_pages()
mm/hugetlb: check for unreasonable folio sizes when registering hstate mm/mm_init: make memmap_init_compound() look more like
prep_compound_page()
mm: sanity-check maximum folio size in folio_set_order()
mm: limit folio/compound page sizes in problematic kernel configs
mm: simplify folio_page() and folio_page_idx()
mm/hugetlb: cleanup hugetlb_folio_init_tail_vmemmap() mm/mm/percpu-km: drop nth_page() usage within single allocation
fs: hugetlbfs: remove nth_page() usage within folio in
adjust_range_hwpoison()
fs: hugetlbfs: cleanup folio in adjust_range_hwpoison() mm/pagewalk: drop nth_page() usage within folio in folio_walk_start() mm/gup: drop nth_page() usage within folio when recording subpages mm/gup: remove record_subpages()
io_uring/zcrx: remove nth_page() usage within folio
mips: mm: convert __flush_dcache_pages() to
__flush_dcache_folio_pages()
mm/cma: refuse handing out non-contiguous page ranges
dma-remap: drop nth_page() in dma_common_contiguous_remap()
scatterlist: disallow non-contigous page ranges in a single SG entry
ata: libata-sff: drop nth_page() usage within SG entry drm/i915/gem: drop nth_page() usage within SG entry
mspro_block: drop nth_page() usage within SG entry
memstick: drop nth_page() usage within SG entry
mmc: drop nth_page() usage within SG entry
scsi: scsi_lib: drop nth_page() usage within SG entry
scsi: sg: drop nth_page() usage within SG entry
vfio/pci: drop nth_page() usage within SG entry
crypto: remove nth_page() usage within SG entry
mm/gup: drop nth_page() usage in unpin_user_page_range_dirty_lock()
kfence: drop nth_page() usage
block: update comment of "struct bio_vec" regarding nth_page()
mm: remove nth_page()

 arch/arm64/Kconfig                            |  1 -
 arch/mips/include/asm/cacheflush.h            | 11 +++--
 arch/mips/mm/cache.c                          |  8 ++--
 arch/s390/Kconfig                             |  1 -
 arch/x86/Kconfig                              |  1 -
 crypto/ahash.c                                |  4 +-
 crypto/scompress.c                            |  8 ++--
 drivers/ata/libata-sff.c                      |  6 +--
 drivers/gpu/drm/i915/gem/i915_gem_pages.c     |  2 +-
 drivers/memstick/core/mspro_block.c           |  3 +-
 drivers/memstick/host/jmb38x_ms.c             |  3 +-
 drivers/memstick/host/tifm_ms.c               |  3 +-
 drivers/mmc/host/tifm_sd.c                    |  4 +-
 drivers/mmc/host/usdhi6rol0.c                 |  4 +-
 drivers/scsi/scsi_lib.c                       |  3 +-
 drivers/scsi/sg.c                             |  3 +-
 drivers/vfio/pci/pds/lm.c                     |  3 +-
 drivers/vfio/pci/virtio/migrate.c             |  3 +-
 fs/hugetlbfs/inode.c                          | 36 +++++---------
 include/crypto/scatterwalk.h                  |  4 +-
 include/linux/bvec.h                          |  7 +--
 include/linux/mm.h                            | 48 +++++++++++++++----
 include/linux/page-flags.h                    |  5 +-
 include/linux/scatterlist.h                   |  3 +-
 io_uring/zcrx.c                               |  4 +-
 kernel/dma/remap.c                            |  2 +-
 mm/Kconfig                                    |  3 +-
 mm/cma.c                                      | 39 +++++++++------
 mm/gup.c                                      | 36 +++++++-------
 mm/hugetlb.c                                  | 22 +++++----
 mm/internal.h                                 |  1 +
 mm/kfence/core.c                              | 12 +++--
 mm/memremap.c                                 |  3 ++
 mm/mm_init.c                                  | 15 +++---
 mm/page_alloc.c                               | 10 +++-
 mm/pagewalk.c                                 |  2 +-
 mm/percpu-km.c                                |  2 +-
 mm/util.c                                     | 36 ++++++++++++++
 tools/testing/scatterlist/linux/mm.h          |  1 -
 .../selftests/wireguard/qemu/kernel.config    |  1 -
 40 files changed, 217 insertions(+), 146 deletions(-)

base-commit: b73c6f2b5712809f5f386780ac46d1d78c31b2e6

Signature · 1 line
2.50.1
#1 lore raw

PATCH v2 1/37 mm: stop making SPARSEMEM_VMEMMAP user-selectable

In an ideal world, we wouldn't have to deal with SPARSEMEM without SPARSEMEM_VMEMMAP, but in particular for 32bit SPARSEMEM_VMEMMAP is considered too costly and consequently not supported.

However, if an architecture does support SPARSEMEM with SPARSEMEM_VMEMMAP, let's forbid the user to disable VMEMMAP: just like we already do for arm64, s390 and x86.

So if SPARSEMEM_VMEMMAP is supported, don't allow to use SPARSEMEM without SPARSEMEM_VMEMMAP.

This implies that the option to not use SPARSEMEM_VMEMMAP will now be gone for loongarch, powerpc, riscv and sparc. All architectures only enable SPARSEMEM_VMEMMAP with 64bit support, so there should not really be a big downside to using the VMEMMAP (quite the contrary).

This is a preparation for not supporting

(1) folio sizes that exceed a single memory section
(2) CMA allocations of non-contiguous page ranges

in SPARSEMEM without SPARSEMEM_VMEMMAP configs, whereby we want to limit possible impact as much as possible (e.g., gigantic hugetlb page allocations suddenly fails).

Cc Huacai Chen <[email protected]>
Cc WANG Xuerui <[email protected]>
Cc Madhavan Srinivasan <[email protected]>
Cc Michael Ellerman <[email protected]>
Cc Nicholas Piggin <[email protected]>
Cc Christophe Leroy <[email protected]>
Cc Paul Walmsley <[email protected]>
Cc Palmer Dabbelt <[email protected]>
Cc Albert Ou <[email protected]>
Cc Alexandre Ghiti <[email protected]>
Cc "David S. Miller" <[email protected]>
Cc Andreas Larsson <[email protected]>
---
 mm/Kconfig | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)
mm/Kconfig +1 -2
index 4108bcd967848..330d0e698ef96 100644
@@ -439,9 +439,8 @@ config SPARSEMEM_VMEMMAP_ENABLE
 	bool
 
 config SPARSEMEM_VMEMMAP
-	bool "Sparse Memory virtual memmap"
+	def_bool y
 	depends on SPARSEMEM && SPARSEMEM_VMEMMAP_ENABLE
-	default y
 	help
 	  SPARSEMEM_VMEMMAP uses a virtually mapped memmap to optimise
 	  pfn_to_page and page_to_pfn operations.  This is the most
Signature · 1 line
2.50.1
#2 lore raw

PATCH v2 2/37 arm64: Kconfig: drop superfluous "select SPARSEMEM_VMEMMAP"

In reply to David Hildenbrand

Now handled by the core automatically once SPARSEMEM_VMEMMAP_ENABLE is selected.

---
 arch/arm64/Kconfig | 1 -
 1 file changed, 1 deletion(-)
arch/arm64/Kconfig +0 -1
index e9bbfacc35a64..b1d1f2ff2493b 100644
@@ -1570,7 +1570,6 @@ source "kernel/Kconfig.hz"
 config ARCH_SPARSEMEM_ENABLE
 	def_bool y
 	select SPARSEMEM_VMEMMAP_ENABLE
-	select SPARSEMEM_VMEMMAP
 
 config HW_PERF_EVENTS
 	def_bool y
Signature · 1 line
2.50.1
#3 lore raw

PATCH v2 3/37 s390/Kconfig: drop superfluous "select SPARSEMEM_VMEMMAP"

In reply to David Hildenbrand

Now handled by the core automatically once SPARSEMEM_VMEMMAP_ENABLE is selected.

---
 arch/s390/Kconfig | 1 -
 1 file changed, 1 deletion(-)
arch/s390/Kconfig +0 -1
index bf680c26a33cf..145ca23c2fff6 100644
@@ -710,7 +710,6 @@ menu "Memory setup"
 config ARCH_SPARSEMEM_ENABLE
 	def_bool y
 	select SPARSEMEM_VMEMMAP_ENABLE
-	select SPARSEMEM_VMEMMAP
 
 config ARCH_SPARSEMEM_DEFAULT
 	def_bool y
Signature · 1 line
2.50.1
#4 lore raw

PATCH v2 4/37 x86/Kconfig: drop superfluous "select SPARSEMEM_VMEMMAP"

In reply to David Hildenbrand

Now handled by the core automatically once SPARSEMEM_VMEMMAP_ENABLE is selected.

---
 arch/x86/Kconfig | 1 -
 1 file changed, 1 deletion(-)
arch/x86/Kconfig +0 -1
index 58d890fe2100e..e431d1c06fecd 100644
@@ -1552,7 +1552,6 @@ config ARCH_SPARSEMEM_ENABLE
 	def_bool y
 	select SPARSEMEM_STATIC if X86_32
 	select SPARSEMEM_VMEMMAP_ENABLE if X86_64
-	select SPARSEMEM_VMEMMAP if X86_64
 
 config ARCH_SPARSEMEM_DEFAULT
 	def_bool X86_64 || (NUMA && X86_32)
Signature · 1 line
2.50.1
#5 lore raw

PATCH v2 5/37 wireguard: selftests: remove CONFIG_SPARSEMEM_VMEMMAP=y from qemu kernel config

In reply to David Hildenbrand

It's no longer user-selectable (and the default was already "y"), so let's just drop it.

It was never really relevant to the wireguard selftests either way.

---
 tools/testing/selftests/wireguard/qemu/kernel.config | 1 -
 1 file changed, 1 deletion(-)
tools/testing/selftests/wireguard/qemu/kernel.config +0 -1
index 0a5381717e9f4..1149289f4b30f 100644
@@ -48,7 +48,6 @@ CONFIG_JUMP_LABEL=y
 CONFIG_FUTEX=y
 CONFIG_SHMEM=y
 CONFIG_SLUB=y
-CONFIG_SPARSEMEM_VMEMMAP=y
 CONFIG_SMP=y
 CONFIG_SCHED_SMT=y
 CONFIG_SCHED_MC=y
Signature · 1 line
2.50.1
maintainer Applied
#6 lore raw

Re: [PATCH v2 05/37] wireguard: selftests: remove CONFIG_SPARSEMEM_VMEMMAP=y from qemu kernel config

Applied this one, actually. Thank you.

#7 lore raw

PATCH v2 6/37 mm/page_alloc: reject unreasonable folio/compound page sizes in alloc_contig_range_noprof()

In reply to David Hildenbrand

Let's reject them early, which in turn makes folio_alloc_gigantic() reject them properly.

To avoid converting from order to nr_pages, let's just add MAX_FOLIO_ORDER and calculate MAX_FOLIO_NR_PAGES based on that.

While at it, let's just make the order a "const unsigned order".

---
 include/linux/mm.h |  6 ++++--
 mm/page_alloc.c    | 10 +++++++++-
 2 files changed, 13 insertions(+), 3 deletions(-)
include/linux/mm.h +4 -2
index 00c8a54127d37..77737cbf2216a 100644
@@ -2055,11 +2055,13 @@ static inline long folio_nr_pages(const struct folio *folio)
 
 /* Only hugetlbfs can allocate folios larger than MAX_ORDER */
 #ifdef CONFIG_ARCH_HAS_GIGANTIC_PAGE
-#define MAX_FOLIO_NR_PAGES	(1UL << PUD_ORDER)
+#define MAX_FOLIO_ORDER		PUD_ORDER
 #else
-#define MAX_FOLIO_NR_PAGES	MAX_ORDER_NR_PAGES
+#define MAX_FOLIO_ORDER		MAX_PAGE_ORDER
 #endif
 
+#define MAX_FOLIO_NR_PAGES	(1UL << MAX_FOLIO_ORDER)
+
 /*
  * compound_nr() returns the number of pages in this potentially compound
  * page.  compound_nr() can be called on a tail page, and is defined to
mm/page_alloc.c +9 -1
index 27ea4c7acd158..7e96c69a06ccb 100644
@@ -6841,6 +6841,7 @@ static int __alloc_contig_verify_gfp_mask(gfp_t gfp_mask, gfp_t *gfp_cc_mask)
 int alloc_contig_range_noprof(unsigned long start, unsigned long end,
 			      acr_flags_t alloc_flags, gfp_t gfp_mask)
 {
+	const unsigned int order = ilog2(end - start);
 	unsigned long outer_start, outer_end;
 	int ret = 0;
 
@@ -6858,6 +6859,14 @@ int alloc_contig_range_noprof(unsigned long start, unsigned long end,
 					    PB_ISOLATE_MODE_CMA_ALLOC :
 					    PB_ISOLATE_MODE_OTHER;
 
+	/*
+	 * In contrast to the buddy, we allow for orders here that exceed
+	 * MAX_PAGE_ORDER, so we must manually make sure that we are not
+	 * exceeding the maximum folio order.
+	 */
+	if (WARN_ON_ONCE((gfp_mask & __GFP_COMP) && order > MAX_FOLIO_ORDER))
+		return -EINVAL;
+
 	gfp_mask = current_gfp_context(gfp_mask);
 	if (__alloc_contig_verify_gfp_mask(gfp_mask, (gfp_t *)&cc.gfp_mask))
 		return -EINVAL;
@@ -6955,7 +6964,6 @@ int alloc_contig_range_noprof(unsigned long start, unsigned long end,
 			free_contig_range(end, outer_end - end);
 	} else if (start == outer_start && end == outer_end && is_power_of_2(end - start)) {
 		struct page *head = pfn_to_page(start);
-		int order = ilog2(end - start);
 
 		check_new_pages(head, order);
 		prep_new_page(head, order, gfp_mask, 0);
Signature · 1 line
2.50.1
#8 lore raw

PATCH v2 7/37 mm/memremap: reject unreasonable folio/compound page sizes in memremap_pages()

In reply to David Hildenbrand

Let's reject unreasonable folio sizes early, where we can still fail. We'll add sanity checks to prepare_compound_head/prepare_compound_page next.

Is there a way to configure a system such that unreasonable folio sizes would be possible? It would already be rather questionable.

If so, we'd probably want to bail out earlier, where we can avoid a WARN and just report a proper error message that indicates where something went wrong such that we messed up.

---
 mm/memremap.c | 3 +++
 1 file changed, 3 insertions(+)
mm/memremap.c +3 -0
index b0ce0d8254bd8..a2d4bb88f64b6 100644
@@ -275,6 +275,9 @@ void *memremap_pages(struct dev_pagemap *pgmap, int nid)
 
 	if (WARN_ONCE(!nr_range, "nr_range must be specified\n"))
 		return ERR_PTR(-EINVAL);
+	if (WARN_ONCE(pgmap->vmemmap_shift > MAX_FOLIO_ORDER,
+		      "requested folio size unsupported\n"))
+		return ERR_PTR(-EINVAL);
 
 	switch (pgmap->type) {
 	case MEMORY_DEVICE_PRIVATE:
Signature · 1 line
2.50.1
#9 lore raw

PATCH v2 8/37 mm/hugetlb: check for unreasonable folio sizes when registering hstate

In reply to David Hildenbrand

Let's check that no hstate that corresponds to an unreasonable folio size is registered by an architecture. If we were to succeed registering, we could later try allocating an unsupported gigantic folio size.

Further, let's add a BUILD_BUG_ON() for checking that HUGETLB_PAGE_ORDER is sane at build time. As HUGETLB_PAGE_ORDER is dynamic on powerpc, we have to use a BUILD_BUG_ON_INVALID() to make it compile.

No existing kernel configuration should be able to trigger this check:
either SPARSEMEM without SPARSEMEM_VMEMMAP cannot be configured or gigantic folios will not exceed a memory section (the case on sparse).

---
 mm/hugetlb.c | 2 ++
 1 file changed, 2 insertions(+)
mm/hugetlb.c +2 -0
index 1e777cc51ad04..d3542e92a712e 100644
@@ -4657,6 +4657,7 @@ static int __init hugetlb_init(void)
 
 	BUILD_BUG_ON(sizeof_field(struct page, private) * BITS_PER_BYTE <
 			__NR_HPAGEFLAGS);
+	BUILD_BUG_ON_INVALID(HUGETLB_PAGE_ORDER > MAX_FOLIO_ORDER);
 
 	if (!hugepages_supported()) {
 		if (hugetlb_max_hstate || default_hstate_max_huge_pages)
@@ -4740,6 +4741,7 @@ void __init hugetlb_add_hstate(unsigned int order)
 	}
 	BUG_ON(hugetlb_max_hstate >= HUGE_MAX_HSTATE);
 	BUG_ON(order < order_base_2(__NR_USED_SUBPAGE));
+	WARN_ON(order > MAX_FOLIO_ORDER);
 	h = &hstates[hugetlb_max_hstate++];
 	__mutex_init(&h->resize_lock, "resize mutex", &h->resize_key);
 	h->order = order;
Signature · 1 line
2.50.1
#10 lore raw

Re: (bisected) [PATCH v2 08/37] mm/hugetlb: check for unreasonable folio sizes when registering hstate

Hi David,

Le 01/09/2025 à 17:03, David Hildenbrand a écrit :

Quoted 8 lines

Let's check that no hstate that corresponds to an unreasonable folio size is registered by an architecture. If we were to succeed registering, we could later try allocating an unsupported gigantic folio size.

Further, let's add a BUILD_BUG_ON() for checking that HUGETLB_PAGE_ORDER is sane at build time. As HUGETLB_PAGE_ORDER is dynamic on powerpc, we have to use a BUILD_BUG_ON_INVALID() to make it compile.

Quoted 8 lines

No existing kernel configuration should be able to trigger this check:
either SPARSEMEM without SPARSEMEM_VMEMMAP cannot be configured or gigantic folios will not exceed a memory section (the case on sparse).

I get following warning on powerpc with linus tree, bisected to commit 7b4f21f5e038 ("mm/hugetlb: check for unreasonable folio sizes when registering hstate")

------------[ cut here ]------------
WARNING: CPU: 0 PID: 0 at mm/hugetlb.c:4744 hugetlb_add_hstate+0xc0/0x180
Modules linked in:
CPU: 0 UID: 0 PID: 0 Comm: swapper Not tainted 6.17.0-rc4-00275-g7b4f21f5e038 #1683 NONE
Hardware name: QEMU ppce500 e5500 0x80240020 QEMU e500
NIP:  c000000001357408 LR: c000000001357c90 CTR: 0000000000000003
REGS: c00000000152bad0 TRAP: 0700   Not tainted (6.17.0-rc4-00275-g7b4f21f5e038)
MSR:  0000000080021002 <CE,ME>  CR: 44000448  XER: 20000000

IRQMASK: 1
GPR00: c000000001357c90 c00000000152bd70 c000000001339000 0000000000000012
GPR04: 000000000000000a 0000000000001000 000000000000001e 0000000000000000
GPR08: 0000000000000000 0000000000000000 0000000000000001 000000000000000a
GPR12: c000000001357b68 c000000001590000 0000000000000000 0000000000000000
GPR16: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
GPR20: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
GPR24: c0000000011adb40 c00000000156b528 0000000000000000 c00000000156b4b0
GPR28: c00000000156b528 0000000000000012 0000000040000000 0000000000000000 NIP [c000000001357408] hugetlb_add_hstate+0xc0/0x180
LR [c000000001357c90] hugepagesz_setup+0x128/0x150

Call Trace:
[c00000000152bd70] [c00000000152bda0] init_stack+0x3da0/0x4000 (unreliable)
[c00000000152be10] [c000000001357c90] hugepagesz_setup+0x128/0x150
[c00000000152be80] [c00000000135841c] hugetlb_bootmem_alloc+0x84/0x104
[c00000000152bec0] [c00000000135143c] mm_core_init+0x30/0x174
[c00000000152bf30] [c000000001332ed4] start_kernel+0x540/0x880
[c00000000152bfe0] [c000000000000a50] start_here_common+0x1c/0x20
Code: 2c09000f 39000001 38e00000 39400001 7d00401e 0b080000 281d0001 7d00505e 79080020 0b080000 281d000c 7d4a385e <0b0a0000> 1f5a00b8 38bf0020 3c82ffe8
---[ end trace 0000000000000000 ]---
------------[ cut here ]------------
WARNING: CPU: 0 PID: 0 at mm/hugetlb.c:4744 hugetlb_add_hstate+0xc0/0x180
Modules linked in:
CPU: 0 UID: 0 PID: 0 Comm: swapper Tainted: G        W 6.17.0-rc4-00275-g7b4f21f5e038 #1683 NONE
Tainted: [W]=WARN
Hardware name: QEMU ppce500 e5500 0x80240020 QEMU e500
NIP:  c000000001357408 LR: c000000001357c90 CTR: 0000000000000005
REGS: c00000000152bad0 TRAP: 0700   Tainted: G        W (6.17.0-rc4-00275-g7b4f21f5e038)
MSR:  0000000080021002 <CE,ME>  CR: 48000448  XER: 20000000

IRQMASK: 1
GPR00: c000000001357c90 c00000000152bd70 c000000001339000 000000000000000e
GPR04: 000000000000000a 0000000000001000 0000000040000000 0000000000000000
GPR08: 0000000000000000 0000000000000001 0000000000000001 0000000000000280
GPR12: c000000001357b68 c000000001590000 0000000000000000 0000000000000000
GPR16: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
GPR20: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
GPR24: c0000000011adb40 c00000000156b5e0 0000000000000001 c00000000156b4b0
GPR28: c00000000156b528 000000000000000e 0000000004000000 00000000000000b8 NIP [c000000001357408] hugetlb_add_hstate+0xc0/0x180
LR [c000000001357c90] hugepagesz_setup+0x128/0x150

Call Trace:
[c00000000152bd70] [c000000000f27048] __func__.0+0x0/0x18 (unreliable)
[c00000000152be10] [c000000001357c90] hugepagesz_setup+0x128/0x150
[c00000000152be80] [c00000000135841c] hugetlb_bootmem_alloc+0x84/0x104
[c00000000152bec0] [c00000000135143c] mm_core_init+0x30/0x174
[c00000000152bf30] [c000000001332ed4] start_kernel+0x540/0x880
[c00000000152bfe0] [c000000000000a50] start_here_common+0x1c/0x20
Code: 2c09000f 39000001 38e00000 39400001 7d00401e 0b080000 281d0001 7d00505e 79080020 0b080000 281d000c 7d4a385e <0b0a0000> 1f5a00b8 38bf0020 3c82ffe8
---[ end trace 0000000000000000 ]---
------------[ cut here ]------------
WARNING: CPU: 0 PID: 0 at mm/hugetlb.c:4744 hugetlb_add_hstate+0xc0/0x180
Modules linked in:
CPU: 0 UID: 0 PID: 0 Comm: swapper Tainted: G        W 6.17.0-rc4-00275-g7b4f21f5e038 #1683 NONE
Tainted: [W]=WARN
Hardware name: QEMU ppce500 e5500 0x80240020 QEMU e500
NIP:  c000000001357408 LR: c000000001357c90 CTR: 0000000000000004
REGS: c00000000152bad0 TRAP: 0700   Tainted: G        W (6.17.0-rc4-00275-g7b4f21f5e038)
MSR:  0000000080021002 <CE,ME>  CR: 48000448  XER: 20000000

IRQMASK: 1
GPR00: c000000001357c90 c00000000152bd70 c000000001339000 0000000000000010
GPR04: 000000000000000a 0000000000001000 0000000004000000 0000000000000000
GPR08: 0000000000000000 0000000000000002 0000000000000001 0000000000000a00
GPR12: c000000001357b68 c000000001590000 0000000000000000 0000000000000000
GPR16: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
GPR20: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
GPR24: c0000000011adb40 c00000000156b698 0000000000000002 c00000000156b4b0
GPR28: c00000000156b528 0000000000000010 0000000010000000 0000000000000170 NIP [c000000001357408] hugetlb_add_hstate+0xc0/0x180
LR [c000000001357c90] hugepagesz_setup+0x128/0x150

Call Trace:
[c00000000152bd70] [c000000000f27048] __func__.0+0x0/0x18 (unreliable)
[c00000000152be10] [c000000001357c90] hugepagesz_setup+0x128/0x150
[c00000000152be80] [c00000000135841c] hugetlb_bootmem_alloc+0x84/0x104
[c00000000152bec0] [c00000000135143c] mm_core_init+0x30/0x174
[c00000000152bf30] [c000000001332ed4] start_kernel+0x540/0x880
[c00000000152bfe0] [c000000000000a50] start_here_common+0x1c/0x20
Code: 2c09000f 39000001 38e00000 39400001 7d00401e 0b080000 281d0001 7d00505e 79080020 0b080000 281d000c 7d4a385e <0b0a0000> 1f5a00b8 38bf0020 3c82ffe8
---[ end trace 0000000000000000 ]---
Quoted 24 lines
---
  mm/hugetlb.c | 2 ++
  1 file changed, 2 insertions(+)
mm/hugetlb.c +2 -0
index 1e777cc51ad04..d3542e92a712e 100644
@@ -4657,6 +4657,7 @@ static int __init hugetlb_init(void)
 
  	BUILD_BUG_ON(sizeof_field(struct page, private) * BITS_PER_BYTE <
  			__NR_HPAGEFLAGS);
+	BUILD_BUG_ON_INVALID(HUGETLB_PAGE_ORDER > MAX_FOLIO_ORDER);
 
  	if (!hugepages_supported()) {
  		if (hugetlb_max_hstate || default_hstate_max_huge_pages)
@@ -4740,6 +4741,7 @@ void __init hugetlb_add_hstate(unsigned int order)
  	}
  	BUG_ON(hugetlb_max_hstate >= HUGE_MAX_HSTATE);
  	BUG_ON(order < order_base_2(__NR_USED_SUBPAGE));
+	WARN_ON(order > MAX_FOLIO_ORDER);
  	h = &hstates[hugetlb_max_hstate++];
  	__mutex_init(&h->resize_lock, "resize mutex", &h->resize_key);
  	h->order = order;
#11 lore raw

Re: (bisected) [PATCH v2 08/37] mm/hugetlb: check for unreasonable folio sizes when registering hstate

Quoted 15 lines · Christophe Leroy

Hi David,

Le 01/09/2025 à 17:03, David Hildenbrand a écrit :

Quoted 12 lines

Let's check that no hstate that corresponds to an unreasonable folio size is registered by an architecture. If we were to succeed registering, we could later try allocating an unsupported gigantic folio size.

Further, let's add a BUILD_BUG_ON() for checking that HUGETLB_PAGE_ORDER is sane at build time. As HUGETLB_PAGE_ORDER is dynamic on powerpc, we have to use a BUILD_BUG_ON_INVALID() to make it compile.

No existing kernel configuration should be able to trigger this check:
either SPARSEMEM without SPARSEMEM_VMEMMAP cannot be configured or gigantic folios will not exceed a memory section (the case on sparse).

Quoted 8 lines
Quoted 4 lines

I get following warning on powerpc with linus tree, bisected to commit 7b4f21f5e038 ("mm/hugetlb: check for unreasonable folio sizes when registering hstate")

Do you have the kernel config around? Is it 32bit?

That would be helpful.

[...]

Quoted 14 lines
Quoted 14 lines
---
   mm/hugetlb.c | 2 ++
   1 file changed, 2 insertions(+)
mm/hugetlb.c +1 -0
index 1e777cc51ad04..d3542e92a712e 100644
@@ -4657,6 +4657,7 @@ static int __init hugetlb_init(void)
 
   	BUILD_BUG_ON(sizeof_field(struct page, private) * BITS_PER_BYTE <
   			__NR_HPAGEFLAGS);
+	BUILD_BUG_ON_INVALID(HUGETLB_PAGE_ORDER > MAX_FOLIO_ORDER);
 
Quoted 10 lines

mm/hugetlb.c void __init hugetlb_add_hstate(unsigned int order) · line 4747

Quoted 10 lines
mm/hugetlb.c +1 -0
   	if (!hugepages_supported()) {
   		if (hugetlb_max_hstate || default_hstate_max_huge_pages)
@@ -4740,6 +4741,7 @@ void __init hugetlb_add_hstate(unsigned int order)
   	}
   	BUG_ON(hugetlb_max_hstate >= HUGE_MAX_HSTATE);
   	BUG_ON(order < order_base_2(__NR_USED_SUBPAGE));
+	WARN_ON(order > MAX_FOLIO_ORDER);
   	h = &hstates[hugetlb_max_hstate++];
   	__mutex_init(&h->resize_lock, "resize mutex", &h->resize_key);
   	h->order = order;

We end up registering hugetlb folios that are bigger than MAX_FOLIO_ORDER. So we have to figure out how a config can trigger that (and if we have to support that).

Signature · 3 lines
Cheers

David / dhildenb
#12 lore raw

Re: (bisected) [PATCH v2 08/37] mm/hugetlb: check for unreasonable folio sizes when registering hstate

Le 09/10/2025 à 09:22, David Hildenbrand a écrit :

Quoted 21 lines · Christophe Leroy
Quoted 20 lines

Hi David,

Le 01/09/2025 à 17:03, David Hildenbrand a écrit :

Quoted 16 lines

Let's check that no hstate that corresponds to an unreasonable folio size is registered by an architecture. If we were to succeed registering, we could later try allocating an unsupported gigantic folio size.

Further, let's add a BUILD_BUG_ON() for checking that HUGETLB_PAGE_ORDER is sane at build time. As HUGETLB_PAGE_ORDER is dynamic on powerpc, we have to use a BUILD_BUG_ON_INVALID() to make it compile.

No existing kernel configuration should be able to trigger this check:
either SPARSEMEM without SPARSEMEM_VMEMMAP cannot be configured or gigantic folios will not exceed a memory section (the case on sparse).

Quoted 7 lines
Quoted 3 lines

I get following warning on powerpc with linus tree, bisected to commit 7b4f21f5e038 ("mm/hugetlb: check for unreasonable folio sizes when registering hstate")

Do you have the kernel config around? Is it 32bit?

That would be helpful.

That's corenet64_smp_defconfig

Boot on QEMU with:

	qemu-system-ppc64 -smp 2 -nographic -M ppce500 -cpu e5500 -m 1G

Christophe

#13 lore raw

Re: (bisected) [PATCH v2 08/37] mm/hugetlb: check for unreasonable folio sizes when registering hstate

In reply to David Hildenbrand

Le 09/10/2025 à 09:22, David Hildenbrand a écrit :

Quoted 16 lines · Christophe Leroy
Quoted 15 lines

Hi David,

Le 01/09/2025 à 17:03, David Hildenbrand a écrit :

Quoted 12 lines
mm/hugetlb.c +0 -0
index 1e777cc51ad04..d3542e92a712e 100644
@@ -4657,6 +4657,7 @@ static int __init hugetlb_init(void)

       BUILD_BUG_ON(sizeof_field(struct page, private) * BITS_PER_BYTE < __NR_HPAGEFLAGS);
+    BUILD_BUG_ON_INVALID(HUGETLB_PAGE_ORDER > MAX_FOLIO_ORDER); if (!hugepages_supported()) {
           if (hugetlb_max_hstate || default_hstate_max_huge_pages)

mm/hugetlb.c +0 -0
@@ -4740,6 +4741,7 @@ void __init hugetlb_add_hstate(unsigned int order)
        }
Quoted 9 lines
Quoted 6 lines

mm/hugetlb.c void __init hugetlb_add_hstate(unsigned int order) · line 4747

Quoted 6 lines
mm/hugetlb.c +1 -0
        BUG_ON(hugetlb_max_hstate >= HUGE_MAX_HSTATE);
        BUG_ON(order < order_base_2(__NR_USED_SUBPAGE));
+    WARN_ON(order > MAX_FOLIO_ORDER);
        h = &hstates[hugetlb_max_hstate++];
        __mutex_init(&h->resize_lock, "resize mutex", &h->resize_key);
        h->order = order;

We end up registering hugetlb folios that are bigger than MAX_FOLIO_ORDER. So we have to figure out how a config can trigger that (and if we have to support that).

MAX_FOLIO_ORDER is defined as:

#ifdef CONFIG_ARCH_HAS_GIGANTIC_PAGE
#define MAX_FOLIO_ORDER PUD_ORDER
#else
#define MAX_FOLIO_ORDER MAX_PAGE_ORDER
#endif

MAX_PAGE_ORDER is the limit for dynamic creation of hugepages via /sys/kernel/mm/hugepages/ but bigger pages can be created at boottime with kernel boot parameters without CONFIG_ARCH_HAS_GIGANTIC_PAGE:

hugepagesz=64m hugepages=1 hugepagesz=256m hugepages=1

Gives:

HugeTLB: registered 1.00 GiB page size, pre-allocated 0 pages
HugeTLB: 0 KiB vmemmap can be freed for a 1.00 GiB page
HugeTLB: registered 64.0 MiB page size, pre-allocated 1 pages
HugeTLB: 0 KiB vmemmap can be freed for a 64.0 MiB page
HugeTLB: registered 256 MiB page size, pre-allocated 1 pages
HugeTLB: 0 KiB vmemmap can be freed for a 256 MiB page
HugeTLB: registered 4.00 MiB page size, pre-allocated 0 pages
HugeTLB: 0 KiB vmemmap can be freed for a 4.00 MiB page
HugeTLB: registered 16.0 MiB page size, pre-allocated 0 pages
HugeTLB: 0 KiB vmemmap can be freed for a 16.0 MiB page

Christophe

#14 lore raw

Re: (bisected) [PATCH v2 08/37] mm/hugetlb: check for unreasonable folio sizes when registering hstate

Quoted 47 lines · Christophe Leroy

Le 09/10/2025 à 09:22, David Hildenbrand a écrit :

Quoted 18 lines · Christophe Leroy
Quoted 17 lines

Hi David,

Le 01/09/2025 à 17:03, David Hildenbrand a écrit :

Quoted 14 lines
mm/hugetlb.c +1 -0
index 1e777cc51ad04..d3542e92a712e 100644
@@ -4657,6 +4657,7 @@ static int __init hugetlb_init(void)
        BUILD_BUG_ON(sizeof_field(struct page, private) * BITS_PER_BYTE <
                __NR_HPAGEFLAGS);
+    BUILD_BUG_ON_INVALID(HUGETLB_PAGE_ORDER > MAX_FOLIO_ORDER);
        if (!hugepages_supported()) {
            if (hugetlb_max_hstate || default_hstate_max_huge_pages)
@@ -4740,6 +4741,7 @@ void __init hugetlb_add_hstate(unsigned int order)
        }
        BUG_ON(hugetlb_max_hstate >= HUGE_MAX_HSTATE);
        BUG_ON(order < order_base_2(__NR_USED_SUBPAGE));
Quoted 9 lines
Quoted 4 lines

mm/hugetlb.c void __init hugetlb_add_hstate(unsigned int order) · line 4747

Quoted 4 lines
mm/hugetlb.c +1 -0
+    WARN_ON(order > MAX_FOLIO_ORDER);
        h = &hstates[hugetlb_max_hstate++];
        __mutex_init(&h->resize_lock, "resize mutex", &h->resize_key);
        h->order = order;

We end up registering hugetlb folios that are bigger than MAX_FOLIO_ORDER. So we have to figure out how a config can trigger that (and if we have to support that).

MAX_FOLIO_ORDER is defined as:

#ifdef CONFIG_ARCH_HAS_GIGANTIC_PAGE
#define MAX_FOLIO_ORDER PUD_ORDER
#else
#define MAX_FOLIO_ORDER MAX_PAGE_ORDER
#endif

MAX_PAGE_ORDER is the limit for dynamic creation of hugepages via /sys/kernel/mm/hugepages/ but bigger pages can be created at boottime with kernel boot parameters without CONFIG_ARCH_HAS_GIGANTIC_PAGE:

hugepagesz=64m hugepages=1 hugepagesz=256m hugepages=1

Gives:

Quoted 10 lines

HugeTLB: registered 1.00 GiB page size, pre-allocated 0 pages
HugeTLB: 0 KiB vmemmap can be freed for a 1.00 GiB page
HugeTLB: registered 64.0 MiB page size, pre-allocated 1 pages
HugeTLB: 0 KiB vmemmap can be freed for a 64.0 MiB page
HugeTLB: registered 256 MiB page size, pre-allocated 1 pages
HugeTLB: 0 KiB vmemmap can be freed for a 256 MiB page
HugeTLB: registered 4.00 MiB page size, pre-allocated 0 pages
HugeTLB: 0 KiB vmemmap can be freed for a 4.00 MiB page
HugeTLB: registered 16.0 MiB page size, pre-allocated 0 pages
HugeTLB: 0 KiB vmemmap can be freed for a 16.0 MiB page

I think it's a violation of CONFIG_ARCH_HAS_GIGANTIC_PAGE. The existing folio_dump() code would not handle it correctly as well.

See how snapshot_page() uses MAX_FOLIO_NR_PAGES.

Signature · 3 lines
Cheers

David / dhildenb
#15 lore raw

Re: (bisected) [PATCH v2 08/37] mm/hugetlb: check for unreasonable folio sizes when registering hstate

Le 09/10/2025 à 10:14, David Hildenbrand a écrit :

Quoted 60 lines · Christophe Leroy
Quoted 48 lines

Le 09/10/2025 à 09:22, David Hildenbrand a écrit :

Quoted 19 lines · Christophe Leroy
Quoted 18 lines

Hi David,

Le 01/09/2025 à 17:03, David Hildenbrand a écrit :

Quoted 15 lines
mm/hugetlb.c +0 -0
index 1e777cc51ad04..d3542e92a712e 100644
@@ -4657,6 +4657,7 @@ static int __init hugetlb_init(void)

        BUILD_BUG_ON(sizeof_field(struct page, private) * BITS_PER_BYTE < __NR_HPAGEFLAGS);
+    BUILD_BUG_ON_INVALID(HUGETLB_PAGE_ORDER > MAX_FOLIO_ORDER); if (!hugepages_supported()) {
            if (hugetlb_max_hstate || default_hstate_max_huge_pages)

mm/hugetlb.c +0 -0
@@ -4740,6 +4741,7 @@ void __init hugetlb_add_hstate(unsigned int 
 order)
         }
         BUG_ON(hugetlb_max_hstate >= HUGE_MAX_HSTATE);
         BUG_ON(order < order_base_2(__NR_USED_SUBPAGE));
Quoted 9 lines
Quoted 4 lines
Quoted 4 lines
mm/hugetlb.c +1 -0
+    WARN_ON(order > MAX_FOLIO_ORDER);
         h = &hstates[hugetlb_max_hstate++];
         __mutex_init(&h->resize_lock, "resize mutex", &h->resize_key);

        h->order = order;

We end up registering hugetlb folios that are bigger than MAX_FOLIO_ORDER. So we have to figure out how a config can trigger that (and if we have to support that).

MAX_FOLIO_ORDER is defined as:

#ifdef CONFIG_ARCH_HAS_GIGANTIC_PAGE
#define MAX_FOLIO_ORDER        PUD_ORDER
#else
#define MAX_FOLIO_ORDER        MAX_PAGE_ORDER
#endif

MAX_PAGE_ORDER is the limit for dynamic creation of hugepages via /sys/kernel/mm/hugepages/ but bigger pages can be created at boottime with kernel boot parameters without CONFIG_ARCH_HAS_GIGANTIC_PAGE:

    hugepagesz=64m hugepages=1 hugepagesz=256m hugepages=1

Gives:

Quoted 10 lines

HugeTLB: registered 1.00 GiB page size, pre-allocated 0 pages
HugeTLB: 0 KiB vmemmap can be freed for a 1.00 GiB page
HugeTLB: registered 64.0 MiB page size, pre-allocated 1 pages
HugeTLB: 0 KiB vmemmap can be freed for a 64.0 MiB page
HugeTLB: registered 256 MiB page size, pre-allocated 1 pages
HugeTLB: 0 KiB vmemmap can be freed for a 256 MiB page
HugeTLB: registered 4.00 MiB page size, pre-allocated 0 pages
HugeTLB: 0 KiB vmemmap can be freed for a 4.00 MiB page
HugeTLB: registered 16.0 MiB page size, pre-allocated 0 pages
HugeTLB: 0 KiB vmemmap can be freed for a 16.0 MiB page

Quoted 1 line

I think it's a violation of CONFIG_ARCH_HAS_GIGANTIC_PAGE. The existing folio_dump() code would not handle it correctly as well.

I'm trying to dig into history and when looking at commit 4eb0716e868e ("hugetlb: allow to free gigantic pages regardless of the configuration") I understand that CONFIG_ARCH_HAS_GIGANTIC_PAGE is needed to be able to allocate gigantic pages at runtime. It is not needed to reserve gigantic pages at boottime.

What am I missing ?

Quoted 3 lines

See how snapshot_page() uses MAX_FOLIO_NR_PAGES.

#16 lore raw

Re: (bisected) [PATCH v2 08/37] mm/hugetlb: check for unreasonable folio sizes when registering hstate

Quoted 67 lines · Christophe Leroy

Le 09/10/2025 à 10:14, David Hildenbrand a écrit :

Quoted 61 lines · Christophe Leroy
Quoted 49 lines

Le 09/10/2025 à 09:22, David Hildenbrand a écrit :

Quoted 20 lines · Christophe Leroy
Quoted 19 lines

Hi David,

Le 01/09/2025 à 17:03, David Hildenbrand a écrit :

Quoted 16 lines
mm/hugetlb.c +0 -0
index 1e777cc51ad04..d3542e92a712e 100644
@@ -4657,6 +4657,7 @@ static int __init hugetlb_init(void)
         BUILD_BUG_ON(sizeof_field(struct page, private) *

BITS_PER_BYTE <
                __NR_HPAGEFLAGS);
+    BUILD_BUG_ON_INVALID(HUGETLB_PAGE_ORDER > MAX_FOLIO_ORDER);
        if (!hugepages_supported()) {
            if (hugetlb_max_hstate || default_hstate_max_huge_pages)

mm/hugetlb.c +0 -0
@@ -4740,6 +4741,7 @@ void __init hugetlb_add_hstate(unsigned int
 order)
         }
         BUG_ON(hugetlb_max_hstate >= HUGE_MAX_HSTATE);
         BUG_ON(order < order_base_2(__NR_USED_SUBPAGE));
Quoted 9 lines
Quoted 4 lines
Quoted 4 lines
mm/hugetlb.c +1 -0
+    WARN_ON(order > MAX_FOLIO_ORDER);
         h = &hstates[hugetlb_max_hstate++];
         __mutex_init(&h->resize_lock, "resize mutex", &h->resize_key);

        h->order = order;

We end up registering hugetlb folios that are bigger than MAX_FOLIO_ORDER. So we have to figure out how a config can trigger that (and if we have to support that).

MAX_FOLIO_ORDER is defined as:

#ifdef CONFIG_ARCH_HAS_GIGANTIC_PAGE
#define MAX_FOLIO_ORDER        PUD_ORDER
#else
#define MAX_FOLIO_ORDER        MAX_PAGE_ORDER
#endif

MAX_PAGE_ORDER is the limit for dynamic creation of hugepages via /sys/kernel/mm/hugepages/ but bigger pages can be created at boottime with kernel boot parameters without CONFIG_ARCH_HAS_GIGANTIC_PAGE:

    hugepagesz=64m hugepages=1 hugepagesz=256m hugepages=1

Gives:

Quoted 10 lines

HugeTLB: registered 1.00 GiB page size, pre-allocated 0 pages
HugeTLB: 0 KiB vmemmap can be freed for a 1.00 GiB page
HugeTLB: registered 64.0 MiB page size, pre-allocated 1 pages
HugeTLB: 0 KiB vmemmap can be freed for a 64.0 MiB page
HugeTLB: registered 256 MiB page size, pre-allocated 1 pages
HugeTLB: 0 KiB vmemmap can be freed for a 256 MiB page
HugeTLB: registered 4.00 MiB page size, pre-allocated 0 pages
HugeTLB: 0 KiB vmemmap can be freed for a 4.00 MiB page
HugeTLB: registered 16.0 MiB page size, pre-allocated 0 pages
HugeTLB: 0 KiB vmemmap can be freed for a 16.0 MiB page

Quoted 2 lines

I think it's a violation of CONFIG_ARCH_HAS_GIGANTIC_PAGE. The existing folio_dump() code would not handle it correctly as well.

Quoted 7 lines

I'm trying to dig into history and when looking at commit 4eb0716e868e ("hugetlb: allow to free gigantic pages regardless of the configuration") I understand that CONFIG_ARCH_HAS_GIGANTIC_PAGE is needed to be able to allocate gigantic pages at runtime. It is not needed to reserve gigantic pages at boottime.

What am I missing ?

That CONFIG_ARCH_HAS_GIGANTIC_PAGE has nothing runtime-specific in its name.

Can't we just select CONFIG_ARCH_HAS_GIGANTIC_PAGE for the relevant hugetlb config that allows for *gigantic pages*.

Signature · 3 lines
Cheers

David / dhildenb
#17 lore raw

Re: (bisected) [PATCH v2 08/37] mm/hugetlb: check for unreasonable folio sizes when registering hstate

Le 09/10/2025 à 11:20, David Hildenbrand a écrit :

Quoted 75 lines · Christophe Leroy
Quoted 74 lines

Le 09/10/2025 à 10:14, David Hildenbrand a écrit :

Quoted 62 lines · Christophe Leroy
Quoted 50 lines

Le 09/10/2025 à 09:22, David Hildenbrand a écrit :

Quoted 23 lines · Christophe Leroy
Quoted 22 lines

Hi David,

Le 01/09/2025 à 17:03, David Hildenbrand a écrit :

Quoted 19 lines
mm/hugetlb.c +0 -0
index 1e777cc51ad04..d3542e92a712e 100644
@@ -4657,6 +4657,7 @@ static int __init hugetlb_init(void)

         BUILD_BUG_ON(sizeof_field(struct page, private) * BITS_PER_BYTE <
                 __NR_HPAGEFLAGS);
+    BUILD_BUG_ON_INVALID(HUGETLB_PAGE_ORDER > MAX_FOLIO_ORDER); if (!hugepages_supported()) {
             if (hugetlb_max_hstate || default_hstate_max_huge_pages)

mm/hugetlb.c +1 -0
@@ -4740,6 +4741,7 @@ void __init hugetlb_add_hstate(unsigned int
 order)
          }
          BUG_ON(hugetlb_max_hstate >= HUGE_MAX_HSTATE);
          BUG_ON(order < order_base_2(__NR_USED_SUBPAGE));
+    WARN_ON(order > MAX_FOLIO_ORDER);
          h = &hstates[hugetlb_max_hstate++];

         __mutex_init(&h->resize_lock, "resize mutex", &h-

Quoted 7 lines
Quoted 2 lines
Quoted 2 lines
Quoted 1 line

resize_key);

         h->order = order;

We end up registering hugetlb folios that are bigger than MAX_FOLIO_ORDER. So we have to figure out how a config can trigger that (and if we have to support that).

MAX_FOLIO_ORDER is defined as:

#ifdef CONFIG_ARCH_HAS_GIGANTIC_PAGE
#define MAX_FOLIO_ORDER        PUD_ORDER
#else
#define MAX_FOLIO_ORDER        MAX_PAGE_ORDER
#endif

MAX_PAGE_ORDER is the limit for dynamic creation of hugepages via /sys/kernel/mm/hugepages/ but bigger pages can be created at boottime with kernel boot parameters without CONFIG_ARCH_HAS_GIGANTIC_PAGE:

     hugepagesz=64m hugepages=1 hugepagesz=256m hugepages=1

Gives:

Quoted 10 lines

HugeTLB: registered 1.00 GiB page size, pre-allocated 0 pages
HugeTLB: 0 KiB vmemmap can be freed for a 1.00 GiB page
HugeTLB: registered 64.0 MiB page size, pre-allocated 1 pages
HugeTLB: 0 KiB vmemmap can be freed for a 64.0 MiB page
HugeTLB: registered 256 MiB page size, pre-allocated 1 pages
HugeTLB: 0 KiB vmemmap can be freed for a 256 MiB page
HugeTLB: registered 4.00 MiB page size, pre-allocated 0 pages
HugeTLB: 0 KiB vmemmap can be freed for a 4.00 MiB page
HugeTLB: registered 16.0 MiB page size, pre-allocated 0 pages
HugeTLB: 0 KiB vmemmap can be freed for a 16.0 MiB page

Quoted 2 lines

I think it's a violation of CONFIG_ARCH_HAS_GIGANTIC_PAGE. The existing folio_dump() code would not handle it correctly as well.

I'm trying to dig into history and when looking at commit 4eb0716e868e ("hugetlb: allow to free gigantic pages regardless of the configuration") I understand that CONFIG_ARCH_HAS_GIGANTIC_PAGE is needed to be able to allocate gigantic pages at runtime. It is not needed to reserve gigantic pages at boottime.

Quoted 3 lines
Quoted 1 line

What am I missing ?

That CONFIG_ARCH_HAS_GIGANTIC_PAGE has nothing runtime-specific in its name.

In its name for sure, but the commit I mention says:

On systems without CONTIG_ALLOC activated but that support gigantic
pages,
boottime reserved gigantic pages can not be freed at all. This patch simply enables the possibility to hand back those pages to memory allocator.

And one of the hunks is:

arch/arm64/Kconfig +1 -1
index 7f7fbd8bd9d5b..7a1aa53d188d3 100644
@@ -19,7 +19,7 @@ config ARM64
        select ARCH_HAS_FAST_MULTIPLIER
        select ARCH_HAS_FORTIFY_SOURCE
        select ARCH_HAS_GCOV_PROFILE_ALL
-       select ARCH_HAS_GIGANTIC_PAGE if CONTIG_ALLOC
+       select ARCH_HAS_GIGANTIC_PAGE
        select ARCH_HAS_KCOV
        select ARCH_HAS_KEEPINITRD
        select ARCH_HAS_MEMBARRIER_SYNC_CORE

So I understand from the commit message that it was possible at that time to have gigantic pages without ARCH_HAS_GIGANTIC_PAGE as long as you didn't have to be able to free them during runtime.

Quoted 3 lines

Can't we just select CONFIG_ARCH_HAS_GIGANTIC_PAGE for the relevant hugetlb config that allows for *gigantic pages*.

We probably can, but I'd really like to understand history and how we ended up in the situation we are now. Because blind fixes often lead to more problems.

If I follow things correctly I see a helper gigantic_page_supported() added by commit 944d9fec8d7a ("hugetlb: add support for gigantic page allocation at runtime").

And then commit 461a7184320a ("mm/hugetlb: introduce ARCH_HAS_GIGANTIC_PAGE") is added to wrap gigantic_page_supported()

Then commit 4eb0716e868e ("hugetlb: allow to free gigantic pages regardless of the configuration") changed gigantic_page_supported() to gigantic_page_runtime_supported()

So where are we now ?

Christophe

#18 lore raw

Re: (bisected) [PATCH v2 08/37] mm/hugetlb: check for unreasonable folio sizes when registering hstate

Quoted 85 lines · Christophe Leroy

Le 09/10/2025 à 11:20, David Hildenbrand a écrit :

Quoted 77 lines · Christophe Leroy
Quoted 76 lines

Le 09/10/2025 à 10:14, David Hildenbrand a écrit :

Quoted 64 lines · Christophe Leroy
Quoted 52 lines

Le 09/10/2025 à 09:22, David Hildenbrand a écrit :

Quoted 24 lines · Christophe Leroy
Quoted 23 lines

Hi David,

Le 01/09/2025 à 17:03, David Hildenbrand a écrit :

Quoted 20 lines
mm/hugetlb.c +0 -0
index 1e777cc51ad04..d3542e92a712e 100644
@@ -4657,6 +4657,7 @@ static int __init hugetlb_init(void)
          BUILD_BUG_ON(sizeof_field(struct page, private) *

BITS_PER_BYTE <
                 __NR_HPAGEFLAGS);
+    BUILD_BUG_ON_INVALID(HUGETLB_PAGE_ORDER > MAX_FOLIO_ORDER);
         if (!hugepages_supported()) {
             if (hugetlb_max_hstate ||
default_hstate_max_huge_pages)

mm/hugetlb.c +1 -0
@@ -4740,6 +4741,7 @@ void __init hugetlb_add_hstate(unsigned int
 order)
          }
          BUG_ON(hugetlb_max_hstate >= HUGE_MAX_HSTATE);
          BUG_ON(order < order_base_2(__NR_USED_SUBPAGE));
+    WARN_ON(order > MAX_FOLIO_ORDER);
          h = &hstates[hugetlb_max_hstate++];
          __mutex_init(&h->resize_lock, "resize mutex", &h-
Quoted 8 lines
Quoted 2 lines
Quoted 2 lines
Quoted 1 line

resize_key);

         h->order = order;

We end up registering hugetlb folios that are bigger than MAX_FOLIO_ORDER. So we have to figure out how a config can trigger that
(and if we have to support that).

MAX_FOLIO_ORDER is defined as:

#ifdef CONFIG_ARCH_HAS_GIGANTIC_PAGE
#define MAX_FOLIO_ORDER        PUD_ORDER
#else
#define MAX_FOLIO_ORDER        MAX_PAGE_ORDER
#endif

MAX_PAGE_ORDER is the limit for dynamic creation of hugepages via /sys/kernel/mm/hugepages/ but bigger pages can be created at boottime with kernel boot parameters without CONFIG_ARCH_HAS_GIGANTIC_PAGE:

     hugepagesz=64m hugepages=1 hugepagesz=256m hugepages=1

Gives:

Quoted 10 lines

HugeTLB: registered 1.00 GiB page size, pre-allocated 0 pages
HugeTLB: 0 KiB vmemmap can be freed for a 1.00 GiB page
HugeTLB: registered 64.0 MiB page size, pre-allocated 1 pages
HugeTLB: 0 KiB vmemmap can be freed for a 64.0 MiB page
HugeTLB: registered 256 MiB page size, pre-allocated 1 pages
HugeTLB: 0 KiB vmemmap can be freed for a 256 MiB page
HugeTLB: registered 4.00 MiB page size, pre-allocated 0 pages
HugeTLB: 0 KiB vmemmap can be freed for a 4.00 MiB page
HugeTLB: registered 16.0 MiB page size, pre-allocated 0 pages
HugeTLB: 0 KiB vmemmap can be freed for a 16.0 MiB page

Quoted 2 lines

I think it's a violation of CONFIG_ARCH_HAS_GIGANTIC_PAGE. The existing folio_dump() code would not handle it correctly as well.

I'm trying to dig into history and when looking at commit 4eb0716e868e ("hugetlb: allow to free gigantic pages regardless of the configuration") I understand that CONFIG_ARCH_HAS_GIGANTIC_PAGE is needed to be able to allocate gigantic pages at runtime. It is not needed to reserve gigantic pages at boottime.

Quoted 4 lines
Quoted 1 line

What am I missing ?

That CONFIG_ARCH_HAS_GIGANTIC_PAGE has nothing runtime-specific in its name.

Quoted 7 lines

In its name for sure, but the commit I mention says:

On systems without CONTIG_ALLOC activated but that support gigantic
pages,
boottime reserved gigantic pages can not be freed at all. This patch simply enables the possibility to hand back those pages to memory allocator.

Right, I think it was a historical artifact.

Quoted 17 lines

And one of the hunks is:

arch/arm64/Kconfig +1 -1
index 7f7fbd8bd9d5b..7a1aa53d188d3 100644
@@ -19,7 +19,7 @@ config ARM64
          select ARCH_HAS_FAST_MULTIPLIER
          select ARCH_HAS_FORTIFY_SOURCE
          select ARCH_HAS_GCOV_PROFILE_ALL
-       select ARCH_HAS_GIGANTIC_PAGE if CONTIG_ALLOC
+       select ARCH_HAS_GIGANTIC_PAGE
          select ARCH_HAS_KCOV
          select ARCH_HAS_KEEPINITRD
          select ARCH_HAS_MEMBARRIER_SYNC_CORE
Quoted 3 lines

So I understand from the commit message that it was possible at that time to have gigantic pages without ARCH_HAS_GIGANTIC_PAGE as long as you didn't have to be able to free them during runtime.

Yes, I agree.

Quoted 9 lines
Quoted 5 lines

Can't we just select CONFIG_ARCH_HAS_GIGANTIC_PAGE for the relevant hugetlb config that allows for *gigantic pages*.

We probably can, but I'd really like to understand history and how we ended up in the situation we are now.
Because blind fixes often lead to more problems.

Yes, let's figure out how to to it cleanly.

Quoted 5 lines

If I follow things correctly I see a helper gigantic_page_supported() added by commit 944d9fec8d7a ("hugetlb: add support for gigantic page allocation at runtime").

Quoted 8 lines

And then commit 461a7184320a ("mm/hugetlb: introduce ARCH_HAS_GIGANTIC_PAGE") is added to wrap gigantic_page_supported()

Then commit 4eb0716e868e ("hugetlb: allow to free gigantic pages regardless of the configuration") changed gigantic_page_supported() to gigantic_page_runtime_supported()

So where are we now ?

In

commit fae7d834c43ccdb9fcecaf4d0f33145d884b3e5c

Author: Matthew Wilcox (Oracle) <[email protected]>
Date:   Tue Feb 27 19:23:31 2024 +0000
    mm: add __dump_folio()

We started assuming that a folio in the system (boottime, dynamic, whatever) has a maximum of MAX_FOLIO_NR_PAGES.

Any other interpretation doesn't make any sense for MAX_FOLIO_NR_PAGES.

So we have two questions:

1) How to teach MAX_FOLIO_NR_PAGES that hugetlb supports gigantic pages

2) How do we handle CONFIG_ARCH_HAS_GIGANTIC_PAGE

We have the following options

(A) Rename existing CONFIG_ARCH_HAS_GIGANTIC_PAGE to something else that is clearer and add a new CONFIG_ARCH_HAS_GIGANTIC_PAGE.

(B) Rename existing CONFIG_ARCH_HAS_GIGANTIC_PAGE -> to something else that is clearer and derive somehow else that hugetlb in that config supports gigantic pages.

(c) Just use CONFIG_ARCH_HAS_GIGANTIC_PAGE if hugetlb on an architecture supports gigantic pages.

I don't quite see why an architecture should be able to opt in into dynamically allocating+freeing gigantic pages. That's just CONTIG_ALLOC magic and not some arch-specific thing IIRC.

Note that in mm/hugetlb.c it is

	#ifdef CONFIG_ARCH_HAS_GIGANTIC_PAGE
	#ifdef CONFIG_CONTIG_ALLOC

Meaning that at least the allocation side is guarded by CONTIG_ALLOC.

So I think (C) is just the right thing to do.

fs/Kconfig +2 -0
index 0bfdaecaa8775..12c11eb9279d3 100644
@@ -283,6 +283,8 @@ config HUGETLB_PMD_PAGE_TABLE_SHARING
        def_bool HUGETLB_PAGE
        depends on ARCH_WANT_HUGE_PMD_SHARE && SPLIT_PMD_PTLOCKS
 
+# An architecture must select this option if there is any mechanism (esp. hugetlb)
+# could obtain gigantic folios.
 config ARCH_HAS_GIGANTIC_PAGE
        bool
 
Signature · 3 lines
Cheers

David / dhildenb
#19 lore raw

Re: (bisected) [PATCH v2 08/37] mm/hugetlb: check for unreasonable folio sizes when registering hstate

Le 09/10/2025 à 12:27, David Hildenbrand a écrit :

Quoted 184 lines · Christophe Leroy
Quoted 85 lines

Le 09/10/2025 à 11:20, David Hildenbrand a écrit :

Quoted 77 lines · Christophe Leroy
Quoted 76 lines

Le 09/10/2025 à 10:14, David Hildenbrand a écrit :

Quoted 64 lines · Christophe Leroy
Quoted 52 lines

Le 09/10/2025 à 09:22, David Hildenbrand a écrit :

Quoted 24 lines · Christophe Leroy
Quoted 23 lines

Hi David,

Le 01/09/2025 à 17:03, David Hildenbrand a écrit :

Quoted 20 lines
mm/hugetlb.c +0 -0
index 1e777cc51ad04..d3542e92a712e 100644
@@ -4657,6 +4657,7 @@ static int __init hugetlb_init(void)

          BUILD_BUG_ON(sizeof_field(struct page, private) * BITS_PER_BYTE <
                  __NR_HPAGEFLAGS);
+    BUILD_BUG_ON_INVALID(HUGETLB_PAGE_ORDER > MAX_FOLIO_ORDER); if (!hugepages_supported()) {
              if (hugetlb_max_hstate || default_hstate_max_huge_pages)

mm/hugetlb.c +1 -0
@@ -4740,6 +4741,7 @@ void __init hugetlb_add_hstate(unsigned int
 order)
           }
           BUG_ON(hugetlb_max_hstate >= HUGE_MAX_HSTATE);
           BUG_ON(order < order_base_2(__NR_USED_SUBPAGE));
+    WARN_ON(order > MAX_FOLIO_ORDER);
           h = &hstates[hugetlb_max_hstate++];

          __mutex_init(&h->resize_lock, "resize mutex", &h-

Quoted 8 lines
Quoted 2 lines
Quoted 2 lines
Quoted 1 line

resize_key);

          h->order = order;

We end up registering hugetlb folios that are bigger than MAX_FOLIO_ORDER. So we have to figure out how a config can trigger that
(and if we have to support that).

MAX_FOLIO_ORDER is defined as:

#ifdef CONFIG_ARCH_HAS_GIGANTIC_PAGE
#define MAX_FOLIO_ORDER        PUD_ORDER
#else
#define MAX_FOLIO_ORDER        MAX_PAGE_ORDER
#endif

MAX_PAGE_ORDER is the limit for dynamic creation of hugepages via /sys/kernel/mm/hugepages/ but bigger pages can be created at boottime with kernel boot parameters without CONFIG_ARCH_HAS_GIGANTIC_PAGE:

      hugepagesz=64m hugepages=1 hugepagesz=256m hugepages=1

Gives:

Quoted 10 lines

HugeTLB: registered 1.00 GiB page size, pre-allocated 0 pages
HugeTLB: 0 KiB vmemmap can be freed for a 1.00 GiB page
HugeTLB: registered 64.0 MiB page size, pre-allocated 1 pages
HugeTLB: 0 KiB vmemmap can be freed for a 64.0 MiB page
HugeTLB: registered 256 MiB page size, pre-allocated 1 pages
HugeTLB: 0 KiB vmemmap can be freed for a 256 MiB page
HugeTLB: registered 4.00 MiB page size, pre-allocated 0 pages
HugeTLB: 0 KiB vmemmap can be freed for a 4.00 MiB page
HugeTLB: registered 16.0 MiB page size, pre-allocated 0 pages
HugeTLB: 0 KiB vmemmap can be freed for a 16.0 MiB page

Quoted 2 lines

I think it's a violation of CONFIG_ARCH_HAS_GIGANTIC_PAGE. The existing folio_dump() code would not handle it correctly as well.

I'm trying to dig into history and when looking at commit 4eb0716e868e ("hugetlb: allow to free gigantic pages regardless of the configuration") I understand that CONFIG_ARCH_HAS_GIGANTIC_PAGE is needed to be able to allocate gigantic pages at runtime. It is not needed to reserve gigantic pages at boottime.

Quoted 4 lines
Quoted 1 line

What am I missing ?

That CONFIG_ARCH_HAS_GIGANTIC_PAGE has nothing runtime-specific in its name.

Quoted 7 lines

In its name for sure, but the commit I mention says:

      On systems without CONTIG_ALLOC activated but that support gigantic pages,
      boottime reserved gigantic pages can not be freed at all.  This patch simply enables the possibility to hand back those pages to memory allocator.

Right, I think it was a historical artifact.

Quoted 17 lines

And one of the hunks is:

arch/arm64/Kconfig +0 -0
index 7f7fbd8bd9d5b..7a1aa53d188d3 100644
@@ -19,7 +19,7 @@ config ARM64

          select ARCH_HAS_FAST_MULTIPLIER select ARCH_HAS_FORTIFY_SOURCE select ARCH_HAS_GCOV_PROFILE_ALL
-       select ARCH_HAS_GIGANTIC_PAGE if CONTIG_ALLOC +       select ARCH_HAS_GIGANTIC_PAGE
          select ARCH_HAS_KCOV
          select ARCH_HAS_KEEPINITRD
          select ARCH_HAS_MEMBARRIER_SYNC_CORE

Quoted 3 lines

So I understand from the commit message that it was possible at that time to have gigantic pages without ARCH_HAS_GIGANTIC_PAGE as long as you didn't have to be able to free them during runtime.

Yes, I agree.

Quoted 9 lines
Quoted 5 lines

Can't we just select CONFIG_ARCH_HAS_GIGANTIC_PAGE for the relevant hugetlb config that allows for *gigantic pages*.

We probably can, but I'd really like to understand history and how we ended up in the situation we are now.
Because blind fixes often lead to more problems.

Yes, let's figure out how to to it cleanly.

Quoted 5 lines

If I follow things correctly I see a helper gigantic_page_supported() added by commit 944d9fec8d7a ("hugetlb: add support for gigantic page allocation at runtime").

Quoted 8 lines

And then commit 461a7184320a ("mm/hugetlb: introduce ARCH_HAS_GIGANTIC_PAGE") is added to wrap gigantic_page_supported()

Then commit 4eb0716e868e ("hugetlb: allow to free gigantic pages regardless of the configuration") changed gigantic_page_supported() to gigantic_page_runtime_supported()

So where are we now ?

In

commit fae7d834c43ccdb9fcecaf4d0f33145d884b3e5c
Author: Matthew Wilcox (Oracle) <[email protected]> Date:   Tue Feb 27 19:23:31 2024 +0000

    mm: add __dump_folio()

We started assuming that a folio in the system (boottime, dynamic, whatever) has a maximum of MAX_FOLIO_NR_PAGES.

Any other interpretation doesn't make any sense for MAX_FOLIO_NR_PAGES.

So we have two questions:

1) How to teach MAX_FOLIO_NR_PAGES that hugetlb supports gigantic pages

2) How do we handle CONFIG_ARCH_HAS_GIGANTIC_PAGE

We have the following options

(A) Rename existing CONFIG_ARCH_HAS_GIGANTIC_PAGE to something else that is clearer and add a new CONFIG_ARCH_HAS_GIGANTIC_PAGE.

(B) Rename existing CONFIG_ARCH_HAS_GIGANTIC_PAGE -> to something else that is clearer and derive somehow else that hugetlb in that config supports gigantic pages.

(c) Just use CONFIG_ARCH_HAS_GIGANTIC_PAGE if hugetlb on an architecture supports gigantic pages.

I don't quite see why an architecture should be able to opt in into dynamically allocating+freeing gigantic pages. That's just CONTIG_ALLOC magic and not some arch-specific thing IIRC.

Quoted 6 lines

Note that in mm/hugetlb.c it is

    #ifdef CONFIG_ARCH_HAS_GIGANTIC_PAGE
    #ifdef CONFIG_CONTIG_ALLOC

Meaning that at least the allocation side is guarded by CONTIG_ALLOC.

Yes but not the freeing since commit 4eb0716e868e ("hugetlb: allow to free gigantic pages regardless of the configuration")

Quoted 10 lines

So I think (C) is just the right thing to do.

fs/Kconfig +0 -0
index 0bfdaecaa8775..12c11eb9279d3 100644

fs/Kconfig config HUGETLB_PMD_PAGE_TABLE_SHARING · line 290

Quoted 8 lines
fs/Kconfig +2 -0
@@ -283,6 +283,8 @@ config HUGETLB_PMD_PAGE_TABLE_SHARING
         def_bool HUGETLB_PAGE
         depends on ARCH_WANT_HUGE_PMD_SHARE && SPLIT_PMD_PTLOCKS
 
+# An architecture must select this option if there is any mechanism 
 (esp. hugetlb)
+# could obtain gigantic folios.
  config ARCH_HAS_GIGANTIC_PAGE
         bool

I gave it a try. That's not enough, it fixes the problem for 64 Mbytes pages and 256 Mbytes pages, but not for 1 Gbytes pages.

Max folio is defined by PUD_ORDER, but PUD_SIZE is 256 Mbytes so we need to make MAX_FOLIO larger. Do we change it to P4D_ORDER or is it too much ? P4D_SIZE is 128 Gbytes

Christophe

#20 lore raw

Re: (bisected) [PATCH v2 08/37] mm/hugetlb: check for unreasonable folio sizes when registering hstate

Quoted 196 lines · Christophe Leroy

Le 09/10/2025 à 12:27, David Hildenbrand a écrit :

Quoted 193 lines · Christophe Leroy
Quoted 86 lines

Le 09/10/2025 à 11:20, David Hildenbrand a écrit :

Quoted 78 lines · Christophe Leroy
Quoted 77 lines

Le 09/10/2025 à 10:14, David Hildenbrand a écrit :

Quoted 64 lines · Christophe Leroy
Quoted 52 lines

Le 09/10/2025 à 09:22, David Hildenbrand a écrit :

Quoted 24 lines · Christophe Leroy
Quoted 23 lines

Hi David,

Le 01/09/2025 à 17:03, David Hildenbrand a écrit :

Quoted 20 lines
mm/hugetlb.c +0 -0
index 1e777cc51ad04..d3542e92a712e 100644
@@ -4657,6 +4657,7 @@ static int __init hugetlb_init(void)
           BUILD_BUG_ON(sizeof_field(struct page, private) *

BITS_PER_BYTE <
                  __NR_HPAGEFLAGS);
+    BUILD_BUG_ON_INVALID(HUGETLB_PAGE_ORDER > MAX_FOLIO_ORDER);
          if (!hugepages_supported()) {
              if (hugetlb_max_hstate ||
default_hstate_max_huge_pages)

mm/hugetlb.c +1 -0
@@ -4740,6 +4741,7 @@ void __init hugetlb_add_hstate(unsigned int
 order)
           }
           BUG_ON(hugetlb_max_hstate >= HUGE_MAX_HSTATE);
           BUG_ON(order < order_base_2(__NR_USED_SUBPAGE));
+    WARN_ON(order > MAX_FOLIO_ORDER);
           h = &hstates[hugetlb_max_hstate++];
           __mutex_init(&h->resize_lock, "resize mutex", &h-
Quoted 8 lines
Quoted 2 lines
Quoted 2 lines
Quoted 1 line

resize_key);

          h->order = order;

We end up registering hugetlb folios that are bigger than MAX_FOLIO_ORDER. So we have to figure out how a config can trigger that
(and if we have to support that).

MAX_FOLIO_ORDER is defined as:

#ifdef CONFIG_ARCH_HAS_GIGANTIC_PAGE
#define MAX_FOLIO_ORDER        PUD_ORDER
#else
#define MAX_FOLIO_ORDER        MAX_PAGE_ORDER
#endif

MAX_PAGE_ORDER is the limit for dynamic creation of hugepages via /sys/kernel/mm/hugepages/ but bigger pages can be created at boottime with kernel boot parameters without CONFIG_ARCH_HAS_GIGANTIC_PAGE:

      hugepagesz=64m hugepages=1 hugepagesz=256m hugepages=1

Gives:

Quoted 10 lines

HugeTLB: registered 1.00 GiB page size, pre-allocated 0 pages
HugeTLB: 0 KiB vmemmap can be freed for a 1.00 GiB page
HugeTLB: registered 64.0 MiB page size, pre-allocated 1 pages
HugeTLB: 0 KiB vmemmap can be freed for a 64.0 MiB page
HugeTLB: registered 256 MiB page size, pre-allocated 1 pages
HugeTLB: 0 KiB vmemmap can be freed for a 256 MiB page
HugeTLB: registered 4.00 MiB page size, pre-allocated 0 pages
HugeTLB: 0 KiB vmemmap can be freed for a 4.00 MiB page
HugeTLB: registered 16.0 MiB page size, pre-allocated 0 pages
HugeTLB: 0 KiB vmemmap can be freed for a 16.0 MiB page

Quoted 3 lines

I think it's a violation of CONFIG_ARCH_HAS_GIGANTIC_PAGE. The existing
folio_dump() code would not handle it correctly as well.

I'm trying to dig into history and when looking at commit 4eb0716e868e ("hugetlb: allow to free gigantic pages regardless of the configuration") I understand that CONFIG_ARCH_HAS_GIGANTIC_PAGE is needed to be able to allocate gigantic pages at runtime. It is not needed to reserve gigantic pages at boottime.

Quoted 4 lines
Quoted 1 line

What am I missing ?

That CONFIG_ARCH_HAS_GIGANTIC_PAGE has nothing runtime-specific in its name.

Quoted 8 lines

In its name for sure, but the commit I mention says:

      On systems without CONTIG_ALLOC activated but that support gigantic
pages,
      boottime reserved gigantic pages can not be freed at all.  This
patch
      simply enables the possibility to hand back those pages to memory allocator.

Right, I think it was a historical artifact.

Quoted 17 lines

And one of the hunks is:

arch/arm64/Kconfig +1 -1
index 7f7fbd8bd9d5b..7a1aa53d188d3 100644
@@ -19,7 +19,7 @@ config ARM64
           select ARCH_HAS_FAST_MULTIPLIER
           select ARCH_HAS_FORTIFY_SOURCE
           select ARCH_HAS_GCOV_PROFILE_ALL
-       select ARCH_HAS_GIGANTIC_PAGE if CONTIG_ALLOC
+       select ARCH_HAS_GIGANTIC_PAGE
           select ARCH_HAS_KCOV
           select ARCH_HAS_KEEPINITRD
           select ARCH_HAS_MEMBARRIER_SYNC_CORE
Quoted 3 lines

So I understand from the commit message that it was possible at that time to have gigantic pages without ARCH_HAS_GIGANTIC_PAGE as long as you didn't have to be able to free them during runtime.

Yes, I agree.

Quoted 9 lines
Quoted 5 lines

Can't we just select CONFIG_ARCH_HAS_GIGANTIC_PAGE for the relevant hugetlb config that allows for *gigantic pages*.

We probably can, but I'd really like to understand history and how we ended up in the situation we are now.
Because blind fixes often lead to more problems.

Yes, let's figure out how to to it cleanly.

Quoted 5 lines

If I follow things correctly I see a helper gigantic_page_supported() added by commit 944d9fec8d7a ("hugetlb: add support for gigantic page allocation at runtime").

Quoted 8 lines

And then commit 461a7184320a ("mm/hugetlb: introduce ARCH_HAS_GIGANTIC_PAGE") is added to wrap gigantic_page_supported()

Then commit 4eb0716e868e ("hugetlb: allow to free gigantic pages regardless of the configuration") changed gigantic_page_supported() to gigantic_page_runtime_supported()

So where are we now ?

In

commit fae7d834c43ccdb9fcecaf4d0f33145d884b3e5c
Author: Matthew Wilcox (Oracle) <[email protected]> Date:   Tue Feb 27 19:23:31 2024 +0000

    mm: add __dump_folio()

We started assuming that a folio in the system (boottime, dynamic, whatever)
has a maximum of MAX_FOLIO_NR_PAGES.

Any other interpretation doesn't make any sense for MAX_FOLIO_NR_PAGES.

So we have two questions:

1) How to teach MAX_FOLIO_NR_PAGES that hugetlb supports gigantic pages

2) How do we handle CONFIG_ARCH_HAS_GIGANTIC_PAGE

We have the following options

(A) Rename existing CONFIG_ARCH_HAS_GIGANTIC_PAGE to something else that is clearer and add a new CONFIG_ARCH_HAS_GIGANTIC_PAGE.

(B) Rename existing CONFIG_ARCH_HAS_GIGANTIC_PAGE -> to something else that is
clearer and derive somehow else that hugetlb in that config supports gigantic pages.

(c) Just use CONFIG_ARCH_HAS_GIGANTIC_PAGE if hugetlb on an architecture supports gigantic pages.

I don't quite see why an architecture should be able to opt in into dynamically
allocating+freeing gigantic pages. That's just CONTIG_ALLOC magic and not some
arch-specific thing IIRC.

Note that in mm/hugetlb.c it is

Quoted 7 lines
Quoted 4 lines
      #ifdef CONFIG_ARCH_HAS_GIGANTIC_PAGE
      #ifdef CONFIG_CONTIG_ALLOC

Meaning that at least the allocation side is guarded by CONTIG_ALLOC.

Yes but not the freeing since commit 4eb0716e868e ("hugetlb: allow to free gigantic pages regardless of the configuration")

Right, the freeing path is just always around as we no longer depend free_contig_range().

Quoted 12 lines
Quoted 12 lines

So I think (C) is just the right thing to do.

fs/Kconfig +0 -0
index 0bfdaecaa8775..12c11eb9279d3 100644
@@ -283,6 +283,8 @@ config HUGETLB_PMD_PAGE_TABLE_SHARING
          def_bool HUGETLB_PAGE
          depends on ARCH_WANT_HUGE_PMD_SHARE && SPLIT_PMD_PTLOCKS
 
Quoted 10 lines

fs/Kconfig config HUGETLB_PMD_PAGE_TABLE_SHARING · line 289

Quoted 7 lines
fs/Kconfig +2 -0
+# An architecture must select this option if there is any mechanism
 (esp. hugetlb)
+# could obtain gigantic folios.
   config ARCH_HAS_GIGANTIC_PAGE
          bool

I gave it a try. That's not enough, it fixes the problem for 64 Mbytes pages and 256 Mbytes pages, but not for 1 Gbytes pages.

Thanks!

Quoted 4 lines

Max folio is defined by PUD_ORDER, but PUD_SIZE is 256 Mbytes so we need to make MAX_FOLIO larger. Do we change it to P4D_ORDER or is it too much ? P4D_SIZE is 128 Gbytes

The exact size doesn't matter, we started with something that soundes reasonable.

I added the comment "There is no real limit on the folio size. We limit them to the maximum we currently expect (e.g., hugetlb, dax)."

We can set it to whatever we would expect for now.

Signature · 3 lines
Cheers

David / dhildenb
#21 lore raw

PATCH v2 9/37 mm/mm_init: make memmap_init_compound() look more like prep_compound_page()

In reply to David Hildenbrand

Grepping for "prep_compound_page" leaves on clueless how devdax gets its compound pages initialized.

Let's add a comment that might help finding this open-coded prep_compound_page() initialization more easily.

Further, let's be less smart about the ordering of initialization and just perform the prep_compound_head() call after all tail pages were
initialized: just like prep_compound_page() does.

No need for a comment to describe the initialization order: again, just like prep_compound_page().

---
 mm/mm_init.c | 15 +++++++--------
 1 file changed, 7 insertions(+), 8 deletions(-)
mm/mm_init.c +7 -8
index 5c21b3af216b2..df614556741a4 100644
@@ -1091,6 +1091,12 @@ static void __ref memmap_init_compound(struct page *head,
 	unsigned long pfn, end_pfn = head_pfn + nr_pages;
 	unsigned int order = pgmap->vmemmap_shift;
 
+	/*
+	 * We have to initialize the pages, including setting up page links.
+	 * prep_compound_page() does not take care of that, so instead we
+	 * open-code prep_compound_page() so we can take care of initializing
+	 * the pages in the same go.
+	 */
 	__SetPageHead(head);
 	for (pfn = head_pfn + 1; pfn < end_pfn; pfn++) {
 		struct page *page = pfn_to_page(pfn);
@@ -1098,15 +1104,8 @@ static void __ref memmap_init_compound(struct page *head,
 		__init_zone_device_page(page, pfn, zone_idx, nid, pgmap);
 		prep_compound_tail(head, pfn - head_pfn);
 		set_page_count(page, 0);
-
-		/*
-		 * The first tail page stores important compound page info.
-		 * Call prep_compound_head() after the first tail page has
-		 * been initialized, to not have the data overwritten.
-		 */
-		if (pfn == head_pfn + 1)
-			prep_compound_head(head, order);
 	}
+	prep_compound_head(head, order);
 }
 
 void __ref memmap_init_zone_device(struct zone *zone,
Signature · 1 line
2.50.1
#22 lore raw

PATCH v2 10/37 mm: sanity-check maximum folio size in folio_set_order()

In reply to David Hildenbrand

Let's sanity-check in folio_set_order() whether we would be trying to create a folio with an order that would make it exceed MAX_FOLIO_ORDER.

This will enable the check whenever a folio/compound page is initialized through prepare_compound_head() / prepare_compound_page() with CONFIG_DEBUG_VM set.

---
 mm/internal.h | 1 +
 1 file changed, 1 insertion(+)
mm/internal.h +1 -0
index 45da9ff5694f6..9b0129531d004 100644
@@ -755,6 +755,7 @@ static inline void folio_set_order(struct folio *folio, unsigned int order)
 {
 	if (WARN_ON_ONCE(!order || !folio_test_large(folio)))
 		return;
+	VM_WARN_ON_ONCE(order > MAX_FOLIO_ORDER);
 
 	folio->_flags_1 = (folio->_flags_1 & ~0xffUL) | order;
 #ifdef NR_PAGES_IN_LARGE_FOLIO
Signature · 1 line
2.50.1
#23 lore raw

PATCH v2 11/37 mm: limit folio/compound page sizes in problematic kernel configs

In reply to David Hildenbrand

Let's limit the maximum folio size in problematic kernel config where the memmap is allocated per memory section (SPARSEMEM without SPARSEMEM_VMEMMAP) to a single memory section.

Currently, only a single architectures supports ARCH_HAS_GIGANTIC_PAGE but not SPARSEMEM_VMEMMAP: sh.

Fortunately, the biggest hugetlb size sh supports is 64 MiB (HUGETLB_PAGE_SIZE_64MB) and the section size is at least 64 MiB (SECTION_SIZE_BITS == 26), so their use case is not degraded.

As folios and memory sections are naturally aligned to their order-2 size in memory, consequently a single folio can no longer span multiple memory sections on these problematic kernel configs.

nth_page() is no longer required when operating within a single compound page / folio.

---
 include/linux/mm.h | 22 ++++++++++++++++++----
 1 file changed, 18 insertions(+), 4 deletions(-)
include/linux/mm.h +18 -4
index 77737cbf2216a..2dee79fa2efcf 100644
@@ -2053,11 +2053,25 @@ static inline long folio_nr_pages(const struct folio *folio)
 	return folio_large_nr_pages(folio);
 }
 
-/* Only hugetlbfs can allocate folios larger than MAX_ORDER */
-#ifdef CONFIG_ARCH_HAS_GIGANTIC_PAGE
-#define MAX_FOLIO_ORDER		PUD_ORDER
-#else
+#if !defined(CONFIG_ARCH_HAS_GIGANTIC_PAGE)
+/*
+ * We don't expect any folios that exceed buddy sizes (and consequently
+ * memory sections).
+ */
 #define MAX_FOLIO_ORDER		MAX_PAGE_ORDER
+#elif defined(CONFIG_SPARSEMEM) && !defined(CONFIG_SPARSEMEM_VMEMMAP)
+/*
+ * Only pages within a single memory section are guaranteed to be
+ * contiguous. By limiting folios to a single memory section, all folio
+ * pages are guaranteed to be contiguous.
+ */
+#define MAX_FOLIO_ORDER		PFN_SECTION_SHIFT
+#else
+/*
+ * There is no real limit on the folio size. We limit them to the maximum we
+ * currently expect (e.g., hugetlb, dax).
+ */
+#define MAX_FOLIO_ORDER		PUD_ORDER
 #endif
 
 #define MAX_FOLIO_NR_PAGES	(1UL << MAX_FOLIO_ORDER)
Signature · 1 line
2.50.1
#24 lore raw

PATCH v2 12/37 mm: simplify folio_page() and folio_page_idx()

In reply to David Hildenbrand

Now that a single folio/compound page can no longer span memory sections in problematic kernel configurations, we can stop using nth_page() in folio_page() and folio_page_idx().

While at it, turn both macros into static inline functions and add kernel doc for folio_page_idx().

---
 include/linux/mm.h         | 16 ++++++++++++++--
 include/linux/page-flags.h |  5 ++++-
 2 files changed, 18 insertions(+), 3 deletions(-)
include/linux/mm.h +14 -2
index 2dee79fa2efcf..f6880e3225c5c 100644
@@ -210,10 +210,8 @@ extern unsigned long sysctl_admin_reserve_kbytes;
 
 #if defined(CONFIG_SPARSEMEM) && !defined(CONFIG_SPARSEMEM_VMEMMAP)
 #define nth_page(page,n) pfn_to_page(page_to_pfn((page)) + (n))
-#define folio_page_idx(folio, p)	(page_to_pfn(p) - folio_pfn(folio))
 #else
 #define nth_page(page,n) ((page) + (n))
-#define folio_page_idx(folio, p)	((p) - &(folio)->page)
 #endif
 
 /* to align the pointer to the (next) page boundary */
@@ -225,6 +223,20 @@ extern unsigned long sysctl_admin_reserve_kbytes;
 /* test whether an address (unsigned long or pointer) is aligned to PAGE_SIZE */
 #define PAGE_ALIGNED(addr)	IS_ALIGNED((unsigned long)(addr), PAGE_SIZE)
 
+/**
+ * folio_page_idx - Return the number of a page in a folio.
+ * @folio: The folio.
+ * @page: The folio page.
+ *
+ * This function expects that the page is actually part of the folio.
+ * The returned number is relative to the start of the folio.
+ */
+static inline unsigned long folio_page_idx(const struct folio *folio,
+		const struct page *page)
+{
+	return page - &folio->page;
+}
+
 static inline struct folio *lru_to_folio(struct list_head *head)
 {
 	return list_entry((head)->prev, struct folio, lru);
include/linux/page-flags.h +4 -1
index 5ee6ffbdbf831..faf17ca211b4f 100644
@@ -316,7 +316,10 @@ static __always_inline unsigned long _compound_head(const struct page *page)
  * check that the page number lies within @folio; the caller is presumed
  * to have a reference to the page.
  */
-#define folio_page(folio, n)	nth_page(&(folio)->page, n)
+static inline struct page *folio_page(struct folio *folio, unsigned long n)
+{
+	return &folio->page + n;
+}
 
 static __always_inline int PageTail(const struct page *page)
 {
Signature · 1 line
2.50.1
#25 lore raw

PATCH v2 13/37 mm/hugetlb: cleanup hugetlb_folio_init_tail_vmemmap()

In reply to David Hildenbrand

We can now safely iterate over all pages in a folio, so no need for the pfn_to_page().

Also, as we already force the refcount in __init_single_page() to 1 through init_page_count(), we can just set the refcount to 0 and avoid page_ref_freeze() + VM_BUG_ON. Likely, in the future, we would just want to tell __init_single_page() to which value to initialize the refcount.

Further, adjust the comments to highlight that we are dealing with an open-coded prep_compound_page() variant, and add another comment explaining why we really need the __init_single_page() only on the tail pages.

Note that the current code was likely problematic, but we never ran into
it: prep_compound_tail() would have been called with an offset that might exceed a memory section, and prep_compound_tail() would have simply added that offset to the page pointer -- which would not have done the right thing on sparsemem without vmemmap.

---
 mm/hugetlb.c | 20 ++++++++++++--------
 1 file changed, 12 insertions(+), 8 deletions(-)
mm/hugetlb.c +12 -8
index d3542e92a712e..56e6d2af08434 100644
@@ -3237,17 +3237,18 @@ static void __init hugetlb_folio_init_tail_vmemmap(struct folio *folio,
 {
 	enum zone_type zone = zone_idx(folio_zone(folio));
 	int nid = folio_nid(folio);
+	struct page *page = folio_page(folio, start_page_number);
 	unsigned long head_pfn = folio_pfn(folio);
 	unsigned long pfn, end_pfn = head_pfn + end_page_number;
-	int ret;
-
-	for (pfn = head_pfn + start_page_number; pfn < end_pfn; pfn++) {
-		struct page *page = pfn_to_page(pfn);
 
+	/*
+	 * As we marked all tail pages with memblock_reserved_mark_noinit(),
+	 * we must initialize them ourselves here.
+	 */
+	for (pfn = head_pfn + start_page_number; pfn < end_pfn; page++, pfn++) {
 		__init_single_page(page, pfn, zone, nid);
 		prep_compound_tail((struct page *)folio, pfn - head_pfn);
-		ret = page_ref_freeze(page, 1);
-		VM_BUG_ON(!ret);
+		set_page_count(page, 0);
 	}
 }
 
@@ -3257,12 +3258,15 @@ static void __init hugetlb_folio_init_vmemmap(struct folio *folio,
 {
 	int ret;
 
-	/* Prepare folio head */
+	/*
+	 * This is an open-coded prep_compound_page() whereby we avoid
+	 * walking pages twice by initializing/preparing+freezing them in the
+	 * same go.
+	 */
 	__folio_clear_reserved(folio);
 	__folio_set_head(folio);
 	ret = folio_ref_freeze(folio, 1);
 	VM_BUG_ON(!ret);
-	/* Initialize the necessary tail struct pages */
 	hugetlb_folio_init_tail_vmemmap(folio, 1, nr_pages);
 	prep_compound_head((struct page *)folio, huge_page_order(h));
 }
Signature · 1 line
2.50.1
#26 lore raw

PATCH v2 14/37 mm/mm/percpu-km: drop nth_page() usage within single allocation

In reply to David Hildenbrand

We're allocating a higher-order page from the buddy. For these pages (that are guaranteed to not exceed a single memory section) there is no need to use nth_page().

---
 mm/percpu-km.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
mm/percpu-km.c +1 -1
index fe31aa19db81a..4efa74a495cb6 100644
@@ -69,7 +69,7 @@ static struct pcpu_chunk *pcpu_create_chunk(gfp_t gfp)
 	}
 
 	for (i = 0; i < nr_pages; i++)
-		pcpu_set_page_chunk(nth_page(pages, i), chunk);
+		pcpu_set_page_chunk(pages + i, chunk);
 
 	chunk->data = pages;
 	chunk->base_addr = page_address(pages);
Signature · 1 line
2.50.1
#27 lore raw

PATCH v2 15/37 fs: hugetlbfs: remove nth_page() usage within folio in adjust_range_hwpoison()

In reply to David Hildenbrand

The nth_page() is not really required anymore, so let's remove it.

---
 fs/hugetlbfs/inode.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
fs/hugetlbfs/inode.c +1 -1
index 34d496a2b7de6..c5a46d10afaa0 100644
@@ -217,7 +217,7 @@ static size_t adjust_range_hwpoison(struct folio *folio, size_t offset,
 			break;
 		offset += n;
 		if (offset == PAGE_SIZE) {
-			page = nth_page(page, 1);
+			page++;
 			offset = 0;
 		}
 	}
Signature · 1 line
2.50.1
#28 lore raw

PATCH v2 16/37 fs: hugetlbfs: cleanup folio in adjust_range_hwpoison()

In reply to David Hildenbrand

Let's cleanup and simplify the function a bit.

---
 fs/hugetlbfs/inode.c | 36 ++++++++++++------------------------
 1 file changed, 12 insertions(+), 24 deletions(-)
fs/hugetlbfs/inode.c +12 -24
index c5a46d10afaa0..3cfdf4091001f 100644
@@ -192,37 +192,25 @@ hugetlb_get_unmapped_area(struct file *file, unsigned long addr,
  * Someone wants to read @bytes from a HWPOISON hugetlb @folio from @offset.
  * Returns the maximum number of bytes one can read without touching the 1st raw
  * HWPOISON page.
- *
- * The implementation borrows the iteration logic from copy_page_to_iter*.
  */
 static size_t adjust_range_hwpoison(struct folio *folio, size_t offset,
 		size_t bytes)
 {
-	struct page *page;
-	size_t n = 0;
-	size_t res = 0;
-
-	/* First page to start the loop. */
-	page = folio_page(folio, offset / PAGE_SIZE);
-	offset %= PAGE_SIZE;
-	while (1) {
-		if (is_raw_hwpoison_page_in_hugepage(page))
-			break;
+	struct page *page = folio_page(folio, offset / PAGE_SIZE);
+	size_t safe_bytes;
+
+	if (is_raw_hwpoison_page_in_hugepage(page))
+		return 0;
+	/* Safe to read the remaining bytes in this page. */
+	safe_bytes = PAGE_SIZE - (offset % PAGE_SIZE);
+	page++;
 
-		/* Safe to read n bytes without touching HWPOISON subpage. */
-		n = min(bytes, (size_t)PAGE_SIZE - offset);
-		res += n;
-		bytes -= n;
-		if (!bytes || !n)
+	/* Check each remaining page as long as we are not done yet. */
+	for (; safe_bytes < bytes; safe_bytes += PAGE_SIZE, page++)
+		if (is_raw_hwpoison_page_in_hugepage(page))
 			break;
-		offset += n;
-		if (offset == PAGE_SIZE) {
-			page++;
-			offset = 0;
-		}
-	}
 
-	return res;
+	return min(safe_bytes, bytes);
 }
 
 /*
Signature · 1 line
2.50.1
#29 lore raw

PATCH v2 17/37 mm/pagewalk: drop nth_page() usage within folio in folio_walk_start()

In reply to David Hildenbrand

It's no longer required to use nth_page() within a folio, so let's just drop the nth_page() in folio_walk_start().

---
 mm/pagewalk.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
mm/pagewalk.c +1 -1
index c6753d370ff4e..9e4225e5fcf5c 100644
@@ -1004,7 +1004,7 @@ struct folio *folio_walk_start(struct folio_walk *fw,
 found:
 	if (expose_page)
 		/* Note: Offset from the mapped page, not the folio start. */
-		fw->page = nth_page(page, (addr & (entry_size - 1)) >> PAGE_SHIFT);
+		fw->page = page + ((addr & (entry_size - 1)) >> PAGE_SHIFT);
 	else
 		fw->page = NULL;
 	fw->ptl = ptl;
Signature · 1 line
2.50.1
#30 lore raw

PATCH v2 18/37 mm/gup: drop nth_page() usage within folio when recording subpages

In reply to David Hildenbrand

nth_page() is no longer required when iterating over pages within a single folio, so let's just drop it when recording subpages.

---
 mm/gup.c | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)
mm/gup.c +3 -4
index 8157197a19f77..c10cd969c1a3b 100644
@@ -488,12 +488,11 @@ static int record_subpages(struct page *page, unsigned long sz,
 			   unsigned long addr, unsigned long end,
 			   struct page **pages)
 {
-	struct page *start_page;
 	int nr;
 
-	start_page = nth_page(page, (addr & (sz - 1)) >> PAGE_SHIFT);
+	page += (addr & (sz - 1)) >> PAGE_SHIFT;
 	for (nr = 0; addr != end; nr++, addr += PAGE_SIZE)
-		pages[nr] = nth_page(start_page, nr);
+		pages[nr] = page++;
 
 	return nr;
 }
@@ -1512,7 +1511,7 @@ static long __get_user_pages(struct mm_struct *mm,
 			}
 
 			for (j = 0; j < page_increm; j++) {
-				subpage = nth_page(page, j);
+				subpage = page + j;
 				pages[i + j] = subpage;
 				flush_anon_page(vma, subpage, start + j * PAGE_SIZE);
 				flush_dcache_page(subpage);
Signature · 1 line
2.50.1
#31 lore raw

PATCH v2 19/37 mm/gup: remove record_subpages()

In reply to David Hildenbrand

We can just cleanup the code by calculating the #refs earlier, so we can just inline what remains of record_subpages().

Calculate the number of references/pages ahead of times, and record them only once all our tests passed.

---
 mm/gup.c | 25 ++++++++-----------------
 1 file changed, 8 insertions(+), 17 deletions(-)
mm/gup.c +8 -17
index c10cd969c1a3b..f0f4d1a68e094 100644
@@ -484,19 +484,6 @@ static inline void mm_set_has_pinned_flag(struct mm_struct *mm)
 #ifdef CONFIG_MMU
 
 #ifdef CONFIG_HAVE_GUP_FAST
-static int record_subpages(struct page *page, unsigned long sz,
-			   unsigned long addr, unsigned long end,
-			   struct page **pages)
-{
-	int nr;
-
-	page += (addr & (sz - 1)) >> PAGE_SHIFT;
-	for (nr = 0; addr != end; nr++, addr += PAGE_SIZE)
-		pages[nr] = page++;
-
-	return nr;
-}
-
 /**
  * try_grab_folio_fast() - Attempt to get or pin a folio in fast path.
  * @page:  pointer to page to be grabbed
@@ -2967,8 +2954,8 @@ static int gup_fast_pmd_leaf(pmd_t orig, pmd_t *pmdp, unsigned long addr,
 	if (pmd_special(orig))
 		return 0;
 
-	page = pmd_page(orig);
-	refs = record_subpages(page, PMD_SIZE, addr, end, pages + *nr);
+	refs = (end - addr) >> PAGE_SHIFT;
+	page = pmd_page(orig) + ((addr & ~PMD_MASK) >> PAGE_SHIFT);
 
 	folio = try_grab_folio_fast(page, refs, flags);
 	if (!folio)
@@ -2989,6 +2976,8 @@ static int gup_fast_pmd_leaf(pmd_t orig, pmd_t *pmdp, unsigned long addr,
 	}
 
 	*nr += refs;
+	for (; refs; refs--)
+		*(pages++) = page++;
 	folio_set_referenced(folio);
 	return 1;
 }
@@ -3007,8 +2996,8 @@ static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr,
 	if (pud_special(orig))
 		return 0;
 
-	page = pud_page(orig);
-	refs = record_subpages(page, PUD_SIZE, addr, end, pages + *nr);
+	refs = (end - addr) >> PAGE_SHIFT;
+	page = pud_page(orig) + ((addr & ~PUD_MASK) >> PAGE_SHIFT);
 
 	folio = try_grab_folio_fast(page, refs, flags);
 	if (!folio)
@@ -3030,6 +3019,8 @@ static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr,
 	}
 
 	*nr += refs;
+	for (; refs; refs--)
+		*(pages++) = page++;
 	folio_set_referenced(folio);
 	return 1;
 }
Signature · 1 line
2.50.1
#32 lore raw

Re: [PATCH v2 19/37] mm/gup: remove record_subpages()

Quoted 67 lines · David Hildenbrand

We can just cleanup the code by calculating the #refs earlier, so we can just inline what remains of record_subpages().

Calculate the number of references/pages ahead of times, and record them only once all our tests passed.

---
  mm/gup.c | 25 ++++++++-----------------
  1 file changed, 8 insertions(+), 17 deletions(-)
mm/gup.c +6 -17
index c10cd969c1a3b..f0f4d1a68e094 100644
@@ -484,19 +484,6 @@ static inline void mm_set_has_pinned_flag(struct mm_struct *mm)
  #ifdef CONFIG_MMU
 
  #ifdef CONFIG_HAVE_GUP_FAST
-static int record_subpages(struct page *page, unsigned long sz,
-			   unsigned long addr, unsigned long end,
-			   struct page **pages)
-{
-	int nr;
-
-	page += (addr & (sz - 1)) >> PAGE_SHIFT;
-	for (nr = 0; addr != end; nr++, addr += PAGE_SIZE)
-		pages[nr] = page++;
-
-	return nr;
-}
-
  /**
   * try_grab_folio_fast() - Attempt to get or pin a folio in fast path.
   * @page:  pointer to page to be grabbed
@@ -2967,8 +2954,8 @@ static int gup_fast_pmd_leaf(pmd_t orig, pmd_t *pmdp, unsigned long addr,
  	if (pmd_special(orig))
  		return 0;
 
-	page = pmd_page(orig);
-	refs = record_subpages(page, PMD_SIZE, addr, end, pages + *nr);
+	refs = (end - addr) >> PAGE_SHIFT;
+	page = pmd_page(orig) + ((addr & ~PMD_MASK) >> PAGE_SHIFT);
 
  	folio = try_grab_folio_fast(page, refs, flags);
  	if (!folio)
@@ -2989,6 +2976,8 @@ static int gup_fast_pmd_leaf(pmd_t orig, pmd_t *pmdp, unsigned long addr,
  	}
 
  	*nr += refs;
+	for (; refs; refs--)
+		*(pages++) = page++;
  	folio_set_referenced(folio);
  	return 1;
  }
@@ -3007,8 +2996,8 @@ static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr,
  	if (pud_special(orig))
  		return 0;
 
-	page = pud_page(orig);
-	refs = record_subpages(page, PUD_SIZE, addr, end, pages + *nr);
+	refs = (end - addr) >> PAGE_SHIFT;
+	page = pud_page(orig) + ((addr & ~PUD_MASK) >> PAGE_SHIFT);
 
  	folio = try_grab_folio_fast(page, refs, flags);
  	if (!folio)

mm/gup.c static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr, · line 3026

Quoted 8 lines
mm/gup.c +2 -0
@@ -3030,6 +3019,8 @@ static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr,
  	}
 
  	*nr += refs;
+	for (; refs; refs--)
+		*(pages++) = page++;
  	folio_set_referenced(folio);
  	return 1;
  }

Okay, this code is nasty. We should rework this code to just return the nr and receive a the proper pages pointer, getting rid of the "*nr" parameter.

For the time being, the following should do the trick:

commit bfd07c995814354f6b66c5b6a72e96a7aa9fb73b (HEAD -> nth_page)

Author: David Hildenbrand <[email protected]>
Date:   Fri Sep 5 08:38:43 2025 +0200

fixup: mm/gup: remove record_subpages()

pages is not adjusted by the caller, but idnexed by existing *nr.

mm/gup.c +2 -0
index 010fe56f6e132..22420f2069ee1 100644
@@ -2981,6 +2981,7 @@ static int gup_fast_pmd_leaf(pmd_t orig, pmd_t *pmdp, unsigned long addr,
                return 0;
        }
 
+       pages += *nr;
        *nr += refs;
        for (; refs; refs--)
                *(pages++) = page++;
@@ -3024,6 +3025,7 @@ static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr,
                return 0;
        }
 
+       pages += *nr;
        *nr += refs;
        for (; refs; refs--)
                *(pages++) = page++;
Signature · 3 lines
Cheers

David / dhildenb
maintainer
#33 lore raw

Re: [PATCH v2 19/37] mm/gup: remove record_subpages()

Quoted 97 lines · David Hildenbrand
Quoted 61 lines · David Hildenbrand

We can just cleanup the code by calculating the #refs earlier, so we can just inline what remains of record_subpages().

Calculate the number of references/pages ahead of times, and record them only once all our tests passed.

---
  mm/gup.c | 25 ++++++++-----------------
  1 file changed, 8 insertions(+), 17 deletions(-)
mm/gup.c +6 -15
index c10cd969c1a3b..f0f4d1a68e094 100644
@@ -484,19 +484,6 @@ static inline void mm_set_has_pinned_flag(struct mm_struct *mm)
  #ifdef CONFIG_MMU
    #ifdef CONFIG_HAVE_GUP_FAST
-static int record_subpages(struct page *page, unsigned long sz,
-               unsigned long addr, unsigned long end,
-               struct page **pages)
-{
-    int nr;
-
-    page += (addr & (sz - 1)) >> PAGE_SHIFT;
-    for (nr = 0; addr != end; nr++, addr += PAGE_SIZE)
-        pages[nr] = page++;
-
-    return nr;
-}
-
  /**
   * try_grab_folio_fast() - Attempt to get or pin a folio in fast path.
   * @page:  pointer to page to be grabbed
@@ -2967,8 +2954,8 @@ static int gup_fast_pmd_leaf(pmd_t orig, pmd_t *pmdp, unsigned long addr,
      if (pmd_special(orig))
          return 0;
  -    page = pmd_page(orig);
-    refs = record_subpages(page, PMD_SIZE, addr, end, pages + *nr);
+    refs = (end - addr) >> PAGE_SHIFT;
+    page = pmd_page(orig) + ((addr & ~PMD_MASK) >> PAGE_SHIFT);
        folio = try_grab_folio_fast(page, refs, flags);
      if (!folio)
@@ -2989,6 +2976,8 @@ static int gup_fast_pmd_leaf(pmd_t orig, pmd_t *pmdp, unsigned long addr,
      }
        *nr += refs;
+    for (; refs; refs--)
+        *(pages++) = page++;
      folio_set_referenced(folio);
      return 1;
  }
@@ -3007,8 +2996,8 @@ static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr,
      if (pud_special(orig))
          return 0;
  -    page = pud_page(orig);
-    refs = record_subpages(page, PUD_SIZE, addr, end, pages + *nr);
+    refs = (end - addr) >> PAGE_SHIFT;
+    page = pud_page(orig) + ((addr & ~PUD_MASK) >> PAGE_SHIFT);
        folio = try_grab_folio_fast(page, refs, flags);
      if (!folio)

mm/gup.c static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr, · line 3025

Quoted 7 lines
mm/gup.c +2 -0
@@ -3030,6 +3019,8 @@ static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr,
      }
        *nr += refs;
+    for (; refs; refs--)
+        *(pages++) = page++;
      folio_set_referenced(folio);
      return 1;
  }

Okay, this code is nasty. We should rework this code to just return the nr and receive a the proper pages pointer, getting rid of the "*nr" parameter.

For the time being, the following should do the trick:

commit bfd07c995814354f6b66c5b6a72e96a7aa9fb73b (HEAD -> nth_page)

Author: David Hildenbrand <[email protected]>
Date:   Fri Sep 5 08:38:43 2025 +0200

fixup: mm/gup: remove record_subpages()
pages is not adjusted by the caller, but idnexed by existing *nr.

mm/gup.c +1 -0
index 010fe56f6e132..22420f2069ee1 100644
@@ -2981,6 +2981,7 @@ static int gup_fast_pmd_leaf(pmd_t orig, pmd_t *pmdp, unsigned long addr,
                return 0;
        }
 
+       pages += *nr;
        *nr += refs;
        for (; refs; refs--)
                *(pages++) = page++;

mm/gup.c static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr, · line 3031

Quoted 7 lines
mm/gup.c +1 -0
@@ -3024,6 +3025,7 @@ static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr,
                return 0;
        }
 
+       pages += *nr;
        *nr += refs;
        for (; refs; refs--)
                *(pages++) = page++;

Tested as fixing the issue for me, thanks.

Signature · 1 line
Jens Axboe
Reviewed-by
#34 lore raw

Re: [PATCH v2 19/37] mm/gup: remove record_subpages()

In reply to David Hildenbrand
Quoted 8 lines · David Hildenbrand
Quoted 7 lines · David Hildenbrand

We can just cleanup the code by calculating the #refs earlier, so we can just inline what remains of record_subpages().

Calculate the number of references/pages ahead of times, and record them only once all our tests passed.

So strange I thought I looked at this...!

Quoted 87 lines
Quoted 54 lines
---
  mm/gup.c | 25 ++++++++-----------------
  1 file changed, 8 insertions(+), 17 deletions(-)
mm/gup.c +6 -17
index c10cd969c1a3b..f0f4d1a68e094 100644
@@ -484,19 +484,6 @@ static inline void mm_set_has_pinned_flag(struct mm_struct *mm)
  #ifdef CONFIG_MMU
  #ifdef CONFIG_HAVE_GUP_FAST
-static int record_subpages(struct page *page, unsigned long sz,
-			   unsigned long addr, unsigned long end,
-			   struct page **pages)
-{
-	int nr;
-
-	page += (addr & (sz - 1)) >> PAGE_SHIFT;
-	for (nr = 0; addr != end; nr++, addr += PAGE_SIZE)
-		pages[nr] = page++;
-
-	return nr;
-}
-
  /**
   * try_grab_folio_fast() - Attempt to get or pin a folio in fast path.
   * @page:  pointer to page to be grabbed
@@ -2967,8 +2954,8 @@ static int gup_fast_pmd_leaf(pmd_t orig, pmd_t *pmdp, unsigned long addr,
  	if (pmd_special(orig))
  		return 0;
-	page = pmd_page(orig);
-	refs = record_subpages(page, PMD_SIZE, addr, end, pages + *nr);
+	refs = (end - addr) >> PAGE_SHIFT;
+	page = pmd_page(orig) + ((addr & ~PMD_MASK) >> PAGE_SHIFT);
  	folio = try_grab_folio_fast(page, refs, flags);
  	if (!folio)
@@ -2989,6 +2976,8 @@ static int gup_fast_pmd_leaf(pmd_t orig, pmd_t *pmdp, unsigned long addr,
  	}
  	*nr += refs;
+	for (; refs; refs--)
+		*(pages++) = page++;
  	folio_set_referenced(folio);
  	return 1;
  }
@@ -3007,8 +2996,8 @@ static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr,
  	if (pud_special(orig))
  		return 0;
-	page = pud_page(orig);
-	refs = record_subpages(page, PUD_SIZE, addr, end, pages + *nr);
+	refs = (end - addr) >> PAGE_SHIFT;
+	page = pud_page(orig) + ((addr & ~PUD_MASK) >> PAGE_SHIFT);
  	folio = try_grab_folio_fast(page, refs, flags);
  	if (!folio)

mm/gup.c static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr, · line 3025

Quoted 7 lines
mm/gup.c +2 -0
@@ -3030,6 +3019,8 @@ static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr,
  	}
  	*nr += refs;
+	for (; refs; refs--)
+		*(pages++) = page++;
  	folio_set_referenced(folio);
  	return 1;
  }

Okay, this code is nasty. We should rework this code to just return the nr and receive a the proper pages pointer, getting rid of the "*nr" parameter.

For the time being, the following should do the trick:

commit bfd07c995814354f6b66c5b6a72e96a7aa9fb73b (HEAD -> nth_page)

Author: David Hildenbrand <[email protected]>
Date:   Fri Sep 5 08:38:43 2025 +0200

fixup: mm/gup: remove record_subpages()
pages is not adjusted by the caller, but idnexed by existing *nr.

mm/gup.c +1 -0
index 010fe56f6e132..22420f2069ee1 100644
@@ -2981,6 +2981,7 @@ static int gup_fast_pmd_leaf(pmd_t orig, pmd_t *pmdp, unsigned long addr,
                return 0;
        }
+       pages += *nr;
        *nr += refs;
        for (; refs; refs--)
                *(pages++) = page++;

mm/gup.c static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr, · line 3030

Quoted 6 lines
mm/gup.c +1 -0
@@ -3024,6 +3025,7 @@ static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr,
                return 0;
        }
+       pages += *nr;
        *nr += refs;
        for (; refs; refs--)
                *(pages++) = page++;

This looks correct.

But.

This is VERY nasty. Before we'd call record_subpages() with pages + *nr, where it was clear we were offsetting by this, now we're making things imo way more confusing.

This makes me less in love with this approach to be honest.

But perhaps it's the least worst thing for now until we can do a bigger refactor...

So since this seems correct to me, and for the sake of moving things forward (was this one patch dropped from mm-new or does mm-new just have an old version? Confused):

For this patch obviously with the fix applied.

But can we PLEASE revisit this :)

Quoted 8 lines
mm/gup.c +0 -1
--

Cheers

David / dhildenb

Cheers, Lorenzo

#35 lore raw

Re: [PATCH v2 19/37] mm/gup: remove record_subpages()

Quoted 123 lines · Lorenzo Stoakes
Quoted 8 lines · David Hildenbrand
Quoted 7 lines · David Hildenbrand

We can just cleanup the code by calculating the #refs earlier, so we can just inline what remains of record_subpages().

Calculate the number of references/pages ahead of times, and record them only once all our tests passed.

So strange I thought I looked at this...!

Quoted 87 lines
Quoted 54 lines
---
   mm/gup.c | 25 ++++++++-----------------
   1 file changed, 8 insertions(+), 17 deletions(-)
mm/gup.c +6 -17
index c10cd969c1a3b..f0f4d1a68e094 100644
@@ -484,19 +484,6 @@ static inline void mm_set_has_pinned_flag(struct mm_struct *mm)
   #ifdef CONFIG_MMU
   #ifdef CONFIG_HAVE_GUP_FAST
-static int record_subpages(struct page *page, unsigned long sz,
-			   unsigned long addr, unsigned long end,
-			   struct page **pages)
-{
-	int nr;
-
-	page += (addr & (sz - 1)) >> PAGE_SHIFT;
-	for (nr = 0; addr != end; nr++, addr += PAGE_SIZE)
-		pages[nr] = page++;
-
-	return nr;
-}
-
   /**
    * try_grab_folio_fast() - Attempt to get or pin a folio in fast path.
    * @page:  pointer to page to be grabbed
@@ -2967,8 +2954,8 @@ static int gup_fast_pmd_leaf(pmd_t orig, pmd_t *pmdp, unsigned long addr,
   	if (pmd_special(orig))
   		return 0;
-	page = pmd_page(orig);
-	refs = record_subpages(page, PMD_SIZE, addr, end, pages + *nr);
+	refs = (end - addr) >> PAGE_SHIFT;
+	page = pmd_page(orig) + ((addr & ~PMD_MASK) >> PAGE_SHIFT);
   	folio = try_grab_folio_fast(page, refs, flags);
   	if (!folio)
@@ -2989,6 +2976,8 @@ static int gup_fast_pmd_leaf(pmd_t orig, pmd_t *pmdp, unsigned long addr,
   	}
   	*nr += refs;
+	for (; refs; refs--)
+		*(pages++) = page++;
   	folio_set_referenced(folio);
   	return 1;
   }
@@ -3007,8 +2996,8 @@ static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr,
   	if (pud_special(orig))
   		return 0;
-	page = pud_page(orig);
-	refs = record_subpages(page, PUD_SIZE, addr, end, pages + *nr);
+	refs = (end - addr) >> PAGE_SHIFT;
+	page = pud_page(orig) + ((addr & ~PUD_MASK) >> PAGE_SHIFT);
   	folio = try_grab_folio_fast(page, refs, flags);
   	if (!folio)

mm/gup.c static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr, · line 3025

Quoted 7 lines
mm/gup.c +2 -0
@@ -3030,6 +3019,8 @@ static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr,
   	}
   	*nr += refs;
+	for (; refs; refs--)
+		*(pages++) = page++;
   	folio_set_referenced(folio);
   	return 1;
   }

Okay, this code is nasty. We should rework this code to just return the nr and receive a the proper pages pointer, getting rid of the "*nr" parameter.

For the time being, the following should do the trick:

commit bfd07c995814354f6b66c5b6a72e96a7aa9fb73b (HEAD -> nth_page)

Author: David Hildenbrand <[email protected]>
Date:   Fri Sep 5 08:38:43 2025 +0200

fixup: mm/gup: remove record_subpages()
pages is not adjusted by the caller, but idnexed by existing *nr.

mm/gup.c +1 -0
index 010fe56f6e132..22420f2069ee1 100644
@@ -2981,6 +2981,7 @@ static int gup_fast_pmd_leaf(pmd_t orig, pmd_t *pmdp, unsigned long addr,
                 return 0;
         }
+       pages += *nr;
         *nr += refs;
         for (; refs; refs--)
                 *(pages++) = page++;

mm/gup.c static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr, · line 3030

Quoted 6 lines
mm/gup.c +1 -0
@@ -3024,6 +3025,7 @@ static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr,
                 return 0;
         }
+       pages += *nr;
         *nr += refs;
         for (; refs; refs--)
                 *(pages++) = page++;

This looks correct.

But.

This is VERY nasty. Before we'd call record_subpages() with pages + *nr, where it was clear we were offsetting by this, now we're making things imo way more confusing.

This makes me less in love with this approach to be honest.

But perhaps it's the least worst thing for now until we can do a bigger refactor...

So since this seems correct to me, and for the sake of moving things forward (was this one patch dropped from mm-new or does mm-new just have an old version? Confused):

Quoted 5 lines

For this patch obviously with the fix applied.

But can we PLEASE revisit this :)

Yeah, I already asked someone internally if he would have time to do some refactorings in mm/gup.c.

If that won't work out I shall do it at some point (and the same time reworking follow_page_mask() to just consume the array as well like gup does)

Signature · 3 lines
Cheers

David / dhildenb
#36 lore raw

Re: [PATCH v2 19/37] mm/gup: remove record_subpages()

In reply to David Hildenbrand
Quoted 95 lines · David Hildenbrand
Quoted 61 lines · David Hildenbrand

We can just cleanup the code by calculating the #refs earlier, so we can just inline what remains of record_subpages().

Calculate the number of references/pages ahead of times, and record them only once all our tests passed.

---
  mm/gup.c | 25 ++++++++-----------------
  1 file changed, 8 insertions(+), 17 deletions(-)
mm/gup.c +6 -17
index c10cd969c1a3b..f0f4d1a68e094 100644
@@ -484,19 +484,6 @@ static inline void mm_set_has_pinned_flag(struct mm_struct *mm)
  #ifdef CONFIG_MMU
  #ifdef CONFIG_HAVE_GUP_FAST
-static int record_subpages(struct page *page, unsigned long sz,
-			   unsigned long addr, unsigned long end,
-			   struct page **pages)
-{
-	int nr;
-
-	page += (addr & (sz - 1)) >> PAGE_SHIFT;
-	for (nr = 0; addr != end; nr++, addr += PAGE_SIZE)
-		pages[nr] = page++;
-
-	return nr;
-}
-
  /**
   * try_grab_folio_fast() - Attempt to get or pin a folio in fast path.
   * @page:  pointer to page to be grabbed
@@ -2967,8 +2954,8 @@ static int gup_fast_pmd_leaf(pmd_t orig, pmd_t *pmdp, unsigned long addr,
  	if (pmd_special(orig))
  		return 0;
-	page = pmd_page(orig);
-	refs = record_subpages(page, PMD_SIZE, addr, end, pages + *nr);
+	refs = (end - addr) >> PAGE_SHIFT;
+	page = pmd_page(orig) + ((addr & ~PMD_MASK) >> PAGE_SHIFT);
  	folio = try_grab_folio_fast(page, refs, flags);
  	if (!folio)
@@ -2989,6 +2976,8 @@ static int gup_fast_pmd_leaf(pmd_t orig, pmd_t *pmdp, unsigned long addr,
  	}
  	*nr += refs;
+	for (; refs; refs--)
+		*(pages++) = page++;
  	folio_set_referenced(folio);
  	return 1;
  }
@@ -3007,8 +2996,8 @@ static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr,
  	if (pud_special(orig))
  		return 0;
-	page = pud_page(orig);
-	refs = record_subpages(page, PUD_SIZE, addr, end, pages + *nr);
+	refs = (end - addr) >> PAGE_SHIFT;
+	page = pud_page(orig) + ((addr & ~PUD_MASK) >> PAGE_SHIFT);
  	folio = try_grab_folio_fast(page, refs, flags);
  	if (!folio)

mm/gup.c static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr, · line 3025

Quoted 7 lines
mm/gup.c +2 -0
@@ -3030,6 +3019,8 @@ static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr,
  	}
  	*nr += refs;
+	for (; refs; refs--)
+		*(pages++) = page++;
  	folio_set_referenced(folio);
  	return 1;
  }

Okay, this code is nasty. We should rework this code to just return the nr and receive a the proper pages pointer, getting rid of the "*nr" parameter.

For the time being, the following should do the trick:

commit bfd07c995814354f6b66c5b6a72e96a7aa9fb73b (HEAD -> nth_page)

Author: David Hildenbrand <[email protected]>
Date:   Fri Sep 5 08:38:43 2025 +0200

fixup: mm/gup: remove record_subpages()
pages is not adjusted by the caller, but idnexed by existing *nr.

mm/gup.c +1 -0
index 010fe56f6e132..22420f2069ee1 100644
@@ -2981,6 +2981,7 @@ static int gup_fast_pmd_leaf(pmd_t orig, pmd_t *pmdp, unsigned long addr,
                return 0;
        }
+       pages += *nr;
        *nr += refs;
        for (; refs; refs--)
                *(pages++) = page++;

mm/gup.c static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr, · line 3030

Quoted 6 lines
mm/gup.c +1 -0
@@ -3024,6 +3025,7 @@ static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr,
                return 0;
        }
+       pages += *nr;
        *nr += refs;
        for (; refs; refs--)
                *(pages++) = page++;

Can this get folded in soon? This bug is causing crashes in AF_ALG too.

Thanks,

- Eric

#37 lore raw

Re: [PATCH v2 19/37] mm/gup: remove record_subpages()

Quoted 96 lines · Eric Biggers
Quoted 95 lines · David Hildenbrand
Quoted 61 lines · David Hildenbrand

We can just cleanup the code by calculating the #refs earlier, so we can just inline what remains of record_subpages().

Calculate the number of references/pages ahead of times, and record them only once all our tests passed.

---
   mm/gup.c | 25 ++++++++-----------------
   1 file changed, 8 insertions(+), 17 deletions(-)
mm/gup.c +6 -17
index c10cd969c1a3b..f0f4d1a68e094 100644
@@ -484,19 +484,6 @@ static inline void mm_set_has_pinned_flag(struct mm_struct *mm)
   #ifdef CONFIG_MMU
   #ifdef CONFIG_HAVE_GUP_FAST
-static int record_subpages(struct page *page, unsigned long sz,
-			   unsigned long addr, unsigned long end,
-			   struct page **pages)
-{
-	int nr;
-
-	page += (addr & (sz - 1)) >> PAGE_SHIFT;
-	for (nr = 0; addr != end; nr++, addr += PAGE_SIZE)
-		pages[nr] = page++;
-
-	return nr;
-}
-
   /**
    * try_grab_folio_fast() - Attempt to get or pin a folio in fast path.
    * @page:  pointer to page to be grabbed
@@ -2967,8 +2954,8 @@ static int gup_fast_pmd_leaf(pmd_t orig, pmd_t *pmdp, unsigned long addr,
   	if (pmd_special(orig))
   		return 0;
-	page = pmd_page(orig);
-	refs = record_subpages(page, PMD_SIZE, addr, end, pages + *nr);
+	refs = (end - addr) >> PAGE_SHIFT;
+	page = pmd_page(orig) + ((addr & ~PMD_MASK) >> PAGE_SHIFT);
   	folio = try_grab_folio_fast(page, refs, flags);
   	if (!folio)
@@ -2989,6 +2976,8 @@ static int gup_fast_pmd_leaf(pmd_t orig, pmd_t *pmdp, unsigned long addr,
   	}
   	*nr += refs;
+	for (; refs; refs--)
+		*(pages++) = page++;
   	folio_set_referenced(folio);
   	return 1;
   }
@@ -3007,8 +2996,8 @@ static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr,
   	if (pud_special(orig))
   		return 0;
-	page = pud_page(orig);
-	refs = record_subpages(page, PUD_SIZE, addr, end, pages + *nr);
+	refs = (end - addr) >> PAGE_SHIFT;
+	page = pud_page(orig) + ((addr & ~PUD_MASK) >> PAGE_SHIFT);
   	folio = try_grab_folio_fast(page, refs, flags);
   	if (!folio)

mm/gup.c static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr, · line 3025

Quoted 7 lines
mm/gup.c +2 -0
@@ -3030,6 +3019,8 @@ static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr,
   	}
   	*nr += refs;
+	for (; refs; refs--)
+		*(pages++) = page++;
   	folio_set_referenced(folio);
   	return 1;
   }

Okay, this code is nasty. We should rework this code to just return the nr and receive a the proper pages pointer, getting rid of the "*nr" parameter.

For the time being, the following should do the trick:

commit bfd07c995814354f6b66c5b6a72e96a7aa9fb73b (HEAD -> nth_page)

Author: David Hildenbrand <[email protected]>
Date:   Fri Sep 5 08:38:43 2025 +0200

fixup: mm/gup: remove record_subpages()
pages is not adjusted by the caller, but idnexed by existing *nr.

mm/gup.c +1 -0
index 010fe56f6e132..22420f2069ee1 100644
@@ -2981,6 +2981,7 @@ static int gup_fast_pmd_leaf(pmd_t orig, pmd_t *pmdp, unsigned long addr,
                 return 0;
         }
+       pages += *nr;
         *nr += refs;
         for (; refs; refs--)
                 *(pages++) = page++;
@@ -3024,6 +3025,7 @@ static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr,
Quoted 8 lines

mm/gup.c static int gup_fast_pmd_leaf(pmd_t orig, pmd_t *pmdp, unsigned long addr, · line 2987

Quoted 6 lines
mm/gup.c +1 -0
                 return 0;
         }
+       pages += *nr;
         *nr += refs;
         for (; refs; refs--)
                 *(pages++) = page++;

Can this get folded in soon? This bug is causing crashes in AF_ALG too.

Andrew immediately dropped the original patch, so it's gone from mm-unstable and should be gone from next soon (today?).

Signature · 3 lines
Cheers

David / dhildenb
maintainer
#38 lore raw

Re: [PATCH v2 19/37] mm/gup: remove record_subpages()

Quoted 10 lines · On Sat, 6 Sep 2025 08:57:37 +0200 David Hildenbrand <[email protected]> wrote:
Quoted 9 lines

mm/gup.c static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr, · line 3030

Quoted 7 lines
mm/gup.c +1 -0
@@ -3024,6 +3025,7 @@ static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr,
                 return 0;
         }
+       pages += *nr;
         *nr += refs;
         for (; refs; refs--)
                 *(pages++) = page++;

Can this get folded in soon? This bug is causing crashes in AF_ALG too.

Quoted 2 lines

Andrew immediately dropped the original patch, so it's gone from mm-unstable and should be gone from next soon (today?).

I restored it once you sent out the fix. It doesn't seem to be in present -next but it should be there in the next one.

reviewer
#39 lore raw

Re: [PATCH v2 19/37] mm/gup: remove record_subpages()

In reply to David Hildenbrand
Quoted 67 lines · David Hildenbrand

We can just cleanup the code by calculating the #refs earlier, so we can just inline what remains of record_subpages().

Calculate the number of references/pages ahead of times, and record them only once all our tests passed.

---
 mm/gup.c | 25 ++++++++-----------------
 1 file changed, 8 insertions(+), 17 deletions(-)
mm/gup.c +6 -17
index c10cd969c1a3b..f0f4d1a68e094 100644
@@ -484,19 +484,6 @@ static inline void mm_set_has_pinned_flag(struct mm_struct *mm)
 #ifdef CONFIG_MMU
 
 #ifdef CONFIG_HAVE_GUP_FAST
-static int record_subpages(struct page *page, unsigned long sz,
-			   unsigned long addr, unsigned long end,
-			   struct page **pages)
-{
-	int nr;
-
-	page += (addr & (sz - 1)) >> PAGE_SHIFT;
-	for (nr = 0; addr != end; nr++, addr += PAGE_SIZE)
-		pages[nr] = page++;
-
-	return nr;
-}
-
 /**
  * try_grab_folio_fast() - Attempt to get or pin a folio in fast path.
  * @page:  pointer to page to be grabbed
@@ -2967,8 +2954,8 @@ static int gup_fast_pmd_leaf(pmd_t orig, pmd_t *pmdp, unsigned long addr,
 	if (pmd_special(orig))
 		return 0;
 
-	page = pmd_page(orig);
-	refs = record_subpages(page, PMD_SIZE, addr, end, pages + *nr);
+	refs = (end - addr) >> PAGE_SHIFT;
+	page = pmd_page(orig) + ((addr & ~PMD_MASK) >> PAGE_SHIFT);
 
 	folio = try_grab_folio_fast(page, refs, flags);
 	if (!folio)
@@ -2989,6 +2976,8 @@ static int gup_fast_pmd_leaf(pmd_t orig, pmd_t *pmdp, unsigned long addr,
 	}
 
 	*nr += refs;
+	for (; refs; refs--)
+		*(pages++) = page++;
 	folio_set_referenced(folio);
 	return 1;
 }
@@ -3007,8 +2996,8 @@ static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr,
 	if (pud_special(orig))
 		return 0;
 
-	page = pud_page(orig);
-	refs = record_subpages(page, PUD_SIZE, addr, end, pages + *nr);
+	refs = (end - addr) >> PAGE_SHIFT;
+	page = pud_page(orig) + ((addr & ~PUD_MASK) >> PAGE_SHIFT);
 
 	folio = try_grab_folio_fast(page, refs, flags);
 	if (!folio)

mm/gup.c static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr, · line 3023

Quoted 5 lines
mm/gup.c +2 -0
@@ -3030,6 +3019,8 @@ static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr,
 	}
 
 	*nr += refs;
+	for (; refs; refs--)
+		*(pages++) = page++;

Hi David,

Probably a similar sentiment as Lorenzo here...the above diffs make the code *worse* to read. In fact, I recall adding record_subpages() here long ago, specifically to help clarify what was going on.

Now it's been returned to it's original, cryptic form.

Just my take on it, for whatever that's worth. :)

thanks,

Signature · 1 line
John Hubbard
Quoted 3 lines
mm/gup.c +0 -0
 	folio_set_referenced(folio);
 	return 1;
 }
#40 lore raw

Re: [PATCH v2 19/37] mm/gup: remove record_subpages()

Quoted 70 lines · John Hubbard
Quoted 69 lines · David Hildenbrand

We can just cleanup the code by calculating the #refs earlier, so we can just inline what remains of record_subpages().

Calculate the number of references/pages ahead of times, and record them only once all our tests passed.

---
  mm/gup.c | 25 ++++++++-----------------
  1 file changed, 8 insertions(+), 17 deletions(-)
mm/gup.c +6 -17
index c10cd969c1a3b..f0f4d1a68e094 100644
@@ -484,19 +484,6 @@ static inline void mm_set_has_pinned_flag(struct mm_struct *mm)
  #ifdef CONFIG_MMU
 
  #ifdef CONFIG_HAVE_GUP_FAST
-static int record_subpages(struct page *page, unsigned long sz,
-			   unsigned long addr, unsigned long end,
-			   struct page **pages)
-{
-	int nr;
-
-	page += (addr & (sz - 1)) >> PAGE_SHIFT;
-	for (nr = 0; addr != end; nr++, addr += PAGE_SIZE)
-		pages[nr] = page++;
-
-	return nr;
-}
-
  /**
   * try_grab_folio_fast() - Attempt to get or pin a folio in fast path.
   * @page:  pointer to page to be grabbed
@@ -2967,8 +2954,8 @@ static int gup_fast_pmd_leaf(pmd_t orig, pmd_t *pmdp, unsigned long addr,
  	if (pmd_special(orig))
  		return 0;
 
-	page = pmd_page(orig);
-	refs = record_subpages(page, PMD_SIZE, addr, end, pages + *nr);
+	refs = (end - addr) >> PAGE_SHIFT;
+	page = pmd_page(orig) + ((addr & ~PMD_MASK) >> PAGE_SHIFT);
 
  	folio = try_grab_folio_fast(page, refs, flags);
  	if (!folio)
@@ -2989,6 +2976,8 @@ static int gup_fast_pmd_leaf(pmd_t orig, pmd_t *pmdp, unsigned long addr,
  	}
 
  	*nr += refs;
+	for (; refs; refs--)
+		*(pages++) = page++;
  	folio_set_referenced(folio);
  	return 1;
  }
@@ -3007,8 +2996,8 @@ static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr,
  	if (pud_special(orig))
  		return 0;
 
-	page = pud_page(orig);
-	refs = record_subpages(page, PUD_SIZE, addr, end, pages + *nr);
+	refs = (end - addr) >> PAGE_SHIFT;
+	page = pud_page(orig) + ((addr & ~PUD_MASK) >> PAGE_SHIFT);
 
  	folio = try_grab_folio_fast(page, refs, flags);
  	if (!folio)
@@ -3030,6 +3019,8 @@ static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr,
  	}
 
Quoted 5 lines

mm/gup.c static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr, · line 3023

Quoted 3 lines
mm/gup.c +2 -0
  	*nr += refs;
+	for (; refs; refs--)
+		*(pages++) = page++;

Hi David,

Hi!

Quoted 4 lines

Probably a similar sentiment as Lorenzo here...the above diffs make the code *worse* to read. In fact, I recall adding record_subpages() here long ago, specifically to help clarify what was going on.

Well, there is a lot I dislike about record_subpages() to go back there. Starting with "as Willy keeps explaining, the concept of subpages do not exist and ending with "why do we fill out the array even on failure".

:)

Quoted 3 lines

Now it's been returned to it's original, cryptic form.

The code in the caller was so uncryptic that both me and Lorenzo missed that magical addition. :P

Quoted 1 line

Just my take on it, for whatever that's worth. :)

As always, appreciated.

I could of course keep the simple loop in some "record_folio_pages" function and clean up what I dislike about record_subpages().

But I much rather want the call chain to be cleaned up instead, if possible.

Roughly, what I am thinking (limiting it to pte+pmd case) about is the following:

From d6d6d21dbf435d8030782a627175e36e6c7b2dfb Mon Sep 17 00:00:00 2001
From: David Hildenbrand <[email protected]>
Date: Sat, 6 Sep 2025 08:33:42 +0200
Subject: [PATCH] tmp

---
 mm/gup.c | 79 ++++++++++++++++++++++++++------------------------------
 1 file changed, 36 insertions(+), 43 deletions(-)
mm/gup.c +36 -43
index 22420f2069ee1..98907ead749c0 100644
@@ -2845,12 +2845,11 @@ static void __maybe_unused gup_fast_undo_dev_pagemap(int *nr, int nr_start,
  * also check pmd here to make sure pmd doesn't change (corresponds to
  * pmdp_collapse_flush() in the THP collapse code path).
  */
-static int gup_fast_pte_range(pmd_t pmd, pmd_t *pmdp, unsigned long addr,
-		unsigned long end, unsigned int flags, struct page **pages,
-		int *nr)
+static unsigned long gup_fast_pte_range(pmd_t pmd, pmd_t *pmdp, unsigned long addr,
+		unsigned long end, unsigned int flags, struct page **pages)
 {
 	struct dev_pagemap *pgmap = NULL;
-	int ret = 0;
+	unsigned long nr_pages = 0;
 	pte_t *ptep, *ptem;
 
 	ptem = ptep = pte_offset_map(&pmd, addr);
@@ -2908,24 +2907,20 @@ static int gup_fast_pte_range(pmd_t pmd, pmd_t *pmdp, unsigned long addr,
 		 * details.
 		 */
 		if (flags & FOLL_PIN) {
-			ret = arch_make_folio_accessible(folio);
-			if (ret) {
+			if (arch_make_folio_accessible(folio)) {
 				gup_put_folio(folio, 1, flags);
 				goto pte_unmap;
 			}
 		}
 		folio_set_referenced(folio);
-		pages[*nr] = page;
-		(*nr)++;
+		pages[nr_pages++] = page;
 	} while (ptep++, addr += PAGE_SIZE, addr != end);
 
-	ret = 1;
-
 pte_unmap:
 	if (pgmap)
 		put_dev_pagemap(pgmap);
 	pte_unmap(ptem);
-	return ret;
+	return nr_pages;
 }
 #else
 
@@ -2938,21 +2933,24 @@ static int gup_fast_pte_range(pmd_t pmd, pmd_t *pmdp, unsigned long addr,
  * get_user_pages_fast_only implementation that can pin pages. Thus it's still
  * useful to have gup_fast_pmd_leaf even if we can't operate on ptes.
  */
-static int gup_fast_pte_range(pmd_t pmd, pmd_t *pmdp, unsigned long addr,
-		unsigned long end, unsigned int flags, struct page **pages,
-		int *nr)
+static unsigned long gup_fast_pte_range(pmd_t pmd, pmd_t *pmdp, unsigned long addr,
+		unsigned long end, unsigned int flags, struct page **pages)
 {
 	return 0;
 }
 #endif /* CONFIG_ARCH_HAS_PTE_SPECIAL */
 
-static int gup_fast_pmd_leaf(pmd_t orig, pmd_t *pmdp, unsigned long addr,
-		unsigned long end, unsigned int flags, struct page **pages,
-		int *nr)
+static unsigned long gup_fast_pmd_leaf(pmd_t orig, pmd_t *pmdp, unsigned long addr,
+		unsigned long end, unsigned int flags, struct page **pages)
 {
+	const unsigned long nr_pages = (end - addr) >> PAGE_SHIFT;
 	struct page *page;
 	struct folio *folio;
-	int refs;
+	unsigned long i;
+
+	/* See gup_fast_pte_range() */
+	if (pmd_protnone(orig))
+		return 0;
 
 	if (!pmd_access_permitted(orig, flags & FOLL_WRITE))
 		return 0;
@@ -2960,33 +2958,30 @@ static int gup_fast_pmd_leaf(pmd_t orig, pmd_t *pmdp, unsigned long addr,
 	if (pmd_special(orig))
 		return 0;
 
-	refs = (end - addr) >> PAGE_SHIFT;
 	page = pmd_page(orig) + ((addr & ~PMD_MASK) >> PAGE_SHIFT);
 
-	folio = try_grab_folio_fast(page, refs, flags);
+	folio = try_grab_folio_fast(page, nr_pages, flags);
 	if (!folio)
 		return 0;
 
 	if (unlikely(pmd_val(orig) != pmd_val(*pmdp))) {
-		gup_put_folio(folio, refs, flags);
+		gup_put_folio(folio, nr_pages, flags);
 		return 0;
 	}
 
 	if (!gup_fast_folio_allowed(folio, flags)) {
-		gup_put_folio(folio, refs, flags);
+		gup_put_folio(folio, nr_pages, flags);
 		return 0;
 	}
 	if (!pmd_write(orig) && gup_must_unshare(NULL, flags, &folio->page)) {
-		gup_put_folio(folio, refs, flags);
+		gup_put_folio(folio, nr_pages, flags);
 		return 0;
 	}
 
-	pages += *nr;
-	*nr += refs;
-	for (; refs; refs--)
+	for (i = 0; i < nr_pages; i++)
 		*(pages++) = page++;
 	folio_set_referenced(folio);
-	return 1;
+	return nr_pages;
 }
 
 static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr,
@@ -3033,11 +3028,11 @@ static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr,
 	return 1;
 }
 
-static int gup_fast_pmd_range(pud_t *pudp, pud_t pud, unsigned long addr,
-		unsigned long end, unsigned int flags, struct page **pages,
-		int *nr)
+static unsigned long gup_fast_pmd_range(pud_t *pudp, pud_t pud, unsigned long addr,
+		unsigned long end, unsigned int flags, struct page **pages)
 {
-	unsigned long next;
+	unsigned long cur_nr_pages, next;
+	unsigned long nr_pages = 0;
 	pmd_t *pmdp;
 
 	pmdp = pmd_offset_lockless(pudp, pud, addr);
@@ -3046,23 +3041,21 @@ static int gup_fast_pmd_range(pud_t *pudp, pud_t pud, unsigned long addr,
 
 		next = pmd_addr_end(addr, end);
 		if (!pmd_present(pmd))
-			return 0;
+			break;
 
-		if (unlikely(pmd_leaf(pmd))) {
-			/* See gup_fast_pte_range() */
-			if (pmd_protnone(pmd))
-				return 0;
+		if (unlikely(pmd_leaf(pmd)))
+			cur_nr_pages = gup_fast_pmd_leaf(pmd, pmdp, addr, next, flags, pages);
+		else
+			cur_nr_pages = gup_fast_pte_range(pmd, pmdp, addr, next, flags, pages);
 
-			if (!gup_fast_pmd_leaf(pmd, pmdp, addr, next, flags,
-				pages, nr))
-				return 0;
+		nr_pages += cur_nr_pages;
+		pages += cur_nr_pages;
 
-		} else if (!gup_fast_pte_range(pmd, pmdp, addr, next, flags,
-					       pages, nr))
-			return 0;
+		if (nr_pages != (next - addr) >> PAGE_SIZE)
+			break;
 	} while (pmdp++, addr = next, addr != end);
 
-	return 1;
+	return nr_pages;
 }
 
 static int gup_fast_pud_range(p4d_t *p4dp, p4d_t p4d, unsigned long addr,
Signature · 32 lines
2.50.1



Oh, I might even have found a bug moving away from that questionable
"ret==1 means success" handling in gup_fast_pte_range()? Will
have to double-check, but likely the following is the right thing to do.



From 8f48b25ef93e7ef98611fd58ec89384ad5171782 Mon Sep 17 00:00:00 2001
From: David Hildenbrand <[email protected]>
Date: Sat, 6 Sep 2025 08:46:45 +0200
Subject: [PATCH] mm/gup: fix handling of errors from
 arch_make_folio_accessible() in follow_page_pte()

In case we call arch_make_folio_accessible() and it fails, we would
incorrectly return a value that is "!= 0" to the caller, indicating that
we pinned all requested pages and that the caller can keep going.

follow_page_pte() is not supposed to return error values, but instead
0 on failure and 1 on success.

That is of course wrong, because the caller will just keep going pinning
more pages. If we happen to pin a page afterwards, we're in trouble,
because we essentially skipped some pages.

Fixes: f28d43636d6f ("mm/gup/writeback: add callbacks for inaccessible pages")
Signed-off-by: David Hildenbrand <[email protected]>
---
 mm/gup.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)
mm/gup.c +1 -2
index 22420f2069ee1..cff226ec0ee7d 100644
@@ -2908,8 +2908,7 @@ static int gup_fast_pte_range(pmd_t pmd, pmd_t *pmdp, unsigned long addr,
 		 * details.
 		 */
 		if (flags & FOLL_PIN) {
-			ret = arch_make_folio_accessible(folio);
-			if (ret) {
+			if (arch_make_folio_accessible(folio)) {
 				gup_put_folio(folio, 1, flags);
 				goto pte_unmap;
 			}
Signature · 7 lines
2.50.1


-- 
Cheers

David / dhildenb
#41 lore raw

Re: [PATCH v2 19/37] mm/gup: remove record_subpages()

Quoted 19 lines
   	pmdp = pmd_offset_lockless(pudp, pud, addr);
mm/gup.c +5 -6
@@ -3046,23 +3041,21 @@ static int gup_fast_pmd_range(pud_t *pudp, pud_t pud, unsigned long addr,
 
   		next = pmd_addr_end(addr, end);
   		if (!pmd_present(pmd))
-			return 0;
+			break;
 
-		if (unlikely(pmd_leaf(pmd))) {
-			/* See gup_fast_pte_range() */
-			if (pmd_protnone(pmd))
-				return 0;
+		if (unlikely(pmd_leaf(pmd)))
+			cur_nr_pages = gup_fast_pmd_leaf(pmd, pmdp, addr, next, flags, pages);
+		else
+			cur_nr_pages = gup_fast_pte_range(pmd, pmdp, addr, next, flags, pages);
 
-			if (!gup_fast_pmd_leaf(pmd, pmdp, addr, next, flags,

mm/gup.c static int gup_fast_pmd_range(pud_t *pudp, pud_t pud, unsigned long addr, · line 3055

Quoted 10 lines
mm/gup.c +4 -5
-				pages, nr))
-				return 0;
+		nr_pages += cur_nr_pages;
+		pages += cur_nr_pages;
 
-		} else if (!gup_fast_pte_range(pmd, pmdp, addr, next, flags,
-					       pages, nr))
-			return 0;
+		if (nr_pages != (next - addr) >> PAGE_SIZE)
+			break;

^ cur_nr_pages. Open for suggestions on how to make that thing here even better.

Signature · 3 lines
Cheers

David / dhildenb
reviewer
#42 lore raw

Re: [PATCH v2 19/37] mm/gup: remove record_subpages()

In reply to David Hildenbrand
Quoted 2 lines · David Hildenbrand
Quoted 1 line · John Hubbard

On 9/1/25 8:03 AM, David Hildenbrand wrote:

...> Well, there is a lot I dislike about record_subpages() to go back there.

Quoted 4 lines

Starting with "as Willy keeps explaining, the concept of subpages do not exist and ending with "why do we fill out the array even on failure".

:)

I am also very glad to see the entire concept of subpages disappear.

Quoted 7 lines
Quoted 3 lines

Now it's been returned to it's original, cryptic form.

The code in the caller was so uncryptic that both me and Lorenzo missed that magical addition. :P

Quoted 9 lines
Quoted 1 line

Just my take on it, for whatever that's worth. :)

As always, appreciated.

I could of course keep the simple loop in some "record_folio_pages" function and clean up what I dislike about record_subpages().

But I much rather want the call chain to be cleaned up instead, if possible.

Right! The primary way that record_subpages() helped was in showing what was going on: a function call helps a lot to self-document, sometimes.

Quoted 2 lines

Roughly, what I am thinking (limiting it to pte+pmd case) about is the following:

The code below looks much cleaner, that's great!

thanks,

Signature · 1 line
John Hubbard
Quoted 196 lines

From d6d6d21dbf435d8030782a627175e36e6c7b2dfb Mon Sep 17 00:00:00 2001
From: David Hildenbrand <[email protected]>
Date: Sat, 6 Sep 2025 08:33:42 +0200
Subject: [PATCH] tmp

---
  mm/gup.c | 79 ++++++++++++++++++++++++++------------------------------
  1 file changed, 36 insertions(+), 43 deletions(-)
mm/gup.c +3 -4
index 22420f2069ee1..98907ead749c0 100644
@@ -2845,12 +2845,11 @@ static void __maybe_unused 
 gup_fast_undo_dev_pagemap(int *nr, int nr_start,
   * also check pmd here to make sure pmd doesn't change (corresponds to
   * pmdp_collapse_flush() in the THP collapse code path).
   */
-static int gup_fast_pte_range(pmd_t pmd, pmd_t *pmdp, unsigned long addr,
-        unsigned long end, unsigned int flags, struct page **pages,
-        int *nr)
+static unsigned long gup_fast_pte_range(pmd_t pmd, pmd_t *pmdp, 
 unsigned long addr,
+        unsigned long end, unsigned int flags, struct page **pages)
  {
      struct dev_pagemap *pgmap = NULL;
-    int ret = 0;
+    unsigned long nr_pages = 0;
      pte_t *ptep, *ptem;

     ptem = ptep = pte_offset_map(&pmd, addr);

mm/gup.c +3 -7
@@ -2908,24 +2907,20 @@ static int gup_fast_pte_range(pmd_t pmd, pmd_t 
 *pmdp, unsigned long addr,
           * details.
           */
          if (flags & FOLL_PIN) {
-            ret = arch_make_folio_accessible(folio);
-            if (ret) {
+            if (arch_make_folio_accessible(folio)) {
                  gup_put_folio(folio, 1, flags);
                  goto pte_unmap;
              }
          }
          folio_set_referenced(folio);
-        pages[*nr] = page;
-        (*nr)++;
+        pages[nr_pages++] = page;
      } while (ptep++, addr += PAGE_SIZE, addr != end);
 
-    ret = 1;
-
  pte_unmap:
      if (pgmap)
          put_dev_pagemap(pgmap);
      pte_unmap(ptem);
-    return ret;
+    return nr_pages;
  }
  #else
@@ -2938,21 +2933,24 @@ static int gup_fast_pte_range(pmd_t pmd, pmd_t 
 *pmdp, unsigned long addr,
   * get_user_pages_fast_only implementation that can pin pages. Thus 

it's still
  * useful to have gup_fast_pmd_leaf even if we can't operate on ptes. */

mm/gup.c +1 -3
-static int gup_fast_pte_range(pmd_t pmd, pmd_t *pmdp, unsigned long addr,
-        unsigned long end, unsigned int flags, struct page **pages,
-        int *nr)
+static unsigned long gup_fast_pte_range(pmd_t pmd, pmd_t *pmdp, 

unsigned long addr,
+        unsigned long end, unsigned int flags, struct page **pages)
 {
     return 0;
 }
 #endif /* CONFIG_ARCH_HAS_PTE_SPECIAL */

mm/gup.c +1 -3
-static int gup_fast_pmd_leaf(pmd_t orig, pmd_t *pmdp, unsigned long addr,
-        unsigned long end, unsigned int flags, struct page **pages,
-        int *nr)
+static unsigned long gup_fast_pmd_leaf(pmd_t orig, pmd_t *pmdp, 

unsigned long addr,
+        unsigned long end, unsigned int flags, struct page **pages)
 {
+    const unsigned long nr_pages = (end - addr) >> PAGE_SHIFT;
     struct page *page;
     struct folio *folio;
-    int refs;
+    unsigned long i;

mm/gup.c +10 -9
+
+    /* See gup_fast_pte_range() */
+    if (pmd_protnone(orig))
+        return 0;
 
      if (!pmd_access_permitted(orig, flags & FOLL_WRITE))
          return 0;
@@ -2960,33 +2958,30 @@ static int gup_fast_pmd_leaf(pmd_t orig, pmd_t 
 *pmdp, unsigned long addr,
      if (pmd_special(orig))
          return 0;
 
-    refs = (end - addr) >> PAGE_SHIFT;
      page = pmd_page(orig) + ((addr & ~PMD_MASK) >> PAGE_SHIFT);
 
-    folio = try_grab_folio_fast(page, refs, flags);
+    folio = try_grab_folio_fast(page, nr_pages, flags);
      if (!folio)
          return 0;
 
      if (unlikely(pmd_val(orig) != pmd_val(*pmdp))) {
-        gup_put_folio(folio, refs, flags);
+        gup_put_folio(folio, nr_pages, flags);
          return 0;
      }
 
      if (!gup_fast_folio_allowed(folio, flags)) {
-        gup_put_folio(folio, refs, flags);
+        gup_put_folio(folio, nr_pages, flags);
          return 0;
      }
      if (!pmd_write(orig) && gup_must_unshare(NULL, flags, &folio- 
 >page)) {
-        gup_put_folio(folio, refs, flags);
+        gup_put_folio(folio, nr_pages, flags);
          return 0;
      }
 
-    pages += *nr;
-    *nr += refs;
-    for (; refs; refs--)
+    for (i = 0; i < nr_pages; i++)
          *(pages++) = page++;
      folio_set_referenced(folio);
-    return 1;
+    return nr_pages;
  }

 static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr,

mm/gup.c +4 -4
@@ -3033,11 +3028,11 @@ static int gup_fast_pud_leaf(pud_t orig, pud_t 
 *pudp, unsigned long addr,
      return 1;
  }
 
-static int gup_fast_pmd_range(pud_t *pudp, pud_t pud, unsigned long addr,
-        unsigned long end, unsigned int flags, struct page **pages,
-        int *nr)
+static unsigned long gup_fast_pmd_range(pud_t *pudp, pud_t pud, 
 unsigned long addr,
+        unsigned long end, unsigned int flags, struct page **pages)
  {
-    unsigned long next;
+    unsigned long cur_nr_pages, next;
+    unsigned long nr_pages = 0;
      pmd_t *pmdp;

     pmdp = pmd_offset_lockless(pudp, pud, addr);

mm/gup.c +10 -12
@@ -3046,23 +3041,21 @@ static int gup_fast_pmd_range(pud_t *pudp, pud_t 
 pud, unsigned long addr,
 
          next = pmd_addr_end(addr, end);
          if (!pmd_present(pmd))
-            return 0;
+            break;
 
-        if (unlikely(pmd_leaf(pmd))) {
-            /* See gup_fast_pte_range() */
-            if (pmd_protnone(pmd))
-                return 0;
+        if (unlikely(pmd_leaf(pmd)))
+            cur_nr_pages = gup_fast_pmd_leaf(pmd, pmdp, addr, next, 
 flags, pages);
+        else
+            cur_nr_pages = gup_fast_pte_range(pmd, pmdp, addr, next, 
 flags, pages);
 
-            if (!gup_fast_pmd_leaf(pmd, pmdp, addr, next, flags,
-                pages, nr))
-                return 0;
+        nr_pages += cur_nr_pages;
+        pages += cur_nr_pages;
 
-        } else if (!gup_fast_pte_range(pmd, pmdp, addr, next, flags,
-                           pages, nr))
-            return 0;
+        if (nr_pages != (next - addr) >> PAGE_SIZE)
+            break;
      } while (pmdp++, addr = next, addr != end);
 
-    return 1;
+    return nr_pages;

 }

 static int gup_fast_pud_range(p4d_t *p4dp, p4d_t p4d, unsigned long addr,

#43 lore raw

Re: [PATCH v2 19/37] mm/gup: remove record_subpages()

Quoted 4 lines
Quoted 2 lines

Roughly, what I am thinking (limiting it to pte+pmd case) about is the following:

The code below looks much cleaner, that's great!

Great, I (or Aristeu if he has capacity) will clean this all up soon.

Signature · 3 lines
Cheers

David / dhildenb
#44 lore raw

Re: [PATCH v2 19/37] mm/gup: remove record_subpages()

In reply to David Hildenbrand
Quoted 9 lines · David Hildenbrand
Quoted 4 lines · John Hubbard

Probably a similar sentiment as Lorenzo here...the above diffs make the code *worse* to read. In fact, I recall adding record_subpages() here long ago, specifically to help clarify what was going on.

Well, there is a lot I dislike about record_subpages() to go back there. Starting with "as Willy keeps explaining, the concept of subpages do not exist and ending with "why do we fill out the array even on failure".

Yes

Quoted 9 lines

:)

Quoted 3 lines

Now it's been returned to it's original, cryptic form.

The code in the caller was so uncryptic that both me and Lorenzo missed that magical addition. :P

:'(

Quoted 5 lines
Quoted 2 lines

Just my take on it, for whatever that's worth. :)

As always, appreciated.

Quoted 7 lines

I could of course keep the simple loop in some "record_folio_pages" function and clean up what I dislike about record_subpages().

But I much rather want the call chain to be cleaned up instead, if possible.

Roughly, what I am thinking (limiting it to pte+pmd case) about is the following:

I cannot get the below to apply even with the original patch here applied + fix.

It looks like (in mm-new :) commit e73f43a66d5f ("mm/gup: remove dead pgmap refcounting code") by Alastair has conflicted here, but even then I can't make it apply, with/without your fix...!

Quoted 153 lines

From d6d6d21dbf435d8030782a627175e36e6c7b2dfb Mon Sep 17 00:00:00 2001
From: David Hildenbrand <[email protected]>
Date: Sat, 6 Sep 2025 08:33:42 +0200
Subject: [PATCH] tmp

---
 mm/gup.c | 79 ++++++++++++++++++++++++++------------------------------
 1 file changed, 36 insertions(+), 43 deletions(-)
mm/gup.c +33 -39
index 22420f2069ee1..98907ead749c0 100644
@@ -2845,12 +2845,11 @@ static void __maybe_unused gup_fast_undo_dev_pagemap(int *nr, int nr_start,
  * also check pmd here to make sure pmd doesn't change (corresponds to
  * pmdp_collapse_flush() in the THP collapse code path).
  */
-static int gup_fast_pte_range(pmd_t pmd, pmd_t *pmdp, unsigned long addr,
-		unsigned long end, unsigned int flags, struct page **pages,
-		int *nr)
+static unsigned long gup_fast_pte_range(pmd_t pmd, pmd_t *pmdp, unsigned long addr,
+		unsigned long end, unsigned int flags, struct page **pages)
 {
 	struct dev_pagemap *pgmap = NULL;
-	int ret = 0;
+	unsigned long nr_pages = 0;
 	pte_t *ptep, *ptem;
 	ptem = ptep = pte_offset_map(&pmd, addr);
@@ -2908,24 +2907,20 @@ static int gup_fast_pte_range(pmd_t pmd, pmd_t *pmdp, unsigned long addr,
 		 * details.
 		 */
 		if (flags & FOLL_PIN) {
-			ret = arch_make_folio_accessible(folio);
-			if (ret) {
+			if (arch_make_folio_accessible(folio)) {
 				gup_put_folio(folio, 1, flags);
 				goto pte_unmap;
 			}
 		}
 		folio_set_referenced(folio);
-		pages[*nr] = page;
-		(*nr)++;
+		pages[nr_pages++] = page;
 	} while (ptep++, addr += PAGE_SIZE, addr != end);
-	ret = 1;
-
 pte_unmap:
 	if (pgmap)
 		put_dev_pagemap(pgmap);
 	pte_unmap(ptem);
-	return ret;
+	return nr_pages;
 }
 #else
@@ -2938,21 +2933,24 @@ static int gup_fast_pte_range(pmd_t pmd, pmd_t *pmdp, unsigned long addr,
  * get_user_pages_fast_only implementation that can pin pages. Thus it's still
  * useful to have gup_fast_pmd_leaf even if we can't operate on ptes.
  */
-static int gup_fast_pte_range(pmd_t pmd, pmd_t *pmdp, unsigned long addr,
-		unsigned long end, unsigned int flags, struct page **pages,
-		int *nr)
+static unsigned long gup_fast_pte_range(pmd_t pmd, pmd_t *pmdp, unsigned long addr,
+		unsigned long end, unsigned int flags, struct page **pages)
 {
 	return 0;
 }
 #endif /* CONFIG_ARCH_HAS_PTE_SPECIAL */
-static int gup_fast_pmd_leaf(pmd_t orig, pmd_t *pmdp, unsigned long addr,
-		unsigned long end, unsigned int flags, struct page **pages,
-		int *nr)
+static unsigned long gup_fast_pmd_leaf(pmd_t orig, pmd_t *pmdp, unsigned long addr,
+		unsigned long end, unsigned int flags, struct page **pages)
 {
+	const unsigned long nr_pages = (end - addr) >> PAGE_SHIFT;
 	struct page *page;
 	struct folio *folio;
-	int refs;
+	unsigned long i;
+
+	/* See gup_fast_pte_range() */
+	if (pmd_protnone(orig))
+		return 0;
 	if (!pmd_access_permitted(orig, flags & FOLL_WRITE))
 		return 0;
@@ -2960,33 +2958,30 @@ static int gup_fast_pmd_leaf(pmd_t orig, pmd_t *pmdp, unsigned long addr,
 	if (pmd_special(orig))
 		return 0;
-	refs = (end - addr) >> PAGE_SHIFT;
 	page = pmd_page(orig) + ((addr & ~PMD_MASK) >> PAGE_SHIFT);
-	folio = try_grab_folio_fast(page, refs, flags);
+	folio = try_grab_folio_fast(page, nr_pages, flags);
 	if (!folio)
 		return 0;
 	if (unlikely(pmd_val(orig) != pmd_val(*pmdp))) {
-		gup_put_folio(folio, refs, flags);
+		gup_put_folio(folio, nr_pages, flags);
 		return 0;
 	}
 	if (!gup_fast_folio_allowed(folio, flags)) {
-		gup_put_folio(folio, refs, flags);
+		gup_put_folio(folio, nr_pages, flags);
 		return 0;
 	}
 	if (!pmd_write(orig) && gup_must_unshare(NULL, flags, &folio->page)) {
-		gup_put_folio(folio, refs, flags);
+		gup_put_folio(folio, nr_pages, flags);
 		return 0;
 	}
-	pages += *nr;
-	*nr += refs;
-	for (; refs; refs--)
+	for (i = 0; i < nr_pages; i++)
 		*(pages++) = page++;
 	folio_set_referenced(folio);
-	return 1;
+	return nr_pages;
 }
 static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr,
@@ -3033,11 +3028,11 @@ static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr,
 	return 1;
 }
-static int gup_fast_pmd_range(pud_t *pudp, pud_t pud, unsigned long addr,
-		unsigned long end, unsigned int flags, struct page **pages,
-		int *nr)
+static unsigned long gup_fast_pmd_range(pud_t *pudp, pud_t pud, unsigned long addr,
+		unsigned long end, unsigned int flags, struct page **pages)
 {
-	unsigned long next;
+	unsigned long cur_nr_pages, next;
+	unsigned long nr_pages = 0;
 	pmd_t *pmdp;
 	pmdp = pmd_offset_lockless(pudp, pud, addr);
@@ -3046,23 +3041,21 @@ static int gup_fast_pmd_range(pud_t *pudp, pud_t pud, unsigned long addr,
 		next = pmd_addr_end(addr, end);
 		if (!pmd_present(pmd))
-			return 0;
+			break;
-		if (unlikely(pmd_leaf(pmd))) {
-			/* See gup_fast_pte_range() */
-			if (pmd_protnone(pmd))
-				return 0;
+		if (unlikely(pmd_leaf(pmd)))
+			cur_nr_pages = gup_fast_pmd_leaf(pmd, pmdp, addr, next, flags, pages);
+		else
+			cur_nr_pages = gup_fast_pte_range(pmd, pmdp, addr, next, flags, pages);
-			if (!gup_fast_pmd_leaf(pmd, pmdp, addr, next, flags,
-				pages, nr))
-				return 0;
+		nr_pages += cur_nr_pages;
+		pages += cur_nr_pages;

mm/gup.c static int gup_fast_pmd_range(pud_t *pudp, pud_t pud, unsigned long addr, · line 3055

Quoted 10 lines
mm/gup.c +3 -4
-		} else if (!gup_fast_pte_range(pmd, pmdp, addr, next, flags,
-					       pages, nr))
-			return 0;
+		if (nr_pages != (next - addr) >> PAGE_SIZE)
+			break;
 	} while (pmdp++, addr = next, addr != end);
-	return 1;
+	return nr_pages;
 }
 static int gup_fast_pud_range(p4d_t *p4dp, p4d_t p4d, unsigned long addr,

OK I guess you intentionally left the rest as a TODO :)

So I'll wait for you to post it before reviewing in-depth.

This generally LGTM as an approach, getting rid of *nr is important that's really horrible.

Quoted 39 lines
mm/gup.c +0 -1
--

2.50.1

Oh, I might even have found a bug moving away from that questionable "ret==1 means success" handling in gup_fast_pte_range()? Will have to double-check, but likely the following is the right thing to do.

From 8f48b25ef93e7ef98611fd58ec89384ad5171782 Mon Sep 17 00:00:00 2001
From: David Hildenbrand <[email protected]>
Date: Sat, 6 Sep 2025 08:46:45 +0200
Subject: [PATCH] mm/gup: fix handling of errors from
arch_make_folio_accessible() in follow_page_pte()

In case we call arch_make_folio_accessible() and it fails, we would incorrectly return a value that is "!= 0" to the caller, indicating that we pinned all requested pages and that the caller can keep going.

follow_page_pte() is not supposed to return error values, but instead 0 on failure and 1 on success.

That is of course wrong, because the caller will just keep going pinning more pages. If we happen to pin a page afterwards, we're in trouble, because we essentially skipped some pages.

Fixes f28d43636d6f ("mm/gup/writeback: add callbacks for inaccessible pages")
---
 mm/gup.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)
mm/gup.c +0 -0
index 22420f2069ee1..cff226ec0ee7d 100644

mm/gup.c static int gup_fast_pte_range(pmd_t pmd, pmd_t *pmdp, unsigned long addr, · line 2911

Quoted 6 lines
mm/gup.c +1 -2
@@ -2908,8 +2908,7 @@ static int gup_fast_pte_range(pmd_t pmd, pmd_t *pmdp, unsigned long addr,
 		 * details.
 		 */
 		if (flags & FOLL_PIN) {
-			ret = arch_make_folio_accessible(folio);
-			if (ret) {
+			if (arch_make_folio_accessible(folio)) {

Oh Lord above. Lol. Yikes.

Yeah I think your fix is valid...

Quoted 12 lines
mm/gup.c +0 -1
 				gup_put_folio(folio, 1, flags);
 				goto pte_unmap;
 			}
--

2.50.1

--
Cheers

David / dhildenb

#45 lore raw

Re: [PATCH v2 19/37] mm/gup: remove record_subpages()

Quoted 36 lines · Lorenzo Stoakes
Quoted 9 lines · David Hildenbrand
Quoted 4 lines · John Hubbard

Probably a similar sentiment as Lorenzo here...the above diffs make the code *worse* to read. In fact, I recall adding record_subpages() here long ago, specifically to help clarify what was going on.

Well, there is a lot I dislike about record_subpages() to go back there. Starting with "as Willy keeps explaining, the concept of subpages do not exist and ending with "why do we fill out the array even on failure".

Yes

Quoted 9 lines

:)

Quoted 3 lines

Now it's been returned to it's original, cryptic form.

The code in the caller was so uncryptic that both me and Lorenzo missed that magical addition. :P

:'(

Quoted 11 lines
Quoted 2 lines

Just my take on it, for whatever that's worth. :)

As always, appreciated.

I could of course keep the simple loop in some "record_folio_pages" function and clean up what I dislike about record_subpages().

But I much rather want the call chain to be cleaned up instead, if possible.

Quoted 7 lines
Quoted 1 line

Roughly, what I am thinking (limiting it to pte+pmd case) about is the following:

I cannot get the below to apply even with the original patch here applied + fix.

It looks like (in mm-new :) commit e73f43a66d5f ("mm/gup: remove dead pgmap refcounting code") by Alastair has conflicted here, but even then I can't make it apply, with/without your fix...!

To be clear: it was never intended to be applied, because it wouldn't even compile in the current form.

It was based on this nth_page submission + fix.

[...]

Quoted 9 lines
Quoted 2 lines

}
static int gup_fast_pud_range(p4d_t *p4dp, p4d_t p4d, unsigned long addr,

OK I guess you intentionally left the rest as a TODO :)

So I'll wait for you to post it before reviewing in-depth.

This generally LGTM as an approach, getting rid of *nr is important that's really horrible.

Yes. Expect a cleanup in that direction soonish (again, either from me or someone else I poke)

Quoted 49 lines
Quoted 40 lines

--
2.50.1

Oh, I might even have found a bug moving away from that questionable "ret==1 means success" handling in gup_fast_pte_range()? Will have to double-check, but likely the following is the right thing to do.

From 8f48b25ef93e7ef98611fd58ec89384ad5171782 Mon Sep 17 00:00:00 2001
From: David Hildenbrand <[email protected]>
Date: Sat, 6 Sep 2025 08:46:45 +0200
Subject: [PATCH] mm/gup: fix handling of errors from
arch_make_folio_accessible() in follow_page_pte()

In case we call arch_make_folio_accessible() and it fails, we would incorrectly return a value that is "!= 0" to the caller, indicating that we pinned all requested pages and that the caller can keep going.

follow_page_pte() is not supposed to return error values, but instead 0 on failure and 1 on success.

That is of course wrong, because the caller will just keep going pinning more pages. If we happen to pin a page afterwards, we're in trouble, because we essentially skipped some pages.

Fixes f28d43636d6f ("mm/gup/writeback: add callbacks for inaccessible pages")
---
  mm/gup.c | 3 +--
  1 file changed, 1 insertion(+), 2 deletions(-)
mm/gup.c +0 -0
index 22420f2069ee1..cff226ec0ee7d 100644

mm/gup.c static int gup_fast_pte_range(pmd_t pmd, pmd_t *pmdp, unsigned long addr, · line 2911

Quoted 6 lines
mm/gup.c +1 -2
@@ -2908,8 +2908,7 @@ static int gup_fast_pte_range(pmd_t pmd, pmd_t *pmdp, unsigned long addr,
  		 * details.
  		 */
  		if (flags & FOLL_PIN) {
-			ret = arch_make_folio_accessible(folio);
-			if (ret) {
+			if (arch_make_folio_accessible(folio)) {

Oh Lord above. Lol. Yikes.

Quoted 1 line

Yeah I think your fix is valid...

I sent it out earlier today. Fortunately that function shouldn't usually really fail IIUC.

Signature · 3 lines
Cheers

David / dhildenb
reviewer
#46 lore raw

Re: [PATCH v2 19/37] mm/gup: remove record_subpages()

Quoted 3 lines · David Hildenbrand
Quoted 2 lines · Lorenzo Stoakes
Quoted 1 line · David Hildenbrand

On 06.09.25 03:05, John Hubbard wrote:

...

Quoted 7 lines
Quoted 7 lines
Quoted 1 line

Roughly, what I am thinking (limiting it to pte+pmd case) about is the following:

I cannot get the below to apply even with the original patch here applied + fix.

It looks like (in mm-new :) commit e73f43a66d5f ("mm/gup: remove dead pgmap refcounting code") by Alastair has conflicted here, but even then I can't make it apply, with/without your fix...!

I eventually resorted to telling the local AI to read the diffs and apply them on top of the nth_page series locally. :) Attaching the resulting patch, which worked well enough to at least see the proposal clearly.

Quoted 6 lines

To be clear: it was never intended to be applied, because it wouldn't even compile in the current form.

It was based on this nth_page submission + fix.

thanks,

Signature · 1 line
John Hubbard

From 614014775c6d3c92abd0a53ae47a0efb05e191b2 Mon Sep 17 00:00:00 2001
From: John Hubbard <[email protected]>
Date: Sat, 6 Sep 2025 14:21:38 -0700
Subject: [PATCH] David Hildenbrand's fix for record_subpages()
X-NVConfidentiality: public
Cc: John Hubbard <[email protected]>

---
 mm/gup.c | 78 ++++++++++++++++++++++++++------------------------------
 1 file changed, 36 insertions(+), 42 deletions(-)
mm/gup.c +36 -42
index d1eaba91d680..a88eff1b15f1 100644
@@ -2841,12 +2841,11 @@ static void __maybe_unused gup_fast_undo_dev_pagemap(int *nr, int nr_start,
  * also check pmd here to make sure pmd doesn't change (corresponds to
  * pmdp_collapse_flush() in the THP collapse code path).
  */
-static int gup_fast_pte_range(pmd_t pmd, pmd_t *pmdp, unsigned long addr,
-		unsigned long end, unsigned int flags, struct page **pages,
-		int *nr)
+static unsigned long gup_fast_pte_range(pmd_t pmd, pmd_t *pmdp, unsigned long addr,
+		unsigned long end, unsigned int flags, struct page **pages)
 {
 	struct dev_pagemap *pgmap = NULL;
-	int ret = 0;
+	unsigned long nr_pages = 0;
 	pte_t *ptep, *ptem;
 
 	ptem = ptep = pte_offset_map(&pmd, addr);
@@ -2904,24 +2903,20 @@ static int gup_fast_pte_range(pmd_t pmd, pmd_t *pmdp, unsigned long addr,
 		 * details.
 		 */
 		if (flags & FOLL_PIN) {
-			ret = arch_make_folio_accessible(folio);
-			if (ret) {
+			if (arch_make_folio_accessible(folio)) {
 				gup_put_folio(folio, 1, flags);
 				goto pte_unmap;
 			}
 		}
 		folio_set_referenced(folio);
-		pages[*nr] = page;
-		(*nr)++;
+		pages[nr_pages++] = page;
 	} while (ptep++, addr += PAGE_SIZE, addr != end);
 
-	ret = 1;
-
 pte_unmap:
 	if (pgmap)
 		put_dev_pagemap(pgmap);
 	pte_unmap(ptem);
-	return ret;
+	return nr_pages;
 }
 #else
 
@@ -2934,21 +2929,24 @@ static int gup_fast_pte_range(pmd_t pmd, pmd_t *pmdp, unsigned long addr,
  * get_user_pages_fast_only implementation that can pin pages. Thus it's still
  * useful to have gup_fast_pmd_leaf even if we can't operate on ptes.
  */
-static int gup_fast_pte_range(pmd_t pmd, pmd_t *pmdp, unsigned long addr,
-		unsigned long end, unsigned int flags, struct page **pages,
-		int *nr)
+static unsigned long gup_fast_pte_range(pmd_t pmd, pmd_t *pmdp, unsigned long addr,
+		unsigned long end, unsigned int flags, struct page **pages)
 {
 	return 0;
 }
 #endif /* CONFIG_ARCH_HAS_PTE_SPECIAL */
 
-static int gup_fast_pmd_leaf(pmd_t orig, pmd_t *pmdp, unsigned long addr,
-		unsigned long end, unsigned int flags, struct page **pages,
-		int *nr)
+static unsigned long gup_fast_pmd_leaf(pmd_t orig, pmd_t *pmdp, unsigned long addr,
+		unsigned long end, unsigned int flags, struct page **pages)
 {
+	const unsigned long nr_pages = (end - addr) >> PAGE_SHIFT;
 	struct page *page;
 	struct folio *folio;
-	int refs;
+	unsigned long i;
+
+	/* See gup_fast_pte_range() */
+	if (pmd_protnone(orig))
+		return 0;
 
 	if (!pmd_access_permitted(orig, flags & FOLL_WRITE))
 		return 0;
@@ -2956,32 +2954,30 @@ static int gup_fast_pmd_leaf(pmd_t orig, pmd_t *pmdp, unsigned long addr,
 	if (pmd_special(orig))
 		return 0;
 
-	refs = (end - addr) >> PAGE_SHIFT;
 	page = pmd_page(orig) + ((addr & ~PMD_MASK) >> PAGE_SHIFT);
 
-	folio = try_grab_folio_fast(page, refs, flags);
+	folio = try_grab_folio_fast(page, nr_pages, flags);
 	if (!folio)
 		return 0;
 
 	if (unlikely(pmd_val(orig) != pmd_val(*pmdp))) {
-		gup_put_folio(folio, refs, flags);
+		gup_put_folio(folio, nr_pages, flags);
 		return 0;
 	}
 
 	if (!gup_fast_folio_allowed(folio, flags)) {
-		gup_put_folio(folio, refs, flags);
+		gup_put_folio(folio, nr_pages, flags);
 		return 0;
 	}
 	if (!pmd_write(orig) && gup_must_unshare(NULL, flags, &folio->page)) {
-		gup_put_folio(folio, refs, flags);
+		gup_put_folio(folio, nr_pages, flags);
 		return 0;
 	}
 
-	*nr += refs;
-	for (; refs; refs--)
+	for (i = 0; i < nr_pages; i++)
 		*(pages++) = page++;
 	folio_set_referenced(folio);
-	return 1;
+	return nr_pages;
 }
 
 static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr,
@@ -3027,11 +3023,11 @@ static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr,
 	return 1;
 }
 
-static int gup_fast_pmd_range(pud_t *pudp, pud_t pud, unsigned long addr,
-		unsigned long end, unsigned int flags, struct page **pages,
-		int *nr)
+static unsigned long gup_fast_pmd_range(pud_t *pudp, pud_t pud, unsigned long addr,
+		unsigned long end, unsigned int flags, struct page **pages)
 {
-	unsigned long next;
+	unsigned long cur_nr_pages, next;
+	unsigned long nr_pages = 0;
 	pmd_t *pmdp;
 
 	pmdp = pmd_offset_lockless(pudp, pud, addr);
@@ -3040,23 +3036,21 @@ static int gup_fast_pmd_range(pud_t *pudp, pud_t pud, unsigned long addr,
 
 		next = pmd_addr_end(addr, end);
 		if (!pmd_present(pmd))
-			return 0;
+			break;
 
-		if (unlikely(pmd_leaf(pmd))) {
-			/* See gup_fast_pte_range() */
-			if (pmd_protnone(pmd))
-				return 0;
+		if (unlikely(pmd_leaf(pmd)))
+			cur_nr_pages = gup_fast_pmd_leaf(pmd, pmdp, addr, next, flags, pages);
+		else
+			cur_nr_pages = gup_fast_pte_range(pmd, pmdp, addr, next, flags, pages);
 
-			if (!gup_fast_pmd_leaf(pmd, pmdp, addr, next, flags,
-				pages, nr))
-				return 0;
+		nr_pages += cur_nr_pages;
+		pages += cur_nr_pages;
 
-		} else if (!gup_fast_pte_range(pmd, pmdp, addr, next, flags,
-					       pages, nr))
-			return 0;
+		if (nr_pages != (next - addr) >> PAGE_SIZE)
+			break;
 	} while (pmdp++, addr = next, addr != end);
 
-	return 1;
+	return nr_pages;
 }
 
 static int gup_fast_pud_range(p4d_t *p4dp, p4d_t p4d, unsigned long addr,
Signature · 1 line
2.51.0
#47 lore raw

Re: [PATCH v2 19/37] mm/gup: remove record_subpages()

In reply to David Hildenbrand
Quoted 5 lines · David Hildenbrand

We can just cleanup the code by calculating the #refs earlier, so we can just inline what remains of record_subpages().

Calculate the number of references/pages ahead of times, and record them only once all our tests passed.

I'm seeing failures in kselftest-mm in -next on at least Raspberry Pi 4 and Orion O6 which bisect to this patch. I'm seeing a NULL pointer dereference during the GUP test (which isn't actually doing anything as I'm just using a standard defconfig rather than one with the mm fragment):

# # # [RUN] R/O longterm GUP-fast pin in MAP_SHARED file mapping .[ 92.209804] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000008

...

[   92.443816] Call trace:
[   92.446284]  io_check_coalesce_buffer+0xd4/0x160 (P)
[   92.451306]  io_sqe_buffers_register+0x1b0/0x22c
[   92.455976]  __arm64_sys_io_uring_register+0x330/0xe74
[   92.461176]  invoke_syscall+0x48/0x104
[   92.464966]  el0_svc_common.constprop.0+0x40/0xe0

Full log:

https://lava.sirena.org.uk/scheduler/job/1778528#L1985

The bisect looks to converge reasonably clearly, I didn't make much more effort to diagnose:

# bad: [be5d4872e528796df9d7425f2bd9b3893eb3a42c] Add linux-next specific files for 20250905
# good: [5fe42852269dc659c8d511864410bd5cf3393e91] Merge branch 'for-linux-next-fixes' of https://gitlab.freedesktop.org/drm/misc/kernel.git
# good: [0ccc1eeda155c947d88ef053e0b54e434e218ee2] ASoC: dt-bindings: wlf,wm8960: Document routing strings (pin names)
# good: [7748328c2fd82efed24257b2bfd796eb1fa1d09b] ASoC: dt-bindings: qcom,lpass-va-macro: Update bindings for clocks to support ADSP
# good: [dd7ae5b8b3c291c0206f127a564ae1e316705ca0] ASoC: cs42l43: Shutdown jack detection on suspend
# good: [ce1a46b2d6a8465a86f7a6f71beb4c6de83bce5c] ASoC: codecs: lpass-wsa-macro: add Codev version 2.9
# good: [ce57b718006a069226b5e5d3afe7969acd59154e] ASoC: Intel: avs: ssm4567: Adjust platform name
# good: [94b39cb3ad6db935b585988b36378884199cd5fc] spi: mxs: fix "transfered"->"transferred"
# good: [5cc49b5a36b32a2dba41441ea13b93fb5ea21cfd] spi: spi-fsl-dspi: Report FIFO overflows as errors
# good: [3279052eab235bfb7130b1fabc74029c2260ed8d] ASoC: SOF: ipc4-topology: Fix a less than zero check on a u32
# good: [8f57dcf39fd0864f5f3e6701fe885e55f45d0d3a] ASoC: qcom: audioreach: convert to cpu endainess type before accessing
# good: [9d35d068fb138160709e04e3ee97fe29a6f8615b] regulator: scmi: Use int type to store negative error codes
# good: [8a9772ec08f87c9e45ab1ad2c8d2b8c1763836eb] ASoC: soc-dapm: rename snd_soc_kcontrol_component() to snd_soc_kcontrol_to_component()
# good: [07752abfa5dbf7cb4d9ce69fa94dc3b12bc597d9] ASoC: SOF: sof-client: Introduce sof_client_dev_entry structure
# good: [d57d27171c92e9049d5301785fb38de127b28fbf] ASoC: SOF: sof-client-probes: Add available points_info(), IPC4 only
# good: [f7c41911ad744177d8289820f01009dc93d8f91c] ASoC: SOF: ipc4-topology: Add support for float sample type
# good: [3d439e1ec3368fae17db379354bd7a9e568ca0ab] ASoC: sof: ipc4-topology: Add support to sched_domain attribute
# good: [5c39bc498f5ff7ef016abf3f16698f3e8db79677] ASoC: SOF: Intel: only detect codecs when HDA DSP probe
# good: [f522da9ab56c96db8703b2ea0f09be7cdc3bffeb] ASoC: doc: Internally link to Writing an ALSA Driver docs
# good: [f4672dc6e9c07643c8c755856ba8e9eb9ca95d0c] regmap: use int type to store negative error codes
# good: [b088b6189a4066b97cef459afd312fd168a76dea] ASoC: mediatek: common: Switch to for_each_available_child_of_node_scoped()
# good: [c42e36a488c7e01f833fc9f4814f735b66b2d494] spi: Drop dev_pm_domain_detach() call
# good: [a37280daa4d583c7212681c49b285de9464a5200] ASoC: Intel: avs: Allow i2s test and non-test boards to coexist
# good: [ff9a7857b7848227788f113d6dc6a72e989084e0] spi: rb4xx: use devm for clk_prepare_enable
# good: [edb5c1f885207d1d74e8a1528e6937e02829ee6e] ASoC: renesas: msiof: start DMAC first
# good: [e2ab5f600bb01d3625d667d97b3eb7538e388336] rust: regulator: use to_result for error handling
# good: [5b4dcaf851df8c414bfc2ac3bf9c65fc942f3be4] ASoC: amd: acp: Remove (explicitly) unused header
# good: [899fb38dd76dd3ede425bbaf8a96d390180a5d1c] regulator: core: Remove redundant ternary operators
# good: [11f5c5f9e43e9020bae452232983fe98e7abfce0] ASoC: qcom: use int type to store negative error codes
# good: [a12b74d2bd4724ee1883bc97ec93eac8fafc8d3c] ASoC: tlv320aic32x4: use dev_err_probe() for regulators
# good: [f840737d1746398c2993be34bfdc80bdc19ecae2] ASoC: SOF: imx: Remove the use of dev_err_probe()
# good: [d78e48ebe04e9566f8ecbf51471e80da3adbceeb] ASoC: dt-bindings: Minor whitespace cleanup in example
# good: [96bcb34df55f7fee99795127c796315950c94fed] ASoC: test-component: Use kcalloc() instead of kzalloc()
# good: [c232495d28ca092d0c39b10e35d3d613bd2414ab] ASoC: dt-bindings: omap-twl4030: convert to DT schema
# good: [87a877de367d835b527d1086f75727123ef85fc4] KVM: x86: Rename handle_fastpath_set_msr_irqoff() to handle_fastpath_wrmsr()
# good: [c26675447faff8c4ddc1dc5d2cd28326b8181aaf] KVM: x86: Zero XSTATE components on INIT by iterating over supported features
# good: [ec0be3cdf40b5302248f3fb27a911cc630e8b855] regulator: consumer.rst: document bulk operations
# good: [27848c082ba0b22850fd9fb7b185c015423dcdc7] spi: s3c64xx: Remove the use of dev_err_probe()
# good: [c1dd310f1d76b4b13f1854618087af2513140897] spi: SPISG: Use devm_kcalloc() in aml_spisg_clk_init()
# good: [da9881d00153cc6d3917f6b74144b1d41b58338c] ASoC: qcom: audioreach: add support for SMECNS module
# good: [cf65182247761f7993737b710afe8c781699356b] ASoC: codecs: wsa883x: Handle shared reset GPIO for WSA883x speakers
# good: [2a55135201d5e24b80b7624880ff42eafd8e320c] ASoC: Intel: avs: Streamline register-component function names
# good: [550bc517e59347b3b1af7d290eac4fb1411a3d4e] regulator: bd718x7: Use kcalloc() instead of kzalloc()
# good: [0056b410355713556d8a10306f82e55b28d33ba8] spi: offload trigger: adi-util-sigma-delta: clean up imports
# good: [daf855f76a1210ceed9541f71ac5dd9be02018a6] ASoC: es8323: enable DAPM power widgets for playback DAC
# good: [90179609efa421b1ccc7d8eafbc078bafb25777c] spi: spl022: use min_t() to improve code
# good: [258384d8ce365dddd6c5c15204de8ccd53a7ab0a] ASoC: es8323: enable DAPM power widgets for playback DAC and output
# good: [6d068f1ae2a2f713d7f21a9a602e65b3d6b6fc6d] regulator: rt5133: Fix spelling mistake "regualtor" -> "regulator"
# good: [a46e95c81e3a28926ab1904d9f754fef8318074d] ASoC: wl1273: Remove
# good: [48124569bbc6bfda1df3e9ee17b19d559f4b1aa3] spi: remove unneeded 'fast_io' parameter in regmap_config
# good: [37533933bfe92cd5a99ef4743f31dac62ccc8de0] regulator: remove unneeded 'fast_io' parameter in regmap_config
# good: [0e62438e476494a1891a8822b9785bc6e73e9c3f] ASoC: Intel: sst: Remove redundant semicolons
# good: [5c36b86d2bf68fbcad16169983ef7ee8c537db59] regmap: Remove superfluous check for !config in __regmap_init()
# good: [714165e1c4b0d5b8c6d095fe07f65e6e7047aaeb] regulator: rt5133: Add RT5133 PMIC regulator Support
# good: [9c45f95222beecd6a284fd1284d54dd7a772cf59] spi: spi-qpic-snand: handle 'use_ecc' parameter of qcom_spi_config_cw_read()
# good: [bab4ab484a6ca170847da9bffe86f1fa90df4bbe] ASoC: dt-bindings: Convert brcm,bcm2835-i2s to DT schema
# good: [b832b19318534bb4f1673b24d78037fee339c679] spi: loopback-test: Don't use %pK through printk
# good: [8c02c8353460f8630313aef6810f34e134a3c1ee] ASoC: dt-bindings: realtek,alc5623: convert to DT schema
# good: [6b7e2aa50bdaf88cd4c2a5e2059a7bf32d85a8b1] spi: spi-qpic-snand: remove 'clr*status' members of struct 'qpic_ecc'
# good: [2291a2186305faaf8525d57849d8ba12ad63f5e7] MAINTAINERS: Add entry for FourSemi audio amplifiers
# good: [a54ef14188519a0994d0264f701f5771815fa11e] regulator: dt-bindings: Clean-up active-semi,act8945a duplication
# good: [a1d0b0ae65ae3f32597edfbb547f16c75601cd87] spi: spi-qpic-snand: avoid double assignment in qcom_spi_probe()
# good: [cf25eb8eae91bcae9b2065d84b0c0ba0f6d9dd34] ASoC: soc-component: unpack snd_soc_component_init_bias_level()
# good: [595b7f155b926460a00776cc581e4dcd01220006] ASoC: Intel: avs: Conditional-path support
# good: [3059067fd3378a5454e7928c08d20bf3ef186760] ASoC: cs48l32: Use PTR_ERR_OR_ZERO() to simplify code
# good: [2d86d2585ab929a143d1e6f8963da1499e33bf13] ASoC: pxa: add GPIOLIB_LEGACY dependency
# good: [9a200cbdb54349909a42b45379e792e4b39dd223] rust: regulator: implement Send and Sync for Regulator<T>
# good: [162e23657e5379f07c6404dbfbf4367cb438ea7d] regulator: pf0900: Add PMIC PF0900 support
# good: [886f42ce96e7ce80545704e7168a9c6b60cd6c03] regmap: mmio: Add missing MODULE_DESCRIPTION()
# good: [6684aba0780da9f505c202f27e68ee6d18c0aa66] XArray: Add extra debugging check to xas_lock and friends
git bisect start 'be5d4872e528796df9d7425f2bd9b3893eb3a42c' '5fe42852269dc659c8d511864410bd5cf3393e91' '0ccc1eeda155c947d88ef053e0b54e434e218ee2' '7748328c2fd82efed24257b2bfd796eb1fa1d09b' 'dd7ae5b8b3c291c0206f127a564ae1e316705ca0' 'ce1a46b2d6a8465a86f7a6f71beb4c6de83bce5c' 'ce57b718006a069226b5e5d3afe7969acd59154e' '94b39cb3ad6db935b585988b36378884199cd5fc' '5cc49b5a36b32a2dba41441ea13b93fb5ea21cfd' '3279052eab235bfb7130b1fabc74029c2260ed8d' '8f57dcf39fd0864f5f3e6701fe885e55f45d0d3a' '9d35d068fb138160709e04e3ee97fe29a6f8615b' '8a9772ec08f87c9e45ab1ad2c8d2b8c1763836eb' '07752abfa5dbf7cb4d9ce69fa94dc3b12bc597d9' 'd57d27171c92e9049d5301785fb38de127b28fbf' 'f7c41911ad744177d8289820f01009dc93d8f91c' '3d439e1ec3368fae17db379354bd7a9e568ca0ab' '5c39bc498f5ff7ef016abf3f16698f3e8db79677' 'f522da9ab56c96db8703b2ea0f09be7cdc3bffeb' 'f4672dc6e9c07643c8c755856ba8e9eb9ca95d0c' 'b088b6189a4066b97cef459afd312fd168a76dea' 'c42e36a488c7e01f833fc9f4814f735b66b2d494' 'a37280daa4d583c7212681c49b285de9464a5200' 'ff9a7857b7848227788f113d6dc6a72e989084e0' 'edb5c1f885207d1d74e8a1528e6937e02829ee6e' 'e2ab5f600bb01d3625d667d97b3eb7538e388336' '5b4dcaf851df8c414bfc2ac3bf9c65fc942f3be4' '899fb38dd76dd3ede425bbaf8a96d390180a5d1c' '11f5c5f9e43e9020bae452232983fe98e7abfce0' 'a12b74d2bd4724ee1883bc97ec93eac8fafc8d3c' 'f840737d1746398c2993be34bfdc80bdc19ecae2' 'd78e48ebe04e9566f8ecbf51471e80da3adbceeb' '96bcb34df55f7fee99795127c796315950c94fed' 'c232495d28ca092d0c39b10e35d3d613bd2414ab' '87a877de367d835b527d1086f75727123ef85fc4' 'c26675447faff8c4ddc1dc5d2cd28326b8181aaf' 'ec0be3cdf40b5302248f3fb27a911cc630e8b855' '27848c082ba0b22850fd9fb7b185c015423dcdc7' 'c1dd310f1d76b4b13f1854618087af2513140897' 'da9881d00153cc6d3917f6b74144b1d41b58338c' 'cf65182247761f7993737b710afe8c781699356b' '2a55135201d5e24b80b7624880ff42eafd8e320c' '550bc517e59347b3b1af7d290eac4fb1411a3d4e' '0056b410355713556d8a10306f82e55b28d33ba8' 'daf855f76a1210ceed9541f71ac5dd9be02018a6' '90179609efa421b1ccc7d8eafbc078bafb25777c' '258384d8ce365dddd6c5c15204de8ccd53a7ab0a' '6d068f1ae2a2f713d7f21a9a602e65b3d6b6fc6d' 'a46e95c81e3a28926ab1904d9f754fef8318074d' '48124569bbc6bfda1df3e9ee17b19d559f4b1aa3' '37533933bfe92cd5a99ef4743f31dac62ccc8de0' '0e62438e476494a1891a8822b9785bc6e73e9c3f' '5c36b86d2bf68fbcad16169983ef7ee8c537db59' '714165e1c4b0d5b8c6d095fe07f65e6e7047aaeb' '9c45f95222beecd6a284fd1284d54dd7a772cf59' 'bab4ab484a6ca170847da9bffe86f1fa90df4bbe' 'b832b19318534bb4f1673b24d78037fee339c679' '8c02c8353460f8630313aef6810f34e134a3c1ee' '6b7e2aa50bdaf88cd4c2a5e2059a7bf32d85a8b1' '2291a2186305faaf8525d57849d8ba12ad63f5e7' 'a54ef14188519a0994d0264f701f5771815fa11e' 'a1d0b0ae65ae3f32597edfbb547f16c75601cd87' 'cf25eb8eae91bcae9b2065d84b0c0ba0f6d9dd34' '595b7f155b926460a00776cc581e4dcd01220006' '3059067fd3378a5454e7928c08d20bf3ef186760' '2d86d2585ab929a143d1e6f8963da1499e33bf13' '9a200cbdb54349909a42b45379e792e4b39dd223' '162e23657e5379f07c6404dbfbf4367cb438ea7d' '886f42ce96e7ce80545704e7168a9c6b60cd6c03' '6684aba0780da9f505c202f27e68ee6d18c0aa66'

# test job: [0ccc1eeda155c947d88ef053e0b54e434e218ee2] https://lava.sirena.org.uk/scheduler/job/1773040
# test job: [7748328c2fd82efed24257b2bfd796eb1fa1d09b] https://lava.sirena.org.uk/scheduler/job/1773378
# test job: [dd7ae5b8b3c291c0206f127a564ae1e316705ca0] https://lava.sirena.org.uk/scheduler/job/1773233
# test job: [ce1a46b2d6a8465a86f7a6f71beb4c6de83bce5c] https://lava.sirena.org.uk/scheduler/job/1768983
# test job: [ce57b718006a069226b5e5d3afe7969acd59154e] https://lava.sirena.org.uk/scheduler/job/1768713
# test job: [94b39cb3ad6db935b585988b36378884199cd5fc] https://lava.sirena.org.uk/scheduler/job/1768603
# test job: [5cc49b5a36b32a2dba41441ea13b93fb5ea21cfd] https://lava.sirena.org.uk/scheduler/job/1769293
# test job: [3279052eab235bfb7130b1fabc74029c2260ed8d] https://lava.sirena.org.uk/scheduler/job/1762427
# test job: [8f57dcf39fd0864f5f3e6701fe885e55f45d0d3a] https://lava.sirena.org.uk/scheduler/job/1760074
# test job: [9d35d068fb138160709e04e3ee97fe29a6f8615b] https://lava.sirena.org.uk/scheduler/job/1758673
# test job: [8a9772ec08f87c9e45ab1ad2c8d2b8c1763836eb] https://lava.sirena.org.uk/scheduler/job/1758556
# test job: [07752abfa5dbf7cb4d9ce69fa94dc3b12bc597d9] https://lava.sirena.org.uk/scheduler/job/1752251
# test job: [d57d27171c92e9049d5301785fb38de127b28fbf] https://lava.sirena.org.uk/scheduler/job/1752624
# test job: [f7c41911ad744177d8289820f01009dc93d8f91c] https://lava.sirena.org.uk/scheduler/job/1752345
# test job: [3d439e1ec3368fae17db379354bd7a9e568ca0ab] https://lava.sirena.org.uk/scheduler/job/1753454
# test job: [5c39bc498f5ff7ef016abf3f16698f3e8db79677] https://lava.sirena.org.uk/scheduler/job/1751954
# test job: [f522da9ab56c96db8703b2ea0f09be7cdc3bffeb] https://lava.sirena.org.uk/scheduler/job/1751875
# test job: [f4672dc6e9c07643c8c755856ba8e9eb9ca95d0c] https://lava.sirena.org.uk/scheduler/job/1747876
# test job: [b088b6189a4066b97cef459afd312fd168a76dea] https://lava.sirena.org.uk/scheduler/job/1746202
# test job: [c42e36a488c7e01f833fc9f4814f735b66b2d494] https://lava.sirena.org.uk/scheduler/job/1746271
# test job: [a37280daa4d583c7212681c49b285de9464a5200] https://lava.sirena.org.uk/scheduler/job/1746918
# test job: [ff9a7857b7848227788f113d6dc6a72e989084e0] https://lava.sirena.org.uk/scheduler/job/1746336
# test job: [edb5c1f885207d1d74e8a1528e6937e02829ee6e] https://lava.sirena.org.uk/scheduler/job/1746134
# test job: [e2ab5f600bb01d3625d667d97b3eb7538e388336] https://lava.sirena.org.uk/scheduler/job/1746607
# test job: [5b4dcaf851df8c414bfc2ac3bf9c65fc942f3be4] https://lava.sirena.org.uk/scheduler/job/1747672
# test job: [899fb38dd76dd3ede425bbaf8a96d390180a5d1c] https://lava.sirena.org.uk/scheduler/job/1747375
# test job: [11f5c5f9e43e9020bae452232983fe98e7abfce0] https://lava.sirena.org.uk/scheduler/job/1747503
# test job: [a12b74d2bd4724ee1883bc97ec93eac8fafc8d3c] https://lava.sirena.org.uk/scheduler/job/1734077
# test job: [f840737d1746398c2993be34bfdc80bdc19ecae2] https://lava.sirena.org.uk/scheduler/job/1727318
# test job: [d78e48ebe04e9566f8ecbf51471e80da3adbceeb] https://lava.sirena.org.uk/scheduler/job/1706175
# test job: [96bcb34df55f7fee99795127c796315950c94fed] https://lava.sirena.org.uk/scheduler/job/1699577
# test job: [c232495d28ca092d0c39b10e35d3d613bd2414ab] https://lava.sirena.org.uk/scheduler/job/1699507
# test job: [87a877de367d835b527d1086f75727123ef85fc4] https://lava.sirena.org.uk/scheduler/job/1697972
# test job: [c26675447faff8c4ddc1dc5d2cd28326b8181aaf] https://lava.sirena.org.uk/scheduler/job/1698132
# test job: [ec0be3cdf40b5302248f3fb27a911cc630e8b855] https://lava.sirena.org.uk/scheduler/job/1694308
# test job: [27848c082ba0b22850fd9fb7b185c015423dcdc7] https://lava.sirena.org.uk/scheduler/job/1693100
# test job: [c1dd310f1d76b4b13f1854618087af2513140897] https://lava.sirena.org.uk/scheduler/job/1693035
# test job: [da9881d00153cc6d3917f6b74144b1d41b58338c] https://lava.sirena.org.uk/scheduler/job/1693416
# test job: [cf65182247761f7993737b710afe8c781699356b] https://lava.sirena.org.uk/scheduler/job/1687562
# test job: [2a55135201d5e24b80b7624880ff42eafd8e320c] https://lava.sirena.org.uk/scheduler/job/1685772
# test job: [550bc517e59347b3b1af7d290eac4fb1411a3d4e] https://lava.sirena.org.uk/scheduler/job/1685910
# test job: [0056b410355713556d8a10306f82e55b28d33ba8] https://lava.sirena.org.uk/scheduler/job/1685649
# test job: [daf855f76a1210ceed9541f71ac5dd9be02018a6] https://lava.sirena.org.uk/scheduler/job/1685441
# test job: [90179609efa421b1ccc7d8eafbc078bafb25777c] https://lava.sirena.org.uk/scheduler/job/1686081
# test job: [258384d8ce365dddd6c5c15204de8ccd53a7ab0a] https://lava.sirena.org.uk/scheduler/job/1673411
# test job: [6d068f1ae2a2f713d7f21a9a602e65b3d6b6fc6d] https://lava.sirena.org.uk/scheduler/job/1673133
# test job: [a46e95c81e3a28926ab1904d9f754fef8318074d] https://lava.sirena.org.uk/scheduler/job/1673748
# test job: [48124569bbc6bfda1df3e9ee17b19d559f4b1aa3] https://lava.sirena.org.uk/scheduler/job/1670184
# test job: [37533933bfe92cd5a99ef4743f31dac62ccc8de0] https://lava.sirena.org.uk/scheduler/job/1668977
# test job: [0e62438e476494a1891a8822b9785bc6e73e9c3f] https://lava.sirena.org.uk/scheduler/job/1669534
# test job: [5c36b86d2bf68fbcad16169983ef7ee8c537db59] https://lava.sirena.org.uk/scheduler/job/1667971
# test job: [714165e1c4b0d5b8c6d095fe07f65e6e7047aaeb] https://lava.sirena.org.uk/scheduler/job/1667699
# test job: [9c45f95222beecd6a284fd1284d54dd7a772cf59] https://lava.sirena.org.uk/scheduler/job/1667598
# test job: [bab4ab484a6ca170847da9bffe86f1fa90df4bbe] https://lava.sirena.org.uk/scheduler/job/1664664
# test job: [b832b19318534bb4f1673b24d78037fee339c679] https://lava.sirena.org.uk/scheduler/job/1659213
# test job: [8c02c8353460f8630313aef6810f34e134a3c1ee] https://lava.sirena.org.uk/scheduler/job/1659264
# test job: [6b7e2aa50bdaf88cd4c2a5e2059a7bf32d85a8b1] https://lava.sirena.org.uk/scheduler/job/1656585
# test job: [2291a2186305faaf8525d57849d8ba12ad63f5e7] https://lava.sirena.org.uk/scheduler/job/1655709
# test job: [a54ef14188519a0994d0264f701f5771815fa11e] https://lava.sirena.org.uk/scheduler/job/1656024
# test job: [a1d0b0ae65ae3f32597edfbb547f16c75601cd87] https://lava.sirena.org.uk/scheduler/job/1654201
# test job: [cf25eb8eae91bcae9b2065d84b0c0ba0f6d9dd34] https://lava.sirena.org.uk/scheduler/job/1654790
# test job: [595b7f155b926460a00776cc581e4dcd01220006] https://lava.sirena.org.uk/scheduler/job/1653119
# test job: [3059067fd3378a5454e7928c08d20bf3ef186760] https://lava.sirena.org.uk/scheduler/job/1655440
# test job: [2d86d2585ab929a143d1e6f8963da1499e33bf13] https://lava.sirena.org.uk/scheduler/job/1655917
# test job: [9a200cbdb54349909a42b45379e792e4b39dd223] https://lava.sirena.org.uk/scheduler/job/1654762
# test job: [162e23657e5379f07c6404dbfbf4367cb438ea7d] https://lava.sirena.org.uk/scheduler/job/1652978
# test job: [886f42ce96e7ce80545704e7168a9c6b60cd6c03] https://lava.sirena.org.uk/scheduler/job/1654270
# test job: [6684aba0780da9f505c202f27e68ee6d18c0aa66] https://lava.sirena.org.uk/scheduler/job/1738722
# test job: [be5d4872e528796df9d7425f2bd9b3893eb3a42c] https://lava.sirena.org.uk/scheduler/job/1778528
# bad: [be5d4872e528796df9d7425f2bd9b3893eb3a42c] Add linux-next specific files for 20250905
git bisect bad be5d4872e528796df9d7425f2bd9b3893eb3a42c
# test job: [c3ce85ecd0268df1e0ca692e8126bb181fc89a08] https://lava.sirena.org.uk/scheduler/job/1779086
# bad: [c3ce85ecd0268df1e0ca692e8126bb181fc89a08] Merge branch 'main' of https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git
git bisect bad c3ce85ecd0268df1e0ca692e8126bb181fc89a08
# test job: [973a887a5bb9a42878e276209592e0f75c287bb6] https://lava.sirena.org.uk/scheduler/job/1780104
# bad: [973a887a5bb9a42878e276209592e0f75c287bb6] Merge branch 'fs-next' of linux-next
git bisect bad 973a887a5bb9a42878e276209592e0f75c287bb6
# test job: [fdabd8890022a9439b95d7395f7ae046544d96fd] https://lava.sirena.org.uk/scheduler/job/1780530
# bad: [fdabd8890022a9439b95d7395f7ae046544d96fd] Merge branch 'for-next' of https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux.git
git bisect bad fdabd8890022a9439b95d7395f7ae046544d96fd
# test job: [94bd0249a4a06131c4a1c2097b6134217a658976] https://lava.sirena.org.uk/scheduler/job/1780904
# bad: [94bd0249a4a06131c4a1c2097b6134217a658976] Merge branch 'for-next' of https://git.kernel.org/pub/scm/linux/kernel/git/soc/soc.git
git bisect bad 94bd0249a4a06131c4a1c2097b6134217a658976
# test job: [702b6c2f1008779e8fc8a4a4438410165309a4b4] https://lava.sirena.org.uk/scheduler/job/1781370
# bad: [702b6c2f1008779e8fc8a4a4438410165309a4b4] kasan-apply-write-only-mode-in-kasan-kunit-testcases-v7
git bisect bad 702b6c2f1008779e8fc8a4a4438410165309a4b4
# test job: [0ac48805721d5952a920356e454167bba8d27737] https://lava.sirena.org.uk/scheduler/job/1781448
# good: [0ac48805721d5952a920356e454167bba8d27737] mm: convert page_to_section() to memdesc_section()
git bisect good 0ac48805721d5952a920356e454167bba8d27737
# test job: [dc731eba2e47fa81d50aa1cb167100889253cfe0] https://lava.sirena.org.uk/scheduler/job/1781608
# good: [dc731eba2e47fa81d50aa1cb167100889253cfe0] mm/damon/paddr: support addr_unit for MIGRATE_{HOT,COLD}
git bisect good dc731eba2e47fa81d50aa1cb167100889253cfe0
# test job: [e24bb041cafabaa5fa3d76386c86af389cc324f5] https://lava.sirena.org.uk/scheduler/job/1781660
# good: [e24bb041cafabaa5fa3d76386c86af389cc324f5] mm/memremap: reject unreasonable folio/compound page sizes in memremap_pages()
git bisect good e24bb041cafabaa5fa3d76386c86af389cc324f5
# test job: [62fd63f4688f40f01a6df23225523ece10d4b69a] https://lava.sirena.org.uk/scheduler/job/1781975
# bad: [62fd63f4688f40f01a6df23225523ece10d4b69a] dma-remap: drop nth_page() in dma_common_contiguous_remap()
git bisect bad 62fd63f4688f40f01a6df23225523ece10d4b69a
# test job: [cb42f7f6d9e4eff4e5259cddf82fd913306b8fe7] https://lava.sirena.org.uk/scheduler/job/1782145
# good: [cb42f7f6d9e4eff4e5259cddf82fd913306b8fe7] fs: hugetlbfs: remove nth_page() usage within folio in adjust_range_hwpoison()
git bisect good cb42f7f6d9e4eff4e5259cddf82fd913306b8fe7
# test job: [db076b5db550aa34169dceee81d0974c7b2a2482] https://lava.sirena.org.uk/scheduler/job/1782813
# bad: [db076b5db550aa34169dceee81d0974c7b2a2482] mm/gup: remove record_subpages()
git bisect bad db076b5db550aa34169dceee81d0974c7b2a2482
# test job: [891d0b3189945a5c37ce92c4e5337ec2c17b6378] https://lava.sirena.org.uk/scheduler/job/1782916
# good: [891d0b3189945a5c37ce92c4e5337ec2c17b6378] mm/pagewalk: drop nth_page() usage within folio in folio_walk_start()
git bisect good 891d0b3189945a5c37ce92c4e5337ec2c17b6378
# test job: [21999f6315d786cbd21d5b2d0ad56f3f6125279f] https://lava.sirena.org.uk/scheduler/job/1783020
# good: [21999f6315d786cbd21d5b2d0ad56f3f6125279f] mm/gup: drop nth_page() usage within folio when recording subpages
git bisect good 21999f6315d786cbd21d5b2d0ad56f3f6125279f
# first bad commit: [db076b5db550aa34169dceee81d0974c7b2a2482] mm/gup: remove record_subpages()
#48 lore raw

Re: [PATCH v2 19/37] mm/gup: remove record_subpages()

Quoted 4 lines · Mark Brown
Quoted 3 lines · David Hildenbrand

We can just cleanup the code by calculating the #refs earlier, so we can just inline what remains of record_subpages().

Quoted 8 lines
Quoted 2 lines

Calculate the number of references/pages ahead of times, and record them only once all our tests passed.

I'm seeing failures in kselftest-mm in -next on at least Raspberry Pi 4 and Orion O6 which bisect to this patch. I'm seeing a NULL pointer dereference during the GUP test (which isn't actually doing anything as I'm just using a standard defconfig rather than one with the mm fragment):

On which -next label are you on? next-20250908 should no longer have that commit.

Signature · 3 lines
Cheers

David / dhildenb
#49 lore raw

Re: [PATCH v2 19/37] mm/gup: remove record_subpages()

Quoted 7 lines · David Hildenbrand
Quoted 2 lines · Mark Brown

I'm seeing failures in kselftest-mm in -next on at least Raspberry Pi 4 and Orion O6 which bisect to this patch. I'm seeing a NULL pointer

On which -next label are you on? next-20250908 should no longer have that commit.

Ah, sorry - it was Friday's -next but I only saw the report this morning. Sorry for the noise.

#50 lore raw

PATCH v2 20/37 io_uring/zcrx: remove nth_page() usage within folio

In reply to David Hildenbrand

Within a folio/compound page, nth_page() is no longer required. Given that we call folio_test_partial_kmap()+kmap_local_page(), the code would already be problematic if the pages would span multiple folios.

So let's just assume that all src pages belong to a single folio/compound page and can be iterated ordinarily. The dst page is currently always a single page, so we're not actually iterating anything.

---
 io_uring/zcrx.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
io_uring/zcrx.c +2 -2
index e5ff49f3425e0..18c12f4b56b6c 100644
@@ -975,9 +975,9 @@ static ssize_t io_copy_page(struct io_copy_cache *cc, struct page *src_page,
 
 		if (folio_test_partial_kmap(page_folio(dst_page)) ||
 		    folio_test_partial_kmap(page_folio(src_page))) {
-			dst_page = nth_page(dst_page, dst_offset / PAGE_SIZE);
+			dst_page += dst_offset / PAGE_SIZE;
 			dst_offset = offset_in_page(dst_offset);
-			src_page = nth_page(src_page, src_offset / PAGE_SIZE);
+			src_page += src_offset / PAGE_SIZE;
 			src_offset = offset_in_page(src_offset);
 			n = min(PAGE_SIZE - src_offset, PAGE_SIZE - dst_offset);
 			n = min(n, len);
Signature · 1 line
2.50.1
#51 lore raw

PATCH v2 21/37 mips: mm: convert __flush_dcache_pages() to __flush_dcache_folio_pages()

In reply to David Hildenbrand

Let's make it clearer that we are operating within a single folio by providing both the folio and the page.

This implies that for flush_dcache_folio() we'll now avoid one more page->folio lookup, and that we can safely drop the "nth_page" usage.

While at it, drop the "extern" from the function declaration.

Cc Thomas Bogendoerfer <[email protected]>
---
 arch/mips/include/asm/cacheflush.h | 11 +++++++----
 arch/mips/mm/cache.c               |  8 ++++----
 2 files changed, 11 insertions(+), 8 deletions(-)
arch/mips/include/asm/cacheflush.h +7 -4
index 5d283ef89d90d..5099c1b65a584 100644
@@ -50,13 +50,14 @@ extern void (*flush_cache_mm)(struct mm_struct *mm);
 extern void (*flush_cache_range)(struct vm_area_struct *vma,
 	unsigned long start, unsigned long end);
 extern void (*flush_cache_page)(struct vm_area_struct *vma, unsigned long page, unsigned long pfn);
-extern void __flush_dcache_pages(struct page *page, unsigned int nr);
+void __flush_dcache_folio_pages(struct folio *folio, struct page *page, unsigned int nr);
 
 #define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE 1
 static inline void flush_dcache_folio(struct folio *folio)
 {
 	if (cpu_has_dc_aliases)
-		__flush_dcache_pages(&folio->page, folio_nr_pages(folio));
+		__flush_dcache_folio_pages(folio, folio_page(folio, 0),
+					   folio_nr_pages(folio));
 	else if (!cpu_has_ic_fills_f_dc)
 		folio_set_dcache_dirty(folio);
 }
@@ -64,10 +65,12 @@ static inline void flush_dcache_folio(struct folio *folio)
 
 static inline void flush_dcache_page(struct page *page)
 {
+	struct folio *folio = page_folio(page);
+
 	if (cpu_has_dc_aliases)
-		__flush_dcache_pages(page, 1);
+		__flush_dcache_folio_pages(folio, page, 1);
 	else if (!cpu_has_ic_fills_f_dc)
-		folio_set_dcache_dirty(page_folio(page));
+		folio_set_dcache_dirty(folio);
 }
 
 #define flush_dcache_mmap_lock(mapping)		do { } while (0)
arch/mips/mm/cache.c +4 -4
index bf9a37c60e9f0..e3b4224c9a406 100644
@@ -99,9 +99,9 @@ SYSCALL_DEFINE3(cacheflush, unsigned long, addr, unsigned long, bytes,
 	return 0;
 }
 
-void __flush_dcache_pages(struct page *page, unsigned int nr)
+void __flush_dcache_folio_pages(struct folio *folio, struct page *page,
+		unsigned int nr)
 {
-	struct folio *folio = page_folio(page);
 	struct address_space *mapping = folio_flush_mapping(folio);
 	unsigned long addr;
 	unsigned int i;
@@ -117,12 +117,12 @@ void __flush_dcache_pages(struct page *page, unsigned int nr)
 	 * get faulted into the tlb (and thus flushed) anyways.
 	 */
 	for (i = 0; i < nr; i++) {
-		addr = (unsigned long)kmap_local_page(nth_page(page, i));
+		addr = (unsigned long)kmap_local_page(page + i);
 		flush_data_cache_page(addr);
 		kunmap_local((void *)addr);
 	}
 }
-EXPORT_SYMBOL(__flush_dcache_pages);
+EXPORT_SYMBOL(__flush_dcache_folio_pages);
 
 void __flush_anon_page(struct page *page, unsigned long vmaddr)
 {
Signature · 1 line
2.50.1
#52 lore raw

PATCH v2 22/37 mm/cma: refuse handing out non-contiguous page ranges

In reply to David Hildenbrand

Let's disallow handing out PFN ranges with non-contiguous pages, so we can remove the nth-page usage in __cma_alloc(), and so any callers don't have to worry about that either when wanting to blindly iterate pages.

This is really only a problem in configs with SPARSEMEM but without SPARSEMEM_VMEMMAP, and only when we would cross memory sections in some cases.

Will this cause harm? Probably not, because it's mostly 32bit that does not support SPARSEMEM_VMEMMAP. If this ever becomes a problem we could look into allocating the memmap for the memory sections spanned by a single CMA region in one go from memblock.

---
 include/linux/mm.h |  6 ++++++
 mm/cma.c           | 39 ++++++++++++++++++++++++---------------
 mm/util.c          | 35 +++++++++++++++++++++++++++++++++++
 3 files changed, 65 insertions(+), 15 deletions(-)
include/linux/mm.h +6 -0
index f6880e3225c5c..2ca1eb2db63ec 100644
@@ -209,9 +209,15 @@ extern unsigned long sysctl_user_reserve_kbytes;
 extern unsigned long sysctl_admin_reserve_kbytes;
 
 #if defined(CONFIG_SPARSEMEM) && !defined(CONFIG_SPARSEMEM_VMEMMAP)
+bool page_range_contiguous(const struct page *page, unsigned long nr_pages);
 #define nth_page(page,n) pfn_to_page(page_to_pfn((page)) + (n))
 #else
 #define nth_page(page,n) ((page) + (n))
+static inline bool page_range_contiguous(const struct page *page,
+		unsigned long nr_pages)
+{
+	return true;
+}
 #endif
 
 /* to align the pointer to the (next) page boundary */
mm/cma.c +24 -15
index e56ec64d0567e..813e6dc7b0954 100644
@@ -780,10 +780,8 @@ static int cma_range_alloc(struct cma *cma, struct cma_memrange *cmr,
 				unsigned long count, unsigned int align,
 				struct page **pagep, gfp_t gfp)
 {
-	unsigned long mask, offset;
-	unsigned long pfn = -1;
-	unsigned long start = 0;
 	unsigned long bitmap_maxno, bitmap_no, bitmap_count;
+	unsigned long start, pfn, mask, offset;
 	int ret = -EBUSY;
 	struct page *page = NULL;
 
@@ -795,7 +793,7 @@ static int cma_range_alloc(struct cma *cma, struct cma_memrange *cmr,
 	if (bitmap_count > bitmap_maxno)
 		goto out;
 
-	for (;;) {
+	for (start = 0; ; start = bitmap_no + mask + 1) {
 		spin_lock_irq(&cma->lock);
 		/*
 		 * If the request is larger than the available number
@@ -812,6 +810,22 @@ static int cma_range_alloc(struct cma *cma, struct cma_memrange *cmr,
 			spin_unlock_irq(&cma->lock);
 			break;
 		}
+
+		pfn = cmr->base_pfn + (bitmap_no << cma->order_per_bit);
+		page = pfn_to_page(pfn);
+
+		/*
+		 * Do not hand out page ranges that are not contiguous, so
+		 * callers can just iterate the pages without having to worry
+		 * about these corner cases.
+		 */
+		if (!page_range_contiguous(page, count)) {
+			spin_unlock_irq(&cma->lock);
+			pr_warn_ratelimited("%s: %s: skipping incompatible area [0x%lx-0x%lx]",
+					    __func__, cma->name, pfn, pfn + count - 1);
+			continue;
+		}
+
 		bitmap_set(cmr->bitmap, bitmap_no, bitmap_count);
 		cma->available_count -= count;
 		/*
@@ -821,29 +835,24 @@ static int cma_range_alloc(struct cma *cma, struct cma_memrange *cmr,
 		 */
 		spin_unlock_irq(&cma->lock);
 
-		pfn = cmr->base_pfn + (bitmap_no << cma->order_per_bit);
 		mutex_lock(&cma->alloc_mutex);
 		ret = alloc_contig_range(pfn, pfn + count, ACR_FLAGS_CMA, gfp);
 		mutex_unlock(&cma->alloc_mutex);
-		if (ret == 0) {
-			page = pfn_to_page(pfn);
+		if (!ret)
 			break;
-		}
 
 		cma_clear_bitmap(cma, cmr, pfn, count);
 		if (ret != -EBUSY)
 			break;
 
 		pr_debug("%s(): memory range at pfn 0x%lx %p is busy, retrying\n",
-			 __func__, pfn, pfn_to_page(pfn));
+			 __func__, pfn, page);
 
-		trace_cma_alloc_busy_retry(cma->name, pfn, pfn_to_page(pfn),
-					   count, align);
-		/* try again with a bit different memory target */
-		start = bitmap_no + mask + 1;
+		trace_cma_alloc_busy_retry(cma->name, pfn, page, count, align);
 	}
 out:
-	*pagep = page;
+	if (!ret)
+		*pagep = page;
 	return ret;
 }
 
@@ -882,7 +891,7 @@ static struct page *__cma_alloc(struct cma *cma, unsigned long count,
 	 */
 	if (page) {
 		for (i = 0; i < count; i++)
-			page_kasan_tag_reset(nth_page(page, i));
+			page_kasan_tag_reset(page + i);
 	}
 
 	if (ret && !(gfp & __GFP_NOWARN)) {
mm/util.c +35 -0
index d235b74f7aff7..fbdb73aaf35fe 100644
@@ -1280,4 +1280,39 @@ unsigned int folio_pte_batch(struct folio *folio, pte_t *ptep, pte_t pte,
 {
 	return folio_pte_batch_flags(folio, NULL, ptep, &pte, max_nr, 0);
 }
+
+#if defined(CONFIG_SPARSEMEM) && !defined(CONFIG_SPARSEMEM_VMEMMAP)
+/**
+ * page_range_contiguous - test whether the page range is contiguous
+ * @page: the start of the page range.
+ * @nr_pages: the number of pages in the range.
+ *
+ * Test whether the page range is contiguous, such that they can be iterated
+ * naively, corresponding to iterating a contiguous PFN range.
+ *
+ * This function should primarily only be used for debug checks, or when
+ * working with page ranges that are not naturally contiguous (e.g., pages
+ * within a folio are).
+ *
+ * Returns true if contiguous, otherwise false.
+ */
+bool page_range_contiguous(const struct page *page, unsigned long nr_pages)
+{
+	const unsigned long start_pfn = page_to_pfn(page);
+	const unsigned long end_pfn = start_pfn + nr_pages;
+	unsigned long pfn;
+
+	/*
+	 * The memmap is allocated per memory section, so no need to check
+	 * within the first section. However, we need to check each other
+	 * spanned memory section once, making sure the first page in a
+	 * section could similarly be reached by just iterating pages.
+	 */
+	for (pfn = ALIGN(start_pfn, PAGES_PER_SECTION);
+	     pfn < end_pfn; pfn += PAGES_PER_SECTION)
+		if (unlikely(page + (pfn - start_pfn) != pfn_to_page(pfn)))
+			return false;
+	return true;
+}
+#endif
 #endif /* CONFIG_MMU */
Signature · 1 line
2.50.1
#53 lore raw

Re: [PATCH v2 22/37] mm/cma: refuse handing out non-contiguous page ranges

Quoted 13 lines · David Hildenbrand

Let's disallow handing out PFN ranges with non-contiguous pages, so we can remove the nth-page usage in __cma_alloc(), and so any callers don't have to worry about that either when wanting to blindly iterate pages.

This is really only a problem in configs with SPARSEMEM but without SPARSEMEM_VMEMMAP, and only when we would cross memory sections in some cases.

Will this cause harm? Probably not, because it's mostly 32bit that does not support SPARSEMEM_VMEMMAP. If this ever becomes a problem we could look into allocating the memmap for the memory sections spanned by a single CMA region in one go from memblock.

Quoted 4 lines

---

@Andrew, the following fixup on top. I'm still cross-compiling it, but at the time you read this mail my cross compiles should have been done.

From cbfa2763e1820b917ce3430f45e5f3a55eb2970f Mon Sep 17 00:00:00 2001
From: David Hildenbrand <[email protected]>
Date: Tue, 9 Sep 2025 05:50:13 -0400
Subject: [PATCH] fixup: mm/cma: refuse handing out non-contiguous page ranges

Apparently we can have NUMMU configs with SPARSEMEM enabled.

---
 mm/util.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
mm/util.c +1 -1
index 248f877f629b6..6c1d64ed02211 100644
@@ -1306,6 +1306,7 @@ unsigned int folio_pte_batch(struct folio *folio, pte_t *ptep, pte_t pte,
 {
 	return folio_pte_batch_flags(folio, NULL, ptep, &pte, max_nr, 0);
 }
+#endif /* CONFIG_MMU */
 
 #if defined(CONFIG_SPARSEMEM) && !defined(CONFIG_SPARSEMEM_VMEMMAP)
 /**
@@ -1342,4 +1343,3 @@ bool page_range_contiguous(const struct page *page, unsigned long nr_pages)
 }
 EXPORT_SYMBOL(page_range_contiguous);
 #endif
-#endif /* CONFIG_MMU */
Signature · 7 lines
2.50.1


-- 
Cheers

David / dhildenb
#54 lore raw

PATCH v2 23/37 dma-remap: drop nth_page() in dma_common_contiguous_remap()

In reply to David Hildenbrand

dma_common_contiguous_remap() is used to remap an "allocated contiguous region". Within a single allocation, there is no need to use nth_page() anymore.

Neither the buddy, nor hugetlb, nor CMA will hand out problematic page ranges.

---
 kernel/dma/remap.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/dma/remap.c +1 -1
index 9e2afad1c6152..b7c1c0c92d0c8 100644
@@ -49,7 +49,7 @@ void *dma_common_contiguous_remap(struct page *page, size_t size,
 	if (!pages)
 		return NULL;
 	for (i = 0; i < count; i++)
-		pages[i] = nth_page(page, i);
+		pages[i] = page++;
 	vaddr = vmap(pages, count, VM_DMA_COHERENT, prot);
 	kvfree(pages);
 
Signature · 1 line
2.50.1
#55 lore raw

PATCH v2 24/37 scatterlist: disallow non-contigous page ranges in a single SG entry

In reply to David Hildenbrand

The expectation is that there is currently no user that would pass in non-contigous page ranges: no allocator, not even VMA, will hand these out.

The only problematic part would be if someone would provide a range obtained directly from memblock, or manually merge problematic ranges. If we find such cases, we should fix them to create separate SG entries.

Let's check in sg_set_page() that this is really the case. No need to check in sg_set_folio(), as pages in a folio are guaranteed to be contiguous. As sg_set_page() gets inlined into modules, we have to export the page_range_contiguous() helper -- use EXPORT_SYMBOL, there is nothing special about this helper such that we would want to enforce GPL-only modules.

We can now drop the nth_page() usage in sg_page_iter_page().

---
 include/linux/scatterlist.h | 3 ++-
 mm/util.c                   | 1 +
 2 files changed, 3 insertions(+), 1 deletion(-)
include/linux/scatterlist.h +2 -1
index 6f8a4965f9b98..29f6ceb98d74b 100644
@@ -158,6 +158,7 @@ static inline void sg_assign_page(struct scatterlist *sg, struct page *page)
 static inline void sg_set_page(struct scatterlist *sg, struct page *page,
 			       unsigned int len, unsigned int offset)
 {
+	VM_WARN_ON_ONCE(!page_range_contiguous(page, ALIGN(len + offset, PAGE_SIZE) / PAGE_SIZE));
 	sg_assign_page(sg, page);
 	sg->offset = offset;
 	sg->length = len;
@@ -600,7 +601,7 @@ void __sg_page_iter_start(struct sg_page_iter *piter,
  */
 static inline struct page *sg_page_iter_page(struct sg_page_iter *piter)
 {
-	return nth_page(sg_page(piter->sg), piter->sg_pgoffset);
+	return sg_page(piter->sg) + piter->sg_pgoffset;
 }
 
 /**
mm/util.c +1 -0
index fbdb73aaf35fe..bb4b47cd67091 100644
@@ -1314,5 +1314,6 @@ bool page_range_contiguous(const struct page *page, unsigned long nr_pages)
 			return false;
 	return true;
 }
+EXPORT_SYMBOL(page_range_contiguous);
 #endif
 #endif /* CONFIG_MMU */
Signature · 1 line
2.50.1
#56 lore raw

PATCH v2 25/37 ata: libata-sff: drop nth_page() usage within SG entry

In reply to David Hildenbrand

It's no longer required to use nth_page() when iterating pages within a single SG entry, so let's drop the nth_page() usage.

---
 drivers/ata/libata-sff.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/ata/libata-sff.c +3 -3
index 7fc407255eb46..1e2a2c33cdc80 100644
@@ -614,7 +614,7 @@ static void ata_pio_sector(struct ata_queued_cmd *qc)
 	offset = qc->cursg->offset + qc->cursg_ofs;
 
 	/* get the current page and offset */
-	page = nth_page(page, (offset >> PAGE_SHIFT));
+	page += offset >> PAGE_SHIFT;
 	offset %= PAGE_SIZE;
 
 	/* don't overrun current sg */
@@ -631,7 +631,7 @@ static void ata_pio_sector(struct ata_queued_cmd *qc)
 		unsigned int split_len = PAGE_SIZE - offset;
 
 		ata_pio_xfer(qc, page, offset, split_len);
-		ata_pio_xfer(qc, nth_page(page, 1), 0, count - split_len);
+		ata_pio_xfer(qc, page + 1, 0, count - split_len);
 	} else {
 		ata_pio_xfer(qc, page, offset, count);
 	}
@@ -751,7 +751,7 @@ static int __atapi_pio_bytes(struct ata_queued_cmd *qc, unsigned int bytes)
 	offset = sg->offset + qc->cursg_ofs;
 
 	/* get the current page and offset */
-	page = nth_page(page, (offset >> PAGE_SHIFT));
+	page += offset >> PAGE_SHIFT;
 	offset %= PAGE_SIZE;
 
 	/* don't overrun current sg */
Signature · 1 line
2.50.1
#57 lore raw

PATCH v2 26/37 drm/i915/gem: drop nth_page() usage within SG entry

In reply to David Hildenbrand

It's no longer required to use nth_page() when iterating pages within a single SG entry, so let's drop the nth_page() usage.

Cc Jani Nikula <[email protected]>
Cc Joonas Lahtinen <[email protected]>
Cc Rodrigo Vivi <[email protected]>
Cc Tvrtko Ursulin <[email protected]>
Cc David Airlie <[email protected]>
Cc Simona Vetter <[email protected]>
---
 drivers/gpu/drm/i915/gem/i915_gem_pages.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/i915/gem/i915_gem_pages.c +1 -1
index c16a57160b262..031d7acc16142 100644
@@ -779,7 +779,7 @@ __i915_gem_object_get_page(struct drm_i915_gem_object *obj, pgoff_t n)
 	GEM_BUG_ON(!i915_gem_object_has_struct_page(obj));
 
 	sg = i915_gem_object_get_sg(obj, n, &offset);
-	return nth_page(sg_page(sg), offset);
+	return sg_page(sg) + offset;
 }
 
 /* Like i915_gem_object_get_page(), but mark the returned page dirty */
Signature · 1 line
2.50.1
maintainer
#58 lore raw

Re: [PATCH v2 26/37] drm/i915/gem: drop nth_page() usage within SG entry

Quoted 20 lines · David Hildenbrand

It's no longer required to use nth_page() when iterating pages within a single SG entry, so let's drop the nth_page() usage.

Cc Jani Nikula <[email protected]>
Cc Joonas Lahtinen <[email protected]>
Cc Rodrigo Vivi <[email protected]>
Cc Tvrtko Ursulin <[email protected]>
Cc David Airlie <[email protected]>
Cc Simona Vetter <[email protected]>
---
  drivers/gpu/drm/i915/gem/i915_gem_pages.c | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/i915/gem/i915_gem_pages.c +0 -0
index c16a57160b262..031d7acc16142 100644

drivers/gpu/drm/i915/gem/i915_gem_pages.c __i915_gem_object_get_page(struct drm_i915_gem_object *obj, pgoff_t n) · line 785

Quoted 8 lines
drivers/gpu/drm/i915/gem/i915_gem_pages.c +1 -1
@@ -779,7 +779,7 @@ __i915_gem_object_get_page(struct drm_i915_gem_object *obj, pgoff_t n)
  	GEM_BUG_ON(!i915_gem_object_has_struct_page(obj));
 
  	sg = i915_gem_object_get_sg(obj, n, &offset);
-	return nth_page(sg_page(sg), offset);
+	return sg_page(sg) + offset;
  }
 
  /* Like i915_gem_object_get_page(), but mark the returned page dirty */

LGTM. If you want an ack to merge via a tree other than i915 you have it. I suspect it might be easier to coordinate like that.

Regards,

Tvrtko

#59 lore raw

Re: [PATCH v2 26/37] drm/i915/gem: drop nth_page() usage within SG entry

Quoted 29 lines · Tvrtko Ursulin
Quoted 27 lines · David Hildenbrand

It's no longer required to use nth_page() when iterating pages within a single SG entry, so let's drop the nth_page() usage.

Cc Jani Nikula <[email protected]>
Cc Joonas Lahtinen <[email protected]>
Cc Rodrigo Vivi <[email protected]>
Cc Tvrtko Ursulin <[email protected]>
Cc David Airlie <[email protected]>
Cc Simona Vetter <[email protected]>
---
   drivers/gpu/drm/i915/gem/i915_gem_pages.c | 2 +-
   1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/i915/gem/i915_gem_pages.c +1 -1
index c16a57160b262..031d7acc16142 100644
@@ -779,7 +779,7 @@ __i915_gem_object_get_page(struct drm_i915_gem_object *obj, pgoff_t n)
   	GEM_BUG_ON(!i915_gem_object_has_struct_page(obj));
 
   	sg = i915_gem_object_get_sg(obj, n, &offset);
-	return nth_page(sg_page(sg), offset);
+	return sg_page(sg) + offset;
   }
 
Quoted 4 lines

drivers/gpu/drm/i915/gem/i915_gem_pages.c __i915_gem_object_get_page(struct drm_i915_gem_object *obj, pgoff_t n) · line 785

Quoted 1 line
drivers/gpu/drm/i915/gem/i915_gem_pages.c +0 -0
   /* Like i915_gem_object_get_page(), but mark the returned page dirty */

LGTM. If you want an ack to merge via a tree other than i915 you have it. I suspect it might be easier to coordinate like that.

Yeah, it would be best to route all of that through the MM tree. Thanks!

Signature · 3 lines
Cheers

David / dhildenb
#60 lore raw

PATCH v2 27/37 mspro_block: drop nth_page() usage within SG entry

In reply to David Hildenbrand

It's no longer required to use nth_page() when iterating pages within a single SG entry, so let's drop the nth_page() usage.

---
 drivers/memstick/core/mspro_block.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/memstick/core/mspro_block.c +1 -2
index c9853d887d282..d3f160dc0da4c 100644
@@ -560,8 +560,7 @@ static int h_mspro_block_transfer_data(struct memstick_dev *card,
 		t_offset += msb->current_page * msb->page_size;
 
 		sg_set_page(&t_sg,
-			    nth_page(sg_page(&(msb->req_sg[msb->current_seg])),
-				     t_offset >> PAGE_SHIFT),
+			    sg_page(&(msb->req_sg[msb->current_seg])) + (t_offset >> PAGE_SHIFT),
 			    msb->page_size, offset_in_page(t_offset));
 
 		memstick_init_req_sg(*mrq, msb->data_dir == READ
Signature · 1 line
2.50.1
#61 lore raw

PATCH v2 28/37 memstick: drop nth_page() usage within SG entry

In reply to David Hildenbrand

It's no longer required to use nth_page() when iterating pages within a single SG entry, so let's drop the nth_page() usage.

---
 drivers/memstick/host/jmb38x_ms.c | 3 +--
 drivers/memstick/host/tifm_ms.c   | 3 +--
 2 files changed, 2 insertions(+), 4 deletions(-)
drivers/memstick/host/jmb38x_ms.c +1 -2
index cddddb3a5a27f..79e66e30417c1 100644
@@ -317,8 +317,7 @@ static int jmb38x_ms_transfer_data(struct jmb38x_ms_host *host)
 		unsigned int p_off;
 
 		if (host->req->long_data) {
-			pg = nth_page(sg_page(&host->req->sg),
-				      off >> PAGE_SHIFT);
+			pg = sg_page(&host->req->sg) + (off >> PAGE_SHIFT);
 			p_off = offset_in_page(off);
 			p_cnt = PAGE_SIZE - p_off;
 			p_cnt = min(p_cnt, length);
drivers/memstick/host/tifm_ms.c +1 -2
index db7f3a088fb09..0b6a90661eee5 100644
@@ -201,8 +201,7 @@ static unsigned int tifm_ms_transfer_data(struct tifm_ms *host)
 		unsigned int p_off;
 
 		if (host->req->long_data) {
-			pg = nth_page(sg_page(&host->req->sg),
-				      off >> PAGE_SHIFT);
+			pg = sg_page(&host->req->sg) + (off >> PAGE_SHIFT);
 			p_off = offset_in_page(off);
 			p_cnt = PAGE_SIZE - p_off;
 			p_cnt = min(p_cnt, length);
Signature · 1 line
2.50.1
#62 lore raw

PATCH v2 29/37 mmc: drop nth_page() usage within SG entry

In reply to David Hildenbrand

It's no longer required to use nth_page() when iterating pages within a single SG entry, so let's drop the nth_page() usage.

---
 drivers/mmc/host/tifm_sd.c    | 4 ++--
 drivers/mmc/host/usdhi6rol0.c | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)
drivers/mmc/host/tifm_sd.c +2 -2
index ac636efd911d3..2cd69c9e9571b 100644
@@ -191,7 +191,7 @@ static void tifm_sd_transfer_data(struct tifm_sd *host)
 		}
 		off = sg[host->sg_pos].offset + host->block_pos;
 
-		pg = nth_page(sg_page(&sg[host->sg_pos]), off >> PAGE_SHIFT);
+		pg = sg_page(&sg[host->sg_pos]) + (off >> PAGE_SHIFT);
 		p_off = offset_in_page(off);
 		p_cnt = PAGE_SIZE - p_off;
 		p_cnt = min(p_cnt, cnt);
@@ -240,7 +240,7 @@ static void tifm_sd_bounce_block(struct tifm_sd *host, struct mmc_data *r_data)
 		}
 		off = sg[host->sg_pos].offset + host->block_pos;
 
-		pg = nth_page(sg_page(&sg[host->sg_pos]), off >> PAGE_SHIFT);
+		pg = sg_page(&sg[host->sg_pos]) + (off >> PAGE_SHIFT);
 		p_off = offset_in_page(off);
 		p_cnt = PAGE_SIZE - p_off;
 		p_cnt = min(p_cnt, cnt);
drivers/mmc/host/usdhi6rol0.c +2 -2
index 85b49c07918b3..3bccf800339ba 100644
@@ -323,7 +323,7 @@ static void usdhi6_blk_bounce(struct usdhi6_host *host,
 
 	host->head_pg.page	= host->pg.page;
 	host->head_pg.mapped	= host->pg.mapped;
-	host->pg.page		= nth_page(host->pg.page, 1);
+	host->pg.page		= host->pg.page + 1;
 	host->pg.mapped		= kmap(host->pg.page);
 
 	host->blk_page = host->bounce_buf;
@@ -503,7 +503,7 @@ static void usdhi6_sg_advance(struct usdhi6_host *host)
 	/* We cannot get here after crossing a page border */
 
 	/* Next page in the same SG */
-	host->pg.page = nth_page(sg_page(host->sg), host->page_idx);
+	host->pg.page = sg_page(host->sg) + host->page_idx;
 	host->pg.mapped = kmap(host->pg.page);
 	host->blk_page = host->pg.mapped;
 
Signature · 1 line
2.50.1
#63 lore raw

PATCH v2 30/37 scsi: scsi_lib: drop nth_page() usage within SG entry

In reply to David Hildenbrand

It's no longer required to use nth_page() when iterating pages within a single SG entry, so let's drop the nth_page() usage.

---
 drivers/scsi/scsi_lib.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/scsi/scsi_lib.c +1 -2
index 0c65ecfedfbd6..d7e42293b8645 100644
@@ -3148,8 +3148,7 @@ void *scsi_kmap_atomic_sg(struct scatterlist *sgl, int sg_count,
 	/* Offset starting from the beginning of first page in this sg-entry */
 	*offset = *offset - len_complete + sg->offset;
 
-	/* Assumption: contiguous pages can be accessed as "page + i" */
-	page = nth_page(sg_page(sg), (*offset >> PAGE_SHIFT));
+	page = sg_page(sg) + (*offset >> PAGE_SHIFT);
 	*offset &= ~PAGE_MASK;
 
 	/* Bytes in this sg-entry from *offset to the end of the page */
Signature · 1 line
2.50.1
#64 lore raw

PATCH v2 31/37 scsi: sg: drop nth_page() usage within SG entry

In reply to David Hildenbrand

It's no longer required to use nth_page() when iterating pages within a single SG entry, so let's drop the nth_page() usage.

---
 drivers/scsi/sg.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/scsi/sg.c +1 -2
index 3c02a5f7b5f39..4c62c597c7be9 100644
@@ -1235,8 +1235,7 @@ sg_vma_fault(struct vm_fault *vmf)
 		len = vma->vm_end - sa;
 		len = (len < length) ? len : length;
 		if (offset < len) {
-			struct page *page = nth_page(rsv_schp->pages[k],
-						     offset >> PAGE_SHIFT);
+			struct page *page = rsv_schp->pages[k] + (offset >> PAGE_SHIFT);
 			get_page(page);	/* increment page count */
 			vmf->page = page;
 			return 0; /* success */
Signature · 1 line
2.50.1
#65 lore raw

PATCH v2 32/37 vfio/pci: drop nth_page() usage within SG entry

In reply to David Hildenbrand

It's no longer required to use nth_page() when iterating pages within a single SG entry, so let's drop the nth_page() usage.

---
 drivers/vfio/pci/pds/lm.c         | 3 +--
 drivers/vfio/pci/virtio/migrate.c | 3 +--
 2 files changed, 2 insertions(+), 4 deletions(-)
drivers/vfio/pci/pds/lm.c +1 -2
index f2673d395236a..4d70c833fa32e 100644
@@ -151,8 +151,7 @@ static struct page *pds_vfio_get_file_page(struct pds_vfio_lm_file *lm_file,
 			lm_file->last_offset_sg = sg;
 			lm_file->sg_last_entry += i;
 			lm_file->last_offset = cur_offset;
-			return nth_page(sg_page(sg),
-					(offset - cur_offset) / PAGE_SIZE);
+			return sg_page(sg) + (offset - cur_offset) / PAGE_SIZE;
 		}
 		cur_offset += sg->length;
 	}
drivers/vfio/pci/virtio/migrate.c +1 -2
index ba92bb4e9af94..7dd0ac866461d 100644
@@ -53,8 +53,7 @@ virtiovf_get_migration_page(struct virtiovf_data_buffer *buf,
 			buf->last_offset_sg = sg;
 			buf->sg_last_entry += i;
 			buf->last_offset = cur_offset;
-			return nth_page(sg_page(sg),
-					(offset - cur_offset) / PAGE_SIZE);
+			return sg_page(sg) + (offset - cur_offset) / PAGE_SIZE;
 		}
 		cur_offset += sg->length;
 	}
Signature · 1 line
2.50.1
#66 lore raw

PATCH v2 33/37 crypto: remove nth_page() usage within SG entry

In reply to David Hildenbrand

It's no longer required to use nth_page() when iterating pages within a single SG entry, so let's drop the nth_page() usage.

---
 crypto/ahash.c               | 4 ++--
 crypto/scompress.c           | 8 ++++----
 include/crypto/scatterwalk.h | 4 ++--
 3 files changed, 8 insertions(+), 8 deletions(-)
crypto/ahash.c +2 -2
index a227793d2c5b5..dfb4f5476428f 100644
@@ -88,7 +88,7 @@ static int hash_walk_new_entry(struct crypto_hash_walk *walk)
 
 	sg = walk->sg;
 	walk->offset = sg->offset;
-	walk->pg = nth_page(sg_page(walk->sg), (walk->offset >> PAGE_SHIFT));
+	walk->pg = sg_page(walk->sg) + (walk->offset >> PAGE_SHIFT);
 	walk->offset = offset_in_page(walk->offset);
 	walk->entrylen = sg->length;
 
@@ -226,7 +226,7 @@ int shash_ahash_digest(struct ahash_request *req, struct shash_desc *desc)
 	if (!IS_ENABLED(CONFIG_HIGHMEM))
 		return crypto_shash_digest(desc, data, nbytes, req->result);
 
-	page = nth_page(page, offset >> PAGE_SHIFT);
+	page += offset >> PAGE_SHIFT;
 	offset = offset_in_page(offset);
 
 	if (nbytes > (unsigned int)PAGE_SIZE - offset)
crypto/scompress.c +4 -4
index c651e7f2197a9..1a7ed8ae65b07 100644
@@ -198,7 +198,7 @@ static int scomp_acomp_comp_decomp(struct acomp_req *req, int dir)
 		} else
 			return -ENOSYS;
 
-		dpage = nth_page(dpage, doff / PAGE_SIZE);
+		dpage += doff / PAGE_SIZE;
 		doff = offset_in_page(doff);
 
 		n = (dlen - 1) / PAGE_SIZE;
@@ -220,12 +220,12 @@ static int scomp_acomp_comp_decomp(struct acomp_req *req, int dir)
 			} else
 				break;
 
-			spage = nth_page(spage, soff / PAGE_SIZE);
+			spage = spage + soff / PAGE_SIZE;
 			soff = offset_in_page(soff);
 
 			n = (slen - 1) / PAGE_SIZE;
 			n += (offset_in_page(slen - 1) + soff) / PAGE_SIZE;
-			if (PageHighMem(nth_page(spage, n)) &&
+			if (PageHighMem(spage + n) &&
 			    size_add(soff, slen) > PAGE_SIZE)
 				break;
 			src = kmap_local_page(spage) + soff;
@@ -270,7 +270,7 @@ static int scomp_acomp_comp_decomp(struct acomp_req *req, int dir)
 			if (dlen <= PAGE_SIZE)
 				break;
 			dlen -= PAGE_SIZE;
-			dpage = nth_page(dpage, 1);
+			dpage++;
 		}
 	}
 
include/crypto/scatterwalk.h +2 -2
index 15ab743f68c8f..83d14376ff2bc 100644
@@ -159,7 +159,7 @@ static inline void scatterwalk_map(struct scatter_walk *walk)
 	if (IS_ENABLED(CONFIG_HIGHMEM)) {
 		struct page *page;
 
-		page = nth_page(base_page, offset >> PAGE_SHIFT);
+		page = base_page + (offset >> PAGE_SHIFT);
 		offset = offset_in_page(offset);
 		addr = kmap_local_page(page) + offset;
 	} else {
@@ -259,7 +259,7 @@ static inline void scatterwalk_done_dst(struct scatter_walk *walk,
 		end += (offset_in_page(offset) + offset_in_page(nbytes) +
 			PAGE_SIZE - 1) >> PAGE_SHIFT;
 		for (i = start; i < end; i++)
-			flush_dcache_page(nth_page(base_page, i));
+			flush_dcache_page(base_page + i);
 	}
 	scatterwalk_advance(walk, nbytes);
 }
Signature · 1 line
2.50.1
#67 lore raw

PATCH v2 34/37 mm/gup: drop nth_page() usage in unpin_user_page_range_dirty_lock()

In reply to David Hildenbrand

There is the concern that unpin_user_page_range_dirty_lock() might do some weird merging of PFN ranges -- either now or in the future -- such that PFN range is contiguous but the page range might not be.

Let's sanity-check for that and drop the nth_page() usage.

---
 mm/gup.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)
mm/gup.c +7 -1
index f0f4d1a68e094..010fe56f6e132 100644
@@ -237,7 +237,7 @@ void folio_add_pin(struct folio *folio)
 static inline struct folio *gup_folio_range_next(struct page *start,
 		unsigned long npages, unsigned long i, unsigned int *ntails)
 {
-	struct page *next = nth_page(start, i);
+	struct page *next = start + i;
 	struct folio *folio = page_folio(next);
 	unsigned int nr = 1;
 
@@ -342,6 +342,10 @@ EXPORT_SYMBOL(unpin_user_pages_dirty_lock);
  * "gup-pinned page range" refers to a range of pages that has had one of the
  * pin_user_pages() variants called on that page.
  *
+ * The page range must be truly physically contiguous: the page range
+ * corresponds to a contiguous PFN range and all pages can be iterated
+ * naturally.
+ *
  * For the page ranges defined by [page .. page+npages], make that range (or
  * its head pages, if a compound page) dirty, if @make_dirty is true, and if the
  * page range was previously listed as clean.
@@ -359,6 +363,8 @@ void unpin_user_page_range_dirty_lock(struct page *page, unsigned long npages,
 	struct folio *folio;
 	unsigned int nr;
 
+	VM_WARN_ON_ONCE(!page_range_contiguous(page, npages));
+
 	for (i = 0; i < npages; i += nr) {
 		folio = gup_folio_range_next(page, npages, i, &nr);
 		if (make_dirty && !folio_test_dirty(folio)) {
Signature · 1 line
2.50.1
#68 lore raw

PATCH v2 35/37 kfence: drop nth_page() usage

In reply to David Hildenbrand

We want to get rid of nth_page(), and kfence init code is the last user.

Unfortunately, we might actually walk a PFN range where the pages are not contiguous, because we might be allocating an area from memblock that could span memory sections in problematic kernel configs (SPARSEMEM without SPARSEMEM_VMEMMAP).

We could check whether the page range is contiguous
using page_range_contiguous() and failing kfence init, or making kfence incompatible these problemtic kernel configs.

Let's keep it simple and simply use pfn_to_page() by iterating PFNs.

---
 mm/kfence/core.c | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)
mm/kfence/core.c +7 -5
index 0ed3be100963a..727c20c94ac59 100644
@@ -594,15 +594,14 @@ static void rcu_guarded_free(struct rcu_head *h)
  */
 static unsigned long kfence_init_pool(void)
 {
-	unsigned long addr;
-	struct page *pages;
+	unsigned long addr, start_pfn;
 	int i;
 
 	if (!arch_kfence_init_pool())
 		return (unsigned long)__kfence_pool;
 
 	addr = (unsigned long)__kfence_pool;
-	pages = virt_to_page(__kfence_pool);
+	start_pfn = PHYS_PFN(virt_to_phys(__kfence_pool));
 
 	/*
 	 * Set up object pages: they must have PGTY_slab set to avoid freeing
@@ -613,11 +612,12 @@ static unsigned long kfence_init_pool(void)
 	 * enters __slab_free() slow-path.
 	 */
 	for (i = 0; i < KFENCE_POOL_SIZE / PAGE_SIZE; i++) {
-		struct slab *slab = page_slab(nth_page(pages, i));
+		struct slab *slab;
 
 		if (!i || (i % 2))
 			continue;
 
+		slab = page_slab(pfn_to_page(start_pfn + i));
 		__folio_set_slab(slab_folio(slab));
 #ifdef CONFIG_MEMCG
 		slab->obj_exts = (unsigned long)&kfence_metadata_init[i / 2 - 1].obj_exts |
@@ -665,10 +665,12 @@ static unsigned long kfence_init_pool(void)
 
 reset_slab:
 	for (i = 0; i < KFENCE_POOL_SIZE / PAGE_SIZE; i++) {
-		struct slab *slab = page_slab(nth_page(pages, i));
+		struct slab *slab;
 
 		if (!i || (i % 2))
 			continue;
+
+		slab = page_slab(pfn_to_page(start_pfn + i));
 #ifdef CONFIG_MEMCG
 		slab->obj_exts = 0;
 #endif
Signature · 1 line
2.50.1
#69 lore raw

PATCH v2 36/37 block: update comment of "struct bio_vec" regarding nth_page()

In reply to David Hildenbrand

Ever since commit 858c708d9efb ("block: move the bi_size update out of __bio_try_merge_page"), page_is_mergeable() no longer exists, and the logic in bvec_try_merge_page() is now a simple page pointer comparison.

---
 include/linux/bvec.h | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)
include/linux/bvec.h +2 -5
index 0a80e1f9aa201..3fc0efa0825b1 100644
@@ -22,11 +22,8 @@ struct page;
  * @bv_len:    Number of bytes in the address range.
  * @bv_offset: Start of the address range relative to the start of @bv_page.
  *
- * The following holds for a bvec if n * PAGE_SIZE < bv_offset + bv_len:
- *
- *   nth_page(@bv_page, n) == @bv_page + n
- *
- * This holds because page_is_mergeable() checks the above property.
+ * All pages within a bio_vec starting from @bv_page are contiguous and
+ * can simply be iterated (see bvec_advance()).
  */
 struct bio_vec {
 	struct page	*bv_page;
Signature · 1 line
2.50.1
#70 lore raw

PATCH v2 37/37 mm: remove nth_page()

In reply to David Hildenbrand

Now that all users are gone, let's remove it.

---
 include/linux/mm.h                   | 2 --
 tools/testing/scatterlist/linux/mm.h | 1 -
 2 files changed, 3 deletions(-)
include/linux/mm.h +0 -2
index 2ca1eb2db63ec..b26ca8b2162d9 100644
@@ -210,9 +210,7 @@ extern unsigned long sysctl_admin_reserve_kbytes;
 
 #if defined(CONFIG_SPARSEMEM) && !defined(CONFIG_SPARSEMEM_VMEMMAP)
 bool page_range_contiguous(const struct page *page, unsigned long nr_pages);
-#define nth_page(page,n) pfn_to_page(page_to_pfn((page)) + (n))
 #else
-#define nth_page(page,n) ((page) + (n))
 static inline bool page_range_contiguous(const struct page *page,
 		unsigned long nr_pages)
 {
tools/testing/scatterlist/linux/mm.h +0 -1
index 5bd9e6e806254..121ae78d6e885 100644
@@ -51,7 +51,6 @@ static inline unsigned long page_to_phys(struct page *page)
 
 #define page_to_pfn(page) ((unsigned long)(page) / PAGE_SIZE)
 #define pfn_to_page(pfn) (void *)((pfn) * PAGE_SIZE)
-#define nth_page(page,n) pfn_to_page(page_to_pfn((page)) + (n))
 
 #define __min(t1, t2, min1, min2, x, y) ({              \
 	t1 min1 = (x);                                  \
Signature · 1 line
2.50.1
#71 lore raw

✓ i915.CI.BAT: success for series starting with [v2,01/37] mm: stop making SPARSEMEM_VMEMMAP user-selectable

In reply to David Hildenbrand
== Series Details ==

== Series Details ==

Series: series starting with [v2,01/37] mm: stop making SPARSEMEM_VMEMMAP user-selectable
URL : https://patchwork.freedesktop.org/series/153803/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_17105 -> Patchwork_153803v1
====================================================

Summary
-------

**SUCCESS**

No regressions found.

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

Participating hosts (44 -> 43)
------------------------------

Missing (1): fi-snb-2520m

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

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

### IGT changes ###

#### Issues hit ####

* igt@gem_exec_fence@basic-busy@vecs0:
- bat-rpls-4: [PASS][1] -> [DMESG-WARN][2] ([i915#13400]) +1 other test dmesg-warn
[1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/bat-rpls-4/igt@gem_exec_fence@[email protected]
[2]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/bat-rpls-4/igt@gem_exec_fence@[email protected]

* igt@i915_selftest@live@workarounds:
- bat-dg2-11: [PASS][3] -> [DMESG-FAIL][4] ([i915#12061]) +1 other test dmesg-fail
[3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/bat-dg2-11/igt@i915_selftest@[email protected]
[4]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/bat-dg2-11/igt@i915_selftest@[email protected]
- bat-dg2-14: [PASS][5] -> [DMESG-FAIL][6] ([i915#12061]) +1 other test dmesg-fail
[5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/bat-dg2-14/igt@i915_selftest@[email protected]
[6]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/bat-dg2-14/igt@i915_selftest@[email protected]

#### Possible fixes ####

* igt@dmabuf@all-tests:
- bat-apl-1: [ABORT][7] ([i915#12904]) -> [PASS][8] +1 other test pass
[7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/bat-apl-1/igt@[email protected]
[8]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/bat-apl-1/igt@[email protected]

* igt@dmabuf@all-tests@dma_fence_chain:
- fi-bsw-n3050: [ABORT][9] ([i915#12904]) -> [PASS][10] +1 other test pass
[9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/fi-bsw-n3050/igt@dmabuf@all-tests@dma_fence_chain.html
[10]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/fi-bsw-n3050/igt@dmabuf@all-tests@dma_fence_chain.html

* igt@i915_selftest@live:
- bat-mtlp-8: [DMESG-FAIL][11] ([i915#12061]) -> [PASS][12] +1 other test pass
[11]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/bat-mtlp-8/igt@[email protected]
[12]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/bat-mtlp-8/igt@[email protected]

* igt@i915_selftest@live@workarounds:
- bat-mtlp-9: [DMESG-FAIL][13] ([i915#12061]) -> [PASS][14] +1 other test pass
[13]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/bat-mtlp-9/igt@i915_selftest@[email protected]
[14]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/bat-mtlp-9/igt@i915_selftest@[email protected]

[i915#12061]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12061
[i915#12904]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12904
[i915#13400]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13400

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

* Linux: CI_DRM_17105 -> Patchwork_153803v1

CI-20190529: 20190529
CI_DRM_17105: f2856d85f7452831ece60ff0d26aa6aa4d6a3a55 @ git://anongit.freedesktop.org/gfx-ci/linux
IGT_8519: 8519
Patchwork_153803v1: f2856d85f7452831ece60ff0d26aa6aa4d6a3a55 @ git://anongit.freedesktop.org/gfx-ci/linux

== Logs ==

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

#72 lore raw

✗ i915.CI.Full: failure for series starting with [v2,01/37] mm: stop making SPARSEMEM_VMEMMAP user-selectable

In reply to David Hildenbrand
== Series Details ==

== Series Details ==

Series: series starting with [v2,01/37] mm: stop making SPARSEMEM_VMEMMAP user-selectable
URL : https://patchwork.freedesktop.org/series/153803/
State : failure

== Summary ==

CI Bug Log - changes from CI_DRM_17105_full -> Patchwork_153803v1_full
====================================================

Summary
-------

**FAILURE**

Serious unknown changes coming with Patchwork_153803v1_full absolutely need to be verified manually.

If you think the reported changes have nothing to do with the changes
introduced in Patchwork_153803v1_full, please notify your bug team ([email protected]) to allow them to document this new failure mode, which will reduce false positives in CI.

Participating hosts (11 -> 11)
------------------------------

No changes in participating hosts

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

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

### IGT changes ###

#### Possible regressions ####

* igt@i915_pm_rc6_residency@rc6-fence:
- shard-rkl: [PASS][1] -> [SKIP][2] +1 other test skip
[1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[2]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-7/igt@[email protected]

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

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

### IGT changes ###

#### Issues hit ####

* igt@api_intel_bb@blit-reloc-purge-cache:
- shard-dg2: NOTRUN -> [SKIP][3] ([i915#8411])
[3]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]

* igt@device_reset@cold-reset-bound:
- shard-tglu-1: NOTRUN -> [SKIP][4] ([i915#11078])
[4]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-1/igt@[email protected]
- shard-rkl: NOTRUN -> [SKIP][5] ([i915#11078])
[5]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-8/igt@[email protected]

* igt@device_reset@unbind-cold-reset-rebind:
- shard-dg2: NOTRUN -> [SKIP][6] ([i915#11078])
[6]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]

* igt@gem_busy@semaphore:
- shard-dg2: NOTRUN -> [SKIP][7] ([i915#3936])
[7]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]

* igt@gem_ccs@block-copy-compressed:
- shard-tglu: NOTRUN -> [SKIP][8] ([i915#3555] / [i915#9323])
[8]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-8/igt@[email protected]

* igt@gem_ccs@block-multicopy-inplace:
- shard-rkl: NOTRUN -> [SKIP][9] ([i915#3555] / [i915#9323])
[9]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-8/igt@[email protected]
- shard-tglu-1: NOTRUN -> [SKIP][10] ([i915#3555] / [i915#9323])
[10]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-1/igt@[email protected]

* igt@gem_create@create-ext-set-pat:
- shard-tglu-1: NOTRUN -> [SKIP][11] ([i915#8562])
[11]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-1/igt@[email protected]

* igt@gem_ctx_isolation@preservation-s3@rcs0:
- shard-glk: NOTRUN -> [INCOMPLETE][12] ([i915#12353]) +1 other test incomplete
[12]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-glk1/igt@gem_ctx_isolation@[email protected]

* igt@gem_ctx_persistence@hang:
- shard-dg2: NOTRUN -> [SKIP][13] ([i915#8555])
[13]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]

* igt@gem_ctx_persistence@saturated-hostile-nopreempt:
- shard-dg2: NOTRUN -> [SKIP][14] ([i915#5882]) +7 other tests skip
[14]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]

* igt@gem_ctx_persistence@smoketest:
- shard-snb: NOTRUN -> [SKIP][15] ([i915#1099]) +1 other test skip
[15]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-snb5/igt@[email protected]

* igt@gem_ctx_sseu@invalid-sseu:
- shard-tglu-1: NOTRUN -> [SKIP][16] ([i915#280])
[16]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-1/igt@[email protected]

* igt@gem_ctx_sseu@mmap-args:
- shard-tglu: NOTRUN -> [SKIP][17] ([i915#280]) +1 other test skip
[17]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-8/igt@[email protected]

* igt@gem_eio@in-flight-suspend:
- shard-rkl: [PASS][18] -> [DMESG-WARN][19] ([i915#12964]) +15 other tests dmesg-warn
[18]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[19]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-5/igt@[email protected]

* igt@gem_eio@kms:
- shard-tglu: NOTRUN -> [DMESG-WARN][20] ([i915#13363])
[20]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-7/igt@[email protected]

* igt@gem_eio@reset-stress:
- shard-dg1: [PASS][21] -> [FAIL][22] ([i915#5784])
[21]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-dg1-14/igt@[email protected]
[22]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg1-17/igt@[email protected]

* igt@gem_exec_balancer@bonded-true-hang:
- shard-dg2: NOTRUN -> [SKIP][23] ([i915#4812])
[23]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]

* igt@gem_exec_balancer@parallel:
- shard-rkl: NOTRUN -> [SKIP][24] ([i915#4525])
[24]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-7/igt@[email protected]

* igt@gem_exec_balancer@parallel-out-fence:
- shard-tglu: NOTRUN -> [SKIP][25] ([i915#4525])
[25]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-7/igt@[email protected]

* igt@gem_exec_fence@submit3:
- shard-dg2-9: NOTRUN -> [SKIP][26] ([i915#4812])
[26]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-9/igt@[email protected]

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

* igt@gem_exec_params@secure-non-master:
- shard-dg2: NOTRUN -> [SKIP][28] +12 other tests skip
[28]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]

* igt@gem_exec_reloc@basic-gtt-cpu:
- shard-dg2-9: NOTRUN -> [SKIP][29] ([i915#3281]) +1 other test skip
[29]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-9/igt@[email protected]

* igt@gem_exec_reloc@basic-range-active:
- shard-rkl: NOTRUN -> [SKIP][30] ([i915#3281]) +2 other tests skip
[30]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-8/igt@[email protected]

* igt@gem_exec_reloc@basic-softpin:
- shard-dg2: NOTRUN -> [SKIP][31] ([i915#3281]) +6 other tests skip
[31]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]

* igt@gem_exec_reloc@basic-write-wc-noreloc:
- shard-mtlp: NOTRUN -> [SKIP][32] ([i915#3281])
[32]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-mtlp-4/igt@[email protected]

* igt@gem_exec_suspend@basic-s3:
- shard-glk: NOTRUN -> [INCOMPLETE][33] ([i915#11441] / [i915#13196]) +1 other test incomplete
[33]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-glk3/igt@[email protected]

* igt@gem_fence_thrash@bo-copy:
- shard-dg2: NOTRUN -> [SKIP][34] ([i915#4860])
[34]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]

* igt@gem_lmem_evict@dontneed-evict-race:
- shard-tglu-1: NOTRUN -> [SKIP][35] ([i915#4613] / [i915#7582])
[35]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-1/igt@[email protected]

* igt@gem_lmem_swapping@heavy-verify-multi-ccs:
- shard-rkl: NOTRUN -> [SKIP][36] ([i915#4613]) +1 other test skip
[36]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-8/igt@[email protected]

* igt@gem_lmem_swapping@heavy-verify-random:
- shard-tglu: NOTRUN -> [SKIP][37] ([i915#4613])
[37]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-8/igt@[email protected]

* igt@gem_lmem_swapping@smem-oom@lmem0:
- shard-dg1: [PASS][38] -> [TIMEOUT][39] ([i915#5493]) +1 other test timeout
[38]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-dg1-17/igt@gem_lmem_swapping@[email protected]
[39]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg1-15/igt@gem_lmem_swapping@[email protected]

* igt@gem_lmem_swapping@verify-ccs:
- shard-glk: NOTRUN -> [SKIP][40] ([i915#4613]) +4 other tests skip
[40]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-glk9/igt@[email protected]
- shard-tglu-1: NOTRUN -> [SKIP][41] ([i915#4613]) +1 other test skip
[41]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-1/igt@[email protected]

* igt@gem_media_vme:
- shard-tglu: NOTRUN -> [SKIP][42] ([i915#284])
[42]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-7/igt@gem_media_vme.html

* igt@gem_mmap@basic-small-bo:
- shard-dg2: NOTRUN -> [SKIP][43] ([i915#4083]) +1 other test skip
[43]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]

* igt@gem_mmap_gtt@big-bo-tiledx:
- shard-dg2-9: NOTRUN -> [SKIP][44] ([i915#4077]) +7 other tests skip
[44]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-9/igt@[email protected]

* igt@gem_mmap_gtt@cpuset-big-copy:
- shard-dg2: NOTRUN -> [SKIP][45] ([i915#4077]) +6 other tests skip
[45]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]

* igt@gem_mmap_wc@invalid-flags:
- shard-dg2-9: NOTRUN -> [SKIP][46] ([i915#4083]) +2 other tests skip
[46]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-9/igt@[email protected]

* igt@gem_partial_pwrite_pread@writes-after-reads-snoop:
- shard-rkl: NOTRUN -> [SKIP][47] ([i915#3282]) +3 other tests skip
[47]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-7/igt@[email protected]
- shard-dg2-9: NOTRUN -> [SKIP][48] ([i915#3282]) +1 other test skip
[48]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-9/igt@[email protected]

* igt@gem_pread@exhaustion:
- shard-tglu: NOTRUN -> [WARN][49] ([i915#2658])
[49]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-7/igt@[email protected]
- shard-glk10: NOTRUN -> [WARN][50] ([i915#2658])
[50]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-glk10/igt@[email protected]

* igt@gem_pread@snoop:
- shard-dg2: NOTRUN -> [SKIP][51] ([i915#3282]) +1 other test skip
[51]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]

* igt@gem_pxp@display-protected-crc:
- shard-dg2: NOTRUN -> [SKIP][52] ([i915#4270]) +2 other tests skip
[52]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]

* igt@gem_pxp@hw-rejects-pxp-buffer:
- shard-tglu: NOTRUN -> [SKIP][53] ([i915#13398])
[53]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-8/igt@[email protected]

* igt@gem_pxp@protected-encrypted-src-copy-not-readible:
- shard-rkl: NOTRUN -> [TIMEOUT][54] ([i915#12917] / [i915#12964])
[54]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-7/igt@[email protected]
- shard-dg2-9: NOTRUN -> [SKIP][55] ([i915#4270])
[55]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-9/igt@[email protected]

* igt@gem_pxp@protected-raw-src-copy-not-readible:
- shard-rkl: [PASS][56] -> [TIMEOUT][57] ([i915#12917] / [i915#12964]) +1 other test timeout
[56]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-8/igt@[email protected]
[57]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-4/igt@[email protected]

* igt@gem_render_copy@x-tiled-to-vebox-y-tiled:
- shard-dg2-9: NOTRUN -> [SKIP][58] ([i915#5190] / [i915#8428]) +1 other test skip
[58]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-9/igt@[email protected]

* igt@gem_render_copy@yf-tiled-mc-ccs-to-vebox-yf-tiled:
- shard-dg2: NOTRUN -> [SKIP][59] ([i915#5190] / [i915#8428]) +4 other tests skip
[59]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]

* igt@gem_set_tiling_vs_blt@tiled-to-untiled:
- shard-dg2: NOTRUN -> [SKIP][60] ([i915#4079])
[60]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]

* igt@gem_softpin@evict-snoop:
- shard-dg2: NOTRUN -> [SKIP][61] ([i915#4885])
[61]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]

* igt@gem_userptr_blits@access-control:
- shard-dg2: NOTRUN -> [SKIP][62] ([i915#3297])
[62]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]

* igt@gem_userptr_blits@sd-probe:
- shard-dg2: NOTRUN -> [SKIP][63] ([i915#3297] / [i915#4958])
[63]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]

* igt@gem_userptr_blits@unsync-unmap-after-close:
- shard-dg2-9: NOTRUN -> [SKIP][64] ([i915#3297])
[64]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-9/igt@[email protected]

* igt@gen9_exec_parse@bb-large:
- shard-glk10: NOTRUN -> [FAIL][65] ([i915#14806])
[65]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-glk10/igt@[email protected]

* igt@gen9_exec_parse@bb-start-cmd:
- shard-dg2-9: NOTRUN -> [SKIP][66] ([i915#2856]) +2 other tests skip
[66]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-9/igt@[email protected]
- shard-rkl: NOTRUN -> [SKIP][67] ([i915#2527])
[67]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-7/igt@[email protected]

* igt@gen9_exec_parse@secure-batches:
- shard-dg2: NOTRUN -> [SKIP][68] ([i915#2856]) +2 other tests skip
[68]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]

* igt@gen9_exec_parse@unaligned-access:
- shard-tglu-1: NOTRUN -> [SKIP][69] ([i915#2527] / [i915#2856])
[69]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-1/igt@[email protected]

* igt@gen9_exec_parse@unaligned-jump:
- shard-tglu: NOTRUN -> [SKIP][70] ([i915#2527] / [i915#2856]) +2 other tests skip
[70]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-7/igt@[email protected]

* igt@i915_drm_fdinfo@most-busy-check-all@vecs0:
- shard-dg2: NOTRUN -> [SKIP][71] ([i915#14073]) +15 other tests skip
[71]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@i915_drm_fdinfo@[email protected]

* igt@i915_module_load@resize-bar:
- shard-tglu: NOTRUN -> [SKIP][72] ([i915#6412])
[72]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-7/igt@[email protected]

* igt@i915_pm_freq_mult@media-freq@gt0:
- shard-rkl: NOTRUN -> [SKIP][73] ([i915#6590]) +1 other test skip
[73]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-7/igt@i915_pm_freq_mult@[email protected]

* igt@i915_pm_rpm@system-suspend-devices:
- shard-snb: NOTRUN -> [SKIP][74] +154 other tests skip
[74]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-snb1/igt@[email protected]

* igt@i915_pm_rps@min-max-config-idle:
- shard-dg2: NOTRUN -> [SKIP][75] ([i915#11681] / [i915#6621])
[75]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]

* igt@i915_pm_rps@thresholds-idle:
- shard-dg2: NOTRUN -> [SKIP][76] ([i915#11681])
[76]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]

* igt@i915_pm_rps@thresholds-idle-park:
- shard-dg2-9: NOTRUN -> [SKIP][77] ([i915#11681])
[77]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-9/igt@[email protected]

* igt@i915_query@hwconfig_table:
- shard-tglu: NOTRUN -> [SKIP][78] ([i915#6245])
[78]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-7/igt@i915_query@hwconfig_table.html

* igt@i915_suspend@basic-s3-without-i915:
- shard-tglu: NOTRUN -> [INCOMPLETE][79] ([i915#4817] / [i915#7443])
[79]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-8/igt@[email protected]

* igt@intel_hwmon@hwmon-write:
- shard-mtlp: NOTRUN -> [SKIP][80] ([i915#7707])
[80]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-mtlp-4/igt@[email protected]

* igt@kms_addfb_basic@bo-too-small-due-to-tiling:
- shard-dg2-9: NOTRUN -> [SKIP][81] ([i915#4212])
[81]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-9/igt@[email protected]

* igt@kms_addfb_basic@invalid-smem-bo-on-discrete:
- shard-tglu-1: NOTRUN -> [SKIP][82] ([i915#12454] / [i915#12712])
[82]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-1/igt@[email protected]

* igt@kms_atomic_transition@plane-all-modeset-transition-internal-panels:
- shard-tglu: NOTRUN -> [SKIP][83] ([i915#1769] / [i915#3555])
[83]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-7/igt@kms_atomic_transition@plane-all-modeset-transition-internal-panels.html

* igt@kms_atomic_transition@plane-toggle-modeset-transition@pipe-a-hdmi-a-3:
- shard-dg2: NOTRUN -> [FAIL][84] ([i915#5956]) +2 other tests fail
[84]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@kms_atomic_transition@[email protected]

* igt@kms_big_fb@4-tiled-16bpp-rotate-0:
- shard-rkl: NOTRUN -> [SKIP][85] ([i915#5286]) +2 other tests skip
[85]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-8/igt@[email protected]

* igt@kms_big_fb@4-tiled-addfb:
- shard-tglu: NOTRUN -> [SKIP][86] ([i915#5286]) +2 other tests skip
[86]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-7/igt@[email protected]

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

* igt@kms_big_fb@y-tiled-32bpp-rotate-270:
- shard-dg2-9: NOTRUN -> [SKIP][88] ([i915#4538] / [i915#5190]) +4 other tests skip
[88]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-9/igt@[email protected]

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

* igt@kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-180:
- shard-mtlp: NOTRUN -> [SKIP][90]
[90]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-mtlp-4/igt@[email protected]

* igt@kms_ccs@bad-pixel-format-yf-tiled-ccs@pipe-c-hdmi-a-1:
- shard-tglu-1: NOTRUN -> [SKIP][91] ([i915#6095]) +34 other tests skip
[91]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-1/igt@kms_ccs@[email protected]

* igt@kms_ccs@bad-rotation-90-4-tiled-lnl-ccs:
- shard-tglu: NOTRUN -> [SKIP][92] ([i915#12313])
[92]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-7/igt@[email protected]

* igt@kms_ccs@ccs-on-another-bo-y-tiled-ccs@pipe-b-dp-3:
- shard-dg2: NOTRUN -> [SKIP][93] ([i915#10307] / [i915#6095]) +159 other tests skip
[93]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-11/igt@kms_ccs@[email protected]

* igt@kms_ccs@crc-primary-basic-4-tiled-lnl-ccs:
- shard-dg2: NOTRUN -> [SKIP][94] ([i915#12313]) +2 other tests skip
[94]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]

* igt@kms_ccs@crc-primary-suspend-4-tiled-bmg-ccs:
- shard-rkl: NOTRUN -> [SKIP][95] ([i915#12805])
[95]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-7/igt@[email protected]
- shard-dg2-9: NOTRUN -> [SKIP][96] ([i915#12805])
[96]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-9/igt@[email protected]

* igt@kms_ccs@crc-primary-suspend-4-tiled-dg2-mc-ccs@pipe-c-hdmi-a-1:
- shard-tglu: NOTRUN -> [SKIP][97] ([i915#6095]) +39 other tests skip
[97]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-7/igt@kms_ccs@[email protected]

* igt@kms_ccs@crc-primary-suspend-4-tiled-mtl-rc-ccs-cc@pipe-b-hdmi-a-3:
- shard-dg2: NOTRUN -> [SKIP][98] ([i915#6095]) +8 other tests skip
[98]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-7/igt@kms_ccs@[email protected]

* igt@kms_ccs@crc-primary-suspend-4-tiled-mtl-rc-ccs-cc@pipe-c-hdmi-a-4:
- shard-dg1: NOTRUN -> [SKIP][99] ([i915#6095]) +111 other tests skip
[99]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg1-15/igt@kms_ccs@[email protected]

* igt@kms_ccs@crc-primary-suspend-y-tiled-ccs:
- shard-glk: NOTRUN -> [INCOMPLETE][100] ([i915#12796]) +1 other test incomplete
[100]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-glk9/igt@[email protected]

* igt@kms_ccs@crc-primary-suspend-y-tiled-ccs@pipe-b-hdmi-a-1:
- shard-rkl: NOTRUN -> [SKIP][101] ([i915#14098] / [i915#6095]) +56 other tests skip
[101]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-7/igt@kms_ccs@[email protected]

* igt@kms_ccs@crc-sprite-planes-basic-4-tiled-mtl-rc-ccs-cc@pipe-d-hdmi-a-1:
- shard-dg2: NOTRUN -> [SKIP][102] ([i915#10307] / [i915#10434] / [i915#6095]) +5 other tests skip
[102]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-4/igt@kms_ccs@crc-sprite-planes-basic-4-tiled-mtl-rc-ccs-cc@pipe-d-hdmi-a-1.html

* igt@kms_ccs@crc-sprite-planes-basic-4-tiled-mtl-rc-ccs@pipe-a-hdmi-a-2:
- shard-rkl: NOTRUN -> [SKIP][103] ([i915#6095]) +53 other tests skip
[103]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-3/igt@kms_ccs@[email protected]

* igt@kms_ccs@random-ccs-data-yf-tiled-ccs@pipe-c-hdmi-a-2:
- shard-dg2-9: NOTRUN -> [SKIP][104] ([i915#10307] / [i915#6095]) +34 other tests skip
[104]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-9/igt@kms_ccs@[email protected]

* igt@kms_cdclk@plane-scaling:
- shard-rkl: NOTRUN -> [SKIP][105] ([i915#3742])
[105]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-8/igt@[email protected]
- shard-tglu-1: NOTRUN -> [SKIP][106] ([i915#3742])
[106]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-1/igt@[email protected]

* igt@kms_chamelium_audio@dp-audio:
- shard-tglu: NOTRUN -> [SKIP][107] ([i915#11151] / [i915#7828]) +7 other tests skip
[107]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-7/igt@[email protected]

* igt@kms_chamelium_audio@dp-audio-edid:
- shard-dg2-9: NOTRUN -> [SKIP][108] ([i915#11151] / [i915#7828]) +4 other tests skip
[108]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-9/igt@[email protected]

* igt@kms_chamelium_color@ctm-blue-to-red:
- shard-dg2-9: NOTRUN -> [SKIP][109] +3 other tests skip
[109]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-9/igt@[email protected]

* igt@kms_chamelium_edid@hdmi-edid-stress-resolution-non-4k:
- shard-dg2: NOTRUN -> [SKIP][110] ([i915#11151] / [i915#7828]) +4 other tests skip
[110]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]

* igt@kms_chamelium_hpd@dp-hpd-storm:
- shard-rkl: NOTRUN -> [SKIP][111] ([i915#11151] / [i915#7828]) +2 other tests skip
[111]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-8/igt@[email protected]
- shard-tglu-1: NOTRUN -> [SKIP][112] ([i915#11151] / [i915#7828]) +2 other tests skip
[112]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-1/igt@[email protected]

* igt@kms_color@deep-color:
- shard-dg2: [PASS][113] -> [SKIP][114] ([i915#12655] / [i915#3555])
[113]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-dg2-11/igt@[email protected]
[114]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-1/igt@[email protected]

* igt@kms_color@legacy-gamma-reset:
- shard-rkl: [PASS][115] -> [SKIP][116] ([i915#12655] / [i915#14544]) +1 other test skip
[115]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-2/igt@[email protected]
[116]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_content_protection@dp-mst-type-1:
- shard-dg2: NOTRUN -> [SKIP][117] ([i915#3299])
[117]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]

* igt@kms_content_protection@legacy:
- shard-rkl: NOTRUN -> [SKIP][118] ([i915#7118] / [i915#9424])
[118]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-8/igt@[email protected]
- shard-tglu-1: NOTRUN -> [SKIP][119] ([i915#6944] / [i915#7116] / [i915#7118] / [i915#9424])
[119]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-1/igt@[email protected]

* igt@kms_content_protection@lic-type-1:
- shard-dg2: NOTRUN -> [SKIP][120] ([i915#9424])
[120]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]

* igt@kms_content_protection@mei-interface:
- shard-dg2-9: NOTRUN -> [SKIP][121] ([i915#9424])
[121]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-9/igt@[email protected]

* igt@kms_content_protection@srm:
- shard-tglu: NOTRUN -> [SKIP][122] ([i915#6944] / [i915#7116] / [i915#7118])
[122]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-7/igt@[email protected]

* igt@kms_content_protection@type1:
- shard-dg2: NOTRUN -> [SKIP][123] ([i915#7118] / [i915#9424])
[123]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]

* igt@kms_cursor_crc@cursor-onscreen-512x170:
- shard-dg2: NOTRUN -> [SKIP][124] ([i915#13049])
[124]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]

* igt@kms_cursor_crc@cursor-onscreen-max-size:
- shard-dg2-9: NOTRUN -> [SKIP][125] ([i915#3555])
[125]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-9/igt@[email protected]

* igt@kms_cursor_crc@cursor-rapid-movement-512x170:
- shard-tglu: NOTRUN -> [SKIP][126] ([i915#13049])
[126]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-7/igt@[email protected]

* igt@kms_cursor_crc@cursor-rapid-movement-512x512:
- shard-tglu-1: NOTRUN -> [SKIP][127] ([i915#13049])
[127]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-1/igt@[email protected]

* igt@kms_cursor_crc@cursor-sliding-32x10:
- shard-dg2: NOTRUN -> [SKIP][128] ([i915#3555]) +6 other tests skip
[128]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]
- shard-mtlp: NOTRUN -> [SKIP][129] ([i915#3555] / [i915#8814])
[129]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-mtlp-4/igt@[email protected]

* igt@kms_cursor_crc@cursor-suspend:
- shard-rkl: [PASS][130] -> [INCOMPLETE][131] ([i915#12358] / [i915#14152])
[130]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-7/igt@[email protected]
[131]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-8/igt@[email protected]

* igt@kms_cursor_crc@cursor-suspend@pipe-a-hdmi-a-2:
- shard-rkl: NOTRUN -> [INCOMPLETE][132] ([i915#12358] / [i915#14152])
[132]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-8/igt@kms_cursor_crc@[email protected]

* igt@kms_cursor_legacy@2x-cursor-vs-flip-atomic:
- shard-mtlp: NOTRUN -> [SKIP][133] ([i915#9809])
[133]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-mtlp-4/igt@[email protected]

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

* igt@kms_cursor_legacy@basic-flip-after-cursor-varying-size:
- shard-rkl: [PASS][135] -> [SKIP][136] ([i915#11190] / [i915#14544]) +1 other test skip
[135]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-7/igt@[email protected]
[136]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_cursor_legacy@basic-flip-before-cursor-atomic:
- shard-glk10: NOTRUN -> [SKIP][137] ([i915#11190]) +3 other tests skip
[137]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-glk10/igt@[email protected]

* igt@kms_cursor_legacy@cursora-vs-flipb-varying-size:
- shard-rkl: NOTRUN -> [SKIP][138] +8 other tests skip
[138]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-8/igt@[email protected]

* igt@kms_cursor_legacy@cursorb-vs-flipb-toggle:
- shard-dg2: NOTRUN -> [SKIP][139] ([i915#13046] / [i915#5354]) +2 other tests skip
[139]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]

* igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions:
- shard-rkl: NOTRUN -> [SKIP][140] ([i915#4103])
[140]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-8/igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions.html
- shard-tglu-1: NOTRUN -> [SKIP][141] ([i915#4103])
[141]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-1/igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions.html

* igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions-varying-size:
- shard-tglu: NOTRUN -> [SKIP][142] ([i915#4103])
[142]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-7/igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions-varying-size.html

* igt@kms_cursor_legacy@short-busy-flip-before-cursor-toggle:
- shard-dg2-9: NOTRUN -> [SKIP][143] ([i915#4103] / [i915#4213])
[143]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-9/igt@[email protected]

* igt@kms_dirtyfb@drrs-dirtyfb-ioctl:
- shard-tglu-1: NOTRUN -> [SKIP][144] ([i915#9723])
[144]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-1/igt@[email protected]

* igt@kms_display_modes@extended-mode-basic:
- shard-tglu: NOTRUN -> [SKIP][145] ([i915#13691])
[145]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-8/igt@[email protected]

* igt@kms_dp_link_training@non-uhbr-sst:
- shard-dg2: NOTRUN -> [SKIP][146] ([i915#13749])
[146]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]

* igt@kms_dp_link_training@uhbr-mst:
- shard-rkl: NOTRUN -> [SKIP][147] ([i915#13748])
[147]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-8/igt@[email protected]
- shard-tglu-1: NOTRUN -> [SKIP][148] ([i915#13748])
[148]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-1/igt@[email protected]

* igt@kms_draw_crc@draw-method-mmap-wc:
- shard-dg2-9: NOTRUN -> [SKIP][149] ([i915#8812])
[149]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-9/igt@[email protected]

* igt@kms_dsc@dsc-basic:
- shard-rkl: NOTRUN -> [SKIP][150] ([i915#3555] / [i915#3840])
[150]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-7/igt@[email protected]
- shard-dg2-9: NOTRUN -> [SKIP][151] ([i915#3555] / [i915#3840])
[151]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-9/igt@[email protected]

* igt@kms_dsc@dsc-with-bpc:
- shard-tglu-1: NOTRUN -> [SKIP][152] ([i915#3555] / [i915#3840])
[152]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-1/igt@[email protected]

* igt@kms_dsc@dsc-with-output-formats-with-bpc:
- shard-tglu: NOTRUN -> [SKIP][153] ([i915#3840] / [i915#9053])
[153]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-8/igt@[email protected]

* igt@kms_fbcon_fbt@fbc-suspend:
- shard-dg1: [PASS][154] -> [DMESG-WARN][155] ([i915#4423]) +3 other tests dmesg-warn
[154]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-dg1-17/igt@[email protected]
[155]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg1-16/igt@[email protected]

* igt@kms_fbcon_fbt@psr:
- shard-rkl: NOTRUN -> [SKIP][156] ([i915#3955])
[156]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-7/igt@[email protected]
- shard-dg2-9: NOTRUN -> [SKIP][157] ([i915#3469])
[157]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-9/igt@[email protected]

* igt@kms_feature_discovery@chamelium:
- shard-tglu: NOTRUN -> [SKIP][158] ([i915#2065] / [i915#4854])
[158]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-7/igt@[email protected]

* igt@kms_feature_discovery@display-4x:
- shard-rkl: NOTRUN -> [SKIP][159] ([i915#1839])
[159]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-8/igt@[email protected]
- shard-tglu-1: NOTRUN -> [SKIP][160] ([i915#1839])
[160]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-1/igt@[email protected]

* igt@kms_feature_discovery@psr1:
- shard-dg2: NOTRUN -> [SKIP][161] ([i915#658])
[161]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]

* igt@kms_feature_discovery@psr2:
- shard-dg2-9: NOTRUN -> [SKIP][162] ([i915#658])
[162]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-9/igt@[email protected]

* igt@kms_fence_pin_leak:
- shard-dg2-9: NOTRUN -> [SKIP][163] ([i915#4881])
[163]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-9/igt@kms_fence_pin_leak.html

* igt@kms_flip@2x-flip-vs-dpms-off-vs-modeset:
- shard-dg2-9: NOTRUN -> [SKIP][164] ([i915#9934]) +1 other test skip
[164]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-9/igt@[email protected]
- shard-rkl: NOTRUN -> [SKIP][165] ([i915#9934])
[165]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-7/igt@[email protected]

* igt@kms_flip@2x-flip-vs-suspend-interruptible:
- shard-snb: NOTRUN -> [TIMEOUT][166] ([i915#14033] / [i915#14350])
[166]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-snb5/igt@[email protected]

* igt@kms_flip@2x-flip-vs-suspend-interruptible@ab-vga1-hdmi-a1:
- shard-snb: NOTRUN -> [TIMEOUT][167] ([i915#14033])
[167]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-snb5/igt@kms_flip@[email protected]

* igt@kms_flip@2x-modeset-vs-vblank-race:
- shard-dg2: NOTRUN -> [SKIP][168] ([i915#9934]) +5 other tests skip
[168]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-6/igt@[email protected]

* igt@kms_flip@2x-nonexisting-fb:
- shard-tglu-1: NOTRUN -> [SKIP][169] ([i915#3637] / [i915#9934])
[169]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-1/igt@[email protected]

* igt@kms_flip@2x-plain-flip-interruptible:
- shard-tglu: NOTRUN -> [SKIP][170] ([i915#3637] / [i915#9934]) +4 other tests skip
[170]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-7/igt@[email protected]

* igt@kms_flip@2x-single-buffer-flip-vs-dpms-off-vs-modeset:
- shard-mtlp: NOTRUN -> [SKIP][171] ([i915#3637] / [i915#9934])
[171]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-mtlp-4/igt@[email protected]

* igt@kms_flip@basic-flip-vs-dpms:
- shard-rkl: [PASS][172] -> [SKIP][173] ([i915#14544] / [i915#3637]) +8 other tests skip
[172]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-3/igt@[email protected]
[173]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_flip@flip-vs-fences-interruptible:
- shard-dg2: NOTRUN -> [SKIP][174] ([i915#8381])
[174]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]

* igt@kms_flip@wf_vblank-ts-check-interruptible:
- shard-glk10: NOTRUN -> [SKIP][175] +229 other tests skip
[175]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-glk10/igt@kms_flip@wf_vblank-ts-check-interruptible.html

* igt@kms_flip_scaled_crc@flip-32bpp-4tile-to-64bpp-4tile-upscaling:
- shard-tglu: NOTRUN -> [SKIP][176] ([i915#2672] / [i915#3555]) +1 other test skip
[176]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-7/igt@kms_flip_scaled_crc@flip-32bpp-4tile-to-64bpp-4tile-upscaling.html

* igt@kms_flip_scaled_crc@flip-32bpp-4tile-to-64bpp-4tile-upscaling@pipe-a-valid-mode:
- shard-tglu: NOTRUN -> [SKIP][177] ([i915#2587] / [i915#2672]) +1 other test skip
[177]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-7/igt@kms_flip_scaled_crc@[email protected]

* igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-32bpp-yftileccs-downscaling@pipe-a-valid-mode:
- shard-dg2: NOTRUN -> [SKIP][178] ([i915#2672]) +3 other tests skip
[178]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-32bpp-yftileccs-downscaling@pipe-a-valid-mode.html

* igt@kms_flip_scaled_crc@flip-32bpp-ytileccs-to-64bpp-ytile-downscaling:
- shard-tglu-1: NOTRUN -> [SKIP][179] ([i915#2587] / [i915#2672] / [i915#3555])
[179]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-1/igt@kms_flip_scaled_crc@flip-32bpp-ytileccs-to-64bpp-ytile-downscaling.html

* igt@kms_flip_scaled_crc@flip-32bpp-ytileccs-to-64bpp-ytile-downscaling@pipe-a-valid-mode:
- shard-tglu-1: NOTRUN -> [SKIP][180] ([i915#2587] / [i915#2672])
[180]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-1/igt@kms_flip_scaled_crc@flip-32bpp-ytileccs-to-64bpp-ytile-downscaling@pipe-a-valid-mode.html

* igt@kms_flip_scaled_crc@flip-32bpp-ytileccs-to-64bpp-ytile-upscaling:
- shard-dg2-9: NOTRUN -> [SKIP][181] ([i915#2672] / [i915#3555] / [i915#5190])
[181]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-9/igt@kms_flip_scaled_crc@flip-32bpp-ytileccs-to-64bpp-ytile-upscaling.html

* igt@kms_flip_scaled_crc@flip-64bpp-linear-to-16bpp-linear-downscaling:
- shard-rkl: [PASS][182] -> [SKIP][183] ([i915#14544] / [i915#3555]) +3 other tests skip
[182]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-3/igt@kms_flip_scaled_crc@flip-64bpp-linear-to-16bpp-linear-downscaling.html
[183]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@kms_flip_scaled_crc@flip-64bpp-linear-to-16bpp-linear-downscaling.html

* igt@kms_flip_scaled_crc@flip-64bpp-yftile-to-16bpp-yftile-upscaling:
- shard-dg2: NOTRUN -> [SKIP][184] ([i915#2672] / [i915#3555]) +2 other tests skip
[184]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@kms_flip_scaled_crc@flip-64bpp-yftile-to-16bpp-yftile-upscaling.html

* igt@kms_flip_scaled_crc@flip-64bpp-yftile-to-32bpp-yftile-upscaling:
- shard-rkl: NOTRUN -> [SKIP][185] ([i915#2672] / [i915#3555]) +2 other tests skip
[185]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-7/igt@kms_flip_scaled_crc@flip-64bpp-yftile-to-32bpp-yftile-upscaling.html
- shard-dg2-9: NOTRUN -> [SKIP][186] ([i915#2672] / [i915#3555])
[186]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-9/igt@kms_flip_scaled_crc@flip-64bpp-yftile-to-32bpp-yftile-upscaling.html

* igt@kms_flip_scaled_crc@flip-64bpp-yftile-to-32bpp-yftile-upscaling@pipe-a-valid-mode:
- shard-rkl: NOTRUN -> [SKIP][187] ([i915#2672]) +7 other tests skip
[187]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-7/igt@kms_flip_scaled_crc@flip-64bpp-yftile-to-32bpp-yftile-upscaling@pipe-a-valid-mode.html
- shard-dg2-9: NOTRUN -> [SKIP][188] ([i915#2672]) +1 other test skip
[188]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-9/igt@kms_flip_scaled_crc@flip-64bpp-yftile-to-32bpp-yftile-upscaling@pipe-a-valid-mode.html

* igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-16bpp-ytile-downscaling:
- shard-dg2: NOTRUN -> [SKIP][189] ([i915#2672] / [i915#3555] / [i915#5190])
[189]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-16bpp-ytile-downscaling.html

* igt@kms_frontbuffer_tracking@fbc-1p-primscrn-pri-indfb-draw-pwrite:
- shard-rkl: [PASS][190] -> [SKIP][191] ([i915#14544] / [i915#1849] / [i915#5354]) +4 other tests skip
[190]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-7/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-pri-indfb-draw-pwrite.html
[191]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-pri-indfb-draw-pwrite.html

* igt@kms_frontbuffer_tracking@fbc-2p-primscrn-pri-indfb-draw-pwrite:
- shard-dg2-9: NOTRUN -> [SKIP][192] ([i915#5354]) +11 other tests skip
[192]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-9/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-pri-indfb-draw-pwrite.html

* igt@kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-move:
- shard-mtlp: NOTRUN -> [SKIP][193] ([i915#1825]) +1 other test skip
[193]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-mtlp-4/igt@[email protected]

* igt@kms_frontbuffer_tracking@fbc-rgb101010-draw-mmap-gtt:
- shard-dg2: NOTRUN -> [SKIP][194] ([i915#8708]) +12 other tests skip
[194]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]

* igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-indfb-pgflip-blt:
- shard-tglu: NOTRUN -> [SKIP][195] +43 other tests skip
[195]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-8/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-indfb-pgflip-blt.html

* igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-spr-indfb-draw-mmap-gtt:
- shard-rkl: NOTRUN -> [SKIP][196] ([i915#1825]) +13 other tests skip
[196]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-7/igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-spr-indfb-draw-mmap-gtt.html

* igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-indfb-pgflip-blt:
- shard-dg2: NOTRUN -> [SKIP][197] ([i915#5354]) +17 other tests skip
[197]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-indfb-pgflip-blt.html

* igt@kms_frontbuffer_tracking@fbcpsr-rgb101010-draw-mmap-wc:
- shard-tglu-1: NOTRUN -> [SKIP][198] +38 other tests skip
[198]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-1/igt@[email protected]

* igt@kms_frontbuffer_tracking@psr-1p-primscrn-cur-indfb-move:
- shard-dg2: NOTRUN -> [SKIP][199] ([i915#3458]) +12 other tests skip
[199]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]

* igt@kms_frontbuffer_tracking@psr-1p-primscrn-indfb-msflip-blt:
- shard-dg2-9: NOTRUN -> [SKIP][200] ([i915#3458]) +7 other tests skip
[200]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-9/igt@[email protected]

* igt@kms_frontbuffer_tracking@psr-2p-primscrn-cur-indfb-draw-mmap-wc:
- shard-dg2-9: NOTRUN -> [SKIP][201] ([i915#8708]) +7 other tests skip
[201]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-9/igt@kms_frontbuffer_tracking@psr-2p-primscrn-cur-indfb-draw-mmap-wc.html

* igt@kms_frontbuffer_tracking@psr-indfb-scaledprimary:
- shard-rkl: NOTRUN -> [SKIP][202] ([i915#3023]) +12 other tests skip
[202]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-8/igt@[email protected]

* igt@kms_hdr@bpc-switch-dpms:
- shard-tglu-1: NOTRUN -> [SKIP][203] ([i915#3555] / [i915#8228])
[203]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-1/igt@[email protected]

* igt@kms_hdr@invalid-hdr:
- shard-dg2: NOTRUN -> [SKIP][204] ([i915#3555] / [i915#8228])
[204]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]

* igt@kms_hdr@invalid-metadata-sizes:
- shard-dg2: [PASS][205] -> [SKIP][206] ([i915#3555] / [i915#8228])
[205]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-dg2-11/igt@[email protected]
[206]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-1/igt@[email protected]

* igt@kms_invalid_mode@uint-max-clock:
- shard-rkl: [PASS][207] -> [SKIP][208] ([i915#14544] / [i915#3555] / [i915#8826]) +1 other test skip
[207]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-7/igt@[email protected]
[208]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_joiner@basic-force-big-joiner:
- shard-dg2: [PASS][209] -> [SKIP][210] ([i915#12388])
[209]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-dg2-11/igt@[email protected]
[210]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-7/igt@[email protected]

* igt@kms_joiner@basic-force-ultra-joiner:
- shard-dg2-9: NOTRUN -> [SKIP][211] ([i915#10656])
[211]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-9/igt@[email protected]

* igt@kms_joiner@basic-ultra-joiner:
- shard-tglu-1: NOTRUN -> [SKIP][212] ([i915#12339])
[212]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-1/igt@[email protected]

* igt@kms_joiner@invalid-modeset-force-ultra-joiner:
- shard-rkl: NOTRUN -> [SKIP][213] ([i915#12394])
[213]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-8/igt@[email protected]
- shard-tglu-1: NOTRUN -> [SKIP][214] ([i915#12394])
[214]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-1/igt@[email protected]

* igt@kms_lease@lease-invalid-plane:
- shard-rkl: [PASS][215] -> [SKIP][216] ([i915#14544]) +50 other tests skip
[215]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-2/igt@[email protected]
[216]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_plane@planar-pixel-format-settings:
- shard-rkl: [PASS][217] -> [SKIP][218] ([i915#14544] / [i915#9581])
[217]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-7/igt@[email protected]
[218]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_plane@plane-panning-bottom-right-suspend:
- shard-glk: NOTRUN -> [INCOMPLETE][219] ([i915#13026]) +1 other test incomplete
[219]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-glk9/igt@[email protected]

* igt@kms_plane_alpha_blend@alpha-basic:
- shard-glk: NOTRUN -> [FAIL][220] ([i915#12178])
[220]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-glk9/igt@[email protected]

* igt@kms_plane_alpha_blend@alpha-basic@pipe-a-hdmi-a-1:
- shard-glk: NOTRUN -> [FAIL][221] ([i915#7862]) +1 other test fail
[221]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-glk9/igt@kms_plane_alpha_blend@[email protected]

* igt@kms_plane_alpha_blend@alpha-transparent-fb:
- shard-rkl: [PASS][222] -> [SKIP][223] ([i915#14544] / [i915#7294]) +1 other test skip
[222]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-2/igt@[email protected]
[223]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_plane_alpha_blend@constant-alpha-max:
- shard-glk: NOTRUN -> [FAIL][224] ([i915#10647] / [i915#12169])
[224]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-glk9/igt@[email protected]

* igt@kms_plane_alpha_blend@constant-alpha-max@pipe-c-hdmi-a-1:
- shard-glk: NOTRUN -> [FAIL][225] ([i915#10647]) +1 other test fail
[225]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-glk9/igt@kms_plane_alpha_blend@[email protected]

* igt@kms_plane_lowres@tiling-4:
- shard-tglu-1: NOTRUN -> [SKIP][226] ([i915#3555])
[226]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-1/igt@[email protected]

* igt@kms_plane_lowres@tiling-yf:
- shard-tglu: NOTRUN -> [SKIP][227] ([i915#3555]) +2 other tests skip
[227]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-8/igt@[email protected]

* igt@kms_plane_multiple@2x-tiling-x:
- shard-tglu: NOTRUN -> [SKIP][228] ([i915#13958])
[228]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-7/igt@[email protected]

* igt@kms_plane_multiple@tiling-4:
- shard-rkl: NOTRUN -> [SKIP][229] ([i915#14259])
[229]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-8/igt@[email protected]
- shard-tglu-1: NOTRUN -> [SKIP][230] ([i915#14259])
[230]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-1/igt@[email protected]

* igt@kms_plane_multiple@tiling-yf:
- shard-dg2: NOTRUN -> [SKIP][231] ([i915#14259])
[231]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]

* igt@kms_plane_scaling@plane-scaler-unity-scaling-with-pixel-format:
- shard-rkl: [PASS][232] -> [SKIP][233] ([i915#14544] / [i915#8152])
[232]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-5/igt@kms_plane_scaling@plane-scaler-unity-scaling-with-pixel-format.html
[233]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@kms_plane_scaling@plane-scaler-unity-scaling-with-pixel-format.html

* igt@kms_plane_scaling@plane-scaler-unity-scaling-with-rotation@pipe-b:
- shard-rkl: NOTRUN -> [SKIP][234] ([i915#12247]) +3 other tests skip
[234]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-8/igt@kms_plane_scaling@[email protected]
- shard-tglu-1: NOTRUN -> [SKIP][235] ([i915#12247]) +4 other tests skip
[235]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-1/igt@kms_plane_scaling@[email protected]

* igt@kms_plane_scaling@plane-scaler-with-clipping-clamping-pixel-formats:
- shard-rkl: [PASS][236] -> [SKIP][237] ([i915#14544] / [i915#3555] / [i915#8152])
[236]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-3/igt@kms_plane_scaling@plane-scaler-with-clipping-clamping-pixel-formats.html
[237]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@kms_plane_scaling@plane-scaler-with-clipping-clamping-pixel-formats.html

* igt@kms_plane_scaling@plane-scaler-with-clipping-clamping-pixel-formats@pipe-a:
- shard-rkl: [PASS][238] -> [SKIP][239] ([i915#12247] / [i915#14544]) +3 other tests skip
[238]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-3/igt@kms_plane_scaling@[email protected]
[239]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@kms_plane_scaling@[email protected]

* igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-75:
- shard-rkl: [PASS][240] -> [SKIP][241] ([i915#12247] / [i915#14544] / [i915#6953] / [i915#8152])
[240]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-2/igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-75.html
[241]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-75.html

* igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-75@pipe-b:
- shard-rkl: [PASS][242] -> [SKIP][243] ([i915#12247] / [i915#14544] / [i915#8152]) +3 other tests skip
[242]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-2/igt@kms_plane_scaling@[email protected]
[243]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@kms_plane_scaling@[email protected]

* igt@kms_plane_scaling@planes-upscale-factor-0-25-downscale-factor-0-75:
- shard-rkl: [PASS][244] -> [SKIP][245] ([i915#12247] / [i915#14544] / [i915#3555] / [i915#6953] / [i915#8152])
[244]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-3/igt@kms_plane_scaling@planes-upscale-factor-0-25-downscale-factor-0-75.html
[245]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@kms_plane_scaling@planes-upscale-factor-0-25-downscale-factor-0-75.html

* igt@kms_pm_backlight@basic-brightness:
- shard-tglu-1: NOTRUN -> [SKIP][246] ([i915#9812])
[246]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-1/igt@[email protected]

* igt@kms_pm_dc@dc3co-vpb-simulation:
- shard-tglu-1: NOTRUN -> [SKIP][247] ([i915#9685])
[247]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-1/igt@[email protected]

* igt@kms_pm_dc@dc5-psr:
- shard-dg2-9: NOTRUN -> [SKIP][248] ([i915#9685])
[248]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-9/igt@[email protected]
- shard-rkl: NOTRUN -> [SKIP][249] ([i915#9685]) +1 other test skip
[249]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-7/igt@[email protected]

* igt@kms_pm_dc@dc5-retention-flops:
- shard-dg2: NOTRUN -> [SKIP][250] ([i915#3828])
[250]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]

* igt@kms_pm_dc@dc9-dpms:
- shard-rkl: NOTRUN -> [SKIP][251] ([i915#3361])
[251]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-8/igt@[email protected]
- shard-tglu-1: NOTRUN -> [SKIP][252] ([i915#4281])
[252]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-1/igt@[email protected]

* igt@kms_pm_rpm@cursor:
- shard-rkl: [PASS][253] -> [SKIP][254] ([i915#14544] / [i915#1849])
[253]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-3/igt@[email protected]
[254]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_pm_rpm@dpms-lpsp:
- shard-dg2: [PASS][255] -> [SKIP][256] ([i915#9519]) +2 other tests skip
[255]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-dg2-4/igt@[email protected]
[256]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-3/igt@[email protected]

* igt@kms_pm_rpm@dpms-mode-unset-non-lpsp:
- shard-tglu: NOTRUN -> [SKIP][257] ([i915#9519])
[257]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-8/igt@[email protected]

* igt@kms_pm_rpm@modeset-lpsp-stress:
- shard-rkl: [PASS][258] -> [SKIP][259] ([i915#9519])
[258]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-4/igt@[email protected]
[259]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-5/igt@[email protected]

* igt@kms_pm_rpm@modeset-lpsp-stress-no-wait:
- shard-dg2: NOTRUN -> [SKIP][260] ([i915#9519])
[260]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-6/igt@[email protected]

* igt@kms_pm_rpm@modeset-non-lpsp-stress-no-wait:
- shard-tglu-1: NOTRUN -> [SKIP][261] ([i915#9519])
[261]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-1/igt@[email protected]

* igt@kms_pm_rpm@system-suspend-modeset:
- shard-rkl: [PASS][262] -> [INCOMPLETE][263] ([i915#14419])
[262]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-8/igt@[email protected]
[263]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-3/igt@[email protected]

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

* igt@kms_properties@plane-properties-atomic:
- shard-rkl: [PASS][265] -> [SKIP][266] ([i915#11521] / [i915#14544])
[265]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-7/igt@[email protected]
[266]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_psr2_sf@fbc-pr-cursor-plane-move-continuous-sf:
- shard-snb: NOTRUN -> [SKIP][267] ([i915#11520]) +3 other tests skip
[267]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-snb5/igt@[email protected]

* igt@kms_psr2_sf@fbc-psr2-overlay-plane-move-continuous-exceed-fully-sf:
- shard-glk10: NOTRUN -> [SKIP][268] ([i915#11520]) +5 other tests skip
[268]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-glk10/igt@kms_psr2_sf@fbc-psr2-overlay-plane-move-continuous-exceed-fully-sf.html

* igt@kms_psr2_sf@fbc-psr2-overlay-plane-move-continuous-exceed-sf:
- shard-dg2: NOTRUN -> [SKIP][269] ([i915#11520]) +5 other tests skip
[269]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@kms_psr2_sf@fbc-psr2-overlay-plane-move-continuous-exceed-sf.html

* igt@kms_psr2_sf@fbc-psr2-overlay-primary-update-sf-dmg-area:
- shard-glk: NOTRUN -> [SKIP][270] ([i915#11520]) +4 other tests skip
[270]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-glk5/igt@[email protected]

* igt@kms_psr2_sf@pr-cursor-plane-move-continuous-exceed-fully-sf:
- shard-dg2-9: NOTRUN -> [SKIP][271] ([i915#11520]) +2 other tests skip
[271]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-9/igt@[email protected]

* igt@kms_psr2_sf@psr2-overlay-primary-update-sf-dmg-area:
- shard-rkl: NOTRUN -> [SKIP][272] ([i915#11520]) +2 other tests skip
[272]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-8/igt@[email protected]
- shard-tglu-1: NOTRUN -> [SKIP][273] ([i915#11520]) +3 other tests skip
[273]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-1/igt@[email protected]

* igt@kms_psr2_sf@psr2-primary-plane-update-sf-dmg-area-big-fb:
- shard-tglu: NOTRUN -> [SKIP][274] ([i915#11520]) +5 other tests skip
[274]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-8/igt@[email protected]

* igt@kms_psr@fbc-psr-cursor-plane-onoff:
- shard-mtlp: NOTRUN -> [SKIP][275] ([i915#9688]) +2 other tests skip
[275]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-mtlp-4/igt@[email protected]

* igt@kms_psr@fbc-psr-sprite-blt:
- shard-dg2-9: NOTRUN -> [SKIP][276] ([i915#1072] / [i915#9732]) +10 other tests skip
[276]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-9/igt@[email protected]

* igt@kms_psr@fbc-psr2-cursor-mmap-gtt:
- shard-glk: NOTRUN -> [SKIP][277] +160 other tests skip
[277]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-glk9/igt@[email protected]

* igt@kms_psr@psr-cursor-plane-move:
- shard-tglu-1: NOTRUN -> [SKIP][278] ([i915#9732]) +9 other tests skip
[278]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-1/igt@[email protected]

* igt@kms_psr@psr-cursor-plane-onoff:
- shard-tglu: NOTRUN -> [SKIP][279] ([i915#9732]) +13 other tests skip
[279]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-7/igt@[email protected]

* igt@kms_psr@psr-sprite-plane-onoff:
- shard-rkl: NOTRUN -> [SKIP][280] ([i915#1072] / [i915#9732]) +10 other tests skip
[280]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-7/igt@[email protected]

* igt@kms_psr@psr2-primary-mmap-gtt:
- shard-dg2: NOTRUN -> [SKIP][281] ([i915#1072] / [i915#9732]) +17 other tests skip
[281]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]

* igt@kms_rotation_crc@bad-tiling:
- shard-dg2: NOTRUN -> [SKIP][282] ([i915#12755])
[282]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]

* igt@kms_rotation_crc@primary-4-tiled-reflect-x-0:
- shard-tglu-1: NOTRUN -> [SKIP][283] ([i915#5289])
[283]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-1/igt@[email protected]

* igt@kms_rotation_crc@primary-y-tiled-reflect-x-90:
- shard-dg2: NOTRUN -> [SKIP][284] ([i915#12755] / [i915#5190])
[284]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]

* igt@kms_rotation_crc@primary-yf-tiled-reflect-x-180:
- shard-tglu: NOTRUN -> [SKIP][285] ([i915#5289])
[285]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-7/igt@[email protected]

* igt@kms_sequence@get-idle@pipe-b-hdmi-a-1:
- shard-rkl: NOTRUN -> [DMESG-WARN][286] ([i915#12964]) +2 other tests dmesg-warn
[286]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-4/igt@kms_sequence@[email protected]

* igt@kms_setmode@basic:
- shard-tglu-1: NOTRUN -> [FAIL][287] ([i915#5465]) +2 other tests fail
[287]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-1/igt@[email protected]

* igt@kms_tiled_display@basic-test-pattern:
- shard-dg2-9: NOTRUN -> [SKIP][288] ([i915#8623])
[288]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-9/igt@[email protected]
- shard-rkl: NOTRUN -> [SKIP][289] ([i915#8623])
[289]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-7/igt@[email protected]

* igt@kms_tiled_display@basic-test-pattern-with-chamelium:
- shard-dg2: NOTRUN -> [SKIP][290] ([i915#8623])
[290]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]

* igt@kms_universal_plane@cursor-fb-leak@pipe-d-edp-1:
- shard-mtlp: [PASS][291] -> [FAIL][292] ([i915#9196]) +1 other test fail
[291]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-mtlp-8/igt@kms_universal_plane@[email protected]
[292]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-mtlp-6/igt@kms_universal_plane@[email protected]

* igt@kms_vrr@flip-basic-fastset:
- shard-dg2: NOTRUN -> [SKIP][293] ([i915#9906])
[293]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]

* igt@kms_vrr@seamless-rr-switch-drrs:
- shard-tglu: NOTRUN -> [SKIP][294] ([i915#9906])
[294]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-7/igt@[email protected]

* igt@kms_vrr@seamless-rr-switch-vrr:
- shard-rkl: NOTRUN -> [SKIP][295] ([i915#9906])
[295]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-8/igt@[email protected]
- shard-tglu-1: NOTRUN -> [SKIP][296] ([i915#9906])
[296]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-1/igt@[email protected]

* igt@kms_writeback@writeback-check-output:
- shard-dg2-9: NOTRUN -> [SKIP][297] ([i915#2437]) +1 other test skip
[297]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-9/igt@[email protected]
- shard-rkl: NOTRUN -> [SKIP][298] ([i915#2437]) +1 other test skip
[298]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-7/igt@[email protected]

* igt@kms_writeback@writeback-check-output-xrgb2101010:
- shard-tglu: NOTRUN -> [SKIP][299] ([i915#2437] / [i915#9412])
[299]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-8/igt@[email protected]

* igt@kms_writeback@writeback-pixel-formats:
- shard-dg2: NOTRUN -> [SKIP][300] ([i915#2437] / [i915#9412]) +1 other test skip
[300]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]
- shard-mtlp: NOTRUN -> [SKIP][301] ([i915#2437] / [i915#9412])
[301]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-mtlp-4/igt@[email protected]

* igt@perf@global-sseu-config:
- shard-dg2: NOTRUN -> [SKIP][302] ([i915#7387])
[302]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]

* igt@perf@polling-small-buf:
- shard-rkl: [PASS][303] -> [FAIL][304] ([i915#14550])
[303]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-7/igt@[email protected]
[304]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@perf_pmu@interrupts-sync:
- shard-rkl: NOTRUN -> [FAIL][305] ([i915#14470])
[305]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-7/igt@[email protected]

* igt@perf_pmu@rc6@other-idle-gt0:
- shard-dg2: NOTRUN -> [SKIP][306] ([i915#8516])
[306]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@perf_pmu@[email protected]

* igt@prime_vgem@fence-write-hang:
- shard-dg2-9: NOTRUN -> [SKIP][307] ([i915#3708])
[307]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-9/igt@[email protected]
- shard-rkl: NOTRUN -> [SKIP][308] ([i915#3708])
[308]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-7/igt@[email protected]

* igt@sriov_basic@bind-unbind-vf@vf-4:
- shard-tglu: NOTRUN -> [FAIL][309] ([i915#12910]) +9 other tests fail
[309]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-7/igt@sriov_basic@[email protected]

* igt@sriov_basic@enable-vfs-bind-unbind-each:
- shard-dg2: NOTRUN -> [SKIP][310] ([i915#9917])
[310]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-5/igt@[email protected]

#### Possible fixes ####

* igt@fbdev@read:
- shard-rkl: [SKIP][311] ([i915#14544] / [i915#2582]) -> [PASS][312]
[311]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[312]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-7/igt@[email protected]

* igt@gem_ccs@suspend-resume:
- shard-dg2: [INCOMPLETE][313] ([i915#13356]) -> [PASS][314]
[313]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-dg2-5/igt@[email protected]
[314]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-6/igt@[email protected]

* igt@gem_ccs@suspend-resume@linear-compressed-compfmt0-lmem0-lmem0:
- shard-dg2: [INCOMPLETE][315] ([i915#12392] / [i915#13356]) -> [PASS][316]
[315]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-dg2-5/igt@gem_ccs@[email protected]
[316]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-6/igt@gem_ccs@[email protected]

* igt@gem_exec_balancer@sliced:
- shard-rkl: [DMESG-WARN][317] ([i915#12917] / [i915#12964]) -> [PASS][318]
[317]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-7/igt@[email protected]
[318]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-8/igt@[email protected]

* igt@gem_lmem_swapping@smem-oom@lmem0:
- shard-dg2: [TIMEOUT][319] ([i915#5493]) -> [PASS][320] +1 other test pass
[319]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-dg2-8/igt@gem_lmem_swapping@[email protected]
[320]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-4/igt@gem_lmem_swapping@[email protected]

* igt@gem_mmap_offset@clear-via-pagefault:
- shard-mtlp: [ABORT][321] ([i915#14809]) -> [PASS][322] +1 other test pass
[321]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-mtlp-4/igt@[email protected]
[322]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-mtlp-4/igt@[email protected]

* igt@gem_mmap_offset@clear@smem0:
- shard-rkl: [DMESG-WARN][323] ([i915#12964]) -> [PASS][324] +7 other tests pass
[323]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-7/igt@gem_mmap_offset@[email protected]
[324]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-8/igt@gem_mmap_offset@[email protected]

* igt@gem_pxp@reject-modify-context-protection-off-3:
- shard-rkl: [SKIP][325] ([i915#14544] / [i915#4270]) -> [PASS][326]
[325]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[326]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-8/igt@[email protected]

* igt@gem_pxp@verify-pxp-stale-ctx-execution:
- shard-rkl: [TIMEOUT][327] ([i915#12917] / [i915#12964]) -> [PASS][328] +2 other tests pass
[327]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[328]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-8/igt@[email protected]

* igt@i915_pm_rpm@debugfs-read:
- shard-dg1: [SKIP][329] ([i915#4423]) -> [PASS][330]
[329]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-dg1-13/igt@[email protected]
[330]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg1-12/igt@[email protected]

* igt@i915_pm_rps@reset:
- shard-snb: [INCOMPLETE][331] ([i915#13729] / [i915#13821]) -> [PASS][332]
[331]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-snb4/igt@[email protected]
[332]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-snb5/igt@[email protected]

* igt@kms_async_flips@crc:
- shard-rkl: [SKIP][333] ([i915#14544]) -> [PASS][334] +70 other tests pass
[333]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[334]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-2/igt@[email protected]

* igt@kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-0-hflip:
- shard-mtlp: [FAIL][335] ([i915#5138]) -> [PASS][336]
[335]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-mtlp-2/igt@[email protected]
[336]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-mtlp-1/igt@[email protected]

* igt@kms_color@gamma:
- shard-rkl: [SKIP][337] ([i915#12655] / [i915#14544]) -> [PASS][338] +1 other test pass
[337]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[338]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-7/igt@[email protected]

* igt@kms_cursor_legacy@basic-flip-before-cursor-legacy:
- shard-dg1: [DMESG-WARN][339] ([i915#4391] / [i915#4423]) -> [PASS][340]
[339]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-dg1-13/igt@[email protected]
[340]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg1-12/igt@[email protected]

* igt@kms_flip@2x-flip-vs-suspend@ab-vga1-hdmi-a1:
- shard-snb: [TIMEOUT][341] ([i915#14033]) -> [PASS][342] +1 other test pass
[341]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-snb4/igt@kms_flip@[email protected]
[342]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-snb1/igt@kms_flip@[email protected]

* igt@kms_flip@flip-vs-suspend-interruptible:
- shard-rkl: [INCOMPLETE][343] ([i915#6113]) -> [PASS][344]
[343]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-3/igt@[email protected]
[344]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-7/igt@[email protected]

* igt@kms_flip@flip-vs-suspend-interruptible@b-vga1:
- shard-snb: [DMESG-WARN][345] ([i915#13899]) -> [PASS][346] +1 other test pass
[345]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-snb6/igt@kms_flip@[email protected]
[346]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-snb6/igt@kms_flip@[email protected]

* igt@kms_flip@plain-flip-interruptible:
- shard-rkl: [SKIP][347] ([i915#14544] / [i915#3637]) -> [PASS][348] +8 other tests pass
[347]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[348]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-3/igt@[email protected]

* igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-64bpp-ytile-downscaling:
- shard-rkl: [SKIP][349] ([i915#14544] / [i915#3555]) -> [PASS][350] +4 other tests pass
[349]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-64bpp-ytile-downscaling.html
[350]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-3/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-64bpp-ytile-downscaling.html

* igt@kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-draw-pwrite:
- shard-dg2: [FAIL][351] ([i915#6880]) -> [PASS][352]
[351]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-dg2-5/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-draw-pwrite.html
[352]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-7/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-draw-pwrite.html

* igt@kms_frontbuffer_tracking@fbc-rgb565-draw-render:
- shard-rkl: [SKIP][353] ([i915#14544] / [i915#1849] / [i915#5354]) -> [PASS][354] +11 other tests pass
[353]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[354]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-3/igt@[email protected]

* igt@kms_hdr@static-toggle:
- shard-dg2: [SKIP][355] ([i915#3555] / [i915#8228]) -> [PASS][356] +1 other test pass
[355]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-dg2-4/igt@[email protected]
[356]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-11/igt@[email protected]

* igt@kms_invalid_mode@bad-vsync-end:
- shard-rkl: [SKIP][357] ([i915#14544] / [i915#3555] / [i915#8826]) -> [PASS][358] +2 other tests pass
[357]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[358]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-8/igt@[email protected]

* igt@kms_pipe_crc_basic@compare-crc-sanitycheck-nv12:
- shard-rkl: [SKIP][359] ([i915#11190] / [i915#14544]) -> [PASS][360]
[359]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[360]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-7/igt@[email protected]

* igt@kms_plane@plane-panning-top-left:
- shard-rkl: [SKIP][361] ([i915#14544] / [i915#8825]) -> [PASS][362] +1 other test pass
[361]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[362]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-3/igt@[email protected]

* igt@kms_plane_alpha_blend@alpha-7efc:
- shard-rkl: [SKIP][363] ([i915#14544] / [i915#7294]) -> [PASS][364] +1 other test pass
[363]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[364]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-2/igt@[email protected]

* igt@kms_plane_scaling@invalid-num-scalers:
- shard-rkl: [SKIP][365] ([i915#14544] / [i915#3555] / [i915#6953] / [i915#8152]) -> [PASS][366]
[365]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[366]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-7/igt@[email protected]

* igt@kms_plane_scaling@plane-downscale-factor-0-75-with-pixel-format:
- shard-rkl: [SKIP][367] ([i915#14544] / [i915#8152]) -> [PASS][368]
[367]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@kms_plane_scaling@plane-downscale-factor-0-75-with-pixel-format.html
[368]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-8/igt@kms_plane_scaling@plane-downscale-factor-0-75-with-pixel-format.html

* igt@kms_plane_scaling@planes-unity-scaling-downscale-factor-0-5@pipe-a:
- shard-rkl: [SKIP][369] ([i915#12247] / [i915#14544]) -> [PASS][370] +4 other tests pass
[369]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@kms_plane_scaling@[email protected]
[370]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-3/igt@kms_plane_scaling@[email protected]

* igt@kms_plane_scaling@planes-unity-scaling-downscale-factor-0-5@pipe-b:
- shard-rkl: [SKIP][371] ([i915#12247] / [i915#14544] / [i915#8152]) -> [PASS][372] +5 other tests pass
[371]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@kms_plane_scaling@[email protected]
[372]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-3/igt@kms_plane_scaling@[email protected]

* igt@kms_plane_scaling@planes-upscale-20x20:
- shard-rkl: [SKIP][373] ([i915#14544] / [i915#6953] / [i915#8152]) -> [PASS][374] +2 other tests pass
[373]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[374]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-2/igt@[email protected]

* igt@kms_pm_rpm@dpms-lpsp:
- shard-rkl: [SKIP][375] ([i915#9519]) -> [PASS][376] +2 other tests pass
[375]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-8/igt@[email protected]
[376]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-4/igt@[email protected]

* igt@kms_pm_rpm@modeset-non-lpsp-stress-no-wait:
- shard-rkl: [SKIP][377] ([i915#14544] / [i915#9519]) -> [PASS][378]
[377]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[378]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-5/igt@[email protected]

* igt@kms_properties@plane-properties-legacy:
- shard-rkl: [SKIP][379] ([i915#11521] / [i915#14544]) -> [PASS][380]
[379]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[380]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-7/igt@[email protected]

* igt@kms_vblank@ts-continuation-modeset:
- shard-dg1: [DMESG-WARN][381] ([i915#4423]) -> [PASS][382] +12 other tests pass
[381]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-dg1-18/igt@[email protected]
[382]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg1-16/igt@[email protected]

* igt@perf_pmu@most-busy-check-all:
- shard-rkl: [FAIL][383] ([i915#4349]) -> [PASS][384] +1 other test pass
[383]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-3/igt@[email protected]
[384]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-8/igt@[email protected]

* igt@prime_vgem@basic-fence-flip:
- shard-rkl: [SKIP][385] ([i915#14544] / [i915#3708]) -> [PASS][386]
[385]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[386]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-3/igt@[email protected]

#### Warnings ####

* igt@api_intel_bb@blit-reloc-purge-cache:
- shard-rkl: [SKIP][387] ([i915#8411]) -> [SKIP][388] ([i915#14544] / [i915#8411])
[387]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-2/igt@[email protected]
[388]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@api_intel_bb@crc32:
- shard-rkl: [SKIP][389] ([i915#6230]) -> [SKIP][390] ([i915#14544] / [i915#6230])
[389]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-7/igt@[email protected]
[390]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@device_reset@unbind-cold-reset-rebind:
- shard-rkl: [SKIP][391] ([i915#11078] / [i915#14544]) -> [SKIP][392] ([i915#11078])
[391]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[392]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-7/igt@[email protected]

* igt@gem_basic@multigpu-create-close:
- shard-rkl: [SKIP][393] ([i915#14544] / [i915#7697]) -> [SKIP][394] ([i915#7697])
[393]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[394]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-3/igt@[email protected]

* igt@gem_ccs@ctrl-surf-copy:
- shard-rkl: [SKIP][395] ([i915#14544] / [i915#3555] / [i915#9323]) -> [SKIP][396] ([i915#3555] / [i915#9323])
[395]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[396]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-2/igt@[email protected]

* igt@gem_create@create-ext-set-pat:
- shard-rkl: [SKIP][397] ([i915#14544] / [i915#8562]) -> [SKIP][398] ([i915#8562])
[397]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[398]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-5/igt@[email protected]

* igt@gem_ctx_sseu@invalid-sseu:
- shard-rkl: [SKIP][399] ([i915#14544] / [i915#280]) -> [SKIP][400] ([i915#280]) +1 other test skip
[399]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[400]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-5/igt@[email protected]

* igt@gem_exec_balancer@parallel-keep-in-fence:
- shard-rkl: [SKIP][401] ([i915#4525]) -> [SKIP][402] ([i915#14544] / [i915#4525])
[401]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-5/igt@[email protected]
[402]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@gem_exec_balancer@parallel-ordering:
- shard-rkl: [SKIP][403] ([i915#14544] / [i915#4525]) -> [SKIP][404] ([i915#4525])
[403]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[404]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-3/igt@[email protected]

* igt@gem_exec_reloc@basic-gtt-cpu:
- shard-rkl: [SKIP][405] ([i915#3281]) -> [SKIP][406] ([i915#14544] / [i915#3281]) +8 other tests skip
[405]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-3/igt@[email protected]
[406]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@gem_exec_reloc@basic-wc-gtt:
- shard-rkl: [SKIP][407] ([i915#14544] / [i915#3281]) -> [SKIP][408] ([i915#3281]) +12 other tests skip
[407]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[408]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-3/igt@[email protected]

* igt@gem_exec_schedule@semaphore-power:
- shard-rkl: [SKIP][409] ([i915#14544] / [i915#7276]) -> [SKIP][410] ([i915#7276])
[409]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[410]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-3/igt@[email protected]

* igt@gem_lmem_evict@dontneed-evict-race:
- shard-rkl: [SKIP][411] ([i915#14544] / [i915#4613] / [i915#7582]) -> [SKIP][412] ([i915#4613] / [i915#7582])
[411]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[412]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-5/igt@[email protected]

* igt@gem_lmem_swapping@random:
- shard-rkl: [SKIP][413] ([i915#4613]) -> [SKIP][414] ([i915#14544] / [i915#4613]) +2 other tests skip
[413]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-7/igt@[email protected]
[414]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@gem_lmem_swapping@verify-ccs:
- shard-rkl: [SKIP][415] ([i915#14544] / [i915#4613]) -> [SKIP][416] ([i915#4613]) +2 other tests skip
[415]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[416]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-5/igt@[email protected]

* igt@gem_media_vme:
- shard-rkl: [SKIP][417] ([i915#14544] / [i915#284]) -> [SKIP][418] ([i915#284])
[417]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@gem_media_vme.html
[418]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-8/igt@gem_media_vme.html

* igt@gem_pread@snoop:
- shard-rkl: [SKIP][419] ([i915#3282]) -> [SKIP][420] ([i915#14544] / [i915#3282]) +3 other tests skip
[419]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-2/igt@[email protected]
[420]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@gem_pxp@create-valid-protected-context:
- shard-rkl: [SKIP][421] ([i915#14544] / [i915#4270]) -> [TIMEOUT][422] ([i915#12964]) +1 other test timeout
[421]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[422]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-2/igt@[email protected]

* igt@gem_pxp@reject-modify-context-protection-off-1:
- shard-rkl: [SKIP][423] ([i915#14544] / [i915#4270]) -> [TIMEOUT][424] ([i915#12917] / [i915#12964])
[423]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[424]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-5/igt@[email protected]

* igt@gem_readwrite@beyond-eob:
- shard-rkl: [SKIP][425] ([i915#14544] / [i915#3282]) -> [SKIP][426] ([i915#3282]) +7 other tests skip
[425]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[426]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-8/igt@[email protected]

* igt@gem_set_tiling_vs_blt@tiled-to-untiled:
- shard-rkl: [SKIP][427] ([i915#14544] / [i915#8411]) -> [SKIP][428] ([i915#8411]) +2 other tests skip
[427]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[428]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-7/igt@[email protected]

* igt@gem_userptr_blits@unsync-overlap:
- shard-rkl: [SKIP][429] ([i915#3297]) -> [SKIP][430] ([i915#14544] / [i915#3297]) +3 other tests skip
[429]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-7/igt@[email protected]
[430]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@gem_userptr_blits@unsync-unmap:
- shard-rkl: [SKIP][431] ([i915#14544] / [i915#3297]) -> [SKIP][432] ([i915#3297]) +1 other test skip
[431]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[432]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-3/igt@[email protected]

* igt@gen9_exec_parse@bb-start-param:
- shard-rkl: [SKIP][433] ([i915#14544] / [i915#2527]) -> [SKIP][434] ([i915#2527]) +5 other tests skip
[433]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[434]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-3/igt@[email protected]

* igt@gen9_exec_parse@shadow-peek:
- shard-rkl: [SKIP][435] ([i915#2527]) -> [SKIP][436] ([i915#14544] / [i915#2527]) +2 other tests skip
[435]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-5/igt@[email protected]
[436]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@i915_module_load@resize-bar:
- shard-rkl: [SKIP][437] ([i915#14544] / [i915#6412]) -> [SKIP][438] ([i915#6412])
[437]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[438]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-8/igt@[email protected]

* igt@i915_pm_freq_api@freq-basic-api:
- shard-rkl: [SKIP][439] ([i915#8399]) -> [SKIP][440] ([i915#14544] / [i915#8399])
[439]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-7/igt@[email protected]
[440]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@i915_pm_rc6_residency@media-rc6-accuracy:
- shard-rkl: [SKIP][441] ([i915#14544]) -> [SKIP][442] +19 other tests skip
[441]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[442]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-2/igt@[email protected]

* igt@i915_pm_rc6_residency@rc6-idle:
- shard-rkl: [SKIP][443] ([i915#14498]) -> [SKIP][444] ([i915#14498] / [i915#14544])
[443]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-3/igt@[email protected]
[444]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_addfb_basic@clobberred-modifier:
- shard-dg1: [SKIP][445] ([i915#4212] / [i915#4423]) -> [SKIP][446] ([i915#4212])
[445]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-dg1-13/igt@[email protected]
[446]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg1-12/igt@[email protected]

* igt@kms_addfb_basic@invalid-smem-bo-on-discrete:
- shard-rkl: [SKIP][447] ([i915#12454] / [i915#12712] / [i915#14544]) -> [SKIP][448] ([i915#12454] / [i915#12712])
[447]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[448]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-5/igt@[email protected]

* igt@kms_atomic@plane-primary-overlay-mutable-zpos:
- shard-rkl: [SKIP][449] ([i915#9531]) -> [SKIP][450] ([i915#14544])
[449]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-5/igt@[email protected]
[450]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_big_fb@4-tiled-addfb:
- shard-rkl: [SKIP][451] ([i915#14544]) -> [SKIP][452] ([i915#5286]) +8 other tests skip
[451]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[452]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-8/igt@[email protected]

* igt@kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-180-hflip:
- shard-rkl: [SKIP][453] ([i915#5286]) -> [SKIP][454] ([i915#14544]) +4 other tests skip
[453]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-7/igt@[email protected]
[454]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_big_fb@linear-32bpp-rotate-90:
- shard-rkl: [SKIP][455] ([i915#3638]) -> [SKIP][456] ([i915#14544]) +6 other tests skip
[455]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-5/igt@[email protected]
[456]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_big_fb@linear-64bpp-rotate-90:
- shard-rkl: [SKIP][457] ([i915#14544]) -> [SKIP][458] ([i915#3638]) +4 other tests skip
[457]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[458]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-3/igt@[email protected]

* igt@kms_ccs@ccs-on-another-bo-4-tiled-mtl-rc-ccs@pipe-b-hdmi-a-2:
- shard-rkl: [SKIP][459] ([i915#14098] / [i915#6095]) -> [SKIP][460] ([i915#6095]) +3 other tests skip
[459]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-3/igt@kms_ccs@[email protected]
[460]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-8/igt@kms_ccs@[email protected]

* igt@kms_ccs@crc-primary-rotation-180-4-tiled-dg2-mc-ccs:
- shard-rkl: [SKIP][461] ([i915#14544]) -> [SKIP][462] ([i915#14098] / [i915#6095]) +18 other tests skip
[461]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[462]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-5/igt@[email protected]

* igt@kms_ccs@crc-primary-rotation-180-4-tiled-mtl-mc-ccs@pipe-a-hdmi-a-3:
- shard-dg1: [SKIP][463] ([i915#4423] / [i915#6095]) -> [SKIP][464] ([i915#6095]) +3 other tests skip
[463]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-dg1-13/igt@kms_ccs@[email protected]
[464]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg1-12/igt@kms_ccs@[email protected]

* igt@kms_ccs@crc-primary-suspend-yf-tiled-ccs:
- shard-rkl: [SKIP][465] ([i915#14098] / [i915#6095]) -> [SKIP][466] ([i915#14544]) +11 other tests skip
[465]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-2/igt@[email protected]
[466]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_ccs@random-ccs-data-4-tiled-lnl-ccs:
- shard-rkl: [SKIP][467] ([i915#12313]) -> [SKIP][468] ([i915#14544])
[467]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-2/igt@[email protected]
[468]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_chamelium_frames@hdmi-crc-nonplanar-formats:
- shard-dg1: [SKIP][469] ([i915#11151] / [i915#4423] / [i915#7828]) -> [SKIP][470] ([i915#11151] / [i915#7828]) +1 other test skip
[469]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-dg1-13/igt@[email protected]
[470]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg1-12/igt@[email protected]

* igt@kms_chamelium_hpd@dp-hpd-enable-disable-mode:
- shard-rkl: [SKIP][471] ([i915#11151] / [i915#14544] / [i915#7828]) -> [SKIP][472] ([i915#11151] / [i915#7828]) +10 other tests skip
[471]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[472]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-8/igt@[email protected]

* igt@kms_chamelium_hpd@vga-hpd-for-each-pipe:
- shard-rkl: [SKIP][473] ([i915#11151] / [i915#7828]) -> [SKIP][474] ([i915#11151] / [i915#14544] / [i915#7828]) +8 other tests skip
[473]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-3/igt@[email protected]
[474]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_content_protection@atomic:
- shard-dg1: [SKIP][475] ([i915#4423] / [i915#7116] / [i915#9424]) -> [SKIP][476] ([i915#7116] / [i915#9424])
[475]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-dg1-13/igt@[email protected]
[476]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg1-12/igt@[email protected]

* igt@kms_content_protection@atomic-dpms:
- shard-rkl: [SKIP][477] ([i915#7118] / [i915#9424]) -> [SKIP][478] ([i915#14544])
[477]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-5/igt@[email protected]
[478]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_content_protection@dp-mst-type-1:
- shard-rkl: [SKIP][479] ([i915#3116]) -> [SKIP][480] ([i915#14544])
[479]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-2/igt@[email protected]
[480]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_content_protection@mei-interface:
- shard-rkl: [SKIP][481] ([i915#9424]) -> [SKIP][482] ([i915#14544])
[481]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-3/igt@[email protected]
[482]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_content_protection@type1:
- shard-rkl: [SKIP][483] ([i915#14544]) -> [SKIP][484] ([i915#7118] / [i915#9424])
[483]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[484]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-7/igt@[email protected]

* igt@kms_cursor_crc@cursor-onscreen-32x32:
- shard-rkl: [SKIP][485] ([i915#14544]) -> [SKIP][486] ([i915#3555]) +3 other tests skip
[485]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[486]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-7/igt@[email protected]

* igt@kms_cursor_crc@cursor-random-512x170:
- shard-rkl: [SKIP][487] ([i915#13049]) -> [SKIP][488] ([i915#14544]) +1 other test skip
[487]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-7/igt@[email protected]
[488]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_cursor_crc@cursor-rapid-movement-32x10:
- shard-rkl: [SKIP][489] ([i915#3555]) -> [SKIP][490] ([i915#14544]) +4 other tests skip
[489]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-7/igt@[email protected]
[490]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_cursor_crc@cursor-rapid-movement-512x170:
- shard-rkl: [SKIP][491] ([i915#14544]) -> [SKIP][492] ([i915#13049]) +1 other test skip
[491]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[492]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-8/igt@[email protected]

* igt@kms_cursor_legacy@2x-flip-vs-cursor-legacy:
- shard-rkl: [SKIP][493] -> [SKIP][494] ([i915#14544]) +10 other tests skip
[493]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-7/igt@[email protected]
[494]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_cursor_legacy@basic-busy-flip-before-cursor-varying-size:
- shard-rkl: [SKIP][495] ([i915#14544]) -> [SKIP][496] ([i915#4103]) +1 other test skip
[495]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@kms_cursor_legacy@basic-busy-flip-before-cursor-varying-size.html
[496]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-7/igt@kms_cursor_legacy@basic-busy-flip-before-cursor-varying-size.html

* igt@kms_cursor_legacy@cursorb-vs-flipa-legacy:
- shard-dg1: [SKIP][497] ([i915#4423]) -> [SKIP][498] +3 other tests skip
[497]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-dg1-18/igt@[email protected]
[498]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg1-16/igt@[email protected]

* igt@kms_cursor_legacy@flip-vs-cursor-atomic:
- shard-rkl: [SKIP][499] ([i915#14544]) -> [FAIL][500] ([i915#2346])
[499]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[500]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-3/igt@[email protected]

* igt@kms_cursor_legacy@short-busy-flip-before-cursor-toggle:
- shard-rkl: [SKIP][501] ([i915#4103]) -> [SKIP][502] ([i915#14544])
[501]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-3/igt@[email protected]
[502]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_dirtyfb@drrs-dirtyfb-ioctl:
- shard-rkl: [SKIP][503] ([i915#14544]) -> [SKIP][504] ([i915#9723])
[503]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[504]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-5/igt@[email protected]

* igt@kms_dirtyfb@psr-dirtyfb-ioctl:
- shard-rkl: [SKIP][505] ([i915#9723]) -> [SKIP][506] ([i915#14544])
[505]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-5/igt@[email protected]
[506]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_dp_link_training@non-uhbr-sst:
- shard-rkl: [SKIP][507] ([i915#13749]) -> [SKIP][508] ([i915#14544])
[507]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-2/igt@[email protected]
[508]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_dp_linktrain_fallback@dp-fallback:
- shard-rkl: [SKIP][509] ([i915#14544]) -> [SKIP][510] ([i915#13707])
[509]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[510]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-2/igt@[email protected]

* igt@kms_dsc@dsc-fractional-bpp:
- shard-rkl: [SKIP][511] ([i915#3840]) -> [SKIP][512] ([i915#14544])
[511]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-7/igt@[email protected]
[512]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_dsc@dsc-with-bpc:
- shard-rkl: [SKIP][513] ([i915#14544]) -> [SKIP][514] ([i915#3555] / [i915#3840])
[513]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[514]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-5/igt@[email protected]

* igt@kms_feature_discovery@chamelium:
- shard-rkl: [SKIP][515] ([i915#14544] / [i915#4854]) -> [SKIP][516] ([i915#4854])
[515]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[516]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-8/igt@[email protected]

* igt@kms_feature_discovery@psr1:
- shard-rkl: [SKIP][517] ([i915#658]) -> [SKIP][518] ([i915#14544] / [i915#658]) +1 other test skip
[517]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-2/igt@[email protected]
[518]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_flip@2x-absolute-wf_vblank:
- shard-rkl: [SKIP][519] ([i915#14544] / [i915#9934]) -> [SKIP][520] ([i915#9934]) +7 other tests skip
[519]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@kms_flip@2x-absolute-wf_vblank.html
[520]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-7/igt@kms_flip@2x-absolute-wf_vblank.html

* igt@kms_flip@2x-flip-vs-dpms:
- shard-rkl: [SKIP][521] ([i915#9934]) -> [SKIP][522] ([i915#14544] / [i915#9934]) +6 other tests skip
[521]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-2/igt@[email protected]
[522]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_flip@absolute-wf_vblank-interruptible:
- shard-rkl: [DMESG-WARN][523] ([i915#12917] / [i915#12964]) -> [SKIP][524] ([i915#14544] / [i915#3637])
[523]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-5/igt@kms_flip@absolute-wf_vblank-interruptible.html
[524]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@kms_flip@absolute-wf_vblank-interruptible.html

* igt@kms_flip@basic-plain-flip:
- shard-rkl: [DMESG-WARN][525] ([i915#12964]) -> [SKIP][526] ([i915#14544] / [i915#3637])
[525]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-7/igt@[email protected]
[526]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_flip@flip-vs-suspend:
- shard-glk: [INCOMPLETE][527] ([i915#12745] / [i915#4839]) -> [INCOMPLETE][528] ([i915#12745] / [i915#4839] / [i915#6113])
[527]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-glk6/igt@[email protected]
[528]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-glk1/igt@[email protected]

* igt@kms_flip@flip-vs-suspend@a-hdmi-a1:
- shard-glk: [INCOMPLETE][529] ([i915#12745]) -> [INCOMPLETE][530] ([i915#12745] / [i915#6113])
[529]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-glk6/igt@kms_flip@[email protected]
[530]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-glk1/igt@kms_flip@[email protected]

* igt@kms_flip_scaled_crc@flip-32bpp-4tile-to-64bpp-4tile-upscaling:
- shard-rkl: [SKIP][531] ([i915#14544] / [i915#3555]) -> [SKIP][532] ([i915#2672] / [i915#3555]) +4 other tests skip
[531]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@kms_flip_scaled_crc@flip-32bpp-4tile-to-64bpp-4tile-upscaling.html
[532]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-8/igt@kms_flip_scaled_crc@flip-32bpp-4tile-to-64bpp-4tile-upscaling.html

* igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling:
- shard-rkl: [SKIP][533] ([i915#2672] / [i915#3555]) -> [SKIP][534] ([i915#14544] / [i915#3555]) +3 other tests skip
[533]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-3/igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling.html
[534]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling.html

* igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-draw-mmap-wc:
- shard-rkl: [DMESG-WARN][535] ([i915#12964]) -> [SKIP][536] ([i915#14544] / [i915#1849] / [i915#5354])
[535]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-2/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-draw-mmap-wc.html
[536]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-draw-mmap-wc.html

* igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-spr-indfb-draw-mmap-wc:
- shard-dg1: [SKIP][537] ([i915#4423] / [i915#8708]) -> [SKIP][538] ([i915#8708])
[537]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-dg1-18/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-spr-indfb-draw-mmap-wc.html
[538]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg1-16/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-spr-indfb-draw-mmap-wc.html

* igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-cur-indfb-draw-mmap-gtt:
- shard-rkl: [SKIP][539] ([i915#14544] / [i915#1849] / [i915#5354]) -> [SKIP][540] ([i915#1825]) +43 other tests skip
[539]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-cur-indfb-draw-mmap-gtt.html
[540]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-3/igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-cur-indfb-draw-mmap-gtt.html

* igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-spr-indfb-onoff:
- shard-rkl: [SKIP][541] ([i915#1825]) -> [SKIP][542] ([i915#14544] / [i915#1849] / [i915#5354]) +38 other tests skip
[541]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-5/igt@[email protected]
[542]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_frontbuffer_tracking@fbcpsr-rgb101010-draw-mmap-wc:
- shard-rkl: [SKIP][543] ([i915#14544] / [i915#1849] / [i915#5354]) -> [SKIP][544] ([i915#3023]) +29 other tests skip
[543]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[544]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-5/igt@[email protected]

* igt@kms_frontbuffer_tracking@fbcpsr-rgb565-draw-render:
- shard-dg2: [SKIP][545] ([i915#10433] / [i915#3458]) -> [SKIP][546] ([i915#3458]) +3 other tests skip
[545]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-dg2-4/igt@[email protected]
[546]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-3/igt@[email protected]

* igt@kms_frontbuffer_tracking@fbcpsr-tiling-4:
- shard-rkl: [SKIP][547] ([i915#14544] / [i915#1849] / [i915#5354]) -> [SKIP][548] ([i915#5439])
[547]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[548]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-7/igt@[email protected]

* igt@kms_frontbuffer_tracking@psr-1p-primscrn-pri-shrfb-draw-blt:
- shard-dg2: [SKIP][549] ([i915#3458]) -> [SKIP][550] ([i915#10433] / [i915#3458]) +5 other tests skip
[549]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-dg2-8/igt@[email protected]
[550]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg2-4/igt@[email protected]

* igt@kms_frontbuffer_tracking@psr-1p-primscrn-shrfb-msflip-blt:
- shard-rkl: [SKIP][551] ([i915#3023]) -> [SKIP][552] ([i915#14544] / [i915#1849] / [i915#5354]) +23 other tests skip
[551]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-5/igt@[email protected]
[552]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_frontbuffer_tracking@psr-modesetfrombusy:
- shard-dg1: [SKIP][553] ([i915#3458] / [i915#4423]) -> [SKIP][554] ([i915#3458]) +1 other test skip
[553]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-dg1-13/igt@[email protected]
[554]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg1-12/igt@[email protected]

* igt@kms_hdr@bpc-switch-dpms:
- shard-rkl: [SKIP][555] ([i915#14544]) -> [SKIP][556] ([i915#3555] / [i915#8228])
[555]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[556]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-5/igt@[email protected]

* igt@kms_hdr@brightness-with-hdr:
- shard-mtlp: [SKIP][557] ([i915#1187] / [i915#12713]) -> [SKIP][558] ([i915#12713])
[557]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-mtlp-1/igt@[email protected]
[558]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-mtlp-3/igt@[email protected]
- shard-rkl: [SKIP][559] ([i915#14544]) -> [SKIP][560] ([i915#1187] / [i915#12713])
[559]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[560]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-3/igt@[email protected]
- shard-dg1: [SKIP][561] ([i915#12713]) -> [SKIP][562] ([i915#1187] / [i915#12713])
[561]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-dg1-19/igt@[email protected]
[562]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg1-13/igt@[email protected]
- shard-tglu: [SKIP][563] ([i915#12713]) -> [SKIP][564] ([i915#1187] / [i915#12713])
[563]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-tglu-8/igt@[email protected]
[564]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-tglu-2/igt@[email protected]

* igt@kms_hdr@static-swap:
- shard-rkl: [SKIP][565] ([i915#3555] / [i915#8228]) -> [SKIP][566] ([i915#14544])
[565]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-5/igt@[email protected]
[566]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_joiner@basic-force-ultra-joiner:
- shard-rkl: [SKIP][567] ([i915#12394]) -> [SKIP][568] ([i915#12394] / [i915#14544])
[567]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-3/igt@[email protected]
[568]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_joiner@basic-ultra-joiner:
- shard-rkl: [SKIP][569] ([i915#12339] / [i915#14544]) -> [SKIP][570] ([i915#12339])
[569]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[570]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-5/igt@[email protected]

* igt@kms_joiner@invalid-modeset-big-joiner:
- shard-rkl: [SKIP][571] ([i915#10656]) -> [SKIP][572] ([i915#10656] / [i915#14544])
[571]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-5/igt@[email protected]
[572]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_joiner@invalid-modeset-force-big-joiner:
- shard-rkl: [SKIP][573] ([i915#12388]) -> [SKIP][574] ([i915#12388] / [i915#14544])
[573]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-7/igt@[email protected]
[574]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_plane@pixel-format-source-clamping:
- shard-rkl: [SKIP][575] ([i915#14544] / [i915#8825]) -> [DMESG-WARN][576] ([i915#12964])
[575]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[576]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-7/igt@[email protected]

* igt@kms_plane_multiple@2x-tiling-x:
- shard-rkl: [SKIP][577] ([i915#14544]) -> [SKIP][578] ([i915#13958])
[577]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[578]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-8/igt@[email protected]

* igt@kms_plane_scaling@plane-downscale-factor-0-5-with-rotation@pipe-a:
- shard-rkl: [SKIP][579] ([i915#12247]) -> [SKIP][580] ([i915#12247] / [i915#14544]) +1 other test skip
[579]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-2/igt@kms_plane_scaling@[email protected]
[580]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@kms_plane_scaling@[email protected]

* igt@kms_plane_scaling@plane-downscale-factor-0-5-with-rotation@pipe-b:
- shard-rkl: [SKIP][581] ([i915#12247]) -> [SKIP][582] ([i915#12247] / [i915#14544] / [i915#8152]) +2 other tests skip
[581]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-2/igt@kms_plane_scaling@[email protected]
[582]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@kms_plane_scaling@[email protected]

* igt@kms_plane_scaling@plane-scaler-with-clipping-clamping-rotation:
- shard-rkl: [SKIP][583] ([i915#3555]) -> [SKIP][584] ([i915#14544] / [i915#3555] / [i915#8152])
[583]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-7/igt@kms_plane_scaling@plane-scaler-with-clipping-clamping-rotation.html
[584]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@kms_plane_scaling@plane-scaler-with-clipping-clamping-rotation.html

* igt@kms_plane_scaling@plane-upscale-20x20-with-rotation@pipe-a:
- shard-rkl: [SKIP][585] ([i915#12247] / [i915#14544]) -> [SKIP][586] ([i915#12247])
[585]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@kms_plane_scaling@[email protected]
[586]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-7/igt@kms_plane_scaling@[email protected]

* igt@kms_plane_scaling@plane-upscale-20x20-with-rotation@pipe-b:
- shard-rkl: [SKIP][587] ([i915#12247] / [i915#14544] / [i915#8152]) -> [SKIP][588] ([i915#12247]) +1 other test skip
[587]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@kms_plane_scaling@[email protected]
[588]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-7/igt@kms_plane_scaling@[email protected]

* igt@kms_pm_backlight@bad-brightness:
- shard-rkl: [SKIP][589] ([i915#5354]) -> [SKIP][590] ([i915#14544] / [i915#5354]) +1 other test skip
[589]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-5/igt@[email protected]
[590]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_pm_backlight@basic-brightness:
- shard-rkl: [SKIP][591] ([i915#14544] / [i915#5354]) -> [SKIP][592] ([i915#5354])
[591]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[592]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-5/igt@[email protected]

* igt@kms_pm_dc@dc5-retention-flops:
- shard-rkl: [SKIP][593] ([i915#14544] / [i915#3828]) -> [SKIP][594] ([i915#3828])
[593]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[594]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-7/igt@[email protected]

* igt@kms_pm_lpsp@kms-lpsp:
- shard-rkl: [SKIP][595] ([i915#14544] / [i915#9340]) -> [SKIP][596] ([i915#3828])
[595]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[596]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-2/igt@[email protected]

* igt@kms_pm_lpsp@screens-disabled:
- shard-rkl: [SKIP][597] ([i915#8430]) -> [SKIP][598] ([i915#14544] / [i915#8430])
[597]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-7/igt@[email protected]
[598]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_pm_rpm@modeset-lpsp:
- shard-rkl: [SKIP][599] ([i915#14544] / [i915#9519]) -> [SKIP][600] ([i915#9519])
[599]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[600]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-8/igt@[email protected]

* igt@kms_prime@basic-crc-hybrid:
- shard-rkl: [SKIP][601] ([i915#6524]) -> [SKIP][602] ([i915#14544] / [i915#6524])
[601]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-2/igt@[email protected]
[602]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_psr2_sf@fbc-pr-overlay-primary-update-sf-dmg-area:
- shard-rkl: [SKIP][603] ([i915#11520]) -> [SKIP][604] ([i915#11520] / [i915#14544]) +7 other tests skip
[603]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-7/igt@[email protected]
[604]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_psr2_sf@fbc-psr2-cursor-plane-move-continuous-exceed-sf:
- shard-rkl: [SKIP][605] ([i915#11520] / [i915#14544]) -> [SKIP][606] ([i915#11520]) +9 other tests skip
[605]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[606]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-8/igt@[email protected]

* igt@kms_psr2_su@frontbuffer-xrgb8888:
- shard-rkl: [SKIP][607] ([i915#9683]) -> [SKIP][608] ([i915#14544] / [i915#9683])
[607]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-5/igt@[email protected]
[608]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_psr@fbc-psr2-primary-blt:
- shard-rkl: [SKIP][609] ([i915#1072] / [i915#14544] / [i915#9732]) -> [SKIP][610] ([i915#1072] / [i915#9732]) +25 other tests skip
[609]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[610]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-7/igt@[email protected]

* igt@kms_psr@fbc-psr2-sprite-render:
- shard-rkl: [SKIP][611] ([i915#1072] / [i915#9732]) -> [SKIP][612] ([i915#1072] / [i915#14544] / [i915#9732]) +19 other tests skip
[611]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-5/igt@[email protected]
[612]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_psr@psr-sprite-mmap-cpu:
- shard-dg1: [SKIP][613] ([i915#1072] / [i915#4423] / [i915#9732]) -> [SKIP][614] ([i915#1072] / [i915#9732]) +1 other test skip
[613]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-dg1-13/igt@[email protected]
[614]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-dg1-12/igt@[email protected]

* igt@kms_psr_stress_test@invalidate-primary-flip-overlay:
- shard-rkl: [SKIP][615] ([i915#9685]) -> [SKIP][616] ([i915#14544] / [i915#9685])
[615]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-5/igt@[email protected]
[616]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_rotation_crc@primary-yf-tiled-reflect-x-180:
- shard-rkl: [SKIP][617] ([i915#14544]) -> [SKIP][618] ([i915#5289]) +1 other test skip
[617]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[618]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-8/igt@[email protected]

* igt@kms_rotation_crc@primary-yf-tiled-reflect-x-90:
- shard-rkl: [SKIP][619] ([i915#5289]) -> [SKIP][620] ([i915#14544])
[619]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-7/igt@[email protected]
[620]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_rotation_crc@sprite-rotation-90:
- shard-rkl: [SKIP][621] ([i915#14544]) -> [DMESG-WARN][622] ([i915#12964])
[621]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[622]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-2/igt@[email protected]

* igt@kms_setmode@invalid-clone-exclusive-crtc:
- shard-rkl: [SKIP][623] ([i915#14544] / [i915#3555]) -> [SKIP][624] ([i915#3555])
[623]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[624]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-8/igt@[email protected]

* igt@kms_setmode@invalid-clone-single-crtc:
- shard-rkl: [SKIP][625] ([i915#3555]) -> [SKIP][626] ([i915#14544] / [i915#3555])
[625]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-2/igt@[email protected]
[626]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_tiled_display@basic-test-pattern-with-chamelium:
- shard-rkl: [SKIP][627] ([i915#8623]) -> [SKIP][628] ([i915#14544])
[627]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-2/igt@[email protected]
[628]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_vrr@seamless-rr-switch-virtual:
- shard-rkl: [SKIP][629] ([i915#9906]) -> [SKIP][630] ([i915#14544])
[629]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-7/igt@[email protected]
[630]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@kms_writeback@writeback-fb-id:
- shard-rkl: [SKIP][631] ([i915#14544] / [i915#2437]) -> [SKIP][632] ([i915#2437])
[631]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[632]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-3/igt@[email protected]

* igt@kms_writeback@writeback-fb-id-xrgb2101010:
- shard-rkl: [SKIP][633] ([i915#14544] / [i915#2437] / [i915#9412]) -> [SKIP][634] ([i915#2437] / [i915#9412])
[633]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[634]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-7/igt@[email protected]

* igt@perf@unprivileged-single-ctx-counters:
- shard-rkl: [SKIP][635] ([i915#14544] / [i915#2433]) -> [SKIP][636] ([i915#2433])
[635]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[636]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-5/igt@[email protected]

* igt@perf_pmu@rc6-all-gts:
- shard-rkl: [SKIP][637] ([i915#8516]) -> [SKIP][638] ([i915#14544] / [i915#8516])
[637]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-7/igt@[email protected]
[638]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@prime_vgem@coherency-gtt:
- shard-rkl: [SKIP][639] ([i915#3708]) -> [SKIP][640] ([i915#14544] / [i915#3708])
[639]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-3/igt@[email protected]
[640]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-6/igt@[email protected]

* igt@sriov_basic@enable-vfs-autoprobe-off:
- shard-rkl: [SKIP][641] ([i915#14544] / [i915#9917]) -> [SKIP][642] ([i915#9917]) +1 other test skip
[641]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17105/shard-rkl-6/igt@[email protected]
[642]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_153803v1/shard-rkl-3/igt@[email protected]

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

[i915#10307]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10307
[i915#10433]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10433
[i915#10434]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10434
[i915#10647]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10647
[i915#10656]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10656
[i915#1072]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/1072
[i915#1099]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/1099
[i915#11078]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11078
[i915#11151]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11151
[i915#11190]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11190
[i915#11441]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11441
[i915#11520]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11520
[i915#11521]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11521
[i915#11681]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11681
[i915#1187]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/1187
[i915#12169]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12169
[i915#12178]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12178
[i915#12247]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12247
[i915#12313]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12313
[i915#12339]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12339
[i915#12353]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12353
[i915#12358]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12358
[i915#12388]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12388
[i915#12392]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12392
[i915#12394]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12394
[i915#12454]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12454
[i915#12655]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12655
[i915#12712]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12712
[i915#12713]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12713
[i915#12745]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12745
[i915#12755]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12755
[i915#12796]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12796
[i915#12805]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12805
[i915#12910]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12910
[i915#12917]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12917
[i915#12964]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12964
[i915#13026]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13026
[i915#13046]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13046
[i915#13049]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13049
[i915#13196]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13196
[i915#13356]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13356
[i915#13363]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13363
[i915#13398]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13398
[i915#13691]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13691
[i915#13707]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13707
[i915#13729]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13729
[i915#13748]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13748
[i915#13749]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13749
[i915#13821]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13821
[i915#13899]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13899
[i915#13958]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13958
[i915#14033]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14033
[i915#14073]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14073
[i915#14098]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14098
[i915#14152]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14152
[i915#14259]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14259
[i915#14350]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14350
[i915#14419]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14419
[i915#14470]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14470
[i915#14498]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14498
[i915#14544]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14544
[i915#14550]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14550
[i915#14806]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14806
[i915#14809]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14809
[i915#1769]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/1769
[i915#1825]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/1825
[i915#1839]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/1839
[i915#1849]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/1849
[i915#2065]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2065
[i915#2346]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2346
[i915#2433]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2433
[i915#2437]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2437
[i915#2527]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2527
[i915#2582]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2582
[i915#2587]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2587
[i915#2658]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2658
[i915#2672]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2672
[i915#280]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/280
[i915#284]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/284
[i915#2856]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2856
[i915#3023]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3023
[i915#3116]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3116
[i915#3281]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3281
[i915#3282]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3282
[i915#3297]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3297
[i915#3299]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3299
[i915#3361]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3361
[i915#3458]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3458
[i915#3469]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3469
[i915#3539]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3539
[i915#3555]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3555
[i915#3637]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3637
[i915#3638]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3638
[i915#3708]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3708
[i915#3742]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3742
[i915#3828]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3828
[i915#3840]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3840
[i915#3936]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3936
[i915#3955]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3955
[i915#4077]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4077
[i915#4079]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4079
[i915#4083]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4083
[i915#4103]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4103
[i915#4212]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4212
[i915#4213]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4213
[i915#4270]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4270
[i915#4281]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4281
[i915#4349]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4349
[i915#4391]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4391
[i915#4423]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4423
[i915#4525]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4525
[i915#4538]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4538
[i915#4613]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4613
[i915#4812]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4812
[i915#4817]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4817
[i915#4839]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4839
[i915#4852]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4852
[i915#4854]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4854
[i915#4860]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4860
[i915#4881]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4881
[i915#4885]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4885
[i915#4958]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4958
[i915#5138]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5138
[i915#5190]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5190
[i915#5286]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5286
[i915#5289]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5289
[i915#5354]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5354
[i915#5439]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5439
[i915#5465]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5465
[i915#5493]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5493
[i915#5784]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5784
[i915#5882]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5882
[i915#5956]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5956
[i915#6095]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6095
[i915#6113]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6113
[i915#6230]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6230
[i915#6245]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6245
[i915#6412]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6412
[i915#6524]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6524
[i915#658]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/658
[i915#6590]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6590
[i915#6621]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6621
[i915#6805]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6805
[i915#6880]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6880
[i915#6944]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6944
[i915#6953]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6953
[i915#7116]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7116
[i915#7118]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7118
[i915#7276]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7276
[i915#7294]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7294
[i915#7387]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7387
[i915#7443]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7443
[i915#7582]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7582
[i915#7697]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7697
[i915#7707]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7707
[i915#7828]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7828
[i915#7862]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7862
[i915#8152]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8152
[i915#8228]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8228
[i915#8381]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8381
[i915#8399]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8399
[i915#8411]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8411
[i915#8428]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8428
[i915#8430]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8430
[i915#8516]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8516
[i915#8555]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8555
[i915#8562]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8562
[i915#8623]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8623
[i915#8708]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8708
[i915#8812]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8812
[i915#8814]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8814
[i915#8825]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8825
[i915#8826]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8826
[i915#9053]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9053
[i915#9196]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9196
[i915#9323]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9323
[i915#9340]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9340
[i915#9412]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9412
[i915#9424]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9424
[i915#9519]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9519
[i915#9531]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9531
[i915#9581]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9581
[i915#9683]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9683
[i915#9685]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9685
[i915#9688]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9688
[i915#9723]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9723
[i915#9732]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9732
[i915#9809]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9809
[i915#9812]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9812
[i915#9906]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9906
[i915#9917]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9917
[i915#9934]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9934

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

* Linux: CI_DRM_17105 -> Patchwork_153803v1

CI-20190529: 20190529
CI_DRM_17105: f2856d85f7452831ece60ff0d26aa6aa4d6a3a55 @ git://anongit.freedesktop.org/gfx-ci/linux
IGT_8519: 8519
Patchwork_153803v1: f2856d85f7452831ece60ff0d26aa6aa4d6a3a55 @ git://anongit.freedesktop.org/gfx-ci/linux
piglit_4509: fdc5a4ca11124ab8413c7988896eec4c97336694 @ git://anongit.freedesktop.org/piglit

== Logs ==

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

#73 lore raw

✗ Fi.CI.BUILD: failure for mm: remove nth_page() (rev2)

In reply to David Hildenbrand
== Series Details ==

== Series Details ==

Series: mm: remove nth_page() (rev2)
URL : https://patchwork.freedesktop.org/series/153803/
State : failure

== Summary ==

Error: patch https://patchwork.freedesktop.org/api/1.0/series/153803/revisions/2/mbox/ not applied
Applying: mm: stop making SPARSEMEM_VMEMMAP user-selectable
Applying: arm64: Kconfig: drop superfluous "select SPARSEMEM_VMEMMAP"
Applying: s390/Kconfig: drop superfluous "select SPARSEMEM_VMEMMAP"
Applying: x86/Kconfig: drop superfluous "select SPARSEMEM_VMEMMAP"
Applying: wireguard: selftests: remove CONFIG_SPARSEMEM_VMEMMAP=y from qemu kernel config
Applying: mm/page_alloc: reject unreasonable folio/compound page sizes in alloc_contig_range_noprof()
Applying: mm/memremap: reject unreasonable folio/compound page sizes in memremap_pages()
Applying: mm/hugetlb: check for unreasonable folio sizes when registering hstate
Applying: mm/mm_init: make memmap_init_compound() look more like prep_compound_page()
Applying: mm: sanity-check maximum folio size in folio_set_order()
Applying: mm: limit folio/compound page sizes in problematic kernel configs
Applying: mm: simplify folio_page() and folio_page_idx()
Applying: mm/hugetlb: cleanup hugetlb_folio_init_tail_vmemmap()
Applying: mm/mm/percpu-km: drop nth_page() usage within single allocation
Applying: fs: hugetlbfs: remove nth_page() usage within folio in adjust_range_hwpoison()
Applying: fs: hugetlbfs: cleanup folio in adjust_range_hwpoison()
Applying: mm/pagewalk: drop nth_page() usage within folio in folio_walk_start()
Applying: mm/gup: drop nth_page() usage within folio when recording subpages
Applying: mm/gup: remove record_subpages()
error: patch failed: mm/gup.c:2981
error: mm/gup.c: patch does not apply
error: Did you hand edit your patch?
It does not apply to blobs recorded in its index.
hint: Use 'git am --show-current-patch=diff' to see the failed patch
Using index info to reconstruct a base tree...
M mm/gup.c
Patch failed at 0019 mm/gup: remove record_subpages()
When you have resolved this problem, run "git am --continue".
If you prefer to skip this patch, run "git am --skip" instead.
To restore the original branch and stop patching, run "git am --abort".
Build failed, no error log produced

#74 lore raw

✗ Fi.CI.BUILD: failure for mm: remove nth_page() (rev3)

In reply to David Hildenbrand
== Series Details ==

== Series Details ==

Series: mm: remove nth_page() (rev3)
URL : https://patchwork.freedesktop.org/series/153803/
State : failure

== Summary ==

Error: patch https://patchwork.freedesktop.org/api/1.0/series/153803/revisions/3/mbox/ not applied
Applying: mm: stop making SPARSEMEM_VMEMMAP user-selectable
Applying: arm64: Kconfig: drop superfluous "select SPARSEMEM_VMEMMAP"
Applying: s390/Kconfig: drop superfluous "select SPARSEMEM_VMEMMAP"
Applying: x86/Kconfig: drop superfluous "select SPARSEMEM_VMEMMAP"
Applying: wireguard: selftests: remove CONFIG_SPARSEMEM_VMEMMAP=y from qemu kernel config
Applying: mm/page_alloc: reject unreasonable folio/compound page sizes in alloc_contig_range_noprof()
Applying: mm/memremap: reject unreasonable folio/compound page sizes in memremap_pages()
Applying: mm/hugetlb: check for unreasonable folio sizes when registering hstate
Applying: mm/mm_init: make memmap_init_compound() look more like prep_compound_page()
Applying: mm: sanity-check maximum folio size in folio_set_order()
Applying: mm: limit folio/compound page sizes in problematic kernel configs
Applying: mm: simplify folio_page() and folio_page_idx()
Applying: mm/hugetlb: cleanup hugetlb_folio_init_tail_vmemmap()
Applying: mm/mm/percpu-km: drop nth_page() usage within single allocation
Applying: fs: hugetlbfs: remove nth_page() usage within folio in adjust_range_hwpoison()
Applying: fs: hugetlbfs: cleanup folio in adjust_range_hwpoison()
Applying: mm/pagewalk: drop nth_page() usage within folio in folio_walk_start()
Applying: mm/gup: drop nth_page() usage within folio when recording subpages
Applying: mm/gup: remove record_subpages()
error: sha1 information is lacking or useless (mm/gup.c).
error: could not build fake ancestor
hint: Use 'git am --show-current-patch=diff' to see the failed patch
Patch failed at 0019 mm/gup: remove record_subpages()
When you have resolved this problem, run "git am --continue".
If you prefer to skip this patch, run "git am --skip" instead.
To restore the original branch and stop patching, run "git am --abort".
Build failed, no error log produced

#75 lore raw

✗ Fi.CI.BUILD: failure for mm: remove nth_page() (rev4)

In reply to David Hildenbrand
== Series Details ==

== Series Details ==

Series: mm: remove nth_page() (rev4)
URL : https://patchwork.freedesktop.org/series/153803/
State : failure

== Summary ==

Error: patch https://patchwork.freedesktop.org/api/1.0/series/153803/revisions/4/mbox/ not applied
Applying: mm: stop making SPARSEMEM_VMEMMAP user-selectable
Applying: arm64: Kconfig: drop superfluous "select SPARSEMEM_VMEMMAP"
Applying: s390/Kconfig: drop superfluous "select SPARSEMEM_VMEMMAP"
Applying: x86/Kconfig: drop superfluous "select SPARSEMEM_VMEMMAP"
Applying: wireguard: selftests: remove CONFIG_SPARSEMEM_VMEMMAP=y from qemu kernel config
Applying: mm/page_alloc: reject unreasonable folio/compound page sizes in alloc_contig_range_noprof()
Applying: mm/memremap: reject unreasonable folio/compound page sizes in memremap_pages()
Applying: mm/hugetlb: check for unreasonable folio sizes when registering hstate
Applying: mm/mm_init: make memmap_init_compound() look more like prep_compound_page()
Applying: mm: sanity-check maximum folio size in folio_set_order()
Applying: mm: limit folio/compound page sizes in problematic kernel configs
Applying: mm: simplify folio_page() and folio_page_idx()
Applying: mm/hugetlb: cleanup hugetlb_folio_init_tail_vmemmap()
Applying: mm/mm/percpu-km: drop nth_page() usage within single allocation
Applying: fs: hugetlbfs: remove nth_page() usage within folio in adjust_range_hwpoison()
Applying: fs: hugetlbfs: cleanup folio in adjust_range_hwpoison()
Applying: mm/pagewalk: drop nth_page() usage within folio in folio_walk_start()
Applying: mm/gup: drop nth_page() usage within folio when recording subpages
Applying: mm/gup: remove record_subpages()
error: sha1 information is lacking or useless (mm/gup.c).
error: could not build fake ancestor
hint: Use 'git am --show-current-patch=diff' to see the failed patch
Patch failed at 0019 mm/gup: remove record_subpages()
When you have resolved this problem, run "git am --continue".
If you prefer to skip this patch, run "git am --skip" instead.
To restore the original branch and stop patching, run "git am --abort".
Build failed, no error log produced

#76 lore raw

✗ Fi.CI.BUILD: failure for mm: remove nth_page() (rev5)

In reply to David Hildenbrand
== Series Details ==

== Series Details ==

Series: mm: remove nth_page() (rev5)
URL : https://patchwork.freedesktop.org/series/153803/
State : failure

== Summary ==

Error: patch https://patchwork.freedesktop.org/api/1.0/series/153803/revisions/5/mbox/ not applied
Applying: mm: stop making SPARSEMEM_VMEMMAP user-selectable
Applying: arm64: Kconfig: drop superfluous "select SPARSEMEM_VMEMMAP"
Applying: s390/Kconfig: drop superfluous "select SPARSEMEM_VMEMMAP"
Applying: x86/Kconfig: drop superfluous "select SPARSEMEM_VMEMMAP"
Applying: wireguard: selftests: remove CONFIG_SPARSEMEM_VMEMMAP=y from qemu kernel config
Applying: mm/page_alloc: reject unreasonable folio/compound page sizes in alloc_contig_range_noprof()
Applying: mm/memremap: reject unreasonable folio/compound page sizes in memremap_pages()
Applying: (bisected) [PATCH v2 08/37] mm/hugetlb: check for unreasonable folio sizes when registering hstate
error: patch failed: fs/Kconfig:283
error: fs/Kconfig: patch does not apply
error: Did you hand edit your patch?
It does not apply to blobs recorded in its index.
hint: Use 'git am --show-current-patch=diff' to see the failed patch
Using index info to reconstruct a base tree...
M fs/Kconfig
Patch failed at 0008 (bisected) [PATCH v2 08/37] mm/hugetlb: check for unreasonable folio sizes when registering hstate When you have resolved this problem, run "git am --continue".
If you prefer to skip this patch, run "git am --skip" instead.
To restore the original branch and stop patching, run "git am --abort".
Build failed, no error log produced