Commit 09a9f1d2 authored by Michel Lespinasse's avatar Michel Lespinasse Committed by Linus Torvalds

Revert "mm: introduce VM_POPULATE flag to better deal with racy userspace programs"

This reverts commit 18693050 ("mm: introduce VM_POPULATE flag to
better deal with racy userspace programs").

VM_POPULATE only has any effect when userspace plays racy games with
vmas by trying to unmap and remap memory regions that mmap or mlock are
operating on.

Also, the only effect of VM_POPULATE when userspace plays such games is
that it avoids populating new memory regions that get remapped into the
address range that was being operated on by the original mmap or mlock
calls.

Let's remove VM_POPULATE as there isn't any strong argument to mandate a
new vm_flag.
Signed-off-by: default avatarMichel Lespinasse <walken@google.com>
Signed-off-by: default avatarHugh Dickins <hughd@google.com>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 0776ce03
...@@ -87,7 +87,6 @@ extern unsigned int kobjsize(const void *objp); ...@@ -87,7 +87,6 @@ extern unsigned int kobjsize(const void *objp);
#define VM_PFNMAP 0x00000400 /* Page-ranges managed without "struct page", just pure PFN */ #define VM_PFNMAP 0x00000400 /* Page-ranges managed without "struct page", just pure PFN */
#define VM_DENYWRITE 0x00000800 /* ETXTBSY on write attempts.. */ #define VM_DENYWRITE 0x00000800 /* ETXTBSY on write attempts.. */
#define VM_POPULATE 0x00001000
#define VM_LOCKED 0x00002000 #define VM_LOCKED 0x00002000
#define VM_IO 0x00004000 /* Memory mapped I/O or similar */ #define VM_IO 0x00004000 /* Memory mapped I/O or similar */
......
...@@ -79,8 +79,6 @@ calc_vm_flag_bits(unsigned long flags) ...@@ -79,8 +79,6 @@ calc_vm_flag_bits(unsigned long flags)
{ {
return _calc_vm_trans(flags, MAP_GROWSDOWN, VM_GROWSDOWN ) | return _calc_vm_trans(flags, MAP_GROWSDOWN, VM_GROWSDOWN ) |
_calc_vm_trans(flags, MAP_DENYWRITE, VM_DENYWRITE ) | _calc_vm_trans(flags, MAP_DENYWRITE, VM_DENYWRITE ) |
((flags & MAP_LOCKED) ? (VM_LOCKED | VM_POPULATE) : 0) | _calc_vm_trans(flags, MAP_LOCKED, VM_LOCKED );
(((flags & (MAP_POPULATE | MAP_NONBLOCK)) == MAP_POPULATE) ?
VM_POPULATE : 0);
} }
#endif /* _LINUX_MMAN_H */ #endif /* _LINUX_MMAN_H */
...@@ -204,10 +204,8 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size, ...@@ -204,10 +204,8 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size,
unsigned long addr; unsigned long addr;
struct file *file = get_file(vma->vm_file); struct file *file = get_file(vma->vm_file);
vm_flags = vma->vm_flags; addr = mmap_region(file, start, size,
if (!(flags & MAP_NONBLOCK)) vma->vm_flags, pgoff);
vm_flags |= VM_POPULATE;
addr = mmap_region(file, start, size, vm_flags, pgoff);
fput(file); fput(file);
if (IS_ERR_VALUE(addr)) { if (IS_ERR_VALUE(addr)) {
err = addr; err = addr;
...@@ -226,12 +224,6 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size, ...@@ -226,12 +224,6 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size,
mutex_unlock(&mapping->i_mmap_mutex); mutex_unlock(&mapping->i_mmap_mutex);
} }
if (!(flags & MAP_NONBLOCK) && !(vma->vm_flags & VM_POPULATE)) {
if (!has_write_lock)
goto get_write_lock;
vma->vm_flags |= VM_POPULATE;
}
if (vma->vm_flags & VM_LOCKED) { if (vma->vm_flags & VM_LOCKED) {
/* /*
* drop PG_Mlocked flag for over-mapped range * drop PG_Mlocked flag for over-mapped range
......
...@@ -358,7 +358,7 @@ static int do_mlock(unsigned long start, size_t len, int on) ...@@ -358,7 +358,7 @@ static int do_mlock(unsigned long start, size_t len, int on)
newflags = vma->vm_flags & ~VM_LOCKED; newflags = vma->vm_flags & ~VM_LOCKED;
if (on) if (on)
newflags |= VM_LOCKED | VM_POPULATE; newflags |= VM_LOCKED;
tmp = vma->vm_end; tmp = vma->vm_end;
if (tmp > end) if (tmp > end)
...@@ -418,8 +418,7 @@ int __mm_populate(unsigned long start, unsigned long len, int ignore_errors) ...@@ -418,8 +418,7 @@ int __mm_populate(unsigned long start, unsigned long len, int ignore_errors)
* range with the first VMA. Also, skip undesirable VMA types. * range with the first VMA. Also, skip undesirable VMA types.
*/ */
nend = min(end, vma->vm_end); nend = min(end, vma->vm_end);
if ((vma->vm_flags & (VM_IO | VM_PFNMAP | VM_POPULATE)) != if (vma->vm_flags & (VM_IO | VM_PFNMAP))
VM_POPULATE)
continue; continue;
if (nstart < vma->vm_start) if (nstart < vma->vm_start)
nstart = vma->vm_start; nstart = vma->vm_start;
...@@ -492,9 +491,9 @@ static int do_mlockall(int flags) ...@@ -492,9 +491,9 @@ static int do_mlockall(int flags)
struct vm_area_struct * vma, * prev = NULL; struct vm_area_struct * vma, * prev = NULL;
if (flags & MCL_FUTURE) if (flags & MCL_FUTURE)
current->mm->def_flags |= VM_LOCKED | VM_POPULATE; current->mm->def_flags |= VM_LOCKED;
else else
current->mm->def_flags &= ~(VM_LOCKED | VM_POPULATE); current->mm->def_flags &= ~VM_LOCKED;
if (flags == MCL_FUTURE) if (flags == MCL_FUTURE)
goto out; goto out;
...@@ -503,7 +502,7 @@ static int do_mlockall(int flags) ...@@ -503,7 +502,7 @@ static int do_mlockall(int flags)
newflags = vma->vm_flags & ~VM_LOCKED; newflags = vma->vm_flags & ~VM_LOCKED;
if (flags & MCL_CURRENT) if (flags & MCL_CURRENT)
newflags |= VM_LOCKED | VM_POPULATE; newflags |= VM_LOCKED;
/* Ignore errors */ /* Ignore errors */
mlock_fixup(vma, &prev, vma->vm_start, vma->vm_end, newflags); mlock_fixup(vma, &prev, vma->vm_start, vma->vm_end, newflags);
......
...@@ -1306,7 +1306,9 @@ unsigned long do_mmap_pgoff(struct file *file, unsigned long addr, ...@@ -1306,7 +1306,9 @@ unsigned long do_mmap_pgoff(struct file *file, unsigned long addr,
} }
addr = mmap_region(file, addr, len, vm_flags, pgoff); addr = mmap_region(file, addr, len, vm_flags, pgoff);
if (!IS_ERR_VALUE(addr) && (vm_flags & VM_POPULATE)) if (!IS_ERR_VALUE(addr) &&
((vm_flags & VM_LOCKED) ||
(flags & (MAP_POPULATE | MAP_NONBLOCK)) == MAP_POPULATE))
*populate = len; *populate = len;
return addr; return addr;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment