[PATCH] fix VmSize and VmData after mremap
mremap's move_vma is applying __vm_stat_account to the old vma which may have already been freed: move it to just before the do_munmap. mremapping to and fro with CONFIG_DEBUG_SLAB=y showed /proc/<pid>/status VmSize and VmData wrapping just like in kernel bugzilla #4842, and fixed by this patch - worth including in 2.6.13, though not yet confirmed that it fixes that specific report from Frank van Maarseveen. Signed-off-by: Hugh Dickins <hugh@veritas.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
e234f35c54
commit
1c5ad84516
@ -229,6 +229,7 @@ static unsigned long move_vma(struct vm_area_struct *vma,
|
|||||||
* since do_munmap() will decrement it by old_len == new_len
|
* since do_munmap() will decrement it by old_len == new_len
|
||||||
*/
|
*/
|
||||||
mm->total_vm += new_len >> PAGE_SHIFT;
|
mm->total_vm += new_len >> PAGE_SHIFT;
|
||||||
|
__vm_stat_account(mm, vma->vm_flags, vma->vm_file, new_len>>PAGE_SHIFT);
|
||||||
|
|
||||||
if (do_munmap(mm, old_addr, old_len) < 0) {
|
if (do_munmap(mm, old_addr, old_len) < 0) {
|
||||||
/* OOM: unable to split vma, just get accounts right */
|
/* OOM: unable to split vma, just get accounts right */
|
||||||
@ -243,7 +244,6 @@ static unsigned long move_vma(struct vm_area_struct *vma,
|
|||||||
vma->vm_next->vm_flags |= VM_ACCOUNT;
|
vma->vm_next->vm_flags |= VM_ACCOUNT;
|
||||||
}
|
}
|
||||||
|
|
||||||
__vm_stat_account(mm, vma->vm_flags, vma->vm_file, new_len>>PAGE_SHIFT);
|
|
||||||
if (vm_flags & VM_LOCKED) {
|
if (vm_flags & VM_LOCKED) {
|
||||||
mm->locked_vm += new_len >> PAGE_SHIFT;
|
mm->locked_vm += new_len >> PAGE_SHIFT;
|
||||||
if (new_len > old_len)
|
if (new_len > old_len)
|
||||||
|
Loading…
Reference in New Issue
Block a user