mm/mmap: simplify vma link and unlink
authorYajun Deng <yajun.deng@linux.dev>
Wed, 10 Jan 2024 08:46:22 +0000 (16:46 +0800)
committerAndrew Morton <akpm@linux-foundation.org>
Thu, 22 Feb 2024 00:00:02 +0000 (16:00 -0800)
The file parameter in the __remove_shared_vm_struct is no longer used,
remove it.

These functions vma_link() and mmap_region() have some of the same code,
introduce vma_link_file() helper function to simplify the code.

Link: https://lkml.kernel.org/r/20240110084622.2425927-1-yajun.deng@linux.dev
Signed-off-by: Yajun Deng <yajun.deng@linux.dev>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/mmap.c

index d89770eaab6b6111117783ca7ff532871c1d71a5..282ed6d0914b076230abfcc09b506cc5395640ae 100644 (file)
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -105,7 +105,7 @@ void vma_set_page_prot(struct vm_area_struct *vma)
  * Requires inode->i_mapping->i_mmap_rwsem
  */
 static void __remove_shared_vm_struct(struct vm_area_struct *vma,
-               struct file *file, struct address_space *mapping)
+                                     struct address_space *mapping)
 {
        if (vma_is_shared_maywrite(vma))
                mapping_unmap_writable(mapping);
@@ -126,7 +126,7 @@ void unlink_file_vma(struct vm_area_struct *vma)
        if (file) {
                struct address_space *mapping = file->f_mapping;
                i_mmap_lock_write(mapping);
-               __remove_shared_vm_struct(vma, file, mapping);
+               __remove_shared_vm_struct(vma, mapping);
                i_mmap_unlock_write(mapping);
        }
 }
@@ -392,26 +392,30 @@ static void __vma_link_file(struct vm_area_struct *vma,
        flush_dcache_mmap_unlock(mapping);
 }
 
+static void vma_link_file(struct vm_area_struct *vma)
+{
+       struct file *file = vma->vm_file;
+       struct address_space *mapping;
+
+       if (file) {
+               mapping = file->f_mapping;
+               i_mmap_lock_write(mapping);
+               __vma_link_file(vma, mapping);
+               i_mmap_unlock_write(mapping);
+       }
+}
+
 static int vma_link(struct mm_struct *mm, struct vm_area_struct *vma)
 {
        VMA_ITERATOR(vmi, mm, 0);
-       struct address_space *mapping = NULL;
 
        vma_iter_config(&vmi, vma->vm_start, vma->vm_end);
        if (vma_iter_prealloc(&vmi, vma))
                return -ENOMEM;
 
        vma_start_write(vma);
-
        vma_iter_store(&vmi, vma);
-
-       if (vma->vm_file) {
-               mapping = vma->vm_file->f_mapping;
-               i_mmap_lock_write(mapping);
-               __vma_link_file(vma, mapping);
-               i_mmap_unlock_write(mapping);
-       }
-
+       vma_link_file(vma);
        mm->map_count++;
        validate_mm(mm);
        return 0;
@@ -519,10 +523,9 @@ static inline void vma_complete(struct vma_prepare *vp,
        }
 
        if (vp->remove && vp->file) {
-               __remove_shared_vm_struct(vp->remove, vp->file, vp->mapping);
+               __remove_shared_vm_struct(vp->remove, vp->mapping);
                if (vp->remove2)
-                       __remove_shared_vm_struct(vp->remove2, vp->file,
-                                                 vp->mapping);
+                       __remove_shared_vm_struct(vp->remove2, vp->mapping);
        } else if (vp->insert) {
                /*
                 * split_vma has split insert from vma, and needs
@@ -2891,16 +2894,7 @@ cannot_expand:
        vma_start_write(vma);
        vma_iter_store(&vmi, vma);
        mm->map_count++;
-       if (vma->vm_file) {
-               i_mmap_lock_write(vma->vm_file->f_mapping);
-               if (vma_is_shared_maywrite(vma))
-                       mapping_allow_writable(vma->vm_file->f_mapping);
-
-               flush_dcache_mmap_lock(vma->vm_file->f_mapping);
-               vma_interval_tree_insert(vma, &vma->vm_file->f_mapping->i_mmap);
-               flush_dcache_mmap_unlock(vma->vm_file->f_mapping);
-               i_mmap_unlock_write(vma->vm_file->f_mapping);
-       }
+       vma_link_file(vma);
 
        /*
         * vma_merge() calls khugepaged_enter_vma() either, the below