Hi.

update patch:

From 0f5d39e416b2fa12d6afdb0a0222b2734e139455 Mon Sep 17 00:00:00 2001
From: xiaer1921 <[email protected]>
Date: Tue, 29 Mar 2022 20:03:03 +0800
Subject: [PATCH] Fix for "kmem -s|-S" on Linux 5.17.0+

Since the following kernel commits split slab info from struct page
into struct slab, crash cannot get several slab related offsets from
struct page.

  d122019bf061 ("mm: Split slab into its own type")
  401fb12c68c2 ("mm: Differentiate struct slab fields by sl*b implementations")
  07f910f9b729 ("mm: Remove slab from struct page")

Without the patch, "kmem -s|-S" options cannot work
correctly with the following errors:

  crash> kmem -s
  kmem: invalid structure member offset: page_active
        FILE: memory.c  LINE: 12225  FUNCTION: verify_slab_overload_page()

  [/usr/bin/crash] error trace: 532526 => 53353a => 5e0a6a => 5e09dc
  [Detaching after fork from child process 28299]

    5e09dc: OFFSET_verify.part.36+92
  [Detaching after fork from child process 28301]
    5e0a6a: OFFSET_verify+58
  [Detaching after fork from child process 28303]
    53353a: verify_slab_overload_page+588
  [Detaching after fork from child process 28305]
    532526: do_slab_chain_slab_overload_page+1171

  kmem: invalid structure member offset: page_active
        FILE: memory.c  LINE: 12225  FUNCTION: verify_slab_overload_page()

Signed-off-by: xiaer1921 <[email protected]>
---
 memory.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/memory.c b/memory.c
index 8448ddc..6240d4c 100644
--- a/memory.c
+++ b/memory.c
@@ -680,6 +680,12 @@ vm_init(void)
                        MEMBER_OFFSET_INIT(slab_s_mem, "slab", "s_mem");
                        MEMBER_OFFSET_INIT(slab_inuse, "slab", "inuse");
                        MEMBER_OFFSET_INIT(slab_free, "slab", "free");
+                       if (INVALID_MEMBER(page_s_mem))
+                                MEMBER_OFFSET_INIT(page_s_mem, "slab", 
"s_mem");
+                       if (INVALID_MEMBER(page_active))
+                                MEMBER_OFFSET_INIT(page_active, "slab", 
"active");
+                       if (INVALID_MEMBER(page_freelist))
+                                MEMBER_OFFSET_INIT(page_freelist, "slab", 
"freelist");
                        /*
                         *  slab members were moved to an anonymous union in 
2.6.39.
                         */
@@ -691,6 +697,12 @@ vm_init(void)
                                ANON_MEMBER_OFFSET_INIT(slab_inuse, "slab", 
"inuse");
                        if (INVALID_MEMBER(slab_free))
                                ANON_MEMBER_OFFSET_INIT(slab_free, "slab", 
"free");
+                       if (INVALID_MEMBER(page_s_mem))
+                               ANON_MEMBER_OFFSET_INIT(page_s_mem, "slab", 
"s_mem");
+                       if (INVALID_MEMBER(page_active))
+                               ANON_MEMBER_OFFSET_INIT(page_active, "slab", 
"active");
+                       if (INVALID_MEMBER(page_freelist))
+                               ANON_MEMBER_OFFSET_INIT(page_freelist, "slab", 
"freelist");
                }
 
                MEMBER_OFFSET_INIT(array_cache_avail, "array_cache", "avail");
-- 
2.7.4

在 2022/3/29 下午8:20, sholck 写道:
> Hello:
> 
> A patch named 0001-Fix-for-kmem-s-S-on-Linux-5.17.0.patch to fix "invalid 
> structure member offset: page_active #115", 
> you can get from attachment.
> 
> ================================================================
> 
> From c8bd4ad430abdfe2dc86149694f424ea24f2b7ec Mon Sep 17 00:00:00 2001
> From: xiaer1921 <[email protected]>
> Date: Tue, 29 Mar 2022 20:03:03 +0800
> Subject: [PATCH] Fix for "kmem -s|-S" on Linux 5.17.0+
> 
> Since the following kernel commits split slab info from struct page
> into struct slab, crash cannot get several slab related offsets from
> struct page.
> 
>   d122019bf061 ("mm: Split slab into its own type")
>   401fb12c68c2 ("mm: Differentiate struct slab fields by sl*b 
> implementations")
>   07f910f9b729 ("mm: Remove slab from struct page")
> 
> Without the patch, "kmem -s|-S" options cannot work
> correctly with the following errors:
> 
>   crash> kmem -s
>   kmem: invalid structure member offset: page_active
>         FILE: memory.c  LINE: 12225  FUNCTION: verify_slab_overload_page()
> 
>   [/usr/bin/crash] error trace: 532526 => 53353a => 5e0a6a => 5e09dc
>   [Detaching after fork from child process 28299]
> 
>     5e09dc: OFFSET_verify.part.36+92
>   [Detaching after fork from child process 28301]
>     5e0a6a: OFFSET_verify+58
>   [Detaching after fork from child process 28303]
>     53353a: verify_slab_overload_page+588
>   [Detaching after fork from child process 28305]
>     532526: do_slab_chain_slab_overload_page+1171
> 
>   kmem: invalid structure member offset: page_active
>         FILE: memory.c  LINE: 12225  FUNCTION: verify_slab_overload_page()
> 
> Signed-off-by: xiaer1921 <[email protected]>
> ---
>  memory.c | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/memory.c b/memory.c
> index 8448ddc..388b12d 100644
> --- a/memory.c
> +++ b/memory.c
> @@ -680,6 +680,8 @@ vm_init(void)
>                       MEMBER_OFFSET_INIT(slab_s_mem, "slab", "s_mem");
>                       MEMBER_OFFSET_INIT(slab_inuse, "slab", "inuse");
>                       MEMBER_OFFSET_INIT(slab_free, "slab", "free");
> +                        MEMBER_OFFSET_INIT(page_s_mem, "slab", "s_mem");
> +                        MEMBER_OFFSET_INIT(page_active, "slab", "active");
>                       /*
>                        *  slab members were moved to an anonymous union in 
> 2.6.39.
>                        */
> @@ -691,6 +693,10 @@ vm_init(void)
>                               ANON_MEMBER_OFFSET_INIT(slab_inuse, "slab", 
> "inuse");
>                       if (INVALID_MEMBER(slab_free))
>                               ANON_MEMBER_OFFSET_INIT(slab_free, "slab", 
> "free");
> +                     if (INVALID_MEMBER(page_s_mem))
> +                             ANON_MEMBER_OFFSET_INIT(page_s_mem, "slab", 
> "s_mem");
> +                     if (INVALID_MEMBER(page_active))
> +                             ANON_MEMBER_OFFSET_INIT(page_active, "slab", 
> "active");
>               }
>  
>               MEMBER_OFFSET_INIT(array_cache_avail, "array_cache", "avail");
> 

--
Crash-utility mailing list
[email protected]
https://listman.redhat.com/mailman/listinfo/crash-utility
Contribution Guidelines: https://github.com/crash-utility/crash/wiki

Reply via email to