Patch "mm: avoid setting up anonymous pages into file mapping" has been added to the 4.1-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
mm: avoid setting up anonymous pages into file mapping
to the 4.1-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
mm-avoid-setting-up-anonymous-pages-into-file-mapping.patch
and it can be found in the queue-4.1 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
6b7339f4c31ad69c8e9c0b2859276e22cf72176dMon Sep 17 00:00:00 2001
From: "Kirill A. Shutemov" <[email protected]>
Date: Mon, 6 Jul 2015 23:18:37 +0300
Subject: mm: avoid setting up anonymous pages into file mapping
From: "Kirill A. Shutemov" <[email protected]>
commit 6b7339f4c31ad69c8e9c0b2859276e22cf72176d upstream.
Reading page fault handler code I've noticed that under right circumstances kernel would map anonymous pages into file mappings: if the VMA doesn't have vm_ops->fault() and the VMA wasn't fully populated on ->mmap(), kernel would handle page fault to not populated pte with do_anonymous_page().
Let's change page fault handler to use do_anonymous_page() only on anonymous VMA (->vm_ops == NULL) and make sure that the VMA is not shared.
For file mappings without vm_ops->fault() or shred VMA without vm_ops, page fault on pte_none() entry would lead to SIGBUS.
--- mm/memory.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-)
mm/memory.c +13 -7
@@ -2669,6 +2669,10 @@ static int do_anonymous_page(struct mm_spte_unmap (page_table); +/* File mapping without ->vm_ops ? */ +if (vma->vm_flags &VM_SHARED ) +return VM_FAULT_SIGBUS ; +/* Check if we need to add a guard page to the stack */ if (check_stack_guard_page (vma, address) <0 )return VM_FAULT_SIGSEGV ;
@@ -3097,6 +3101,9 @@ static int do_fault(struct mm_struct *mm - vma->vm_start) >> PAGE_SHIFT) + vma->vm_pgoff;pte_unmap (page_table); +/* The VMA was not fully populated on mmap() or missing VM_DONTEXPAND */ +if (!vma->vm_ops->fault) +return VM_FAULT_SIGBUS ;if (!(flags &FAULT_FLAG_WRITE ))return do_read_fault (mm, vma, address, pmd, pgoff, flags, orig_pte);
@@ -3242,13 +3249,12 @@ static int handle_pte_fault(struct mm_stbarrier ();if (!pte_present (entry)) {if (pte_none (entry)) { -if (vma->vm_ops) { -if (likely (vma->vm_ops->fault)) -return do_fault (mm, vma, address, pte, - pmd, flags, entry); - } -return do_anonymous_page (mm, vma, address, - pte, pmd, flags); +if (vma->vm_ops) +return do_fault (mm, vma, address, pte, pmd, + flags, entry); + +return do_anonymous_page (mm, vma, address, pte, pmd, + flags); }return do_swap_page (mm, vma, address, pte, pmd, flags, entry);
Patches currently in stable-queue which might be from [email protected] are
queue-4.1/mm-avoid-setting-up-anonymous-pages-into-file-mapping.patch