From: Kirill Korotaev Explain a move_vma() mystery. Signed-off-by: Andrew Morton --- mm/mremap.c | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletion(-) diff -puN mm/mremap.c~move_vma-comment mm/mremap.c --- 25/mm/mremap.c~move_vma-comment 2005-05-12 01:17:59.000000000 -0700 +++ 25-akpm/mm/mremap.c 2005-05-12 01:17:59.000000000 -0700 @@ -224,6 +224,12 @@ static unsigned long move_vma(struct vm_ split = 1; } + /* + * if we failed to move page tables we still do total_vm increment + * since do_munmap() will decrement it by old_len == new_len + */ + mm->total_vm += new_len >> PAGE_SHIFT; + if (do_munmap(mm, old_addr, old_len) < 0) { /* OOM: unable to split vma, just get accounts right */ vm_unacct_memory(excess >> PAGE_SHIFT); @@ -237,7 +243,6 @@ static unsigned long move_vma(struct vm_ vma->vm_next->vm_flags |= VM_ACCOUNT; } - mm->total_vm += new_len >> PAGE_SHIFT; __vm_stat_account(mm, vma->vm_flags, vma->vm_file, new_len>>PAGE_SHIFT); if (vm_flags & VM_LOCKED) { mm->locked_vm += new_len >> PAGE_SHIFT; _