diff options
| author | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2018-10-15 04:30:23 -0400 |
|---|---|---|
| committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2018-11-02 03:31:54 -0400 |
| commit | 6d212db11947ae5464e4717536ed9faf61c01e86 (patch) | |
| tree | 1de9816d69f5a602ad0218b2a33af0efaa0297eb /include/linux/mm.h | |
| parent | 1071fc5779d9846fec56a4ff6089ab08cac1ab72 (diff) | |
mm: add mm_pxd_folded checks to pgtable_bytes accounting functions
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.
Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'include/linux/mm.h')
| -rw-r--r-- | include/linux/mm.h | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/include/linux/mm.h b/include/linux/mm.h index daa2b8f1e9a8..a3701e91bb57 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
| @@ -1742,11 +1742,15 @@ int __pud_alloc(struct mm_struct *mm, p4d_t *p4d, unsigned long address); | |||
| 1742 | 1742 | ||
| 1743 | static inline void mm_inc_nr_puds(struct mm_struct *mm) | 1743 | static inline void mm_inc_nr_puds(struct mm_struct *mm) |
| 1744 | { | 1744 | { |
| 1745 | if (mm_pud_folded(mm)) | ||
| 1746 | return; | ||
| 1745 | atomic_long_add(PTRS_PER_PUD * sizeof(pud_t), &mm->pgtables_bytes); | 1747 | atomic_long_add(PTRS_PER_PUD * sizeof(pud_t), &mm->pgtables_bytes); |
| 1746 | } | 1748 | } |
| 1747 | 1749 | ||
| 1748 | static inline void mm_dec_nr_puds(struct mm_struct *mm) | 1750 | static inline void mm_dec_nr_puds(struct mm_struct *mm) |
| 1749 | { | 1751 | { |
| 1752 | if (mm_pud_folded(mm)) | ||
| 1753 | return; | ||
| 1750 | atomic_long_sub(PTRS_PER_PUD * sizeof(pud_t), &mm->pgtables_bytes); | 1754 | atomic_long_sub(PTRS_PER_PUD * sizeof(pud_t), &mm->pgtables_bytes); |
| 1751 | } | 1755 | } |
| 1752 | #endif | 1756 | #endif |
| @@ -1766,11 +1770,15 @@ int __pmd_alloc(struct mm_struct *mm, pud_t *pud, unsigned long address); | |||
| 1766 | 1770 | ||
| 1767 | static inline void mm_inc_nr_pmds(struct mm_struct *mm) | 1771 | static inline void mm_inc_nr_pmds(struct mm_struct *mm) |
| 1768 | { | 1772 | { |
| 1773 | if (mm_pmd_folded(mm)) | ||
| 1774 | return; | ||
| 1769 | atomic_long_add(PTRS_PER_PMD * sizeof(pmd_t), &mm->pgtables_bytes); | 1775 | atomic_long_add(PTRS_PER_PMD * sizeof(pmd_t), &mm->pgtables_bytes); |
| 1770 | } | 1776 | } |
| 1771 | 1777 | ||
| 1772 | static inline void mm_dec_nr_pmds(struct mm_struct *mm) | 1778 | static inline void mm_dec_nr_pmds(struct mm_struct *mm) |
| 1773 | { | 1779 | { |
| 1780 | if (mm_pmd_folded(mm)) | ||
| 1781 | return; | ||
| 1774 | atomic_long_sub(PTRS_PER_PMD * sizeof(pmd_t), &mm->pgtables_bytes); | 1782 | atomic_long_sub(PTRS_PER_PMD * sizeof(pmd_t), &mm->pgtables_bytes); |
| 1775 | } | 1783 | } |
| 1776 | #endif | 1784 | #endif |
