Line data Source code
1 : /* SPDX-License-Identifier: GPL-2.0 */ 2 : #ifndef _LINUX_PGALLOC_TRACK_H 3 : #define _LINUX_PGALLOC_TRACK_H 4 : 5 : #if defined(CONFIG_MMU) 6 : static inline p4d_t *p4d_alloc_track(struct mm_struct *mm, pgd_t *pgd, 7 : unsigned long address, 8 : pgtbl_mod_mask *mod_mask) 9 : { 10 274 : if (unlikely(pgd_none(*pgd))) { 11 : if (__p4d_alloc(mm, pgd, address)) 12 : return NULL; 13 : *mod_mask |= PGTBL_PGD_MODIFIED; 14 : } 15 : 16 274 : return p4d_offset(pgd, address); 17 : } 18 : 19 : static inline pud_t *pud_alloc_track(struct mm_struct *mm, p4d_t *p4d, 20 : unsigned long address, 21 : pgtbl_mod_mask *mod_mask) 22 : { 23 274 : if (unlikely(p4d_none(*p4d))) { 24 : if (__pud_alloc(mm, p4d, address)) 25 : return NULL; 26 : *mod_mask |= PGTBL_P4D_MODIFIED; 27 : } 28 : 29 274 : return pud_offset(p4d, address); 30 : } 31 : 32 274 : static inline pmd_t *pmd_alloc_track(struct mm_struct *mm, pud_t *pud, 33 : unsigned long address, 34 : pgtbl_mod_mask *mod_mask) 35 : { 36 274 : if (unlikely(pud_none(*pud))) { 37 1 : if (__pmd_alloc(mm, pud, address)) 38 : return NULL; 39 1 : *mod_mask |= PGTBL_PUD_MODIFIED; 40 : } 41 : 42 274 : return pmd_offset(pud, address); 43 : } 44 : #endif /* CONFIG_MMU */ 45 : 46 : #define pte_alloc_kernel_track(pmd, address, mask) \ 47 : ((unlikely(pmd_none(*(pmd))) && \ 48 : (__pte_alloc_kernel(pmd) || ({*(mask)|=PGTBL_PMD_MODIFIED;0;})))?\ 49 : NULL: pte_offset_kernel(pmd, address)) 50 : 51 : #endif /* _LINUX_PGALLOC_TRACK_H */