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
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