diff options
author | Naoya Horiguchi <n-horiguchi@ah.jp.nec.com> | 2016-03-17 17:17:47 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-03-17 18:09:34 -0400 |
commit | 0335ddd34f39569a32096084bf3b0960d2b1212b (patch) | |
tree | 226e2e489392c93d25fa901b657a267bea96b70a /tools/vm | |
parent | 0a71649cb724ab97df26baa7731ac31d2364bfe5 (diff) |
tools/vm/page-types.c: support swap entry
/proc/pid/pagemap (pte_to_pagemap_entry() internally) already reports
about swap entry, so let's make the in-kernel utility aware of it.
Signed-off-by: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
Cc: Vladimir Davydov <vdavydov@parallels.com>
Cc: Konstantin Khlebnikov <koct9i@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'tools/vm')
-rw-r--r-- | tools/vm/page-types.c | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/tools/vm/page-types.c b/tools/vm/page-types.c index 5a6016224bb9..ec62ab4d8b55 100644 --- a/tools/vm/page-types.c +++ b/tools/vm/page-types.c | |||
@@ -61,6 +61,8 @@ | |||
61 | #define PM_PFRAME_BITS 55 | 61 | #define PM_PFRAME_BITS 55 |
62 | #define PM_PFRAME_MASK ((1LL << PM_PFRAME_BITS) - 1) | 62 | #define PM_PFRAME_MASK ((1LL << PM_PFRAME_BITS) - 1) |
63 | #define PM_PFRAME(x) ((x) & PM_PFRAME_MASK) | 63 | #define PM_PFRAME(x) ((x) & PM_PFRAME_MASK) |
64 | #define MAX_SWAPFILES_SHIFT 5 | ||
65 | #define PM_SWAP_OFFSET(x) (((x) & PM_PFRAME_MASK) >> MAX_SWAPFILES_SHIFT) | ||
64 | #define PM_SOFT_DIRTY (1ULL << 55) | 66 | #define PM_SOFT_DIRTY (1ULL << 55) |
65 | #define PM_MMAP_EXCLUSIVE (1ULL << 56) | 67 | #define PM_MMAP_EXCLUSIVE (1ULL << 56) |
66 | #define PM_FILE (1ULL << 61) | 68 | #define PM_FILE (1ULL << 61) |
@@ -92,7 +94,8 @@ | |||
92 | #define KPF_SLOB_FREE 49 | 94 | #define KPF_SLOB_FREE 49 |
93 | #define KPF_SLUB_FROZEN 50 | 95 | #define KPF_SLUB_FROZEN 50 |
94 | #define KPF_SLUB_DEBUG 51 | 96 | #define KPF_SLUB_DEBUG 51 |
95 | #define KPF_FILE 62 | 97 | #define KPF_FILE 61 |
98 | #define KPF_SWAP 62 | ||
96 | #define KPF_MMAP_EXCLUSIVE 63 | 99 | #define KPF_MMAP_EXCLUSIVE 63 |
97 | 100 | ||
98 | #define KPF_ALL_BITS ((uint64_t)~0ULL) | 101 | #define KPF_ALL_BITS ((uint64_t)~0ULL) |
@@ -146,6 +149,7 @@ static const char * const page_flag_names[] = { | |||
146 | [KPF_SLUB_DEBUG] = "E:slub_debug", | 149 | [KPF_SLUB_DEBUG] = "E:slub_debug", |
147 | 150 | ||
148 | [KPF_FILE] = "F:file", | 151 | [KPF_FILE] = "F:file", |
152 | [KPF_SWAP] = "w:swap", | ||
149 | [KPF_MMAP_EXCLUSIVE] = "1:mmap_exclusive", | 153 | [KPF_MMAP_EXCLUSIVE] = "1:mmap_exclusive", |
150 | }; | 154 | }; |
151 | 155 | ||
@@ -297,6 +301,10 @@ static unsigned long pagemap_pfn(uint64_t val) | |||
297 | return pfn; | 301 | return pfn; |
298 | } | 302 | } |
299 | 303 | ||
304 | static unsigned long pagemap_swap_offset(uint64_t val) | ||
305 | { | ||
306 | return val & PM_SWAP ? PM_SWAP_OFFSET(val) : 0; | ||
307 | } | ||
300 | 308 | ||
301 | /* | 309 | /* |
302 | * page flag names | 310 | * page flag names |
@@ -452,6 +460,8 @@ static uint64_t expand_overloaded_flags(uint64_t flags, uint64_t pme) | |||
452 | flags |= BIT(SOFTDIRTY); | 460 | flags |= BIT(SOFTDIRTY); |
453 | if (pme & PM_FILE) | 461 | if (pme & PM_FILE) |
454 | flags |= BIT(FILE); | 462 | flags |= BIT(FILE); |
463 | if (pme & PM_SWAP) | ||
464 | flags |= BIT(SWAP); | ||
455 | if (pme & PM_MMAP_EXCLUSIVE) | 465 | if (pme & PM_MMAP_EXCLUSIVE) |
456 | flags |= BIT(MMAP_EXCLUSIVE); | 466 | flags |= BIT(MMAP_EXCLUSIVE); |
457 | 467 | ||
@@ -613,6 +623,22 @@ static void walk_pfn(unsigned long voffset, | |||
613 | } | 623 | } |
614 | } | 624 | } |
615 | 625 | ||
626 | static void walk_swap(unsigned long voffset, uint64_t pme) | ||
627 | { | ||
628 | uint64_t flags = kpageflags_flags(0, pme); | ||
629 | |||
630 | if (!bit_mask_ok(flags)) | ||
631 | return; | ||
632 | |||
633 | if (opt_list == 1) | ||
634 | show_page_range(voffset, pagemap_swap_offset(pme), 1, flags); | ||
635 | else if (opt_list == 2) | ||
636 | show_page(voffset, pagemap_swap_offset(pme), flags); | ||
637 | |||
638 | nr_pages[hash_slot(flags)]++; | ||
639 | total_pages++; | ||
640 | } | ||
641 | |||
616 | #define PAGEMAP_BATCH (64 << 10) | 642 | #define PAGEMAP_BATCH (64 << 10) |
617 | static void walk_vma(unsigned long index, unsigned long count) | 643 | static void walk_vma(unsigned long index, unsigned long count) |
618 | { | 644 | { |
@@ -632,6 +658,8 @@ static void walk_vma(unsigned long index, unsigned long count) | |||
632 | pfn = pagemap_pfn(buf[i]); | 658 | pfn = pagemap_pfn(buf[i]); |
633 | if (pfn) | 659 | if (pfn) |
634 | walk_pfn(index + i, pfn, 1, buf[i]); | 660 | walk_pfn(index + i, pfn, 1, buf[i]); |
661 | if (buf[i] & PM_SWAP) | ||
662 | walk_swap(index + i, buf[i]); | ||
635 | } | 663 | } |
636 | 664 | ||
637 | index += pages; | 665 | index += pages; |