X-Git-Url: https://git.proxmox.com/?p=pve-kernel.git;a=blobdiff_plain;f=patches%2Fkernel%2F0019-mm-mremap-fix-mremap-expanding-vma-with-addr-inside-.patch;fp=patches%2Fkernel%2F0019-mm-mremap-fix-mremap-expanding-vma-with-addr-inside-.patch;h=f7fb8c02a1e7a78f72fbe162350c7368aa36d654;hp=0000000000000000000000000000000000000000;hb=4d1db3083ca7a6afa2ae4597aa93fdc35b066f2d;hpb=a0a93ff7fec0cd9cc2c17418a34084444d57b0d7 diff --git a/patches/kernel/0019-mm-mremap-fix-mremap-expanding-vma-with-addr-inside-.patch b/patches/kernel/0019-mm-mremap-fix-mremap-expanding-vma-with-addr-inside-.patch new file mode 100644 index 0000000..f7fb8c0 --- /dev/null +++ b/patches/kernel/0019-mm-mremap-fix-mremap-expanding-vma-with-addr-inside-.patch @@ -0,0 +1,59 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Vlastimil Babka +Date: Fri, 16 Dec 2022 17:32:27 +0100 +Subject: [PATCH] mm, mremap: fix mremap() expanding vma with addr inside vma +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +commit 6f12be792fde994ed934168f93c2a0d2a0cf0bc5 upstream. + +Since 6.1 we have noticed random rpm install failures that were tracked to +mremap() returning -ENOMEM and to commit ca3d76b0aa80 ("mm: add merging +after mremap resize"). + +The problem occurs when mremap() expands a VMA in place, but using an +starting address that's not vma->vm_start, but somewhere in the middle. +The extension_pgoff calculation introduced by the commit is wrong in that +case, so vma_merge() fails due to pgoffs not being compatible. Fix the +calculation. + +By the way it seems that the situations, where rpm now expands a vma from +the middle, were made possible also due to that commit, thanks to the +improved vma merging. Yet it should work just fine, except for the buggy +calculation. + +Link: https://lkml.kernel.org/r/20221216163227.24648-1-vbabka@suse.cz +Reported-by: Jiri Slaby + Link: https://bugzilla.suse.com/show_bug.cgi?id=1206359 +Fixes: ca3d76b0aa80 ("mm: add merging after mremap resize") +Signed-off-by: Vlastimil Babka +Cc: Jakub Matěna +Cc: "Kirill A . Shutemov" +Cc: Liam Howlett +Cc: Matthew Wilcox +Cc: Mel Gorman +Cc: Michal Hocko +Cc: +Signed-off-by: Andrew Morton +Signed-off-by: Greg Kroah-Hartman +(cherry picked from commit 4d528dab403ba45db24769f5e5a9514ab0890351) +Signed-off-by: Thomas Lamprecht +--- + mm/mremap.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/mm/mremap.c b/mm/mremap.c +index e465ffe279bb..fe587c5d6591 100644 +--- a/mm/mremap.c ++++ b/mm/mremap.c +@@ -1016,7 +1016,8 @@ SYSCALL_DEFINE5(mremap, unsigned long, addr, unsigned long, old_len, + long pages = (new_len - old_len) >> PAGE_SHIFT; + unsigned long extension_start = addr + old_len; + unsigned long extension_end = addr + new_len; +- pgoff_t extension_pgoff = vma->vm_pgoff + (old_len >> PAGE_SHIFT); ++ pgoff_t extension_pgoff = vma->vm_pgoff + ++ ((extension_start - vma->vm_start) >> PAGE_SHIFT); + + if (vma->vm_flags & VM_ACCOUNT) { + if (security_vm_enough_memory_mm(mm, pages)) {