makedumpfile: Fix wrong exclusion of slab pages on Linux 6.2-rc1
Resolves: bz2155754 Upstream: https://github.com/makedumpfile/makedumpfile Conflict: None commit 5f17bdd2128998a3eeeb4521d136a192222fadb6 Author: Kazuhito Hagio <k-hagio-ab@nec.com> Date: Wed Dec 21 11:06:39 2022 +0900 [PATCH] Fix wrong exclusion of slab pages on Linux 6.2-rc1 * Required for kernel 6.2 Kernel commit 130d4df57390 ("mm/sl[au]b: rearrange struct slab fields to allow larger rcu_head"), which is contained in Linux 6.2-rc1 and later, made the offset of slab.slabs equal to page.mapping's one. As a result, "makedumpfile -d 8", which should exclude user data, excludes some slab pages wrongly because isAnon() returns true when slab.slabs is an odd number. With such dumpfiles, crash can fail to start session with an error like this: # crash vmlinux dumpfile ... crash: page excluded: kernel virtual address: ffff8fa047ac2fe8 type: "xa_node shift" Make isAnon() check that the page is not slab to fix this. Signed-off-by: Kazuhito Hagio <k-hagio-ab@nec.com> Reported-by: Baoquan He <bhe@redhat.com> Acked-by: Baoquan He <bhe@redhat.com> Signed-off-by: Coiby Xu <coxu@redhat.com>
This commit is contained in:
parent
4ffc0113a6
commit
f4c04c3d63
@ -0,0 +1,81 @@
|
|||||||
|
From 5f17bdd2128998a3eeeb4521d136a192222fadb6 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kazuhito Hagio <k-hagio-ab@nec.com>
|
||||||
|
Date: Wed, 21 Dec 2022 11:06:39 +0900
|
||||||
|
Subject: [PATCH] [PATCH] Fix wrong exclusion of slab pages on Linux 6.2-rc1
|
||||||
|
|
||||||
|
* Required for kernel 6.2
|
||||||
|
|
||||||
|
Kernel commit 130d4df57390 ("mm/sl[au]b: rearrange struct slab fields to
|
||||||
|
allow larger rcu_head"), which is contained in Linux 6.2-rc1 and later,
|
||||||
|
made the offset of slab.slabs equal to page.mapping's one. As a result,
|
||||||
|
"makedumpfile -d 8", which should exclude user data, excludes some slab
|
||||||
|
pages wrongly because isAnon() returns true when slab.slabs is an odd
|
||||||
|
number. With such dumpfiles, crash can fail to start session with an
|
||||||
|
error like this:
|
||||||
|
|
||||||
|
# crash vmlinux dumpfile
|
||||||
|
...
|
||||||
|
crash: page excluded: kernel virtual address: ffff8fa047ac2fe8 type: "xa_node shift"
|
||||||
|
|
||||||
|
Make isAnon() check that the page is not slab to fix this.
|
||||||
|
|
||||||
|
Signed-off-by: Kazuhito Hagio <k-hagio-ab@nec.com>
|
||||||
|
---
|
||||||
|
makedumpfile.c | 6 +++---
|
||||||
|
makedumpfile.h | 9 +++------
|
||||||
|
2 files changed, 6 insertions(+), 9 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/makedumpfile-1.7.2/makedumpfile.c b/makedumpfile-1.7.2/makedumpfile.c
|
||||||
|
index ff821eb..f403683 100644
|
||||||
|
--- a/makedumpfile-1.7.2/makedumpfile.c
|
||||||
|
+++ b/makedumpfile-1.7.2/makedumpfile.c
|
||||||
|
@@ -6502,7 +6502,7 @@ __exclude_unnecessary_pages(unsigned long mem_map,
|
||||||
|
*/
|
||||||
|
else if ((info->dump_level & DL_EXCLUDE_CACHE)
|
||||||
|
&& is_cache_page(flags)
|
||||||
|
- && !isPrivate(flags) && !isAnon(mapping)) {
|
||||||
|
+ && !isPrivate(flags) && !isAnon(mapping, flags)) {
|
||||||
|
pfn_counter = &pfn_cache;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
@@ -6510,7 +6510,7 @@ __exclude_unnecessary_pages(unsigned long mem_map,
|
||||||
|
*/
|
||||||
|
else if ((info->dump_level & DL_EXCLUDE_CACHE_PRI)
|
||||||
|
&& is_cache_page(flags)
|
||||||
|
- && !isAnon(mapping)) {
|
||||||
|
+ && !isAnon(mapping, flags)) {
|
||||||
|
if (isPrivate(flags))
|
||||||
|
pfn_counter = &pfn_cache_private;
|
||||||
|
else
|
||||||
|
@@ -6522,7 +6522,7 @@ __exclude_unnecessary_pages(unsigned long mem_map,
|
||||||
|
* - hugetlbfs pages
|
||||||
|
*/
|
||||||
|
else if ((info->dump_level & DL_EXCLUDE_USER_DATA)
|
||||||
|
- && (isAnon(mapping) || isHugetlb(compound_dtor))) {
|
||||||
|
+ && (isAnon(mapping, flags) || isHugetlb(compound_dtor))) {
|
||||||
|
pfn_counter = &pfn_user;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
diff --git a/makedumpfile-1.7.2/makedumpfile.h b/makedumpfile-1.7.2/makedumpfile.h
|
||||||
|
index 70a1a91..21dec7d 100644
|
||||||
|
--- a/makedumpfile-1.7.2/makedumpfile.h
|
||||||
|
+++ b/makedumpfile-1.7.2/makedumpfile.h
|
||||||
|
@@ -161,12 +161,9 @@ 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))
|
||||||
|
-
|
||||||
|
-static inline int
|
||||||
|
-isAnon(unsigned long mapping)
|
||||||
|
-{
|
||||||
|
- return ((unsigned long)mapping & PAGE_MAPPING_ANON) != 0;
|
||||||
|
-}
|
||||||
|
+#define isSlab(flags) test_bit(NUMBER(PG_slab), flags)
|
||||||
|
+#define isAnon(mapping, flags) (((unsigned long)mapping & PAGE_MAPPING_ANON) != 0 \
|
||||||
|
+ && !isSlab(flags))
|
||||||
|
|
||||||
|
#define PTOB(X) (((unsigned long long)(X)) << PAGESHIFT())
|
||||||
|
#define BTOP(X) (((unsigned long long)(X)) >> PAGESHIFT())
|
||||||
|
--
|
||||||
|
2.39.0
|
||||||
|
|
@ -105,6 +105,7 @@ Requires: systemd-udev%{?_isa}
|
|||||||
#
|
#
|
||||||
# Patches 601 onward are generic patches
|
# Patches 601 onward are generic patches
|
||||||
#
|
#
|
||||||
|
Patch601: kexec-tools-2.0.26-makedumpfile-Fix-wrong-exclusion-of-slab-pages-on-Linux-6.2.patch
|
||||||
|
|
||||||
%description
|
%description
|
||||||
kexec-tools provides /sbin/kexec binary that facilitates a new
|
kexec-tools provides /sbin/kexec binary that facilitates a new
|
||||||
@ -120,6 +121,7 @@ mkdir -p -m755 kcp
|
|||||||
tar -z -x -v -f %{SOURCE9}
|
tar -z -x -v -f %{SOURCE9}
|
||||||
tar -z -x -v -f %{SOURCE19}
|
tar -z -x -v -f %{SOURCE19}
|
||||||
|
|
||||||
|
%patch601 -p1
|
||||||
|
|
||||||
%ifarch ppc
|
%ifarch ppc
|
||||||
%define archdef ARCH=ppc
|
%define archdef ARCH=ppc
|
||||||
|
Loading…
Reference in New Issue
Block a user