mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-02 03:57:34 -04:00
mm: add temporary vma iterator versions of vma_merge(), split_vma(), and __split_vma()
These wrappers are short-lived in this patch set so that each user can be converted on its own. In the end, these functions are renamed in one commit. Link: https://lkml.kernel.org/r/20230120162650.984577-15-Liam.Howlett@oracle.com Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
committed by
Andrew Morton
parent
3c441ab7d0
commit
f2ebfe43ba
@@ -2843,11 +2843,20 @@ extern struct vm_area_struct *vma_merge(struct mm_struct *,
|
||||
struct vm_area_struct *prev, unsigned long addr, unsigned long end,
|
||||
unsigned long vm_flags, struct anon_vma *, struct file *, pgoff_t,
|
||||
struct mempolicy *, struct vm_userfaultfd_ctx, struct anon_vma_name *);
|
||||
extern struct vm_area_struct *vmi_vma_merge(struct vma_iterator *vmi,
|
||||
struct mm_struct *, struct vm_area_struct *prev, unsigned long addr,
|
||||
unsigned long end, unsigned long vm_flags, struct anon_vma *,
|
||||
struct file *, pgoff_t, struct mempolicy *, struct vm_userfaultfd_ctx,
|
||||
struct anon_vma_name *);
|
||||
extern struct anon_vma *find_mergeable_anon_vma(struct vm_area_struct *);
|
||||
extern int __split_vma(struct mm_struct *, struct vm_area_struct *,
|
||||
unsigned long addr, int new_below);
|
||||
unsigned long addr, int new_below);
|
||||
extern int vmi__split_vma(struct vma_iterator *vmi, struct mm_struct *,
|
||||
struct vm_area_struct *, unsigned long addr, int new_below);
|
||||
extern int split_vma(struct mm_struct *, struct vm_area_struct *,
|
||||
unsigned long addr, int new_below);
|
||||
extern int vmi_split_vma(struct vma_iterator *vmi, struct mm_struct *,
|
||||
struct vm_area_struct *, unsigned long addr, int new_below);
|
||||
extern int insert_vm_struct(struct mm_struct *, struct vm_area_struct *);
|
||||
extern void unlink_file_vma(struct vm_area_struct *);
|
||||
extern struct vm_area_struct *copy_vma(struct vm_area_struct **,
|
||||
|
||||
44
mm/mmap.c
44
mm/mmap.c
@@ -1091,6 +1091,25 @@ struct vm_area_struct *vma_merge(struct mm_struct *mm,
|
||||
return res;
|
||||
}
|
||||
|
||||
struct vm_area_struct *vmi_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,
|
||||
struct vm_userfaultfd_ctx vm_userfaultfd_ctx,
|
||||
struct anon_vma_name *anon_name)
|
||||
{
|
||||
struct vm_area_struct *tmp;
|
||||
|
||||
tmp = vma_merge(mm, prev, addr, end, vm_flags, anon_vma, file, pgoff,
|
||||
policy, vm_userfaultfd_ctx, anon_name);
|
||||
if (tmp)
|
||||
vma_iter_set(vmi, end);
|
||||
|
||||
return tmp;
|
||||
}
|
||||
|
||||
/*
|
||||
* Rough compatibility check to quickly see if it's even worth looking
|
||||
* at sharing an anon_vma.
|
||||
@@ -2276,6 +2295,18 @@ int __split_vma(struct mm_struct *mm, struct vm_area_struct *vma,
|
||||
validate_mm_mt(mm);
|
||||
return err;
|
||||
}
|
||||
int vmi__split_vma(struct vma_iterator *vmi, struct mm_struct *mm,
|
||||
struct vm_area_struct *vma, unsigned long addr, int new_below)
|
||||
{
|
||||
int ret;
|
||||
unsigned long end = vma->vm_end;
|
||||
|
||||
ret = __split_vma(mm, vma, addr, new_below);
|
||||
if (!ret)
|
||||
vma_iter_set(vmi, end);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Split a vma into two pieces at address 'addr', a new vma is allocated
|
||||
@@ -2290,6 +2321,19 @@ int split_vma(struct mm_struct *mm, struct vm_area_struct *vma,
|
||||
return __split_vma(mm, vma, addr, new_below);
|
||||
}
|
||||
|
||||
int vmi_split_vma(struct vma_iterator *vmi, struct mm_struct *mm,
|
||||
struct vm_area_struct *vma, unsigned long addr, int new_below)
|
||||
{
|
||||
int ret;
|
||||
unsigned long end = vma->vm_end;
|
||||
|
||||
ret = split_vma(mm, vma, addr, new_below);
|
||||
if (!ret)
|
||||
vma_iter_set(vmi, end);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline int munmap_sidetree(struct vm_area_struct *vma,
|
||||
struct ma_state *mas_detach)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user