[Crash-utility] [PATCH] kmem: Add support for SECTION_TAINT_ZONE flag

lijiang lijiang at redhat.com
Tue Jun 1 13:47:40 UTC 2021


On Wed, May 26, 2021 at 4:33 PM HAGIO KAZUHITO(萩尾 一仁) <k-hagio-ab at nec.com>
wrote:

> Fix for the "kmem {-n|-p}" options on Linux 5.12-rc1 and later kernels
> that contain commit 1f90a3477df3f ("mm: teach pfn_to_online_page()
> about ZONE_DEVICE section collisions").  Without the patch, the
> "kmem -n" option incorrectly shows mem_map addresses containing the
> flag in bit 5 as part of the virtual address, and also the "kmem -p"
> option shows page structures at wrong position.  With the patch,
> the "kmem -n" option displays the new "D" state flag.
>
>
This looks good to me.  Acked-by: Lianbo Jiang <lijiang at redhat.com>
Thanks.

Without the patch:
>   crash> kmem -n
>   ...
>   NR      SECTION        CODED_MEM_MAP        MEM_MAP       STATE PFN
>   1040  ffff9edf3ffd4100  ffffe2bcc0000010  ffffe2bd42000010  PMOE
> 34078720
>                                         ^                 ^
>   crash> kmem -p
>       PAGE         PHYSICAL      MAPPING       INDEX CNT FLAGS
>   ffffe2bd42000010 2080000000           400040 1ffffffff 9961471
> dead000000000122 referenced,active,error
>   ffffe2bd42000050 2080001000           800080 1ffffffff 9961471
> dead000000000122 referenced,active,error
>   ffffe2bd42000090 2080002000                0 1ffffffff 9961471
> dead000000000122 referenced,active,error
>                 ^^
> With the patch:
>   crash> kmem -n
>   ...
>   NR      SECTION        CODED_MEM_MAP        MEM_MAP       STATE PFN
>   1040  ffff9edf3ffd4100  ffffe2bcc0000000  ffffe2bd42000000  PMOED
> 34078720
>
>   crash> kmem -p
>       PAGE         PHYSICAL      MAPPING       INDEX CNT FLAGS
>   ffffe2bd42000000 2080000000 ffff9ebfc0044100        0  1 97ffffc0000200
> slab
>   ffffe2bd42000040 2080001000 ffff9ebfc0044400        0  1 97ffffc0000200
> slab
>   ffffe2bd42000080 2080002000                0        0  1 97ffffc0000000
>
> Signed-off-by: Kazuhito Hagio <k-hagio-ab at nec.com>
> ---
>  help.c   | 12 ++++++++----
>  memory.c | 15 +++++++++------
>  2 files changed, 17 insertions(+), 10 deletions(-)
>
> diff --git a/help.c b/help.c
> index e0c84087add3..7734281166eb 100644
> --- a/help.c
> +++ b/help.c
> @@ -6584,10 +6584,14 @@ char *help_kmem[] = {
>  "            kernels, the vm_zone_stat, vm_node_stat and vm_numa_stat
> tables,",
>  "            the cumulative page_states counter values if they exist,
> and/or ",
>  "            the cumulative, vm_event_states counter values if they
> exist.",
> -"        -n  display memory node, memory section, and memory block data",
> -"            and state; the state of each memory section state is
> encoded",
> -"            as \"P\", \"M\", \"O\" and/or \"E\", meaning
> SECTION_MARKED_PRESENT,",
> -"            SECTION_HAS_MEM_MAP, SECTION_IS_ONLINE and
> SECTION_IS_EARLY.",
> +"        -n  display memory node, memory section, memory block data and
> state;",
> +"            the state of each memory section is shown as the following
> flags",
> +"            respectively:",
> +"              \"P\": SECTION_MARKED_PRESENT",
> +"              \"M\": SECTION_HAS_MEM_MAP",
> +"              \"O\": SECTION_IS_ONLINE",
> +"              \"E\": SECTION_IS_EARLY",
> +"              \"D\": SECTION_TAINT_ZONE_DEVICE",
>  "        -z  displays per-zone memory statistics.",
>  "        -o  displays each cpu's offset value that is added to per-cpu
> symbol",
>  "            values to translate them into kernel virtual addresses.",
> diff --git a/memory.c b/memory.c
> index 8c6bbe409922..7bc9a2cd6d0e 100644
> --- a/memory.c
> +++ b/memory.c
> @@ -17269,12 +17269,13 @@ nr_to_section(ulong nr)
>   *      which results in PFN_SECTION_SHIFT equal 6.
>   * To sum it up, at least 6 bits are available.
>   */
> -#define SECTION_MARKED_PRESENT (1UL<<0)
> -#define SECTION_HAS_MEM_MAP    (1UL<<1)
> -#define SECTION_IS_ONLINE      (1UL<<2)
> -#define SECTION_IS_EARLY       (1UL<<3)
> -#define SECTION_MAP_LAST_BIT   (1UL<<4)
> -#define SECTION_MAP_MASK       (~(SECTION_MAP_LAST_BIT-1))
> +#define SECTION_MARKED_PRESENT         (1UL<<0)
> +#define SECTION_HAS_MEM_MAP            (1UL<<1)
> +#define SECTION_IS_ONLINE              (1UL<<2)
> +#define SECTION_IS_EARLY               (1UL<<3)
> +#define SECTION_TAINT_ZONE_DEVICE      (1UL<<4)
> +#define SECTION_MAP_LAST_BIT           (1UL<<5)
> +#define SECTION_MAP_MASK               (~(SECTION_MAP_LAST_BIT-1))
>
>
>  int
> @@ -17372,6 +17373,8 @@ fill_mem_section_state(ulong state, char *buf)
>                 bufidx += sprintf(buf + bufidx, "%s", "O");
>         if (state & SECTION_IS_EARLY)
>                 bufidx += sprintf(buf + bufidx, "%s", "E");
> +       if (state & SECTION_TAINT_ZONE_DEVICE)
> +               bufidx += sprintf(buf + bufidx, "%s", "D");
>  }
>
>  void
> --
> 2.27.0
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/crash-utility/attachments/20210601/c3f150dc/attachment.htm>


More information about the Crash-utility mailing list