Hi,
Thank you for the patch.
-----Original Message-----
Hi.
update patch:
From 0f5d39e416b2fa12d6afdb0a0222b2734e139455 Mon Sep 17 00:00:00 2001
From: xiaer1921 <xiaer1921(a)gmail.com>
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:
It would be preferable to mention CONFIG_SLAB:
Without the patch, "kmem -s|-S" options cannot work correctly on kernels
configured with CONFIG_SLAB with the following error:
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()
Please drop these extra errors.
Signed-off-by: xiaer1921 <xiaer1921(a)gmail.com>
---
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");
Hmm, probably these additional ANON_MEMBER_OFFSET_INIT() were used for anonymous
union. Looking at the current kernel source, they will not be needed.
And these OFFSET(page_s_mem) and etc. are set in the block for SLAB_OVERLOAD_PAGE,
so I think it would be more readable to do this here:
diff --git a/memory.c b/memory.c
index 8448ddc3a16c..7339f0cd0224 100644
--- a/memory.c
+++ b/memory.c
@@ -541,6 +541,15 @@ vm_init(void)
ANON_MEMBER_OFFSET_INIT(page_s_mem, "page", "s_mem");
ANON_MEMBER_OFFSET_INIT(page_freelist, "page", "freelist");
ANON_MEMBER_OFFSET_INIT(page_active, "page", "active");
+ /*
+ * Moved to struct slab in Linux 5.17
+ */
+ if (INVALID_MEMBER(page_s_mem))
+ MEMBER_OFFSET_INIT(page_s_mem, "slab", "s_mem");
+ if (INVALID_MEMBER(page_freelist))
+ MEMBER_OFFSET_INIT(page_freelist, "slab", "freelist");
+ if (INVALID_MEMBER(page_active))
+ MEMBER_OFFSET_INIT(page_active, "slab", "active");
}
if (!VALID_STRUCT(kmem_slab_s) && VALID_STRUCT(slab_s)) {
Could you try this and update your patch if it's ok?
Thanks,
Kazu
}
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 <xiaer1921(a)gmail.com>
> 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 <xiaer1921(a)gmail.com>
> ---
> 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
Crash-utility(a)redhat.com
https://listman.redhat.com/mailman/listinfo/crash-utility
Contribution Guidelines:
https://github.com/crash-utility/crash/wiki