|
@@ -1009,8 +1009,7 @@ munmap_back:
|
|
}
|
|
}
|
|
|
|
|
|
/* Check against address space limit. */
|
|
/* Check against address space limit. */
|
|
- if ((mm->total_vm << PAGE_SHIFT) + len
|
|
|
|
- > current->signal->rlim[RLIMIT_AS].rlim_cur)
|
|
|
|
|
|
+ if (!may_expand_vm(mm, len >> PAGE_SHIFT))
|
|
return -ENOMEM;
|
|
return -ENOMEM;
|
|
|
|
|
|
if (accountable && (!(flags & MAP_NORESERVE) ||
|
|
if (accountable && (!(flags & MAP_NORESERVE) ||
|
|
@@ -1421,7 +1420,7 @@ static int acct_stack_growth(struct vm_area_struct * vma, unsigned long size, un
|
|
struct rlimit *rlim = current->signal->rlim;
|
|
struct rlimit *rlim = current->signal->rlim;
|
|
|
|
|
|
/* address space limit tests */
|
|
/* address space limit tests */
|
|
- if (mm->total_vm + grow > rlim[RLIMIT_AS].rlim_cur >> PAGE_SHIFT)
|
|
|
|
|
|
+ if (!may_expand_vm(mm, grow))
|
|
return -ENOMEM;
|
|
return -ENOMEM;
|
|
|
|
|
|
/* Stack limit test */
|
|
/* Stack limit test */
|
|
@@ -1848,8 +1847,7 @@ unsigned long do_brk(unsigned long addr, unsigned long len)
|
|
}
|
|
}
|
|
|
|
|
|
/* Check against address space limits *after* clearing old maps... */
|
|
/* Check against address space limits *after* clearing old maps... */
|
|
- if ((mm->total_vm << PAGE_SHIFT) + len
|
|
|
|
- > current->signal->rlim[RLIMIT_AS].rlim_cur)
|
|
|
|
|
|
+ if (!may_expand_vm(mm, len >> PAGE_SHIFT))
|
|
return -ENOMEM;
|
|
return -ENOMEM;
|
|
|
|
|
|
if (mm->map_count > sysctl_max_map_count)
|
|
if (mm->map_count > sysctl_max_map_count)
|
|
@@ -2019,3 +2017,19 @@ struct vm_area_struct *copy_vma(struct vm_area_struct **vmap,
|
|
}
|
|
}
|
|
return new_vma;
|
|
return new_vma;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Return true if the calling process may expand its vm space by the passed
|
|
|
|
+ * number of pages
|
|
|
|
+ */
|
|
|
|
+int may_expand_vm(struct mm_struct *mm, unsigned long npages)
|
|
|
|
+{
|
|
|
|
+ unsigned long cur = mm->total_vm; /* pages */
|
|
|
|
+ unsigned long lim;
|
|
|
|
+
|
|
|
|
+ lim = current->signal->rlim[RLIMIT_AS].rlim_cur >> PAGE_SHIFT;
|
|
|
|
+
|
|
|
|
+ if (cur + npages > lim)
|
|
|
|
+ return 0;
|
|
|
|
+ return 1;
|
|
|
|
+}
|