mm/mmap: simplify vma link and unlink
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>
This commit is contained in:
parent
0040f2c553
commit
30afc8c342
44
mm/mmap.c
44
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
|
||||
|
Loading…
x
Reference in New Issue
Block a user