Thread (8 messages) 8 messages, 2 authors, 2019-09-20

RE: [PATCH v5 3/3] mm: fix double page fault on arm64 if PTE_AF is cleared

From: Justin He (Arm Technology China) <hidden>
Date: 2019-09-20 01:14:03
Also in: linux-mm, lkml

Hi Catalin
-----Original Message-----
From: Catalin Marinas <catalin.marinas@arm.com>
Sent: 2019年9月20日 0:42
To: Justin He (Arm Technology China) <redacted>
Cc: Will Deacon <will@kernel.org>; Mark Rutland
[off-list ref]; James Morse [off-list ref]; Marc
Zyngier [off-list ref]; Matthew Wilcox [off-list ref]; Kirill A.
Shutemov [off-list ref]; linux-arm-
kernel@lists.infradead.org; linux-kernel@vger.kernel.org; linux-
mm@kvack.org; Suzuki Poulose [off-list ref]; Punit
Agrawal [off-list ref]; Anshuman Khandual
[off-list ref]; Alex Van Brunt
[off-list ref]; Robin Murphy [off-list ref];
Thomas Gleixner [off-list ref]; Andrew Morton <akpm@linux-
foundation.org>; Jérôme Glisse [off-list ref]; Ralph Campbell
[off-list ref]; hejianet@gmail.com; Kaly Xin (Arm Technology
China) [off-list ref]
Subject: Re: [PATCH v5 3/3] mm: fix double page fault on arm64 if PTE_AF
is cleared

On Fri, Sep 20, 2019 at 12:12:04AM +0800, Jia He wrote:
quoted
@@ -2152,7 +2163,29 @@ static inline void cow_user_page(struct page
*dst, struct page *src, unsigned lo
quoted
     */
    if (unlikely(!src)) {
            void *kaddr = kmap_atomic(dst);
-           void __user *uaddr = (void __user *)(va & PAGE_MASK);
+           void __user *uaddr = (void __user *)(addr & PAGE_MASK);
+           pte_t entry;
+
+           /* On architectures with software "accessed" bits, we would
+            * take a double page fault, so mark it accessed here.
+            */
+           if (arch_faults_on_old_pte() && !pte_young(vmf->orig_pte))
{
quoted
+                   spin_lock(vmf->ptl);
+                   if (likely(pte_same(*vmf->pte, vmf->orig_pte))) {
+                           entry = pte_mkyoung(vmf->orig_pte);
+                           if (ptep_set_access_flags(vma, addr,
+                                                     vmf->pte, entry, 0))
+                                   update_mmu_cache(vma, addr, vmf-
pte);
+                   } else {
+                           /* Other thread has already handled the
fault
quoted
+                            * and we don't need to do anything. If it's
+                            * not the case, the fault will be triggered
+                            * again on the same address.
+                            */
+                           return -1;
+                   }
+                   spin_unlock(vmf->ptl);
Returning with the spinlock held doesn't normally go very well ;).
Yes, my bad. Will fix asap

--
Cheers,
Justin (Jia He)


IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you.
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help