2014-04-11 15:50:45

by Petr Tesařík

[permalink] [raw]
Subject: [PATCH] Save PG_head_mask in VMCOREINFO

To allow filtering of huge pages, makedumpfile must be able to
identify them in the dump. This can be done by checking the
appropriate page flag, so communicate its value to makedumpfile
through the VMCOREINFO interface.

There's only one small catch. Depending on how many page flags
are available on a given architecture, this bit can be called
PG_head or PG_compound.

I sent a similar patch back in 2012, but Eric Biederman did not
like using an #ifdef. So, this time I'm adding a common symbol
(PG_head_mask) instead.

See https://lkml.org/lkml/2012/11/28/91 for the previous version.

Signed-off-by: Petr Tesarik <[email protected]>
---
include/linux/page-flags.h | 3 +++
kernel/kexec.c | 1 +
2 files changed, 4 insertions(+)

diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h
index d1fe1a7..bc2007e 100644
--- a/include/linux/page-flags.h
+++ b/include/linux/page-flags.h
@@ -348,6 +348,9 @@ static inline void ClearPageCompound(struct page
*page) ClearPageHead(page);
}
#endif
+
+#define PG_head_mask ((1L << PG_head))
+
#else
/*
* Reduce page flag use as much as possible by overlapping
diff --git a/kernel/kexec.c b/kernel/kexec.c
index c8380ad..e6f3aec 100644
--- a/kernel/kexec.c
+++ b/kernel/kexec.c
@@ -1622,6 +1622,7 @@ static int __init crash_save_vmcoreinfo_init(void)
#ifdef CONFIG_MEMORY_FAILURE
VMCOREINFO_NUMBER(PG_hwpoison);
#endif
+ VMCOREINFO_NUMBER(PG_head_mask);
VMCOREINFO_NUMBER(PAGE_BUDDY_MAPCOUNT_VALUE);

arch_crash_save_vmcoreinfo();
--
1.8.4.5


2014-04-15 09:02:17

by Petr Tesařík

[permalink] [raw]
Subject: Re: [PATCH] Save PG_head_mask in VMCOREINFO

On Fri, 11 Apr 2014 17:50:39 +0200
Petr Tesarik <[email protected]> wrote:

> To allow filtering of huge pages, makedumpfile must be able to
> identify them in the dump. This can be done by checking the
> appropriate page flag, so communicate its value to makedumpfile
> through the VMCOREINFO interface.
>
> There's only one small catch. Depending on how many page flags
> are available on a given architecture, this bit can be called
> PG_head or PG_compound.
>
> I sent a similar patch back in 2012, but Eric Biederman did not
> like using an #ifdef. So, this time I'm adding a common symbol
> (PG_head_mask) instead.

Any opinion on this patch?

TIA,
Petr T

> See https://lkml.org/lkml/2012/11/28/91 for the previous version.
>
> Signed-off-by: Petr Tesarik <[email protected]>
> ---
> include/linux/page-flags.h | 3 +++
> kernel/kexec.c | 1 +
> 2 files changed, 4 insertions(+)
>
> diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h
> index d1fe1a7..bc2007e 100644
> --- a/include/linux/page-flags.h
> +++ b/include/linux/page-flags.h
> @@ -348,6 +348,9 @@ static inline void ClearPageCompound(struct page
> *page) ClearPageHead(page);
> }
> #endif
> +
> +#define PG_head_mask ((1L << PG_head))
> +
> #else
> /*
> * Reduce page flag use as much as possible by overlapping
> diff --git a/kernel/kexec.c b/kernel/kexec.c
> index c8380ad..e6f3aec 100644
> --- a/kernel/kexec.c
> +++ b/kernel/kexec.c
> @@ -1622,6 +1622,7 @@ static int __init crash_save_vmcoreinfo_init(void)
> #ifdef CONFIG_MEMORY_FAILURE
> VMCOREINFO_NUMBER(PG_hwpoison);
> #endif
> + VMCOREINFO_NUMBER(PG_head_mask);
> VMCOREINFO_NUMBER(PAGE_BUDDY_MAPCOUNT_VALUE);
>
> arch_crash_save_vmcoreinfo();

2014-04-22 03:04:13

by Baoquan He

[permalink] [raw]
Subject: Re: [PATCH] Save PG_head_mask in VMCOREINFO

On 04/11/14 at 05:50pm, Petr Tesarik wrote:
> To allow filtering of huge pages, makedumpfile must be able to
> identify them in the dump. This can be done by checking the
> appropriate page flag, so communicate its value to makedumpfile
> through the VMCOREINFO interface.
>
> There's only one small catch. Depending on how many page flags
> are available on a given architecture, this bit can be called
> PG_head or PG_compound.
>
> I sent a similar patch back in 2012, but Eric Biederman did not
> like using an #ifdef. So, this time I'm adding a common symbol
> (PG_head_mask) instead.
>
> See https://lkml.org/lkml/2012/11/28/91 for the previous version.
>
> Signed-off-by: Petr Tesarik <[email protected]>
> ---
> include/linux/page-flags.h | 3 +++
> kernel/kexec.c | 1 +
> 2 files changed, 4 insertions(+)
>
> diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h
> index d1fe1a7..bc2007e 100644
> --- a/include/linux/page-flags.h
> +++ b/include/linux/page-flags.h
> @@ -348,6 +348,9 @@ static inline void ClearPageCompound(struct page
> *page) ClearPageHead(page);
> }
> #endif
> +
> +#define PG_head_mask ((1L << PG_head))

Hi Petr,

I am fine with this trick which define one name PG_head_mask, but can
stands for both PG_head and PG_compound.

I guess Eric may suggest the implementation like it done in
mm/memory-failure.c . In that file it explicitly defines both of them.

Thanks
Baoquan

> +
> #else
> /*
> * Reduce page flag use as much as possible by overlapping
> diff --git a/kernel/kexec.c b/kernel/kexec.c
> index c8380ad..e6f3aec 100644
> --- a/kernel/kexec.c
> +++ b/kernel/kexec.c
> @@ -1622,6 +1622,7 @@ static int __init crash_save_vmcoreinfo_init(void)
> #ifdef CONFIG_MEMORY_FAILURE
> VMCOREINFO_NUMBER(PG_hwpoison);
> #endif
> + VMCOREINFO_NUMBER(PG_head_mask);
> VMCOREINFO_NUMBER(PAGE_BUDDY_MAPCOUNT_VALUE);
>
> arch_crash_save_vmcoreinfo();
> --
> 1.8.4.5
>
> _______________________________________________
> kexec mailing list
> [email protected]
> http://lists.infradead.org/mailman/listinfo/kexec