Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package makedumpfile for openSUSE:Factory checked in at 2024-08-07 06:10:10 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/makedumpfile (Old) and /work/SRC/openSUSE:Factory/.makedumpfile.new.7232 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "makedumpfile" Wed Aug 7 06:10:10 2024 rev:93 rq:1191711 version:1.7.5 Changes: -------- --- /work/SRC/openSUSE:Factory/makedumpfile/makedumpfile.changes 2024-05-16 17:15:09.107871109 +0200 +++ /work/SRC/openSUSE:Factory/.makedumpfile.new.7232/makedumpfile.changes 2024-08-07 06:10:33.714715054 +0200 @@ -1,0 +2,7 @@ +Thu Aug 1 06:57:56 UTC 2024 - Jiri Slaby <jsl...@suse.cz> + +- add (bsc#1228388): + * 0001-PATCH-Fix-failure-of-hugetlb-pages-exclusion-on-Linu.patch + * 0002-PATCH-Fix-wrong-exclusion-of-Slab-pages-on-Linux-6.1.patch + +------------------------------------------------------------------- New: ---- 0001-PATCH-Fix-failure-of-hugetlb-pages-exclusion-on-Linu.patch 0002-PATCH-Fix-wrong-exclusion-of-Slab-pages-on-Linux-6.1.patch BETA DEBUG BEGIN: New:- add (bsc#1228388): * 0001-PATCH-Fix-failure-of-hugetlb-pages-exclusion-on-Linu.patch * 0002-PATCH-Fix-wrong-exclusion-of-Slab-pages-on-Linux-6.1.patch New: * 0001-PATCH-Fix-failure-of-hugetlb-pages-exclusion-on-Linu.patch * 0002-PATCH-Fix-wrong-exclusion-of-Slab-pages-on-Linux-6.1.patch BETA DEBUG END: ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ makedumpfile.spec ++++++ --- /var/tmp/diff_new_pack.nRRdI3/_old 2024-08-07 06:10:34.674755034 +0200 +++ /var/tmp/diff_new_pack.nRRdI3/_new 2024-08-07 06:10:34.678755200 +0200 @@ -40,6 +40,8 @@ Patch0: %{name}-override-libtinfo.patch Patch1: %{name}-ppc64-VA-range-SUSE.patch Patch2: %{name}-PN_XNUM.patch +Patch3: 0001-PATCH-Fix-failure-of-hugetlb-pages-exclusion-on-Linu.patch +Patch4: 0002-PATCH-Fix-wrong-exclusion-of-Slab-pages-on-Linux-6.1.patch BuildRequires: libbz2-devel BuildRequires: libdw-devel BuildRequires: libelf-devel ++++++ 0001-PATCH-Fix-failure-of-hugetlb-pages-exclusion-on-Linu.patch ++++++ From: Kazuhito Hagio <k-hagio...@nec.com> Date: Thu, 30 May 2024 16:59:02 +0900 Subject: [PATCH] Fix failure of hugetlb pages exclusion on Linux 6.9 and later Git-repo: https://github.com/makedumpfile/makedumpfile Git-commit: 985e575253f1c2de8d6876cfe685c68a24ee06e1 Patch-mainline: 1.7.6 References: bsc#1228388 * 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...@nec.com> Signed-off-by: Jiri Slaby (SUSE) <jirisl...@kernel.org> --- makedumpfile.c | 22 ++++++++++++++++++++-- makedumpfile.h | 3 +++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/makedumpfile.c b/makedumpfile.c index d7f1dd41d2ca..437ad916f816 100644 --- a/makedumpfile.c +++ b/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.h b/makedumpfile.h index 75b66ceaba21..f08c49fc73be 100644 --- a/makedumpfile.h +++ b/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.2 ++++++ 0002-PATCH-Fix-wrong-exclusion-of-Slab-pages-on-Linux-6.1.patch ++++++ From: Kazuhito Hagio <k-hagio...@nec.com> Date: Fri, 7 Jun 2024 15:34:05 +0900 Subject: [PATCH] Fix wrong exclusion of Slab pages on Linux 6.10-rc1 and later Git-repo: https://github.com/makedumpfile/makedumpfile Git-commit: bad2a7c4fa75d37a41578441468584963028bdda Patch-mainline: 1.7.6 References: bsc#1228388 * 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...@nec.com> Signed-off-by: Jiri Slaby (SUSE) <jirisl...@kernel.org> --- makedumpfile.c | 24 +++++++++++++++++++----- makedumpfile.h | 6 +++--- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/makedumpfile.c b/makedumpfile.c index 437ad916f816..5b347126db76 100644 --- a/makedumpfile.c +++ b/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.h b/makedumpfile.h index f08c49fc73be..6b43a8b44f93 100644 --- a/makedumpfile.h +++ b/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.2