Release 2.0.28-12

Resolves: RHEL-40200

Signed-off-by: Tao Liu <ltao@redhat.com>
This commit is contained in:
Tao Liu 2024-06-19 09:10:19 +08:00
parent a331745281
commit 90e4406c58
3 changed files with 236 additions and 1 deletions

View File

@ -0,0 +1,99 @@
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
* 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>
---
makedumpfile.c | 22 ++++++++++++++++++++--
makedumpfile.h | 3 +++
2 files changed, 23 insertions(+), 2 deletions(-)
diff --git a/makedumpfile-1.7.4/makedumpfile.c b/makedumpfile-1.7.4/makedumpfile.c
index d7f1dd4..437ad91 100644
--- a/makedumpfile-1.7.4/makedumpfile.c
+++ b/makedumpfile-1.7.4/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.4/makedumpfile.h b/makedumpfile-1.7.4/makedumpfile.h
index 75b66ce..f08c49f 100644
--- a/makedumpfile-1.7.4/makedumpfile.h
+++ b/makedumpfile-1.7.4/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.40.1

View File

@ -0,0 +1,129 @@
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
* 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>
---
makedumpfile.c | 24 +++++++++++++++++++-----
makedumpfile.h | 6 +++---
2 files changed, 22 insertions(+), 8 deletions(-)
diff --git a/makedumpfile-1.7.4/makedumpfile.c b/makedumpfile-1.7.4/makedumpfile.c
index 437ad91..5b34712 100644
--- a/makedumpfile-1.7.4/makedumpfile.c
+++ b/makedumpfile-1.7.4/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.4/makedumpfile.h b/makedumpfile-1.7.4/makedumpfile.h
index f08c49f..6b43a8b 100644
--- a/makedumpfile-1.7.4/makedumpfile.h
+++ b/makedumpfile-1.7.4/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.40.1

View File

@ -6,7 +6,7 @@
Name: kexec-tools
Version: 2.0.28
Release: 11%{?dist}
Release: 12%{?dist}
URL: https://kernel.org/pub/linux/utils/kernel/kexec
License: GPL-2.0-only
Summary: The kexec/kdump userspace component
@ -62,6 +62,8 @@ Patch606: 0004-Install-the-driver-of-physical-device-for-a-SR-IOV-v.patch
Patch607: 0005-update-98-kexec-rules-for-crash-hotplug.patch
Patch608: 0006-sysconfig-add-pcie_ports-compat-to-KDUMP_COMMANDLINE.patch
Patch609: 0007-fadump-udev-do-not-re-register-fadump-if-kernel-hotp.patch
Patch610: kexec-tools-2.0.28-makedumpfile-0002-PATCH-Fix-failure-of-hugetlb-pages-exclusion-on-Linu.patch
Patch611: kexec-tools-2.0.28-makedumpfile-0003-PATCH-Fix-wrong-exclusion-of-Slab-pages-on-Linux-6.1.patch
%description
kexec-tools provides /sbin/kexec binary that facilitates a new
@ -154,6 +156,8 @@ tar -z -x -v -f %{SOURCE19}
%patch 607 -p1 -d kdump-utils-%{kdump_utils_ver}
%patch 608 -p1 -d kdump-utils-%{kdump_utils_ver}
%patch 609 -p1 -d kdump-utils-%{kdump_utils_ver}
%patch 610 -p1
%patch 611 -p1
%ifarch ppc
%define archdef ARCH=ppc
@ -306,6 +310,9 @@ fi
%changelog
* Wed Jun 19 2024 Tao Liu <ltao@redhat.com> - 2.0.28-12
- Resolves: RHEL-40200
* Fri May 31 2024 Lichen Liu <lichliu@redhat.com> - 2.0.28-11
- Re-apply upstream patches
- Resolves: RHEL-37670