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.