Skip to content

Commit

Permalink
Fix "vtop" command to display the swapinfo for arm64 kernel 5.19.0+
Browse files Browse the repository at this point in the history
arm64/pgtable: support __HAVE_ARCH_PTE_SWP_EXCLUSIVE

Let's use one of the type bits: core-mm only supports 5, so there is no
need to consume 6.

Note that we might be able to reuse bit 1, but reusing bit 1 turned out
problematic in the past for PROT_NONE handling; so let's play safe and use
another bit.

Link: https://lkml.kernel.org/r/20220329164329.208407-5-david@redhat.com

Before:
crash> vtop 70504000
VIRTUAL     PHYSICAL
70504000    (not mapped)

PAGE DIRECTORY: ffffff80f265c000
   PGD: ffffff80f265c008 => 800000141537003
   PMD: ffffff8101537c10 => 800000141538003
   PTE: ffffff8101538820 => 12bc3e04

  PTE     vtop: cannot determine swap location

After:
crash> vtop 70504000
VIRTUAL     PHYSICAL
70504000    (not mapped)

PAGE DIRECTORY: ffffff80f265c000
   PGD: ffffff80f265c008 => 800000141537003
   PMD: ffffff8101537c10 => 800000141538003
   PTE: ffffff8101538820 => 12bc3e04

  PTE                     SWAP                  OFFSET
12bc3e04  /first_stage_ramdisk/dev/block/zram0  1227838

      VMA           START       END     FLAGS FILE
ffffff80dfe7b578   70504000   707bd000 100073

SWAP: /first_stage_ramdisk/dev/block/zram0  OFFSET: 1227838

Signed-off-by: chenguanyou <chenguanyou@xiaomi.com>
  • Loading branch information
chenguanyou committed Sep 27, 2023
1 parent a9291fc commit d8181be
Showing 1 changed file with 10 additions and 2 deletions.
12 changes: 10 additions & 2 deletions arm64.c
Expand Up @@ -468,8 +468,16 @@ arm64_init(int when)
}
}


if (THIS_KERNEL_VERSION >= LINUX(4,0,0)) {
if (THIS_KERNEL_VERSION >= LINUX(5,19,0)) {
ms->__SWP_TYPE_BITS = 5;
ms->__SWP_TYPE_SHIFT = 3;
ms->__SWP_TYPE_MASK = ((1UL << ms->__SWP_TYPE_BITS) - 1);
ms->__SWP_OFFSET_SHIFT = (ms->__SWP_TYPE_BITS + ms->__SWP_TYPE_SHIFT);
ms->__SWP_OFFSET_BITS = 50;
ms->__SWP_OFFSET_MASK = ((1UL << ms->__SWP_OFFSET_BITS) - 1);
ms->PTE_PROT_NONE = (1UL << 58);
ms->PTE_FILE = 0; /* unused */
} else if (THIS_KERNEL_VERSION >= LINUX(4,0,0)) {
ms->__SWP_TYPE_BITS = 6;
ms->__SWP_TYPE_SHIFT = 2;
ms->__SWP_TYPE_MASK = ((1UL << ms->__SWP_TYPE_BITS) - 1);
Expand Down

0 comments on commit d8181be

Please sign in to comment.