Merge tag 'mm-stable-2024-03-13-20-04' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-2.6-microblaze.git] / mm / mmap.c
index 3281287..04da021 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
@@ -660,9 +663,7 @@ int vma_expand(struct vma_iterator *vmi, struct vm_area_struct *vma,
 
        vma_prepare(&vp);
        vma_adjust_trans_huge(vma, start, end, 0);
-       vma->vm_start = start;
-       vma->vm_end = end;
-       vma->vm_pgoff = pgoff;
+       vma_set_range(vma, start, end, pgoff);
        vma_iter_store(vmi, vma);
 
        vma_complete(&vp, vmi, vma->vm_mm);
@@ -705,9 +706,7 @@ int vma_shrink(struct vma_iterator *vmi, struct vm_area_struct *vma,
        vma_adjust_trans_huge(vma, start, end, 0);
 
        vma_iter_clear(vmi);
-       vma->vm_start = start;
-       vma->vm_end = end;
-       vma->vm_pgoff = pgoff;
+       vma_set_range(vma, start, end, pgoff);
        vma_complete(&vp, vmi, vma->vm_mm);
        return 0;
 }
@@ -861,13 +860,15 @@ can_vma_merge_after(struct vm_area_struct *vma, unsigned long vm_flags,
  *      area is returned, or the function will return NULL
  */
 static struct vm_area_struct
-*vma_merge(struct vma_iterator *vmi, struct mm_struct *mm,
-          struct vm_area_struct *prev, unsigned long addr, unsigned long end,
-          unsigned long vm_flags, struct anon_vma *anon_vma, struct file *file,
-          pgoff_t pgoff, struct mempolicy *policy,
+*vma_merge(struct vma_iterator *vmi, struct vm_area_struct *prev,
+          struct vm_area_struct *src, unsigned long addr, unsigned long end,
+          unsigned long vm_flags, pgoff_t pgoff, struct mempolicy *policy,
           struct vm_userfaultfd_ctx vm_userfaultfd_ctx,
           struct anon_vma_name *anon_name)
 {
+       struct mm_struct *mm = src->vm_mm;
+       struct anon_vma *anon_vma = src->anon_vma;
+       struct file *file = src->vm_file;
        struct vm_area_struct *curr, *next, *res;
        struct vm_area_struct *vma, *adjust, *remove, *remove2;
        struct vm_area_struct *anon_dup = NULL;
@@ -1020,10 +1021,7 @@ static struct vm_area_struct
 
        vma_prepare(&vp);
        vma_adjust_trans_huge(vma, vma_start, vma_end, adj_start);
-
-       vma->vm_start = vma_start;
-       vma->vm_end = vma_end;
-       vma->vm_pgoff = vma_pgoff;
+       vma_set_range(vma, vma_start, vma_end, vma_pgoff);
 
        if (vma_expanded)
                vma_iter_store(vmi, vma);
@@ -2056,7 +2054,6 @@ static int expand_upwards(struct vm_area_struct *vma, unsigned long address)
                }
        }
        anon_vma_unlock_write(vma->anon_vma);
-       khugepaged_enter_vma(vma, vma->vm_flags);
        mas_destroy(&mas);
        validate_mm(mm);
        return error;
@@ -2150,7 +2147,6 @@ int expand_downwards(struct vm_area_struct *vma, unsigned long address)
                }
        }
        anon_vma_unlock_write(vma->anon_vma);
-       khugepaged_enter_vma(vma, vma->vm_flags);
        mas_destroy(&mas);
        validate_mm(mm);
        return error;
@@ -2440,9 +2436,8 @@ struct vm_area_struct *vma_modify(struct vma_iterator *vmi,
        pgoff_t pgoff = vma->vm_pgoff + ((start - vma->vm_start) >> PAGE_SHIFT);
        struct vm_area_struct *merged;
 
-       merged = vma_merge(vmi, vma->vm_mm, prev, start, end, vm_flags,
-                          vma->anon_vma, vma->vm_file, pgoff, policy,
-                          uffd_ctx, anon_name);
+       merged = vma_merge(vmi, prev, vma, start, end, vm_flags,
+                          pgoff, policy, uffd_ctx, anon_name);
        if (merged)
                return merged;
 
@@ -2472,9 +2467,8 @@ static struct vm_area_struct
                   struct vm_area_struct *vma, unsigned long start,
                   unsigned long end, pgoff_t pgoff)
 {
-       return vma_merge(vmi, vma->vm_mm, prev, start, end, vma->vm_flags,
-                        vma->anon_vma, vma->vm_file, pgoff, vma_policy(vma),
-                        vma->vm_userfaultfd_ctx, anon_vma_name(vma));
+       return vma_merge(vmi, prev, vma, start, end, vma->vm_flags, pgoff,
+                        vma_policy(vma), vma->vm_userfaultfd_ctx, anon_vma_name(vma));
 }
 
 /*
@@ -2488,10 +2482,9 @@ struct vm_area_struct *vma_merge_extend(struct vma_iterator *vmi,
        pgoff_t pgoff = vma->vm_pgoff + vma_pages(vma);
 
        /* vma is specified as prev, so case 1 or 2 will apply. */
-       return vma_merge(vmi, vma->vm_mm, vma, vma->vm_end, vma->vm_end + delta,
-                        vma->vm_flags, vma->anon_vma, vma->vm_file, pgoff,
-                        vma_policy(vma), vma->vm_userfaultfd_ctx,
-                        anon_vma_name(vma));
+       return vma_merge(vmi, vma, vma, vma->vm_end, vma->vm_end + delta,
+                        vma->vm_flags, pgoff, vma_policy(vma),
+                        vma->vm_userfaultfd_ctx, anon_vma_name(vma));
 }
 
 /*
@@ -2818,11 +2811,9 @@ cannot_expand:
        }
 
        vma_iter_config(&vmi, addr, end);
-       vma->vm_start = addr;
-       vma->vm_end = end;
+       vma_set_range(vma, addr, end, pgoff);
        vm_flags_init(vma, vm_flags);
        vma->vm_page_prot = vm_get_page_prot(vm_flags);
-       vma->vm_pgoff = pgoff;
 
        if (file) {
                vma->vm_file = get_file(file);
@@ -2899,16 +2890,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
@@ -3181,9 +3163,7 @@ static int do_brk_flags(struct vma_iterator *vmi, struct vm_area_struct *vma,
                goto unacct_fail;
 
        vma_set_anonymous(vma);
-       vma->vm_start = addr;
-       vma->vm_end = addr + len;
-       vma->vm_pgoff = addr >> PAGE_SHIFT;
+       vma_set_range(vma, addr, addr + len, addr >> PAGE_SHIFT);
        vm_flags_init(vma, flags);
        vma->vm_page_prot = vm_get_page_prot(flags);
        vma_start_write(vma);
@@ -3420,9 +3400,7 @@ struct vm_area_struct *copy_vma(struct vm_area_struct **vmap,
                new_vma = vm_area_dup(vma);
                if (!new_vma)
                        goto out;
-               new_vma->vm_start = addr;
-               new_vma->vm_end = addr + len;
-               new_vma->vm_pgoff = pgoff;
+               vma_set_range(new_vma, addr, addr + len, pgoff);
                if (vma_dup_policy(vma, new_vma))
                        goto out_free_vma;
                if (anon_vma_clone(new_vma, vma))
@@ -3590,9 +3568,7 @@ static struct vm_area_struct *__install_special_mapping(
        if (unlikely(vma == NULL))
                return ERR_PTR(-ENOMEM);
 
-       vma->vm_start = addr;
-       vma->vm_end = addr + len;
-
+       vma_set_range(vma, addr, addr + len, 0);
        vm_flags_init(vma, (vm_flags | mm->def_flags |
                      VM_DONTEXPAND | VM_SOFTDIRTY) & ~VM_LOCKED_MASK);
        vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
@@ -3876,7 +3852,7 @@ static int init_user_reserve(void)
 
        free_kbytes = K(global_zone_page_state(NR_FREE_PAGES));
 
-       sysctl_user_reserve_kbytes = min(free_kbytes / 32, 1UL << 17);
+       sysctl_user_reserve_kbytes = min(free_kbytes / 32, SZ_128K);
        return 0;
 }
 subsys_initcall(init_user_reserve);
@@ -3897,7 +3873,7 @@ static int init_admin_reserve(void)
 
        free_kbytes = K(global_zone_page_state(NR_FREE_PAGES));
 
-       sysctl_admin_reserve_kbytes = min(free_kbytes / 32, 1UL << 13);
+       sysctl_admin_reserve_kbytes = min(free_kbytes / 32, SZ_8K);
        return 0;
 }
 subsys_initcall(init_admin_reserve);
@@ -3929,12 +3905,12 @@ static int reserve_mem_notifier(struct notifier_block *nb,
        case MEM_ONLINE:
                /* Default max is 128MB. Leave alone if modified by operator. */
                tmp = sysctl_user_reserve_kbytes;
-               if (0 < tmp && tmp < (1UL << 17))
+               if (tmp > 0 && tmp < SZ_128K)
                        init_user_reserve();
 
                /* Default max is 8MB.  Leave alone if modified by operator. */
                tmp = sysctl_admin_reserve_kbytes;
-               if (0 < tmp && tmp < (1UL << 13))
+               if (tmp > 0 && tmp < SZ_8K)
                        init_admin_reserve();
 
                break;