On Fri, Aug 30, 2024 at 7:39 PM <devel-requ...@lists.crash-utility.osci.io>
wrote:

> Date: Fri, 30 Aug 2024 10:33:03 -0000
> From: qiwu.c...@transsion.com
> Subject: [Crash-utility] [PATCH] kmem: fix the determination for slab
>         page
> To: devel@lists.crash-utility.osci.io
> Message-ID: <20240830103303.2824.23...@lists.crash-utility.osci.io>
> Content-Type: text/plain; charset="utf-8"
>
> The determination for a slab page is changed since kernel commit
> 8db00ad564617 which migrates PG_slab flag from page flags to the
> lower 16 bit of the page type.
>
>
Thank you for the fix, qiwu.

Can you help double check if the code related to PG_* flags in the crash
tool needs to be changed accordingly?

Thanks
Lianbo


> Before apply this patch:
> crash> kmem -s ffff000002aa4100
> kmem: address is not allocated in slab subsystem: ffff000002aa4100
>
> After apply this patch:
> crash> kmem -s ffff000002aa4100
> CACHE             OBJSIZE  ALLOCATED     TOTAL  SLABS  SSIZE  NAME
> ffff00000140f900     4096         94       126     18    32k  task_struct
>   SLAB              MEMORY            NODE  TOTAL  ALLOCATED  FREE
>   fffffdffc00aa800  ffff000002aa0000     0      7          5     2
>   FREE / [ALLOCATED]
>   [ffff000002aa4100]
>
> Signed-off-by: qiwu.chen <qiwu.c...@transsion.com>
> ---
>  defs.h   |  1 +
>  memory.c | 23 +++++++++++++++++++----
>  2 files changed, 20 insertions(+), 4 deletions(-)
>
> diff --git a/defs.h b/defs.h
> index e9eb9e3..9ef7f97 100644
> --- a/defs.h
> +++ b/defs.h
> @@ -2289,6 +2289,7 @@ struct offset_table {                    /* stash of
> commonly-used offsets */
>         long track_cpu;
>         long track_when;
>         long track_handle;
> +       long page_page_type;
>  };
>
>  struct size_table {         /* stash of commonly-used sizes */
> diff --git a/memory.c b/memory.c
> index 7bf8f86..f9ad6e4 100644
> --- a/memory.c
> +++ b/memory.c
> @@ -509,6 +509,8 @@ vm_init(void)
>                 ANON_MEMBER_OFFSET_INIT(page_compound_head, "page",
> "compound_head");
>         MEMBER_OFFSET_INIT(page_private, "page", "private");
>         MEMBER_OFFSET_INIT(page_freelist, "page", "freelist");
> +       if (MEMBER_EXISTS("page", "page_type"))
> +               MEMBER_OFFSET_INIT(page_page_type, "page", "page_type");
>
>         MEMBER_OFFSET_INIT(mm_struct_pgd, "mm_struct", "pgd");
>
> @@ -10114,7 +10116,7 @@ static char *
>  vaddr_to_kmem_cache(ulong vaddr, char *buf, int verbose)
>  {
>         physaddr_t paddr;
> -       ulong page, cache, page_flags;
> +       ulong page, cache, page_flags, page_type;
>
>          if (!kvtop(NULL, vaddr, &paddr, 0)) {
>                 if (verbose)
> @@ -10143,7 +10145,10 @@ vaddr_to_kmem_cache(ulong vaddr, char *buf, int
> verbose)
>
> readmem(compound_head(page)+OFFSET(page_flags), KVADDR,
>                                         &page_flags, sizeof(ulong),
> "page.flags",
>                                         FAULT_ON_ERROR);
> -                               if (!(page_flags & (1 << vt->PG_slab)))
> +                               readmem(page + OFFSET(page_page_type),
> KVADDR, &page_type,
> +                                       sizeof(ulong), "page type",
> FAULT_ON_ERROR);
> +                               if (!(page_flags & (1 << vt->PG_slab)) &&
> +                                       !(page_type & (1 << vt->PG_slab)))
>                                         return NULL;
>                         } else
>                                 return NULL;
> @@ -20688,7 +20693,7 @@ char *
>  is_slab_page(struct meminfo *si, char *buf)
>  {
>         int i, cnt;
> -       ulong page_slab, page_flags, name;
> +       ulong page_slab, page_flags, page_type, name;
>          ulong *cache_list;
>          char *retval;
>
> @@ -20703,7 +20708,17 @@ is_slab_page(struct meminfo *si, char *buf)
>             RETURN_ON_ERROR|QUIET))
>                 return NULL;
>
> -       if (!(page_flags & (1 << vt->PG_slab)))
> +       if (!readmem(si->spec_addr + OFFSET(page_page_type), KVADDR,
> +           &page_type, sizeof(ulong), "page.page_type",
> +           RETURN_ON_ERROR|QUIET))
> +               return NULL;
> +
> +       /*
> +        * PG_slab is migrated from the page flags to the lower 16 bit
> +        * of the page type since linux commit 8db00ad564617.
> +        */
> +       if (!(page_flags & (1 << vt->PG_slab)) &&
> +               !(page_type & (1 << vt->PG_slab)))
>                 return NULL;
>
>         if (!readmem(si->spec_addr + OFFSET(page_slab), KVADDR,
> --
> 2.25.1
>
--
Crash-utility mailing list -- devel@lists.crash-utility.osci.io
To unsubscribe send an email to devel-le...@lists.crash-utility.osci.io
https://${domain_name}/admin/lists/devel.lists.crash-utility.osci.io/
Contribution Guidelines: https://github.com/crash-utility/crash/wiki

Reply via email to