Sorry, please ignore this patch. I will post v2 later.

Thanks
Lianbo

On Wed, Jun 19, 2024 at 10:30 AM Lianbo Jiang <lijiang@redhat.com> wrote:
Resolves: RHEL-40200

Signed-off-by: Lianbo Jiang <lijiang@redhat.com>
---
Scratch build: https://koji.fedoraproject.org/koji/taskinfo?taskID=119232649

 ...e-of-hugetlb-pages-exclusion-on-Linu.patch | 110 ++++++++++++++
 ...exclusion-of-Slab-pages-on-Linux-6.1.patch | 139 ++++++++++++++++++
 kexec-tools.spec                              |  10 +-
 3 files changed, 258 insertions(+), 1 deletion(-)
 create mode 100644 kexec-tools-2.0.28-makedumfpile-0001-PATCH-Fix-failure-of-hugetlb-pages-exclusion-on-Linu.patch
 create mode 100644 kexec-tools-2.0.28-makedumfpile-0002-PATCH-Fix-wrong-exclusion-of-Slab-pages-on-Linux-6.1.patch

diff --git a/kexec-tools-2.0.28-makedumfpile-0001-PATCH-Fix-failure-of-hugetlb-pages-exclusion-on-Linu.patch b/kexec-tools-2.0.28-makedumfpile-0001-PATCH-Fix-failure-of-hugetlb-pages-exclusion-on-Linu.patch
new file mode 100644
index 000000000000..bfed3cdbd26c
--- /dev/null
+++ b/kexec-tools-2.0.28-makedumfpile-0001-PATCH-Fix-failure-of-hugetlb-pages-exclusion-on-Linu.patch
@@ -0,0 +1,110 @@
+From 985e575253f1c2de8d6876cfe685c68a24ee06e1 Mon Sep 17 00:00:00 2001
+From: Kazuhito Hagio <k-hagio-ab@nec.com>
+Date: Thu, 30 May 2024 16:59:02 +0900
+Subject: [PATCH 1/2] [PATCH] Fix failure of hugetlb pages exclusion on Linux
+ 6.9 and later
+
+Resolves: RHEL-40200
+
+  commit 985e575253f1c2de8d6876cfe685c68a24ee06e1
+  Author: Kazuhito Hagio <k-hagio-ab@nec.com>
+  Date:   Thu May 30 16:59:02 2024 +0900
+
+    [PATCH] Fix failure of hugetlb pages exclusion on Linux 6.9 and later
+   
+    * Required for kernel 6.9
+   
+    Kernel commit d99e3140a4d3 ("mm: turn folio_test_hugetlb into a
+    PageType") moved the PG_hugetlb flag from folio._flags_1 into
+    page._mapcount and introduced NUMBER(PAGE_HUGETLB_MAPCOUNT_VALUE) entry
+    into vmcoreinfo.
+   
+    Without the patch, "makedumpfile -d 8" cannot exclude hugetlb pages.
+   
+    Signed-off-by: Kazuhito Hagio <k-hagio-ab@nec.com>
+
+
+Signed-off-by: Lianbo Jiang <lijiang@redhat.com>
+---
+ makedumpfile.c | 22 ++++++++++++++++++++--
+ makedumpfile.h |  3 +++
+ 2 files changed, 23 insertions(+), 2 deletions(-)
+
+diff --git a/makedumpfile-1.7.5/makedumpfile.c b/makedumpfile-1.7.5/makedumpfile.c
+index d7f1dd41d2ca..437ad916f816 100644
+--- a/makedumpfile-1.7.5/makedumpfile.c
++++ b/makedumpfile-1.7.5/makedumpfile.c
+@@ -2975,6 +2975,7 @@ read_vmcoreinfo(void)
+       READ_SRCFILE("pud_t", pud_t);
+
+       READ_NUMBER("PAGE_BUDDY_MAPCOUNT_VALUE", PAGE_BUDDY_MAPCOUNT_VALUE);
++      READ_NUMBER("PAGE_HUGETLB_MAPCOUNT_VALUE", PAGE_HUGETLB_MAPCOUNT_VALUE);
+       READ_NUMBER("PAGE_OFFLINE_MAPCOUNT_VALUE", PAGE_OFFLINE_MAPCOUNT_VALUE);
+       READ_NUMBER("phys_base", phys_base);
+       READ_NUMBER("KERNEL_IMAGE_SIZE", KERNEL_IMAGE_SIZE);
+@@ -6510,6 +6511,9 @@ __exclude_unnecessary_pages(unsigned long mem_map,
+               _count  = UINT(pcache + OFFSET(page._refcount));
+               mapping = ULONG(pcache + OFFSET(page.mapping));
+
++              if (OFFSET(page._mapcount) != NOT_FOUND_STRUCTURE)
++                      _mapcount = UINT(pcache + OFFSET(page._mapcount));
++
+               compound_order = 0;
+               compound_dtor = 0;
+               /*
+@@ -6520,6 +6524,22 @@ __exclude_unnecessary_pages(unsigned long mem_map,
+               if ((index_pg < PGMM_CACHED - 1) && isCompoundHead(flags)) {
+                       unsigned char *addr = pcache + SIZE(page);
+
++                      /*
++                       * Linux 6.9 and later kernels use _mapcount value for hugetlb pages.
++                       * See kernel commit d99e3140a4d3.
++                       */
++                      if (NUMBER(PAGE_HUGETLB_MAPCOUNT_VALUE) != NOT_FOUND_NUMBER) {
++                              unsigned long _flags_1 = ULONG(addr + OFFSET(page.flags));
++                              unsigned int PG_hugetlb = ~NUMBER(PAGE_HUGETLB_MAPCOUNT_VALUE);
++
++                              compound_order = _flags_1 & 0xff;
++
++                              if ((_mapcount & (PAGE_TYPE_BASE | PG_hugetlb)) == PAGE_TYPE_BASE)
++                                      compound_dtor = IS_HUGETLB;
++
++                              goto check_order;
++                      }
++
+                       /*
+                        * Linux 6.6 and later.  Kernels that have PG_hugetlb should also
+                        * have the compound order in the low byte of folio._flags_1.
+@@ -6564,8 +6584,6 @@ check_order:
+               if (OFFSET(page.compound_head) != NOT_FOUND_STRUCTURE)
+                       compound_head = ULONG(pcache + OFFSET(page.compound_head));
+
+-              if (OFFSET(page._mapcount) != NOT_FOUND_STRUCTURE)
+-                      _mapcount = UINT(pcache + OFFSET(page._mapcount));
+               if (OFFSET(page.private) != NOT_FOUND_STRUCTURE)
+                       private = ULONG(pcache + OFFSET(page.private));
+
+diff --git a/makedumpfile-1.7.5/makedumpfile.h b/makedumpfile-1.7.5/makedumpfile.h
+index 75b66ceaba21..f08c49fc73be 100644
+--- a/makedumpfile-1.7.5/makedumpfile.h
++++ b/makedumpfile-1.7.5/makedumpfile.h
+@@ -165,6 +165,8 @@ test_bit(int nr, unsigned long addr)
+ #define isAnon(mapping, flags)        (((unsigned long)mapping & PAGE_MAPPING_ANON) != 0 \
+                               && !isSlab(flags))
+
++#define PAGE_TYPE_BASE                (0xf0000000)
++
+ #define PTOB(X)                       (((unsigned long long)(X)) << PAGESHIFT())
+ #define BTOP(X)                       (((unsigned long long)(X)) >> PAGESHIFT())
+
+@@ -2255,6 +2257,7 @@ struct number_table {
+       long    PG_hugetlb;
+
+       long    PAGE_BUDDY_MAPCOUNT_VALUE;
++      long    PAGE_HUGETLB_MAPCOUNT_VALUE;
+       long    PAGE_OFFLINE_MAPCOUNT_VALUE;
+       long    SECTION_SIZE_BITS;
+       long    MAX_PHYSMEM_BITS;
+--
+2.45.1
+
diff --git a/kexec-tools-2.0.28-makedumfpile-0002-PATCH-Fix-wrong-exclusion-of-Slab-pages-on-Linux-6.1.patch b/kexec-tools-2.0.28-makedumfpile-0002-PATCH-Fix-wrong-exclusion-of-Slab-pages-on-Linux-6.1.patch
new file mode 100644
index 000000000000..66143104e952
--- /dev/null
+++ b/kexec-tools-2.0.28-makedumfpile-0002-PATCH-Fix-wrong-exclusion-of-Slab-pages-on-Linux-6.1.patch
@@ -0,0 +1,139 @@
+From bad2a7c4fa75d37a41578441468584963028bdda Mon Sep 17 00:00:00 2001
+From: Kazuhito Hagio <k-hagio-ab@nec.com>
+Date: Fri, 7 Jun 2024 15:34:05 +0900
+Subject: [PATCH 2/2] [PATCH] Fix wrong exclusion of Slab pages on Linux
+ 6.10-rc1 and later
+
+Resolves: RHEL-40200
+
+  commit bad2a7c4fa75d37a41578441468584963028bdda
+  Author: Kazuhito Hagio <k-hagio-ab@nec.com>
+  Date:   Fri Jun 7 15:34:05 2024 +0900
+
+    [PATCH] Fix wrong exclusion of Slab pages on Linux 6.10-rc1 and later
+   
+    * Required for kernel 6.10
+   
+    Kernel commit 46df8e73a4a3 ("mm: free up PG_slab") moved the PG_slab
+    flag from page.flags into page._mapcount (slab.__page_type), and
+    introduced NUMBER(PAGE_SLAB_MAPCOUNT_VALUE) entry into vmcoreinfo.
+   
+    Without the patch, "makedumpfile -d 8" option wrongly excludes Slab
+    pages and crash cannot open the dumpfile with an error like this:
+   
+      $ crash --kaslr auto vmlinux dumpfile
+      ...
+      please wait... (gathering task table data)
+      crash: page excluded: kernel virtual address: ffff909980440270 type: "xa_node.slots[off]"
+   
+    Signed-off-by: Kazuhito Hagio <k-hagio-ab@nec.com>
+
+Signed-off-by: Lianbo Jiang <lijiang@redhat.com>
+---
+ makedumpfile.c | 24 +++++++++++++++++++-----
+ makedumpfile.h |  6 +++---
+ 2 files changed, 22 insertions(+), 8 deletions(-)
+
+diff --git a/makedumpfile-1.7.5/makedumpfile.c b/makedumpfile-1.7.5/makedumpfile.c
+index 437ad916f816..5b347126db76 100644
+--- a/makedumpfile-1.7.5/makedumpfile.c
++++ b/makedumpfile-1.7.5/makedumpfile.c
+@@ -275,13 +275,26 @@ isHugetlb(unsigned long dtor)
+                  && (SYMBOL(free_huge_page) == dtor));
+ }
+
++static inline int
++isSlab(unsigned long flags, unsigned int _mapcount)
++{
++      /* Linux 6.10 and later */
++      if (NUMBER(PAGE_SLAB_MAPCOUNT_VALUE) != NOT_FOUND_NUMBER) {
++              unsigned int PG_slab = ~NUMBER(PAGE_SLAB_MAPCOUNT_VALUE);
++              if ((_mapcount & (PAGE_TYPE_BASE | PG_slab)) == PAGE_TYPE_BASE)
++                      return TRUE;
++      }
++
++      return flags & (1UL << NUMBER(PG_slab));
++}
++
+ static int
+ isOffline(unsigned long flags, unsigned int _mapcount)
+ {
+       if (NUMBER(PAGE_OFFLINE_MAPCOUNT_VALUE) == NOT_FOUND_NUMBER)
+               return FALSE;
+
+-      if (flags & (1UL << NUMBER(PG_slab)))
++      if (isSlab(flags, _mapcount))
+               return FALSE;
+
+       if (_mapcount == (int)NUMBER(PAGE_OFFLINE_MAPCOUNT_VALUE))
+@@ -2977,6 +2990,7 @@ read_vmcoreinfo(void)
+       READ_NUMBER("PAGE_BUDDY_MAPCOUNT_VALUE", PAGE_BUDDY_MAPCOUNT_VALUE);
+       READ_NUMBER("PAGE_HUGETLB_MAPCOUNT_VALUE", PAGE_HUGETLB_MAPCOUNT_VALUE);
+       READ_NUMBER("PAGE_OFFLINE_MAPCOUNT_VALUE", PAGE_OFFLINE_MAPCOUNT_VALUE);
++      READ_NUMBER("PAGE_SLAB_MAPCOUNT_VALUE", PAGE_SLAB_MAPCOUNT_VALUE);
+       READ_NUMBER("phys_base", phys_base);
+       READ_NUMBER("KERNEL_IMAGE_SIZE", KERNEL_IMAGE_SIZE);
+
+@@ -6043,7 +6057,7 @@ static int
+ page_is_buddy_v3(unsigned long flags, unsigned int _mapcount,
+                       unsigned long private, unsigned int _count)
+ {
+-      if (flags & (1UL << NUMBER(PG_slab)))
++      if (isSlab(flags, _mapcount))
+               return FALSE;
+
+       if (_mapcount == (int)NUMBER(PAGE_BUDDY_MAPCOUNT_VALUE))
+@@ -6618,7 +6632,7 @@ check_order:
+                */
+               else if ((info->dump_level & DL_EXCLUDE_CACHE)
+                   && is_cache_page(flags)
+-                  && !isPrivate(flags) && !isAnon(mapping, flags)) {
++                  && !isPrivate(flags) && !isAnon(mapping, flags, _mapcount)) {
+                       pfn_counter = &pfn_cache;
+               }
+               /*
+@@ -6626,7 +6640,7 @@ check_order:
+                */
+               else if ((info->dump_level & DL_EXCLUDE_CACHE_PRI)
+                   && is_cache_page(flags)
+-                  && !isAnon(mapping, flags)) {
++                  && !isAnon(mapping, flags, _mapcount)) {
+                       if (isPrivate(flags))
+                               pfn_counter = &pfn_cache_private;
+                       else
+@@ -6638,7 +6652,7 @@ check_order:
+                *  - hugetlbfs pages
+                */
+               else if ((info->dump_level & DL_EXCLUDE_USER_DATA)
+-                       && (isAnon(mapping, flags) || isHugetlb(compound_dtor))) {
++                       && (isAnon(mapping, flags, _mapcount) || isHugetlb(compound_dtor))) {
+                       pfn_counter = &pfn_user;
+               }
+               /*
+diff --git a/makedumpfile-1.7.5/makedumpfile.h b/makedumpfile-1.7.5/makedumpfile.h
+index f08c49fc73be..6b43a8b44f93 100644
+--- a/makedumpfile-1.7.5/makedumpfile.h
++++ b/makedumpfile-1.7.5/makedumpfile.h
+@@ -161,9 +161,8 @@ test_bit(int nr, unsigned long addr)
+ #define isSwapBacked(flags)   test_bit(NUMBER(PG_swapbacked), flags)
+ #define isHWPOISON(flags)     (test_bit(NUMBER(PG_hwpoison), flags) \
+                               && (NUMBER(PG_hwpoison) != NOT_FOUND_NUMBER))
+-#define isSlab(flags)         test_bit(NUMBER(PG_slab), flags)
+-#define isAnon(mapping, flags)        (((unsigned long)mapping & PAGE_MAPPING_ANON) != 0 \
+-                              && !isSlab(flags))
++#define isAnon(mapping, flags, _mapcount) \
++      (((unsigned long)mapping & PAGE_MAPPING_ANON) != 0 && !isSlab(flags, _mapcount))
+
+ #define PAGE_TYPE_BASE                (0xf0000000)
+
+@@ -2259,6 +2258,7 @@ struct number_table {
+       long    PAGE_BUDDY_MAPCOUNT_VALUE;
+       long    PAGE_HUGETLB_MAPCOUNT_VALUE;
+       long    PAGE_OFFLINE_MAPCOUNT_VALUE;
++      long    PAGE_SLAB_MAPCOUNT_VALUE;
+       long    SECTION_SIZE_BITS;
+       long    MAX_PHYSMEM_BITS;
+       long    HUGETLB_PAGE_DTOR;
+--
+2.45.1
+
diff --git a/kexec-tools.spec b/kexec-tools.spec
index d5458bc1fb66..38044a5a634b 100644
--- a/kexec-tools.spec
+++ b/kexec-tools.spec
@@ -6,7 +6,7 @@

 Name: kexec-tools
 Version: 2.0.28
-Release: 9%{?dist}
+Release: 10%{?dist}
 URL: https://kernel.org/pub/linux/utils/kernel/kexec
 License: GPL-2.0-only
 Summary: The kexec/kdump userspace component
@@ -53,6 +53,8 @@ Patch101: kexec-tools-2.0.28-Fix-building-on-x86_64-with-binutils-2.41.patch
 # kexec: don't use kexec_file_load on XEN
 # Author: Jiri Bohac <jbohac@suse.cz>
 Patch601: kexec-tools-2.0.28-kexec-don-t-use-kexec_file_load-on-XEN.patch
+Patch602: kexec-tools-2.0.28-makedumfpile-0001-PATCH-Fix-failure-of-hugetlb-pages-exclusion-on-Linu.patch
+Patch603: kexec-tools-2.0.28-makedumfpile-0002-PATCH-Fix-wrong-exclusion-of-Slab-pages-on-Linux-6.1.patch

 %description
 kexec-tools provides /sbin/kexec binary that facilitates a new
@@ -137,6 +139,8 @@ tar -z -x -v -f %{SOURCE19}

 %patch 101 -p1
 %patch 601 -p1
+%patch 602 -p1
+%patch 603 -p1

 %ifarch ppc
 %define archdef ARCH=ppc
@@ -292,6 +296,10 @@ fi


 %changelog
+* Tue Jun 18 2024 Lianbo Jiang <lijiang@redhat.com> - 2.0.28-10
+- Fix failure of hugetlb pages exclusion on Linux 6.9 and later
+- Fix wrong exclusion of Slab pages on Linux 6.10-rc1 and later
+
 * Thu Apr 25 2024 Coiby Xu <coxu@redhat.com> - 2.0.28-9
 - Update to makedumpfile-1.7.5

--
2.45.1