[PATCH] arm64: Don't report clear pmds and puds as huge

Steve Capper steve.capper at linaro.org
Wed Jul 1 05:24:34 PDT 2015


On 1 July 2015 at 13:08, Christoffer Dall <christoffer.dall at linaro.org> 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

Thanks Christoffer.

It may be worth adding:

Fixes: 084bd29810a5 ("ARM64: mm: HugeTLB support.")

And, please feel free to add:

Reviewed-by: Steve Capper <steve.capper at linaro.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
> --
> 2.1.2.330.g565301e.dirty
>



More information about the linux-arm-kernel mailing list