diff options
Diffstat (limited to 'mm/rmap.c')
| -rw-r--r-- | mm/rmap.c | 8 | 
1 files changed, 7 insertions, 1 deletions
| diff --git a/mm/rmap.c b/mm/rmap.c index 6db729dc4c50..eb477809a5c0 100644 --- a/mm/rmap.c +++ b/mm/rmap.c @@ -64,6 +64,7 @@  #include <linux/backing-dev.h>  #include <linux/page_idle.h>  #include <linux/memremap.h> +#include <linux/userfaultfd_k.h>  #include <asm/tlbflush.h> @@ -1481,11 +1482,16 @@ static bool try_to_unmap_one(struct page *page, struct vm_area_struct *vma,  				set_pte_at(mm, address, pvmw.pte, pteval);  			} -		} else if (pte_unused(pteval)) { +		} else if (pte_unused(pteval) && !userfaultfd_armed(vma)) {  			/*  			 * The guest indicated that the page content is of no  			 * interest anymore. Simply discard the pte, vmscan  			 * will take care of the rest. +			 * A future reference will then fault in a new zero +			 * page. When userfaultfd is active, we must not drop +			 * this page though, as its main user (postcopy +			 * migration) will not expect userfaults on already +			 * copied pages.  			 */  			dec_mm_counter(mm, mm_counter(page));  			/* We have to invalidate as we cleared the pte */ |