162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#ifndef _LINUX_PGALLOC_TRACK_H 362306a36Sopenharmony_ci#define _LINUX_PGALLOC_TRACK_H 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#if defined(CONFIG_MMU) 662306a36Sopenharmony_cistatic inline p4d_t *p4d_alloc_track(struct mm_struct *mm, pgd_t *pgd, 762306a36Sopenharmony_ci unsigned long address, 862306a36Sopenharmony_ci pgtbl_mod_mask *mod_mask) 962306a36Sopenharmony_ci{ 1062306a36Sopenharmony_ci if (unlikely(pgd_none(*pgd))) { 1162306a36Sopenharmony_ci if (__p4d_alloc(mm, pgd, address)) 1262306a36Sopenharmony_ci return NULL; 1362306a36Sopenharmony_ci *mod_mask |= PGTBL_PGD_MODIFIED; 1462306a36Sopenharmony_ci } 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci return p4d_offset(pgd, address); 1762306a36Sopenharmony_ci} 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_cistatic inline pud_t *pud_alloc_track(struct mm_struct *mm, p4d_t *p4d, 2062306a36Sopenharmony_ci unsigned long address, 2162306a36Sopenharmony_ci pgtbl_mod_mask *mod_mask) 2262306a36Sopenharmony_ci{ 2362306a36Sopenharmony_ci if (unlikely(p4d_none(*p4d))) { 2462306a36Sopenharmony_ci if (__pud_alloc(mm, p4d, address)) 2562306a36Sopenharmony_ci return NULL; 2662306a36Sopenharmony_ci *mod_mask |= PGTBL_P4D_MODIFIED; 2762306a36Sopenharmony_ci } 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci return pud_offset(p4d, address); 3062306a36Sopenharmony_ci} 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_cistatic inline pmd_t *pmd_alloc_track(struct mm_struct *mm, pud_t *pud, 3362306a36Sopenharmony_ci unsigned long address, 3462306a36Sopenharmony_ci pgtbl_mod_mask *mod_mask) 3562306a36Sopenharmony_ci{ 3662306a36Sopenharmony_ci if (unlikely(pud_none(*pud))) { 3762306a36Sopenharmony_ci if (__pmd_alloc(mm, pud, address)) 3862306a36Sopenharmony_ci return NULL; 3962306a36Sopenharmony_ci *mod_mask |= PGTBL_PUD_MODIFIED; 4062306a36Sopenharmony_ci } 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci return pmd_offset(pud, address); 4362306a36Sopenharmony_ci} 4462306a36Sopenharmony_ci#endif /* CONFIG_MMU */ 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci#define pte_alloc_kernel_track(pmd, address, mask) \ 4762306a36Sopenharmony_ci ((unlikely(pmd_none(*(pmd))) && \ 4862306a36Sopenharmony_ci (__pte_alloc_kernel(pmd) || ({*(mask)|=PGTBL_PMD_MODIFIED;0;})))?\ 4962306a36Sopenharmony_ci NULL: pte_offset_kernel(pmd, address)) 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci#endif /* _LINUX_PGALLOC_TRACK_H */ 52