mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-12-29 09:16:33 +00:00
arm64/mm: Re-organize arch_make_huge_pte()
Core HugeTLB defines a fallback definition for arch_make_huge_pte(), which calls platform provided pte_mkhuge(). But if any platform already provides an override for arch_make_huge_pte(), then it does not need to provide the helper pte_mkhuge(). arm64 override for arch_make_huge_pte() calls pte_mkhuge() internally, thus creating an impression, that both of these callbacks are being used in core HugeTLB and hence required to be defined. This drops off pte_mkhuge() which was never required to begin with as there could not be any section mappings at the PTE level. Re-organize arch_make_huge_pte() based on requested page size and create the entry for the applicable page table level as needed. It also removes a redundancy of clearing PTE_TABLE_BIT bit followed by setting both PTE_TABLE_BIT and PTE_VALID bits (via PTE_TYPE_MASK) in the pte, while creating CONT_PTE_SIZE size entries. Cc: Will Deacon <will@kernel.org> Cc: Ard Biesheuvel <ardb@kernel.org> Cc: Ryan Roberts <ryan.roberts@arm.com> Cc: Mark Rutland <mark.rutland@arm.com> Cc: linux-arm-kernel@lists.infradead.org Cc: linux-kernel@vger.kernel.org Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com> Link: https://lore.kernel.org/r/20241029044529.2624785-1-anshuman.khandual@arm.com Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
This commit is contained in:
parent
0448a96e24
commit
f8192813dc
@ -438,11 +438,6 @@ static inline void __set_ptes(struct mm_struct *mm,
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Huge pte definitions.
|
||||
*/
|
||||
#define pte_mkhuge(pte) (__pte(pte_val(pte) & ~PTE_TABLE_BIT))
|
||||
|
||||
/*
|
||||
* Hugetlb definitions.
|
||||
*/
|
||||
|
@ -361,14 +361,25 @@ pte_t arch_make_huge_pte(pte_t entry, unsigned int shift, vm_flags_t flags)
|
||||
{
|
||||
size_t pagesize = 1UL << shift;
|
||||
|
||||
entry = pte_mkhuge(entry);
|
||||
if (pagesize == CONT_PTE_SIZE) {
|
||||
entry = pte_mkcont(entry);
|
||||
} else if (pagesize == CONT_PMD_SIZE) {
|
||||
switch (pagesize) {
|
||||
#ifndef __PAGETABLE_PMD_FOLDED
|
||||
case PUD_SIZE:
|
||||
entry = pud_pte(pud_mkhuge(pte_pud(entry)));
|
||||
break;
|
||||
#endif
|
||||
case CONT_PMD_SIZE:
|
||||
entry = pmd_pte(pmd_mkcont(pte_pmd(entry)));
|
||||
} else if (pagesize != PUD_SIZE && pagesize != PMD_SIZE) {
|
||||
fallthrough;
|
||||
case PMD_SIZE:
|
||||
entry = pmd_pte(pmd_mkhuge(pte_pmd(entry)));
|
||||
break;
|
||||
case CONT_PTE_SIZE:
|
||||
entry = pte_mkcont(entry);
|
||||
break;
|
||||
default:
|
||||
pr_warn("%s: unrecognized huge page size 0x%lx\n",
|
||||
__func__, pagesize);
|
||||
break;
|
||||
}
|
||||
return entry;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user