FAILED: patch "[PATCH] mm/memory.c: fix modifying of page protection by insert_pfn()" failed to apply to 4.14-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 4.14-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From cae85cb8add35f678cf487139d05e083ce2f570a Mon Sep 17 00:00:00 2001
From: Jan Kara <[email protected]>
Date: Thu, 28 Mar 2019 20:43:19 -0700
Subject: [PATCH] mm/memory.c: fix modifying of page protection by insert_pfn()
Aneesh has reported that PPC triggers the following warning when excercising DAX code:
IP set_pte_at+0x3c/0x190
LR insert_pfn+0x208/0x280
Call Trace:
insert_pfn+0x68/0x280
dax_iomap_pte_fault.isra.7+0x734/0xa40
__xfs_filemap_fault+0x280/0x2d0
do_wp_page+0x48c/0xa40
__handle_mm_fault+0x8d0/0x1fd0
handle_mm_fault+0x140/0x250
__do_page_fault+0x300/0xd60
handle_page_fault+0x18Now that is WARN_ON in set_pte_at which is
VM_WARN_ON(pte_hw_valid(*ptep) && !pte_protnone(*ptep));
The problem is that on some architectures set_pte_at() cannot cope with a situation where there is already some (different) valid entry present.
Use ptep_set_access_flags() instead to modify the pfn which is built to deal with modifying existing PTE.
mm/memory.c +6 -5
@@ -1549,10 +1549,12 @@ static vm_fault_t insert_pfn(struct vm_area_struct *vma, unsigned long addr,WARN_ON_ONCE (!is_zero_pfn (pte_pfn (*pte))); goto out_unlock; } - entry = *pte; - goto out_mkwrite; - }else - goto out_unlock; + entry =pte_mkyoung (*pte); + entry =maybe_mkwrite (pte_mkdirty (entry), vma); +if (ptep_set_access_flags (vma, addr, pte, entry,1 )) +update_mmu_cache (vma, addr, pte); + } + goto out_unlock; }/* Ok, finally just insert the thing.. */
@@ -1561,7 +1563,6 @@ static vm_fault_t insert_pfn(struct vm_area_struct *vma, unsigned long addr,else entry =pte_mkspecial (pfn_t_pte (pfn, prot)); -out_mkwrite:if (mkwrite) { entry =pte_mkyoung (entry); entry =maybe_mkwrite (pte_mkdirty (entry), vma);