Skip to content

Commit 3cec504

Browse files
committed
vm: fix move_vma() memory accounting being off
Commit 408579c ("mm: Update do_vmi_align_munmap() return semantics") seems to have updated one of the callers of do_vmi_munmap() incorrectly: it used to check for the error case (which didn't change: negative means error). That commit changed the check to the success case (which did change: before that commit, 0 was success, and 1 was "success and lock downgraded". After the change, it's always 0 for success, and the lock will have been released if requested). This didn't change any actual VM behavior _except_ for memory accounting when 'VM_ACCOUNT' was set on the vma. Which made the wrong return value test fairly subtle, since everything continues to work. Or rather - it continues to work but the "Committed memory" accounting goes all wonky (Committed_AS value in /proc/meminfo), and depending on settings that then causes problems much much later as the VM relies on bogus statistics for its heuristics. Revert that one line of the change back to the original logic. Fixes: 408579c ("mm: Update do_vmi_align_munmap() return semantics") Reported-by: Christoph Biedl <linux-kernel.bfrz@manchmal.in-ulm.de> Reported-bisected-and-tested-by: Michael Labiuk <michael.labiuk@virtuozzo.com> Cc: Bagas Sanjaya <bagasdotme@gmail.com> Cc: Liam R. Howlett <Liam.Howlett@oracle.com> Link: https://lore.kernel.org/all/1694366957@msgid.manchmal.in-ulm.de/ Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parent ad8a69f commit 3cec504

File tree

1 file changed

+1
-1
lines changed

1 file changed

+1
-1
lines changed

mm/mremap.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -715,7 +715,7 @@ static unsigned long move_vma(struct vm_area_struct *vma,
715715
}
716716

717717
vma_iter_init(&vmi, mm, old_addr);
718-
if (!do_vmi_munmap(&vmi, mm, old_addr, old_len, uf_unmap, false)) {
718+
if (do_vmi_munmap(&vmi, mm, old_addr, old_len, uf_unmap, false) < 0) {
719719
/* OOM: unable to split vma, just get accounts right */
720720
if (vm_flags & VM_ACCOUNT && !(flags & MREMAP_DONTUNMAP))
721721
vm_acct_memory(old_len >> PAGE_SHIFT);

0 commit comments

Comments
 (0)