Re: [PATCH] mm: fix double page fault on arm64 if PTE_AF is cleared

From: Anshuman Khandual
Date: Wed Sep 04 2019 - 00:37:47 EST

On 09/04/2019 08:49 AM, Anshuman Khandual wrote:
> /*
> * This really shouldn't fail, because the page is there
> * in the page tables. But it might just be unreadable,
> * in which case we just give up and fill the result with
> - * zeroes.
> + * zeroes. If PTE_AF is cleared on arm64, it might
> + * cause double page fault here. so makes pte young here
> */
> + if (!pte_young(vmf->orig_pte)) {
> + entry = pte_mkyoung(vmf->orig_pte);
> + if (ptep_set_access_flags(vmf->vma, vmf->address,
> + vmf->pte, entry, vmf->flags & FAULT_FLAG_WRITE))
> + update_mmu_cache(vmf->vma, vmf->address,
> + vmf->pte);
> + }

This looks correct where it updates the pte entry with PTE_AF which
will prevent a subsequent page fault. But I think what we really need
here is to make sure 'uaddr' is mapped correctly at vma->pte. Probably
a generic function arch_map_pte() when defined for arm64 should check
CPU version and ensure continuance of PTE_AF if required. The comment
above also need to be updated saying not only the page should be there
in the page table, it needs to mapped appropriately as well.