aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/vm/pagemap.txt3
-rw-r--r--fs/proc/task_mmu.c14
-rw-r--r--tools/vm/page-types.c10
3 files changed, 25 insertions, 2 deletions
diff --git a/Documentation/vm/pagemap.txt b/Documentation/vm/pagemap.txt
index 6bfbc172cdb9..56faec0f73f7 100644
--- a/Documentation/vm/pagemap.txt
+++ b/Documentation/vm/pagemap.txt
@@ -16,7 +16,8 @@ There are three components to pagemap:
16 * Bits 0-4 swap type if swapped 16 * Bits 0-4 swap type if swapped
17 * Bits 5-54 swap offset if swapped 17 * Bits 5-54 swap offset if swapped
18 * Bit 55 pte is soft-dirty (see Documentation/vm/soft-dirty.txt) 18 * Bit 55 pte is soft-dirty (see Documentation/vm/soft-dirty.txt)
19 * Bits 56-60 zero 19 * Bit 56 page exclusively mapped
20 * Bits 57-60 zero
20 * Bit 61 page is file-page or shared-anon 21 * Bit 61 page is file-page or shared-anon
21 * Bit 62 page swapped 22 * Bit 62 page swapped
22 * Bit 63 page present 23 * Bit 63 page present
diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
index bc651644b1b2..67c76468a7be 100644
--- a/fs/proc/task_mmu.c
+++ b/fs/proc/task_mmu.c
@@ -949,6 +949,7 @@ struct pagemapread {
949#define PM_PFRAME_BITS 55 949#define PM_PFRAME_BITS 55
950#define PM_PFRAME_MASK GENMASK_ULL(PM_PFRAME_BITS - 1, 0) 950#define PM_PFRAME_MASK GENMASK_ULL(PM_PFRAME_BITS - 1, 0)
951#define PM_SOFT_DIRTY BIT_ULL(55) 951#define PM_SOFT_DIRTY BIT_ULL(55)
952#define PM_MMAP_EXCLUSIVE BIT_ULL(56)
952#define PM_FILE BIT_ULL(61) 953#define PM_FILE BIT_ULL(61)
953#define PM_SWAP BIT_ULL(62) 954#define PM_SWAP BIT_ULL(62)
954#define PM_PRESENT BIT_ULL(63) 955#define PM_PRESENT BIT_ULL(63)
@@ -1036,6 +1037,8 @@ static pagemap_entry_t pte_to_pagemap_entry(struct pagemapread *pm,
1036 1037
1037 if (page && !PageAnon(page)) 1038 if (page && !PageAnon(page))
1038 flags |= PM_FILE; 1039 flags |= PM_FILE;
1040 if (page && page_mapcount(page) == 1)
1041 flags |= PM_MMAP_EXCLUSIVE;
1039 if (vma->vm_flags & VM_SOFTDIRTY) 1042 if (vma->vm_flags & VM_SOFTDIRTY)
1040 flags |= PM_SOFT_DIRTY; 1043 flags |= PM_SOFT_DIRTY;
1041 1044
@@ -1066,6 +1069,11 @@ static int pagemap_pmd_range(pmd_t *pmdp, unsigned long addr, unsigned long end,
1066 * This if-check is just to prepare for future implementation. 1069 * This if-check is just to prepare for future implementation.
1067 */ 1070 */
1068 if (pmd_present(pmd)) { 1071 if (pmd_present(pmd)) {
1072 struct page *page = pmd_page(pmd);
1073
1074 if (page_mapcount(page) == 1)
1075 flags |= PM_MMAP_EXCLUSIVE;
1076
1069 flags |= PM_PRESENT; 1077 flags |= PM_PRESENT;
1070 if (pm->show_pfn) 1078 if (pm->show_pfn)
1071 frame = pmd_pfn(pmd) + 1079 frame = pmd_pfn(pmd) +
@@ -1131,6 +1139,9 @@ static int pagemap_hugetlb_range(pte_t *ptep, unsigned long hmask,
1131 if (!PageAnon(page)) 1139 if (!PageAnon(page))
1132 flags |= PM_FILE; 1140 flags |= PM_FILE;
1133 1141
1142 if (page_mapcount(page) == 1)
1143 flags |= PM_MMAP_EXCLUSIVE;
1144
1134 flags |= PM_PRESENT; 1145 flags |= PM_PRESENT;
1135 if (pm->show_pfn) 1146 if (pm->show_pfn)
1136 frame = pte_pfn(pte) + 1147 frame = pte_pfn(pte) +
@@ -1163,7 +1174,8 @@ static int pagemap_hugetlb_range(pte_t *ptep, unsigned long hmask,
1163 * Bits 0-4 swap type if swapped 1174 * Bits 0-4 swap type if swapped
1164 * Bits 5-54 swap offset if swapped 1175 * Bits 5-54 swap offset if swapped
1165 * Bit 55 pte is soft-dirty (see Documentation/vm/soft-dirty.txt) 1176 * Bit 55 pte is soft-dirty (see Documentation/vm/soft-dirty.txt)
1166 * Bits 56-60 zero 1177 * Bit 56 page exclusively mapped
1178 * Bits 57-60 zero
1167 * Bit 61 page is file-page or shared-anon 1179 * Bit 61 page is file-page or shared-anon
1168 * Bit 62 page swapped 1180 * Bit 62 page swapped
1169 * Bit 63 page present 1181 * Bit 63 page present
diff --git a/tools/vm/page-types.c b/tools/vm/page-types.c
index 603ec916716b..7f73fa32a590 100644
--- a/tools/vm/page-types.c
+++ b/tools/vm/page-types.c
@@ -62,6 +62,7 @@
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 PM_SOFT_DIRTY (1ULL << 55) 64#define PM_SOFT_DIRTY (1ULL << 55)
65#define PM_MMAP_EXCLUSIVE (1ULL << 56)
65#define PM_FILE (1ULL << 61) 66#define PM_FILE (1ULL << 61)
66#define PM_SWAP (1ULL << 62) 67#define PM_SWAP (1ULL << 62)
67#define PM_PRESENT (1ULL << 63) 68#define PM_PRESENT (1ULL << 63)
@@ -91,6 +92,8 @@
91#define KPF_SLOB_FREE 49 92#define KPF_SLOB_FREE 49
92#define KPF_SLUB_FROZEN 50 93#define KPF_SLUB_FROZEN 50
93#define KPF_SLUB_DEBUG 51 94#define KPF_SLUB_DEBUG 51
95#define KPF_FILE 62
96#define KPF_MMAP_EXCLUSIVE 63
94 97
95#define KPF_ALL_BITS ((uint64_t)~0ULL) 98#define KPF_ALL_BITS ((uint64_t)~0ULL)
96#define KPF_HACKERS_BITS (0xffffULL << 32) 99#define KPF_HACKERS_BITS (0xffffULL << 32)
@@ -140,6 +143,9 @@ static const char * const page_flag_names[] = {
140 [KPF_SLOB_FREE] = "P:slob_free", 143 [KPF_SLOB_FREE] = "P:slob_free",
141 [KPF_SLUB_FROZEN] = "A:slub_frozen", 144 [KPF_SLUB_FROZEN] = "A:slub_frozen",
142 [KPF_SLUB_DEBUG] = "E:slub_debug", 145 [KPF_SLUB_DEBUG] = "E:slub_debug",
146
147 [KPF_FILE] = "F:file",
148 [KPF_MMAP_EXCLUSIVE] = "1:mmap_exclusive",
143}; 149};
144 150
145 151
@@ -443,6 +449,10 @@ static uint64_t expand_overloaded_flags(uint64_t flags, uint64_t pme)
443 449
444 if (pme & PM_SOFT_DIRTY) 450 if (pme & PM_SOFT_DIRTY)
445 flags |= BIT(SOFTDIRTY); 451 flags |= BIT(SOFTDIRTY);
452 if (pme & PM_FILE)
453 flags |= BIT(FILE);
454 if (pme & PM_MMAP_EXCLUSIVE)
455 flags |= BIT(MMAP_EXCLUSIVE);
446 456
447 return flags; 457 return flags;
448} 458}