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

Reply via email to