mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 03:27:44 -04:00
mmap: handle mlocked pages during map, remap, unmap
Originally by Nick Piggin <[email protected]> Remove mlocked pages from the LRU using "unevictable infrastructure" during mmap(), munmap(), mremap() and truncate(). Try to move back to normal LRU lists on munmap() when last mlocked mapping removed. Remove PageMlocked() status when page truncated from file. [[email protected]: cleanup] [[email protected]: fix double unlock_page()] [[email protected]: split LRU: munlock rework] [[email protected]: mlock: fix __mlock_vma_pages_range comment block] [[email protected]: remove bogus kerneldoc token] Signed-off-by: Nick Piggin <[email protected]> Signed-off-by: Lee Schermerhorn <[email protected]> Signed-off-by: Rik van Riel <[email protected]> Signed-off-by: KOSAKI Motohiro <[email protected]> Signed-off-by: KAMEZAWA Hiroyuki <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
parent
8edb08caf6
commit
ba470de431
6 changed files with 180 additions and 160 deletions
27
mm/fremap.c
27
mm/fremap.c
|
|
@ -21,6 +21,8 @@
|
|||
#include <asm/cacheflush.h>
|
||||
#include <asm/tlbflush.h>
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
static void zap_pte(struct mm_struct *mm, struct vm_area_struct *vma,
|
||||
unsigned long addr, pte_t *ptep)
|
||||
{
|
||||
|
|
@ -215,15 +217,31 @@ asmlinkage long sys_remap_file_pages(unsigned long start, unsigned long size,
|
|||
spin_unlock(&mapping->i_mmap_lock);
|
||||
}
|
||||
|
||||
if (vma->vm_flags & VM_LOCKED) {
|
||||
/*
|
||||
* drop PG_Mlocked flag for over-mapped range
|
||||
*/
|
||||
unsigned int saved_flags = vma->vm_flags;
|
||||
munlock_vma_pages_range(vma, start, start + size);
|
||||
vma->vm_flags = saved_flags;
|
||||
}
|
||||
|
||||
mmu_notifier_invalidate_range_start(mm, start, start + size);
|
||||
err = populate_range(mm, vma, start, size, pgoff);
|
||||
mmu_notifier_invalidate_range_end(mm, start, start + size);
|
||||
if (!err && !(flags & MAP_NONBLOCK)) {
|
||||
if (unlikely(has_write_lock)) {
|
||||
downgrade_write(&mm->mmap_sem);
|
||||
has_write_lock = 0;
|
||||
if (vma->vm_flags & VM_LOCKED) {
|
||||
/*
|
||||
* might be mapping previously unmapped range of file
|
||||
*/
|
||||
mlock_vma_pages_range(vma, start, start + size);
|
||||
} else {
|
||||
if (unlikely(has_write_lock)) {
|
||||
downgrade_write(&mm->mmap_sem);
|
||||
has_write_lock = 0;
|
||||
}
|
||||
make_pages_present(start, start+size);
|
||||
}
|
||||
make_pages_present(start, start+size);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -240,4 +258,3 @@ out:
|
|||
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue