Skip to content

Commit bce73e4

Browse files
borntraegertorvalds
authored andcommitted
mm: do not drop unused pages when userfaultd is running
KVM guests on s390 can notify the host of unused pages. This can result in pte_unused callbacks to be true for KVM guest memory. If a page is unused (checked with pte_unused) we might drop this page instead of paging it. This can have side-effects on userfaultd, when the page in question was already migrated: The next access of that page will trigger a fault and a user fault instead of faulting in a new and empty zero page. As QEMU does not expect a userfault on an already migrated page this migration will fail. The most straightforward solution is to ignore the pte_unused hint if a userfault context is active for this VMA. Link: http://lkml.kernel.org/r/[email protected] Signed-off-by: Christian Borntraeger <[email protected]> Cc: Martin Schwidefsky <[email protected]> Cc: Andrea Arcangeli <[email protected]> Cc: Mike Rapoport <[email protected]> Cc: Janosch Frank <[email protected]> Cc: David Hildenbrand <[email protected]> Cc: Cornelia Huck <[email protected]> Cc: <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent 3951dbf commit bce73e4

File tree

1 file changed

+7
-1
lines changed

1 file changed

+7
-1
lines changed

mm/rmap.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
#include <linux/backing-dev.h>
6565
#include <linux/page_idle.h>
6666
#include <linux/memremap.h>
67+
#include <linux/userfaultfd_k.h>
6768

6869
#include <asm/tlbflush.h>
6970

@@ -1481,11 +1482,16 @@ static bool try_to_unmap_one(struct page *page, struct vm_area_struct *vma,
14811482
set_pte_at(mm, address, pvmw.pte, pteval);
14821483
}
14831484

1484-
} else if (pte_unused(pteval)) {
1485+
} else if (pte_unused(pteval) && !userfaultfd_armed(vma)) {
14851486
/*
14861487
* The guest indicated that the page content is of no
14871488
* interest anymore. Simply discard the pte, vmscan
14881489
* will take care of the rest.
1490+
* A future reference will then fault in a new zero
1491+
* page. When userfaultfd is active, we must not drop
1492+
* this page though, as its main user (postcopy
1493+
* migration) will not expect userfaults on already
1494+
* copied pages.
14891495
*/
14901496
dec_mm_counter(mm, mm_counter(page));
14911497
/* We have to invalidate as we cleared the pte */

0 commit comments

Comments
 (0)