Re: [PATCH] mm: mmap: Merge vma after call_mmap() if possible

From: linmiaohe
Date: Thu Jul 16 2020 - 21:05:01 EST


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.