[PATCH] arm64: Don't report clear pmds and puds as huge
Catalin Marinas
catalin.marinas at arm.com
Wed Jul 1 06:18:31 PDT 2015
On Wed, Jul 01, 2015 at 02:08:31PM +0200, Christoffer Dall wrote:
> The current pmd_huge() and pud_huge() functions simply check if the table
> bit is not set and reports the entries as huge in that case. This is
> counter-intuitive as a clear pmd/pud cannot also be a huge pmd/pud, and
> it is inconsistent with at least arm and x86.
>
> To prevent others from making the same mistake as me in looking at code
> that calls these functions and to fix an issue with KVM on arm64 that
> causes memory corruption due to incorrect page reference counting
> resulting from this mistake, let's change the behavior.
>
> Cc: stable at vger.kernel.org
> Signed-off-by: Christoffer Dall <christoffer.dall at linaro.org>
> ---
> arch/arm64/mm/hugetlbpage.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/arch/arm64/mm/hugetlbpage.c b/arch/arm64/mm/hugetlbpage.c
> index 2de9d2e..0eeb4f09 100644
> --- a/arch/arm64/mm/hugetlbpage.c
> +++ b/arch/arm64/mm/hugetlbpage.c
> @@ -40,13 +40,13 @@ int huge_pmd_unshare(struct mm_struct *mm, unsigned long *addr, pte_t *ptep)
>
> int pmd_huge(pmd_t pmd)
> {
> - return !(pmd_val(pmd) & PMD_TABLE_BIT);
> + return pmd_val(pmd) && !(pmd_val(pmd) & PMD_TABLE_BIT);
> }
>
> int pud_huge(pud_t pud)
> {
> #ifndef __PAGETABLE_PMD_FOLDED
> - return !(pud_val(pud) & PUD_TABLE_BIT);
> + return pud_val(pud) && !(pud_val(pud) & PUD_TABLE_BIT);
> #else
> return 0;
> #endif
Thanks for the patch, I'll add the acks/reviews and Fixes: tags.
(and I think I'll change pmd_val to pmd_present, same for pud; no
functional difference)
--
Catalin
More information about the linux-arm-kernel
mailing list