diff options
-rw-r--r-- | Documentation/vm/pagemap.txt | 3 | ||||
-rw-r--r-- | fs/proc/task_mmu.c | 14 | ||||
-rw-r--r-- | tools/vm/page-types.c | 10 |
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 | } |