Message ID | 20250217065414.49489-1-anshuman.khandual@arm.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | arm64/hugetlb: Consistently use pud_sect_supported() | expand |
On 17/02/2025 06:54, Anshuman Khandual wrote: > Let's be consistent in using pud_sect_supported() for PUD_SIZE sized pages. > Hence change hugetlb_mask_last_page() and arch_make_huge_pte() as required. > > Cc: Catalin Marinas <catalin.marinas@arm.com> > Cc: Will Deacon <will@kernel.org> > Cc: linux-arm-kernel@lists.infradead.org > Cc: linux-kernel@vger.kernel.org > Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com> > --- > This patch applies on v6.14-rc3 > > arch/arm64/mm/hugetlbpage.c | 7 +++++-- > 1 file changed, 5 insertions(+), 2 deletions(-) > > diff --git a/arch/arm64/mm/hugetlbpage.c b/arch/arm64/mm/hugetlbpage.c > index 98a2a0e64e25..5b7cfdba9c93 100644 > --- a/arch/arm64/mm/hugetlbpage.c > +++ b/arch/arm64/mm/hugetlbpage.c > @@ -342,7 +342,9 @@ unsigned long hugetlb_mask_last_page(struct hstate *h) > switch (hp_size) { > #ifndef __PAGETABLE_PMD_FOLDED > case PUD_SIZE: > - return PGDIR_SIZE - PUD_SIZE; > + if (pud_sect_supported()) > + return PGDIR_SIZE - PUD_SIZE; > + break; > #endif > case CONT_PMD_SIZE: > return PUD_SIZE - CONT_PMD_SIZE; > @@ -364,7 +366,8 @@ pte_t arch_make_huge_pte(pte_t entry, unsigned int shift, vm_flags_t flags) > switch (pagesize) { > #ifndef __PAGETABLE_PMD_FOLDED > case PUD_SIZE: > - entry = pud_pte(pud_mkhuge(pte_pud(entry))); > + if (pud_sect_supported()) > + entry = pud_pte(pud_mkhuge(pte_pud(entry))); If this was to get called with PUD_SIZE for a config that doesn't fold the PMD and which pud_sect_supported() returns false, we will now return the entry unmodified and will not emit the warning that the default case emits. I think we should at least either modify the entry (so that it is safe) or emit the warning. Doing neither seems less defensive than the current situation. > break; > #endif > case CONT_PMD_SIZE:
On 2/17/25 19:51, Ryan Roberts wrote: > On 17/02/2025 06:54, Anshuman Khandual wrote: >> Let's be consistent in using pud_sect_supported() for PUD_SIZE sized pages. >> Hence change hugetlb_mask_last_page() and arch_make_huge_pte() as required. >> >> Cc: Catalin Marinas <catalin.marinas@arm.com> >> Cc: Will Deacon <will@kernel.org> >> Cc: linux-arm-kernel@lists.infradead.org >> Cc: linux-kernel@vger.kernel.org >> Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com> >> --- >> This patch applies on v6.14-rc3 >> >> arch/arm64/mm/hugetlbpage.c | 7 +++++-- >> 1 file changed, 5 insertions(+), 2 deletions(-) >> >> diff --git a/arch/arm64/mm/hugetlbpage.c b/arch/arm64/mm/hugetlbpage.c >> index 98a2a0e64e25..5b7cfdba9c93 100644 >> --- a/arch/arm64/mm/hugetlbpage.c >> +++ b/arch/arm64/mm/hugetlbpage.c >> @@ -342,7 +342,9 @@ unsigned long hugetlb_mask_last_page(struct hstate *h) >> switch (hp_size) { >> #ifndef __PAGETABLE_PMD_FOLDED >> case PUD_SIZE: >> - return PGDIR_SIZE - PUD_SIZE; >> + if (pud_sect_supported()) >> + return PGDIR_SIZE - PUD_SIZE; >> + break; >> #endif >> case CONT_PMD_SIZE: >> return PUD_SIZE - CONT_PMD_SIZE; >> @@ -364,7 +366,8 @@ pte_t arch_make_huge_pte(pte_t entry, unsigned int shift, vm_flags_t flags) >> switch (pagesize) { >> #ifndef __PAGETABLE_PMD_FOLDED >> case PUD_SIZE: >> - entry = pud_pte(pud_mkhuge(pte_pud(entry))); >> + if (pud_sect_supported()) >> + entry = pud_pte(pud_mkhuge(pte_pud(entry))); > > If this was to get called with PUD_SIZE for a config that doesn't fold the PMD > and which pud_sect_supported() returns false, we will now return the entry > unmodified and will not emit the warning that the default case emits. I think we > should at least either modify the entry (so that it is safe) or emit the > warning. Doing neither seems less defensive than the current situation. An warning can be added before breaking when pud_sect_supported() returns false which will help inform the user that the page table entry did not get modified. switch (pagesize) { #ifndef __PAGETABLE_PMD_FOLDED case PUD_SIZE: if (pud_sect_supported()) entry = pud_pte(pud_mkhuge(pte_pud(entry))); else pr_warn("%s: pud huge page not supported\n", __func__); break; #endif > >> break; >> #endif >> case CONT_PMD_SIZE: >
diff --git a/arch/arm64/mm/hugetlbpage.c b/arch/arm64/mm/hugetlbpage.c index 98a2a0e64e25..5b7cfdba9c93 100644 --- a/arch/arm64/mm/hugetlbpage.c +++ b/arch/arm64/mm/hugetlbpage.c @@ -342,7 +342,9 @@ unsigned long hugetlb_mask_last_page(struct hstate *h) switch (hp_size) { #ifndef __PAGETABLE_PMD_FOLDED case PUD_SIZE: - return PGDIR_SIZE - PUD_SIZE; + if (pud_sect_supported()) + return PGDIR_SIZE - PUD_SIZE; + break; #endif case CONT_PMD_SIZE: return PUD_SIZE - CONT_PMD_SIZE; @@ -364,7 +366,8 @@ pte_t arch_make_huge_pte(pte_t entry, unsigned int shift, vm_flags_t flags) switch (pagesize) { #ifndef __PAGETABLE_PMD_FOLDED case PUD_SIZE: - entry = pud_pte(pud_mkhuge(pte_pud(entry))); + if (pud_sect_supported()) + entry = pud_pte(pud_mkhuge(pte_pud(entry))); break; #endif case CONT_PMD_SIZE:
Let's be consistent in using pud_sect_supported() for PUD_SIZE sized pages. Hence change hugetlb_mask_last_page() and arch_make_huge_pte() as required. Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Will Deacon <will@kernel.org> Cc: linux-arm-kernel@lists.infradead.org Cc: linux-kernel@vger.kernel.org Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com> --- This patch applies on v6.14-rc3 arch/arm64/mm/hugetlbpage.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)