aboutsummaryrefslogtreecommitdiffstats
path: root/tools/vm
diff options
context:
space:
mode:
authorNaoya Horiguchi <n-horiguchi@ah.jp.nec.com>2016-03-17 17:17:47 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2016-03-17 18:09:34 -0400
commit0335ddd34f39569a32096084bf3b0960d2b1212b (patch)
tree226e2e489392c93d25fa901b657a267bea96b70a /tools/vm
parent0a71649cb724ab97df26baa7731ac31d2364bfe5 (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.c30
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
304static 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
626static 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)
617static void walk_vma(unsigned long index, unsigned long count) 643static 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;