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.

Reply via email to