On Fri 27-01-17 20:44:30, Mike Rapoport wrote: > When a non-cooperative userfaultfd monitor copies pages in the background, > it may encounter regions that were already unmapped. Addition of > UFFD_EVENT_UNMAP allows the uffd monitor to track precisely changes in the > virtual memory layout. > > Since there might be different uffd contexts for the affected VMAs, we > first should create a temporary representation for the unmap event for each > uffd context and then notify them one by one to the appropriate userfault > file descriptors. > > The event notification occurs after the mmap_sem has been released. > > Signed-off-by: Mike Rapoport <rppt@xxxxxxxxxxxxxxxxxx> > Acked-by: Hillf Danton <hillf.zj@xxxxxxxxxxxxxxx> This breaks NOMMU compilation --- >From 510948533b059f4f5033464f9f4a0c32d4ab0c08 Mon Sep 17 00:00:00 2001 From: Michal Hocko <mhocko@xxxxxxxx> Date: Thu, 2 Feb 2017 10:08:47 +0100 Subject: [PATCH] mmotm: userfaultfd-non-cooperative-add-event-for-memory-unmaps-fix This breaks compilation on nommu configs. mm/nommu.c:1201:15: error: conflicting types for 'do_mmap' unsigned long do_mmap(struct file *file, ^ In file included from mm/nommu.c:19:0: ./include/linux/mm.h:2089:22: note: previous declaration of 'do_mmap' was here extern unsigned long do_mmap(struct file *file, unsigned long addr, ^ mm/nommu.c:1580:5: error: conflicting types for 'do_munmap' int do_munmap(struct mm_struct *mm, unsigned long start, size_t len) ^ In file included from mm/nommu.c:19:0: ./include/linux/mm.h:2093:12: note: previous declaration of 'do_munmap' was here extern int do_munmap(struct mm_struct *, unsigned long, size_t, ^ make[1]: *** [mm/nommu.o] Error 1 CONFIG_USERFAULTFD depends on CONFIG_MMU so I guess we are OK to just ignore the argument. Signed-off-by: Michal Hocko <mhocko@xxxxxxxx> --- mm/nommu.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/mm/nommu.c b/mm/nommu.c index d35088a4b73d..f78d06459ba4 100644 --- a/mm/nommu.c +++ b/mm/nommu.c @@ -1205,7 +1205,8 @@ unsigned long do_mmap(struct file *file, unsigned long flags, vm_flags_t vm_flags, unsigned long pgoff, - unsigned long *populate) + unsigned long *populate, + struct list_head *uf_unused) { struct vm_area_struct *vma; struct vm_region *region; @@ -1577,7 +1578,7 @@ static int shrink_vma(struct mm_struct *mm, * - under NOMMU conditions the chunk to be unmapped must be backed by a single * VMA, though it need not cover the whole VMA */ -int do_munmap(struct mm_struct *mm, unsigned long start, size_t len) +int do_munmap(struct mm_struct *mm, unsigned long start, size_t len, struct list_head *uf) { struct vm_area_struct *vma; unsigned long end; @@ -1643,7 +1644,7 @@ int vm_munmap(unsigned long addr, size_t len) int ret; down_write(&mm->mmap_sem); - ret = do_munmap(mm, addr, len); + ret = do_munmap(mm, addr, len, NULL); up_write(&mm->mmap_sem); return ret; } -- 2.11.0 -- Michal Hocko SUSE Labs -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>