lkml.org 
[lkml]   [2018]   [Oct]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 2/3] mm: add mm_pxd_folded checks to pgtable_bytes accounting functions
    Date
    The common mm code calls mm_dec_nr_pmds() and mm_dec_nr_puds()
    in free_pgtables() if the address range spans a full pud or pmd.
    If mm_dec_nr_puds/mm_dec_nr_pmds are non-empty due to configuration
    settings they blindly subtract the size of the pmd or pud table from
    pgtable_bytes even if the pud or pmd page table layer is folded.

    Add explicit mm_[pmd|pud]_folded checks to the four pgtable_bytes
    accounting functions mm_inc_nr_puds, mm_inc_nr_pmds, mm_dec_nr_puds
    and mm_dec_nr_pmds. As the check for folded page tables can be
    overwritten by the architecture, this allows to keep a correct
    pgtable_bytes value for platforms that use a dynamic number of
    page table levels.

    Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
    ---
    include/linux/mm.h | 8 ++++++++
    1 file changed, 8 insertions(+)

    diff --git a/include/linux/mm.h b/include/linux/mm.h
    index d1029972541c..67f55c71e59a 100644
    --- a/include/linux/mm.h
    +++ b/include/linux/mm.h
    @@ -1764,11 +1764,15 @@ int __pud_alloc(struct mm_struct *mm, p4d_t *p4d, unsigned long address);

    static inline void mm_inc_nr_puds(struct mm_struct *mm)
    {
    + if (mm_pud_folded(mm))
    + return;
    atomic_long_add(PTRS_PER_PUD * sizeof(pud_t), &mm->pgtables_bytes);
    }

    static inline void mm_dec_nr_puds(struct mm_struct *mm)
    {
    + if (mm_pud_folded(mm))
    + return;
    atomic_long_sub(PTRS_PER_PUD * sizeof(pud_t), &mm->pgtables_bytes);
    }
    #endif
    @@ -1788,11 +1792,15 @@ int __pmd_alloc(struct mm_struct *mm, pud_t *pud, unsigned long address);

    static inline void mm_inc_nr_pmds(struct mm_struct *mm)
    {
    + if (mm_pmd_folded(mm))
    + return;
    atomic_long_add(PTRS_PER_PMD * sizeof(pmd_t), &mm->pgtables_bytes);
    }

    static inline void mm_dec_nr_pmds(struct mm_struct *mm)
    {
    + if (mm_pmd_folded(mm))
    + return;
    atomic_long_sub(PTRS_PER_PMD * sizeof(pmd_t), &mm->pgtables_bytes);
    }
    #endif
    --
    2.16.4
    \
     
     \ /
      Last update: 2018-10-15 18:43    [W:2.220 / U:0.268 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site