Re: invalid structure member offset: page_active #115

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

Thank you for the patch.

> -----Original Message-----
> Hi.
> 
> update patch:
> 
> From 0f5d39e416b2fa12d6afdb0a0222b2734e139455 Mon Sep 17 00:00:00 2001
> From: xiaer1921 <xiaer1921@xxxxxxxxx>
> 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@xxxxxxxxx>
> ---
>  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@xxxxxxxxx>
> > 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@xxxxxxxxx>
> > ---
> >  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@xxxxxxxxxx
> https://listman.redhat.com/mailman/listinfo/crash-utility
> Contribution Guidelines: https://github.com/crash-utility/crash/wiki
--
Crash-utility mailing list
Crash-utility@xxxxxxxxxx
https://listman.redhat.com/mailman/listinfo/crash-utility
Contribution Guidelines: https://github.com/crash-utility/crash/wiki




[Index of Archives]     [Fedora Development]     [Fedora Desktop]     [Fedora SELinux]     [Yosemite News]     [KDE Users]     [Fedora Tools]

 

Powered by Linux