|
@@ -256,6 +256,7 @@ SYSCALL_DEFINE1(brk, unsigned long, brk)
|
|
|
unsigned long newbrk, oldbrk;
|
|
|
struct mm_struct *mm = current->mm;
|
|
|
unsigned long min_brk;
|
|
|
+ bool populate;
|
|
|
|
|
|
down_write(&mm->mmap_sem);
|
|
|
|
|
@@ -305,8 +306,15 @@ SYSCALL_DEFINE1(brk, unsigned long, brk)
|
|
|
/* Ok, looks good - let it rip. */
|
|
|
if (do_brk(oldbrk, newbrk-oldbrk) != oldbrk)
|
|
|
goto out;
|
|
|
+
|
|
|
set_brk:
|
|
|
mm->brk = brk;
|
|
|
+ populate = newbrk > oldbrk && (mm->def_flags & VM_LOCKED) != 0;
|
|
|
+ up_write(&mm->mmap_sem);
|
|
|
+ if (populate)
|
|
|
+ mm_populate(oldbrk, newbrk - oldbrk);
|
|
|
+ return brk;
|
|
|
+
|
|
|
out:
|
|
|
retval = mm->brk;
|
|
|
up_write(&mm->mmap_sem);
|
|
@@ -2600,10 +2608,8 @@ static unsigned long do_brk(unsigned long addr, unsigned long len)
|
|
|
out:
|
|
|
perf_event_mmap(vma);
|
|
|
mm->total_vm += len >> PAGE_SHIFT;
|
|
|
- if (flags & VM_LOCKED) {
|
|
|
- if (!mlock_vma_pages_range(vma, addr, addr + len))
|
|
|
- mm->locked_vm += (len >> PAGE_SHIFT);
|
|
|
- }
|
|
|
+ if (flags & VM_LOCKED)
|
|
|
+ mm->locked_vm += (len >> PAGE_SHIFT);
|
|
|
return addr;
|
|
|
}
|
|
|
|
|
@@ -2611,10 +2617,14 @@ unsigned long vm_brk(unsigned long addr, unsigned long len)
|
|
|
{
|
|
|
struct mm_struct *mm = current->mm;
|
|
|
unsigned long ret;
|
|
|
+ bool populate;
|
|
|
|
|
|
down_write(&mm->mmap_sem);
|
|
|
ret = do_brk(addr, len);
|
|
|
+ populate = ((mm->def_flags & VM_LOCKED) != 0);
|
|
|
up_write(&mm->mmap_sem);
|
|
|
+ if (populate)
|
|
|
+ mm_populate(addr, len);
|
|
|
return ret;
|
|
|
}
|
|
|
EXPORT_SYMBOL(vm_brk);
|