Thread (9 messages) 9 messages, 4 authors, 2019-09-21

RE: [PATCH v7 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 14:24:23
Also in: linux-mm, lkml

Thanks for your patent review 😊

--
Cheers,
Justin (Jia He)


-----Original Message-----
From: Kirill A. Shutemov <redacted>
Sent: 2019年9月20日 22:21
To: Justin He (Arm Technology China) <redacted>
Cc: Catalin Marinas <Catalin.Marinas@arm.com>; Will Deacon
[off-list ref]; 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]; nd [off-list ref]
Subject: Re: [PATCH v7 3/3] mm: fix double page fault on arm64 if PTE_AF is
cleared

On Fri, Sep 20, 2019 at 09:54:37PM +0800, Jia He wrote:
quoted
When we tested pmdk unit test [1] vmmalloc_fork TEST1 in arm64 guest,
there
quoted
will be a double page fault in __copy_from_user_inatomic of
cow_user_page.
quoted
Below call trace is from arm64 do_page_fault for debugging purpose
[  110.016195] Call trace:
[  110.016826]  do_page_fault+0x5a4/0x690
[  110.017812]  do_mem_abort+0x50/0xb0
[  110.018726]  el1_da+0x20/0xc4
[  110.019492]  __arch_copy_from_user+0x180/0x280
[  110.020646]  do_wp_page+0xb0/0x860
[  110.021517]  __handle_mm_fault+0x994/0x1338
[  110.022606]  handle_mm_fault+0xe8/0x180
[  110.023584]  do_page_fault+0x240/0x690
[  110.024535]  do_mem_abort+0x50/0xb0
[  110.025423]  el0_da+0x20/0x24

The pte info before __copy_from_user_inatomic is (PTE_AF is cleared):
[ffff9b007000] pgd=000000023d4f8003, pud=000000023da9b003,
pmd=000000023d4b3003, pte=360000298607bd3
quoted
As told by Catalin: "On arm64 without hardware Access Flag, copying from
user will fail because the pte is old and cannot be marked young. So we
always end up with zeroed page after fork() + CoW for pfn mappings. we
don't always have a hardware-managed access flag on arm64."

This patch fix it by calling pte_mkyoung. Also, the parameter is
changed because vmf should be passed to cow_user_page()

Add a WARN_ON_ONCE when __copy_from_user_inatomic() returns error
in case there can be some obscure use-case.(by Kirill)

[1] https://github.com/pmem/pmdk/tree/master/src/test/vmmalloc_fork

Reported-by: Yibo Cai <redacted>
Signed-off-by: Jia He <redacted>
Acked-by: Kirill A. Shutemov <redacted>

--
 Kirill A. Shutemov
_______________________________________________
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