|
@@ -446,6 +446,8 @@ struct mem_size_stats {
|
|
|
unsigned long anonymous;
|
|
|
unsigned long anonymous_thp;
|
|
|
unsigned long swap;
|
|
|
+ unsigned long shared_hugetlb;
|
|
|
+ unsigned long private_hugetlb;
|
|
|
u64 pss;
|
|
|
u64 swap_pss;
|
|
|
};
|
|
@@ -625,12 +627,44 @@ static void show_smap_vma_flags(struct seq_file *m, struct vm_area_struct *vma)
|
|
|
seq_putc(m, '\n');
|
|
|
}
|
|
|
|
|
|
+#ifdef CONFIG_HUGETLB_PAGE
|
|
|
+static int smaps_hugetlb_range(pte_t *pte, unsigned long hmask,
|
|
|
+ unsigned long addr, unsigned long end,
|
|
|
+ struct mm_walk *walk)
|
|
|
+{
|
|
|
+ struct mem_size_stats *mss = walk->private;
|
|
|
+ struct vm_area_struct *vma = walk->vma;
|
|
|
+ struct page *page = NULL;
|
|
|
+
|
|
|
+ if (pte_present(*pte)) {
|
|
|
+ page = vm_normal_page(vma, addr, *pte);
|
|
|
+ } else if (is_swap_pte(*pte)) {
|
|
|
+ swp_entry_t swpent = pte_to_swp_entry(*pte);
|
|
|
+
|
|
|
+ if (is_migration_entry(swpent))
|
|
|
+ page = migration_entry_to_page(swpent);
|
|
|
+ }
|
|
|
+ if (page) {
|
|
|
+ int mapcount = page_mapcount(page);
|
|
|
+
|
|
|
+ if (mapcount >= 2)
|
|
|
+ mss->shared_hugetlb += huge_page_size(hstate_vma(vma));
|
|
|
+ else
|
|
|
+ mss->private_hugetlb += huge_page_size(hstate_vma(vma));
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+#endif /* HUGETLB_PAGE */
|
|
|
+
|
|
|
static int show_smap(struct seq_file *m, void *v, int is_pid)
|
|
|
{
|
|
|
struct vm_area_struct *vma = v;
|
|
|
struct mem_size_stats mss;
|
|
|
struct mm_walk smaps_walk = {
|
|
|
.pmd_entry = smaps_pte_range,
|
|
|
+#ifdef CONFIG_HUGETLB_PAGE
|
|
|
+ .hugetlb_entry = smaps_hugetlb_range,
|
|
|
+#endif
|
|
|
.mm = vma->vm_mm,
|
|
|
.private = &mss,
|
|
|
};
|
|
@@ -652,6 +686,8 @@ static int show_smap(struct seq_file *m, void *v, int is_pid)
|
|
|
"Referenced: %8lu kB\n"
|
|
|
"Anonymous: %8lu kB\n"
|
|
|
"AnonHugePages: %8lu kB\n"
|
|
|
+ "Shared_Hugetlb: %8lu kB\n"
|
|
|
+ "Private_Hugetlb: %7lu kB\n"
|
|
|
"Swap: %8lu kB\n"
|
|
|
"SwapPss: %8lu kB\n"
|
|
|
"KernelPageSize: %8lu kB\n"
|
|
@@ -667,6 +703,8 @@ static int show_smap(struct seq_file *m, void *v, int is_pid)
|
|
|
mss.referenced >> 10,
|
|
|
mss.anonymous >> 10,
|
|
|
mss.anonymous_thp >> 10,
|
|
|
+ mss.shared_hugetlb >> 10,
|
|
|
+ mss.private_hugetlb >> 10,
|
|
|
mss.swap >> 10,
|
|
|
(unsigned long)(mss.swap_pss >> (10 + PSS_SHIFT)),
|
|
|
vma_kernel_pagesize(vma) >> 10,
|