On Tue, 29 Dec 2015 00:10:15 +0300 Cyrill Gorcunov <gorcunov@xxxxxxxxx> wrote: > When inspecting a vague code inside prctl(PR_SET_MM_MEM) > call (which testing the RLIMIT_DATA value to figure out > if we're allowed to assign new @start_brk, @brk, @start_data, > @end_data from mm_struct) it's been commited that RLIMIT_DATA > in a form it's implemented now doesn't do anything useful > because most of user-space libraries use mmap() syscall > for dynamic memory allocations. > > Linus suggested to convert RLIMIT_DATA rlimit into something > suitable for anonymous memory accounting. But in this patch > we go further, and the changes are bundled together as: > > * keep vma counting if CONFIG_PROC_FS=n, will be used for limits > * replace mm->shared_vm with better defined mm->data_vm > * account anonymous executable areas as executable > * account file-backed growsdown/up areas as stack > * drop struct file* argument from vm_stat_account > * enforce RLIMIT_DATA for size of data areas > > This way code looks cleaner: now code/stack/data > classification depends only on vm_flags state: > > VM_EXEC & ~VM_WRITE -> code (VmExe + VmLib in proc) > VM_GROWSUP | VM_GROWSDOWN -> stack (VmStk) > VM_WRITE & ~VM_SHARED & !stack -> data (VmData) > > The rest (VmSize - VmData - VmStk - VmExe - VmLib) could be > called "shared", but that might be strange beast like > readonly-private or VM_IO area. > > - RLIMIT_AS limits whole address space "VmSize" > - RLIMIT_STACK limits stack "VmStk" (but each vma individually) > - RLIMIT_DATA now limits "VmData" This clashes with mm-mmapc-remove-redundant-local-variables-for-may_expand_vm.patch, below. I resolved it thusly: bool may_expand_vm(struct mm_struct *mm, vm_flags_t flags, unsigned long npages) { if (mm->total_vm + npages > rlimit(RLIMIT_AS) >> PAGE_SHIFT) return false; if ((flags & (VM_WRITE | VM_SHARED | (VM_STACK_FLAGS & (VM_GROWSUP | VM_GROWSDOWN)))) == VM_WRITE) return mm->data_vm + npages <= rlimit(RLIMIT_DATA); return true; } From: Chen Gang <gang.chen.5i5j@xxxxxxxxx> Subject: mm/mmap.c: remove redundant local variables for may_expand_vm() Simplify may_expand_vm() [akpm@xxxxxxxxxxxxxxxxxxxx: further simplification, per Naoya Horiguchi] Signed-off-by: Chen Gang <gang.chen.5i5j@xxxxxxxxx> Cc: Naoya Horiguchi <n-horiguchi@xxxxxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- mm/mmap.c | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff -puN mm/mmap.c~mm-mmapc-remove-redundant-local-variables-for-may_expand_vm mm/mmap.c --- a/mm/mmap.c~mm-mmapc-remove-redundant-local-variables-for-may_expand_vm +++ a/mm/mmap.c @@ -2988,14 +2988,7 @@ out: */ int may_expand_vm(struct mm_struct *mm, unsigned long npages) { - unsigned long cur = mm->total_vm; /* pages */ - unsigned long lim; - - lim = rlimit(RLIMIT_AS) >> PAGE_SHIFT; - - if (cur + npages > lim) - return 0; - return 1; + return mm->total_vm + npages <= rlimit(RLIMIT_AS) >> PAGE_SHIFT; } static int special_mapping_fault(struct vm_area_struct *vma, _ -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>