On Sat, 16 Sept 2023 at 04:43, Bagas Sanjaya <bagasdotme@xxxxxxxxx> wrote: > > Thanks for the regression report. Michael had already bisected it [1], so > telling regzbot: > > #regzbot ^introduced: 408579cd627a15 > #regzbot title: huge committed memory due to returning 0 on do_vmi_align_mmunmap() success > > [1]: https://lore.kernel.org/linux-parisc/30f16b4f-a2fa-fc42-fe6e-abad01c3f794@xxxxxxxxxxxxx/ Funky. That commit isn't actually supposed to change anything, and the only locking change was because it incorrectly ended up doing the unlock a bit too early (before it did a validate_mm() - fixed in commit b5641a5d8b8b ("mm: don't do validate_mm() unnecessarily and without mmap locking"). HOWEVER. Now that I look at it again, I note this change in move_vma(). - if (do_vmi_munmap(&vmi, mm, old_addr, old_len, uf_unmap, false) < 0) { + if (!do_vmi_munmap(&vmi, mm, old_addr, old_len, uf_unmap, false)) { and I think that is wrong. The return value that changed was the old "return 1 if successful _and_ lock downgraded". Now it does "lock is always released on success if requested". So the special "1" return went away, but the failure case didn't change. So that change to "move_vma()" seems to be bogus. It used to do "if failed". Now it does "if success". Does the attached patch fix the problem? Liam - or am I just crazy? That return value check change really looks bogus to me, but it looks *so* bogus that it makes me think I'm missing something. Linus
mm/mremap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mm/mremap.c b/mm/mremap.c index 056478c106ee..382e81c33fc4 100644 --- a/mm/mremap.c +++ b/mm/mremap.c @@ -715,7 +715,7 @@ static unsigned long move_vma(struct vm_area_struct *vma, } vma_iter_init(&vmi, mm, old_addr); - if (!do_vmi_munmap(&vmi, mm, old_addr, old_len, uf_unmap, false)) { + if (do_vmi_munmap(&vmi, mm, old_addr, old_len, uf_unmap, false) < 0) { /* OOM: unable to split vma, just get accounts right */ if (vm_flags & VM_ACCOUNT && !(flags & MREMAP_DONTUNMAP)) vm_acct_memory(old_len >> PAGE_SHIFT);