[PATCH] makedumpfile: support _count -> _refcount rename in struct page
Dave Anderson
anderson at redhat.com
Thu Jun 16 06:49:28 PDT 2016
----- Original Message -----
> _count member was renamed to _refcount in linux commit commit 0139aa7b7fa12
> ("mm: rename _count, field of the struct page, to _refcount") and this
> broke makedumpfile. The reason for making the change was to find all users
> accessing it directly and not through the recommended API. I tried
> suggesting to revert the change but failed, I see no other choice than to
> start supporting both _count and _refcount in makedumpfile.
>
> Signed-off-by: Vitaly Kuznetsov <vkuznets at redhat.com>
> ---
> - 'crash' tool is now broken as well.
FYI, crash was fixed upstream a few weeks ago:
commit 8ceb1ac628bf6a0a7f0bbfff030ec93081bca4cd
Author: Dave Anderson <anderson at redhat.com>
Date: Mon May 23 11:23:01 2016 -0400
Fix for Linux commit 0139aa7b7fa12ceef095d99dc36606a5b10ab83a, which
renamed the page._count member to page._refcount. Without the patch,
certain "kmem" commands fail with the "kmem: invalid structure member
offset: page_count".
(anderson at redhat.com)
Dave
> ---
> makedumpfile.c | 18 +++++++++++++++++-
> makedumpfile.h | 1 +
> 2 files changed, 18 insertions(+), 1 deletion(-)
>
> diff --git a/makedumpfile.c b/makedumpfile.c
> index 853b999..96dfe39 100644
> --- a/makedumpfile.c
> +++ b/makedumpfile.c
> @@ -1580,6 +1580,13 @@ get_structure_info(void)
> SIZE_INIT(page, "page");
> OFFSET_INIT(page.flags, "page", "flags");
> OFFSET_INIT(page._count, "page", "_count");
> + if (OFFSET(page._count) == NOT_FOUND_STRUCTURE) {
> + info->flag_refcount = TRUE;
> + OFFSET_INIT(page._count, "page", "_refcount");
> + } else {
> + info->flag_refcount = FALSE;
> + }
> +
> OFFSET_INIT(page.mapping, "page", "mapping");
> OFFSET_INIT(page._mapcount, "page", "_mapcount");
> OFFSET_INIT(page.private, "page", "private");
> @@ -2151,7 +2158,10 @@ write_vmcoreinfo_data(void)
> * write the member offset of 1st kernel
> */
> WRITE_MEMBER_OFFSET("page.flags", page.flags);
> - WRITE_MEMBER_OFFSET("page._count", page._count);
> + if (info->flag_refcount)
> + WRITE_MEMBER_OFFSET("page._refcount", page._count);
> + else
> + WRITE_MEMBER_OFFSET("page._count", page._count);
> WRITE_MEMBER_OFFSET("page.mapping", page.mapping);
> WRITE_MEMBER_OFFSET("page.lru", page.lru);
> WRITE_MEMBER_OFFSET("page._mapcount", page._mapcount);
> @@ -2492,6 +2502,12 @@ read_vmcoreinfo(void)
>
> READ_MEMBER_OFFSET("page.flags", page.flags);
> READ_MEMBER_OFFSET("page._count", page._count);
> + if (OFFSET(page._count) == NOT_FOUND_STRUCTURE) {
> + info->flag_refcount = TRUE;
> + READ_MEMBER_OFFSET("page._refcount", page._count);
> + } else {
> + info->flag_refcount = FALSE;
> + }
> READ_MEMBER_OFFSET("page.mapping", page.mapping);
> READ_MEMBER_OFFSET("page.lru", page.lru);
> READ_MEMBER_OFFSET("page._mapcount", page._mapcount);
> diff --git a/makedumpfile.h b/makedumpfile.h
> index 251d4bf..3742389 100644
> --- a/makedumpfile.h
> +++ b/makedumpfile.h
> @@ -1100,6 +1100,7 @@ struct DumpInfo {
> int flag_nospace; /* the flag of "No space on device" error */
> int flag_vmemmap; /* kernel supports vmemmap address space */
> int flag_excludevm; /* -e - excluding unused vmemmap pages */
> + int flag_refcount; /* _count is renamed to _refcount */
> unsigned long vaddr_for_vtop; /* virtual address for debugging */
> long page_size; /* size of page */
> long page_shift;
> --
> 2.5.5
>
>
More information about the kexec
mailing list