lkml.org 
[lkml]   [2023]   [Jan]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    Subject[PATCH 38/46] mm: smaps: add stats for HugeTLB mapping size
    From
    When the kernel is compiled with HUGETLB_HIGH_GRANULARITY_MAPPING,
    smaps may provide HugetlbPudMapped, HugetlbPmdMapped, and
    HugetlbPteMapped. Levels that are folded will not be outputted.

    Signed-off-by: James Houghton <jthoughton@google.com>
    ---
    fs/proc/task_mmu.c | 101 +++++++++++++++++++++++++++++++++------------
    1 file changed, 75 insertions(+), 26 deletions(-)

    diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
    index c353cab11eee..af31c4d314d2 100644
    --- a/fs/proc/task_mmu.c
    +++ b/fs/proc/task_mmu.c
    @@ -412,6 +412,15 @@ struct mem_size_stats {
    unsigned long swap;
    unsigned long shared_hugetlb;
    unsigned long private_hugetlb;
    +#ifdef CONFIG_HUGETLB_HIGH_GRANULARITY_MAPPING
    +#ifndef __PAGETABLE_PUD_FOLDED
    + unsigned long hugetlb_pud_mapped;
    +#endif
    +#ifndef __PAGETABLE_PMD_FOLDED
    + unsigned long hugetlb_pmd_mapped;
    +#endif
    + unsigned long hugetlb_pte_mapped;
    +#endif
    u64 pss;
    u64 pss_anon;
    u64 pss_file;
    @@ -731,6 +740,35 @@ static void show_smap_vma_flags(struct seq_file *m, struct vm_area_struct *vma)
    }

    #ifdef CONFIG_HUGETLB_PAGE
    +
    +static void smaps_hugetlb_hgm_account(struct mem_size_stats *mss,
    + struct hugetlb_pte *hpte)
    +{
    +#ifdef CONFIG_HUGETLB_HIGH_GRANULARITY_MAPPING
    + unsigned long size = hugetlb_pte_size(hpte);
    +
    + switch (hpte->level) {
    +#ifndef __PAGETABLE_PUD_FOLDED
    + case HUGETLB_LEVEL_PUD:
    + mss->hugetlb_pud_mapped += size;
    + break;
    +#endif
    +#ifndef __PAGETABLE_PMD_FOLDED
    + case HUGETLB_LEVEL_PMD:
    + mss->hugetlb_pmd_mapped += size;
    + break;
    +#endif
    + case HUGETLB_LEVEL_PTE:
    + mss->hugetlb_pte_mapped += size;
    + break;
    + default:
    + break;
    + }
    +#else
    + return;
    +#endif /* CONFIG_HUGETLB_HIGH_GRANULARITY_MAPPING */
    +}
    +
    static int smaps_hugetlb_range(struct hugetlb_pte *hpte,
    unsigned long addr,
    struct mm_walk *walk)
    @@ -764,6 +802,8 @@ static int smaps_hugetlb_range(struct hugetlb_pte *hpte,
    mss->shared_hugetlb += hugetlb_pte_size(hpte);
    else
    mss->private_hugetlb += hugetlb_pte_size(hpte);
    +
    + smaps_hugetlb_hgm_account(mss, hpte);
    }
    return 0;
    }
    @@ -833,38 +873,47 @@ static void smap_gather_stats(struct vm_area_struct *vma,
    static void __show_smap(struct seq_file *m, const struct mem_size_stats *mss,
    bool rollup_mode)
    {
    - SEQ_PUT_DEC("Rss: ", mss->resident);
    - SEQ_PUT_DEC(" kB\nPss: ", mss->pss >> PSS_SHIFT);
    - SEQ_PUT_DEC(" kB\nPss_Dirty: ", mss->pss_dirty >> PSS_SHIFT);
    + SEQ_PUT_DEC("Rss: ", mss->resident);
    + SEQ_PUT_DEC(" kB\nPss: ", mss->pss >> PSS_SHIFT);
    + SEQ_PUT_DEC(" kB\nPss_Dirty: ", mss->pss_dirty >> PSS_SHIFT);
    if (rollup_mode) {
    /*
    * These are meaningful only for smaps_rollup, otherwise two of
    * them are zero, and the other one is the same as Pss.
    */
    - SEQ_PUT_DEC(" kB\nPss_Anon: ",
    + SEQ_PUT_DEC(" kB\nPss_Anon: ",
    mss->pss_anon >> PSS_SHIFT);
    - SEQ_PUT_DEC(" kB\nPss_File: ",
    + SEQ_PUT_DEC(" kB\nPss_File: ",
    mss->pss_file >> PSS_SHIFT);
    - SEQ_PUT_DEC(" kB\nPss_Shmem: ",
    + SEQ_PUT_DEC(" kB\nPss_Shmem: ",
    mss->pss_shmem >> PSS_SHIFT);
    }
    - SEQ_PUT_DEC(" kB\nShared_Clean: ", mss->shared_clean);
    - SEQ_PUT_DEC(" kB\nShared_Dirty: ", mss->shared_dirty);
    - SEQ_PUT_DEC(" kB\nPrivate_Clean: ", mss->private_clean);
    - SEQ_PUT_DEC(" kB\nPrivate_Dirty: ", mss->private_dirty);
    - SEQ_PUT_DEC(" kB\nReferenced: ", mss->referenced);
    - SEQ_PUT_DEC(" kB\nAnonymous: ", mss->anonymous);
    - SEQ_PUT_DEC(" kB\nLazyFree: ", mss->lazyfree);
    - SEQ_PUT_DEC(" kB\nAnonHugePages: ", mss->anonymous_thp);
    - SEQ_PUT_DEC(" kB\nShmemPmdMapped: ", mss->shmem_thp);
    - SEQ_PUT_DEC(" kB\nFilePmdMapped: ", mss->file_thp);
    - SEQ_PUT_DEC(" kB\nShared_Hugetlb: ", mss->shared_hugetlb);
    - seq_put_decimal_ull_width(m, " kB\nPrivate_Hugetlb: ",
    + SEQ_PUT_DEC(" kB\nShared_Clean: ", mss->shared_clean);
    + SEQ_PUT_DEC(" kB\nShared_Dirty: ", mss->shared_dirty);
    + SEQ_PUT_DEC(" kB\nPrivate_Clean: ", mss->private_clean);
    + SEQ_PUT_DEC(" kB\nPrivate_Dirty: ", mss->private_dirty);
    + SEQ_PUT_DEC(" kB\nReferenced: ", mss->referenced);
    + SEQ_PUT_DEC(" kB\nAnonymous: ", mss->anonymous);
    + SEQ_PUT_DEC(" kB\nLazyFree: ", mss->lazyfree);
    + SEQ_PUT_DEC(" kB\nAnonHugePages: ", mss->anonymous_thp);
    + SEQ_PUT_DEC(" kB\nShmemPmdMapped: ", mss->shmem_thp);
    + SEQ_PUT_DEC(" kB\nFilePmdMapped: ", mss->file_thp);
    + SEQ_PUT_DEC(" kB\nShared_Hugetlb: ", mss->shared_hugetlb);
    + seq_put_decimal_ull_width(m, " kB\nPrivate_Hugetlb: ",
    mss->private_hugetlb >> 10, 7);
    - SEQ_PUT_DEC(" kB\nSwap: ", mss->swap);
    - SEQ_PUT_DEC(" kB\nSwapPss: ",
    +#ifdef CONFIG_HUGETLB_HIGH_GRANULARITY_MAPPING
    +#ifndef __PAGETABLE_PUD_FOLDED
    + SEQ_PUT_DEC(" kB\nHugetlbPudMapped: ", mss->hugetlb_pud_mapped);
    +#endif
    +#ifndef __PAGETABLE_PMD_FOLDED
    + SEQ_PUT_DEC(" kB\nHugetlbPmdMapped: ", mss->hugetlb_pmd_mapped);
    +#endif
    + SEQ_PUT_DEC(" kB\nHugetlbPteMapped: ", mss->hugetlb_pte_mapped);
    +#endif /* CONFIG_HUGETLB_HIGH_GRANULARITY_MAPPING */
    + SEQ_PUT_DEC(" kB\nSwap: ", mss->swap);
    + SEQ_PUT_DEC(" kB\nSwapPss: ",
    mss->swap_pss >> PSS_SHIFT);
    - SEQ_PUT_DEC(" kB\nLocked: ",
    + SEQ_PUT_DEC(" kB\nLocked: ",
    mss->pss_locked >> PSS_SHIFT);
    seq_puts(m, " kB\n");
    }
    @@ -880,18 +929,18 @@ static int show_smap(struct seq_file *m, void *v)

    show_map_vma(m, vma);

    - SEQ_PUT_DEC("Size: ", vma->vm_end - vma->vm_start);
    - SEQ_PUT_DEC(" kB\nKernelPageSize: ", vma_kernel_pagesize(vma));
    - SEQ_PUT_DEC(" kB\nMMUPageSize: ", vma_mmu_pagesize(vma));
    + SEQ_PUT_DEC("Size: ", vma->vm_end - vma->vm_start);
    + SEQ_PUT_DEC(" kB\nKernelPageSize: ", vma_kernel_pagesize(vma));
    + SEQ_PUT_DEC(" kB\nMMUPageSize: ", vma_mmu_pagesize(vma));
    seq_puts(m, " kB\n");

    __show_smap(m, &mss, false);

    - seq_printf(m, "THPeligible: %d\n",
    + seq_printf(m, "THPeligible: %d\n",
    hugepage_vma_check(vma, vma->vm_flags, true, false, true));

    if (arch_pkeys_enabled())
    - seq_printf(m, "ProtectionKey: %8u\n", vma_pkey(vma));
    + seq_printf(m, "ProtectionKey: %8u\n", vma_pkey(vma));
    show_smap_vma_flags(m, vma);

    return 0;
    --
    2.39.0.314.g84b9a713c41-goog
    \
     
     \ /
      Last update: 2023-03-26 23:28    [W:4.185 / U:0.380 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site