[PATCH] makedumpfile: fix for hugepages filtering
Masaki Tachibana
mas-tachibana at vf.jp.nec.com
Thu Mar 8 21:58:08 PST 2018
Hi Hari,
Thank you for your patch.
It looks good.
I will merge it into V1.6.4.
Thanks
Tachibana
P.S. Sorry. I am prohibited from sending a mail to free mail address such as gmail.com.
> -----Original Message-----
> From: kexec [mailto:kexec-bounces at lists.infradead.org] On Behalf Of Hari Bathini
> Sent: Friday, March 09, 2018 3:10 AM
> To: Atsushi Kumagai <ats-kumagai at wm.jp.nec.com>
> Cc: Dave Young <dyoung at redhat.com>; ptesarik at suse.cz; Kexec-ml <kexec at lists.infradead.org>; piliu at redhat.com;
> andrej.skvortzov at gmail.com
> Subject: [PATCH] makedumpfile: fix for hugepages filtering
>
> Kernel commit 036e7aa49fb2 changed 'compound_dtor' & 'compound_order'
> types from 'unsigned short' to 'unsigned char'. Fix it here to ensure
> hugepages are filtered properly.
>
> Also, makedumpfile tool commit 484c6b18624 used 'int' type for 'dtor'
> argument in 'isHugetlb' function. While this works in recent kernels
> that use 'unsigned short/char' type for 'compound_dtor', it breaks
> older kernels that used address of 'free_huge_page' as dtor. Fix it
> by changing 'dtor' type.
>
> Signed-off-by: Hari Bathini <hbathini at linux.vnet.ibm.com>
> ---
> makedumpfile.c | 30 ++++++++++++++++++++++++------
> makedumpfile.h | 1 +
> 2 files changed, 25 insertions(+), 6 deletions(-)
>
> diff --git a/makedumpfile.c b/makedumpfile.c
> index ed138d3..ac8483d 100644
> --- a/makedumpfile.c
> +++ b/makedumpfile.c
> @@ -241,7 +241,7 @@ is_in_same_page(unsigned long vaddr1, unsigned long vaddr2)
> }
>
> static inline int
> -isHugetlb(int dtor)
> +isHugetlb(unsigned long dtor)
> {
> return ((NUMBER(HUGETLB_PAGE_DTOR) != NOT_FOUND_NUMBER)
> && (NUMBER(HUGETLB_PAGE_DTOR) == dtor))
> @@ -5798,18 +5798,36 @@ __exclude_unnecessary_pages(unsigned long mem_map,
> * and PGMM_CACHED is a power of 2.
> */
> if ((index_pg < PGMM_CACHED - 1) && isCompoundHead(flags)) {
> - if (order_offset)
> - compound_order = USHORT(pcache + SIZE(page) + order_offset);
> + unsigned long long addr =
> + (unsigned long long)(pcache + SIZE(page));
> +
> + if (order_offset) {
> + if (info->kernel_version >=
> + KERNEL_VERSION(4, 16, 0)) {
> + compound_order =
> + UCHAR(addr + order_offset);
> + } else {
> + compound_order =
> + USHORT(addr + order_offset);
> + }
> + }
>
> if (dtor_offset) {
> /*
> * compound_dtor has been changed from the address of descriptor
> * to the ID of it since linux-4.4.
> */
> - if (info->kernel_version >= KERNEL_VERSION(4, 4, 0)) {
> - compound_dtor = USHORT(pcache + SIZE(page) + dtor_offset);
> + if (info->kernel_version >=
> + KERNEL_VERSION(4, 16, 0)) {
> + compound_dtor =
> + UCHAR(addr + dtor_offset);
> + } else if (info->kernel_version >=
> + KERNEL_VERSION(4, 4, 0)) {
> + compound_dtor =
> + USHORT(addr + dtor_offset);
> } else {
> - compound_dtor = ULONG(pcache + SIZE(page) + dtor_offset);
> + compound_dtor =
> + ULONG(addr + dtor_offset);
> }
> }
>
> diff --git a/makedumpfile.h b/makedumpfile.h
> index 01eece2..4cfad98 100644
> --- a/makedumpfile.h
> +++ b/makedumpfile.h
> @@ -241,6 +241,7 @@ static inline int string_exists(char *s) { return (s ? TRUE : FALSE); }
> string_exists((char *)(B)) && \
> (strncmp((char *)(A), (char *)(B), strlen((char *)(B))) == 0))
>
> +#define UCHAR(ADDR) *((unsigned char *)(ADDR))
> #define USHORT(ADDR) *((unsigned short *)(ADDR))
> #define UINT(ADDR) *((unsigned int *)(ADDR))
> #define ULONG(ADDR) *((unsigned long *)(ADDR))
>
>
> _______________________________________________
> kexec mailing list
> kexec at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/kexec
More information about the kexec
mailing list