Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> wrote: >On Tue, 14 Jul 2020 11:07:44 +0800 linmiaohe <linmiaohe@xxxxxxxxxx> wrote: > >> From: Miaohe Lin <linmiaohe@xxxxxxxxxx> >> >> The vm_flags may be changed after call_mmap() because drivers may set >> some flags for their own purpose. As a result, we failed to merge the >> adjacent vma due to the different vm_flags as userspace can't pass in the same one. >> Try to merge vma after call_mmap() to fix this issue. >> >> Signed-off-by: Hongxiang Lou <louhongxiang@xxxxxxxxxx> >> Signed-off-by: Miaohe Lin <linmiaohe@xxxxxxxxxx> >> --- >> + /* If vm_flags changed after call_mmap(), we should try merge vma again >> + * as we may succeed this time. >> + */ >> + if (unlikely(vm_flags != vma->vm_flags && prev)) { >> + merge = vma_merge(mm, prev, vma->vm_start, vma->vm_end, vma->vm_flags, >> + NULL, vma->vm_file, vma->vm_pgoff, NULL, NULL_VM_UFFD_CTX); >> + if (merge) { >> + fput(file); >> + vm_area_free(vma); >> + vma = merge; >> + goto unmap_writable; > >Shouldn't we update local variable `vm_flags' here, to pick up the change? And possibly `addr'? Yes, we should. `vm_flags` and `addr` should be updated to continue the work. Many thanks for your great review. I will fix it and test again. I will send a patch v2 soon.