diff mbox series

[v3,07/16] mm/mmap: Extract validate_mm() from vma_complete()

Message ID 20240704182718.2653918-8-Liam.Howlett@oracle.com (mailing list archive)
State New
Headers show
Series Avoid MAP_FIXED gap exposure | expand

Commit Message

Liam R. Howlett July 4, 2024, 6:27 p.m. UTC
vma_complete() will need to be called during an unsafe time to call
validate_mm().  Extract the call in all places now so that only one
location can be modified in the next change.

Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
---
 mm/mmap.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

Comments

Lorenzo Stoakes July 5, 2024, 7:35 p.m. UTC | #1
On Thu, Jul 04, 2024 at 02:27:09PM GMT, Liam R. Howlett wrote:
> vma_complete() will need to be called during an unsafe time to call
> validate_mm().  Extract the call in all places now so that only one
> location can be modified in the next change.
>
> Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
> ---
>  mm/mmap.c | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/mm/mmap.c b/mm/mmap.c
> index 2a1a49f98fa3..8d9be791997a 100644
> --- a/mm/mmap.c
> +++ b/mm/mmap.c
> @@ -646,7 +646,6 @@ static inline void vma_complete(struct vma_prepare *vp,
>  	}
>  	if (vp->insert && vp->file)
>  		uprobe_mmap(vp->insert);
> -	validate_mm(mm);
>  }
>
>  /*
> @@ -734,6 +733,7 @@ int vma_expand(struct vma_iterator *vmi, struct vm_area_struct *vma,
>  	vma_iter_store(vmi, vma);
>
>  	vma_complete(&vp, vmi, vma->vm_mm);
> +	validate_mm(vma->vm_mm);
>  	return 0;
>
>  nomem:
> @@ -775,6 +775,7 @@ int vma_shrink(struct vma_iterator *vmi, struct vm_area_struct *vma,
>  	vma_iter_clear(vmi);
>  	vma_set_range(vma, start, end, pgoff);
>  	vma_complete(&vp, vmi, vma->vm_mm);
> +	validate_mm(vma->vm_mm);
>  	return 0;
>  }
>
> @@ -1103,6 +1104,7 @@ static struct vm_area_struct
>  	}
>
>  	vma_complete(&vp, vmi, mm);
> +	validate_mm(mm);
>  	khugepaged_enter_vma(res, vm_flags);
>  	return res;
>
> @@ -2481,6 +2483,7 @@ static int __split_vma(struct vma_iterator *vmi, struct vm_area_struct *vma,
>
>  	/* vma_complete stores the new vma */
>  	vma_complete(&vp, vmi, vma->vm_mm);
> +	validate_mm(vma->vm_mm);
>
>  	/* Success. */
>  	if (new_below)
> @@ -3353,6 +3356,7 @@ static int do_brk_flags(struct vma_iterator *vmi, struct vm_area_struct *vma,
>  		vma_iter_store(vmi, vma);
>
>  		vma_complete(&vp, vmi, mm);
> +		validate_mm(mm);
>  		khugepaged_enter_vma(vma, flags);
>  		goto out;
>  	}
> --
> 2.43.0
>
>

LGTM

Reviewed-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
Suren Baghdasaryan July 10, 2024, 4:06 p.m. UTC | #2
On Fri, Jul 5, 2024 at 12:35 PM Lorenzo Stoakes
<lorenzo.stoakes@oracle.com> wrote:
>
> On Thu, Jul 04, 2024 at 02:27:09PM GMT, Liam R. Howlett wrote:
> > vma_complete() will need to be called during an unsafe time to call
> > validate_mm().  Extract the call in all places now so that only one
> > location can be modified in the next change.
> >
> > Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
> > ---
> >  mm/mmap.c | 6 +++++-
> >  1 file changed, 5 insertions(+), 1 deletion(-)
> >
> > diff --git a/mm/mmap.c b/mm/mmap.c
> > index 2a1a49f98fa3..8d9be791997a 100644
> > --- a/mm/mmap.c
> > +++ b/mm/mmap.c
> > @@ -646,7 +646,6 @@ static inline void vma_complete(struct vma_prepare *vp,
> >       }
> >       if (vp->insert && vp->file)
> >               uprobe_mmap(vp->insert);
> > -     validate_mm(mm);
> >  }
> >
> >  /*
> > @@ -734,6 +733,7 @@ int vma_expand(struct vma_iterator *vmi, struct vm_area_struct *vma,
> >       vma_iter_store(vmi, vma);
> >
> >       vma_complete(&vp, vmi, vma->vm_mm);
> > +     validate_mm(vma->vm_mm);
> >       return 0;
> >
> >  nomem:
> > @@ -775,6 +775,7 @@ int vma_shrink(struct vma_iterator *vmi, struct vm_area_struct *vma,
> >       vma_iter_clear(vmi);
> >       vma_set_range(vma, start, end, pgoff);
> >       vma_complete(&vp, vmi, vma->vm_mm);
> > +     validate_mm(vma->vm_mm);
> >       return 0;
> >  }
> >
> > @@ -1103,6 +1104,7 @@ static struct vm_area_struct
> >       }
> >
> >       vma_complete(&vp, vmi, mm);
> > +     validate_mm(mm);
> >       khugepaged_enter_vma(res, vm_flags);
> >       return res;
> >
> > @@ -2481,6 +2483,7 @@ static int __split_vma(struct vma_iterator *vmi, struct vm_area_struct *vma,
> >
> >       /* vma_complete stores the new vma */
> >       vma_complete(&vp, vmi, vma->vm_mm);
> > +     validate_mm(vma->vm_mm);
> >
> >       /* Success. */
> >       if (new_below)
> > @@ -3353,6 +3356,7 @@ static int do_brk_flags(struct vma_iterator *vmi, struct vm_area_struct *vma,
> >               vma_iter_store(vmi, vma);
> >
> >               vma_complete(&vp, vmi, mm);
> > +             validate_mm(mm);
> >               khugepaged_enter_vma(vma, flags);
> >               goto out;
> >       }
> > --
> > 2.43.0
> >
> >
>
> LGTM
>
> Reviewed-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>

Reviewed-by: Suren Baghdasaryan <surenb@google.com>
diff mbox series

Patch

diff --git a/mm/mmap.c b/mm/mmap.c
index 2a1a49f98fa3..8d9be791997a 100644
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -646,7 +646,6 @@  static inline void vma_complete(struct vma_prepare *vp,
 	}
 	if (vp->insert && vp->file)
 		uprobe_mmap(vp->insert);
-	validate_mm(mm);
 }
 
 /*
@@ -734,6 +733,7 @@  int vma_expand(struct vma_iterator *vmi, struct vm_area_struct *vma,
 	vma_iter_store(vmi, vma);
 
 	vma_complete(&vp, vmi, vma->vm_mm);
+	validate_mm(vma->vm_mm);
 	return 0;
 
 nomem:
@@ -775,6 +775,7 @@  int vma_shrink(struct vma_iterator *vmi, struct vm_area_struct *vma,
 	vma_iter_clear(vmi);
 	vma_set_range(vma, start, end, pgoff);
 	vma_complete(&vp, vmi, vma->vm_mm);
+	validate_mm(vma->vm_mm);
 	return 0;
 }
 
@@ -1103,6 +1104,7 @@  static struct vm_area_struct
 	}
 
 	vma_complete(&vp, vmi, mm);
+	validate_mm(mm);
 	khugepaged_enter_vma(res, vm_flags);
 	return res;
 
@@ -2481,6 +2483,7 @@  static int __split_vma(struct vma_iterator *vmi, struct vm_area_struct *vma,
 
 	/* vma_complete stores the new vma */
 	vma_complete(&vp, vmi, vma->vm_mm);
+	validate_mm(vma->vm_mm);
 
 	/* Success. */
 	if (new_below)
@@ -3353,6 +3356,7 @@  static int do_brk_flags(struct vma_iterator *vmi, struct vm_area_struct *vma,
 		vma_iter_store(vmi, vma);
 
 		vma_complete(&vp, vmi, mm);
+		validate_mm(mm);
 		khugepaged_enter_vma(vma, flags);
 		goto out;
 	}