Message ID | 20250222161952.41957-1-lorenzo.stoakes@oracle.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | mm: abort vma_modify() on merge out of memory failure | expand |
On Sat, 22 Feb 2025 16:19:52 +0000 Lorenzo Stoakes <lorenzo.stoakes@oracle.com> wrote: > The remainder of vma_modify() relies upon the vmg state remaining pristine > after a merge attempt. > This patch is against your "mm: simplify vma merge structure and expand comments", presently in mm-unstable. I tweaked things (simple) so it applies to mainline: --- a/mm/vma.c~mm-abort-vma_modify-on-merge-out-of-memory-failure +++ a/mm/vma.c @@ -1509,24 +1509,28 @@ int do_vmi_munmap(struct vma_iterator *v static struct vm_area_struct *vma_modify(struct vma_merge_struct *vmg) { struct vm_area_struct *vma = vmg->vma; + unsigned long start = vmg->start; + unsigned long end = vmg->end; struct vm_area_struct *merged; /* First, try to merge. */ merged = vma_merge_existing_range(vmg); if (merged) return merged; + if (vmg_nomem(vmg)) + return ERR_PTR(-ENOMEM); /* Split any preceding portion of the VMA. */ - if (vma->vm_start < vmg->start) { - int err = split_vma(vmg->vmi, vma, vmg->start, 1); + if (vma->vm_start < start) { + int err = split_vma(vmg->vmi, vma, start, 1); if (err) return ERR_PTR(err); } /* Split any trailing portion of the VMA. */ - if (vma->vm_end > vmg->end) { - int err = split_vma(vmg->vmi, vma, vmg->end, 0); + if (vma->vm_end > end) { + int err = split_vma(vmg->vmi, vma, end, 0); if (err) return ERR_PTR(err);
On Sat, Feb 22, 2025 at 05:26:34PM -0800, Andrew Morton wrote: > On Sat, 22 Feb 2025 16:19:52 +0000 Lorenzo Stoakes <lorenzo.stoakes@oracle.com> wrote: > > > The remainder of vma_modify() relies upon the vmg state remaining pristine > > after a merge attempt. > > > > This patch is against your "mm: simplify vma merge structure and expand > comments", presently in mm-unstable. I tweaked things (simple) so it > applies to mainline: Thanks that looks correct! Apologies, I ought to have accounted for the need for this to be hotfix/backported and instead applied against mainline. Cheers, Lorenzo > > > --- a/mm/vma.c~mm-abort-vma_modify-on-merge-out-of-memory-failure > +++ a/mm/vma.c > @@ -1509,24 +1509,28 @@ int do_vmi_munmap(struct vma_iterator *v > static struct vm_area_struct *vma_modify(struct vma_merge_struct *vmg) > { > struct vm_area_struct *vma = vmg->vma; > + unsigned long start = vmg->start; > + unsigned long end = vmg->end; > struct vm_area_struct *merged; > > /* First, try to merge. */ > merged = vma_merge_existing_range(vmg); > if (merged) > return merged; > + if (vmg_nomem(vmg)) > + return ERR_PTR(-ENOMEM); > > /* Split any preceding portion of the VMA. */ > - if (vma->vm_start < vmg->start) { > - int err = split_vma(vmg->vmi, vma, vmg->start, 1); > + if (vma->vm_start < start) { > + int err = split_vma(vmg->vmi, vma, start, 1); > > if (err) > return ERR_PTR(err); > } > > /* Split any trailing portion of the VMA. */ > - if (vma->vm_end > vmg->end) { > - int err = split_vma(vmg->vmi, vma, vmg->end, 0); > + if (vma->vm_end > end) { > + int err = split_vma(vmg->vmi, vma, end, 0); > > if (err) > return ERR_PTR(err); > _ >
diff --git a/mm/vma.c b/mm/vma.c index c7abef5177cc..76bec07e30b7 100644 --- a/mm/vma.c +++ b/mm/vma.c @@ -1523,24 +1523,28 @@ int do_vmi_munmap(struct vma_iterator *vmi, struct mm_struct *mm, static struct vm_area_struct *vma_modify(struct vma_merge_struct *vmg) { struct vm_area_struct *vma = vmg->middle; + unsigned long start = vmg->start; + unsigned long end = vmg->end; struct vm_area_struct *merged; /* First, try to merge. */ merged = vma_merge_existing_range(vmg); if (merged) return merged; + if (vmg_nomem(vmg)) + return ERR_PTR(-ENOMEM); /* Split any preceding portion of the VMA. */ - if (vma->vm_start < vmg->start) { - int err = split_vma(vmg->vmi, vma, vmg->start, 1); + if (vma->vm_start < start) { + int err = split_vma(vmg->vmi, vma, start, 1); if (err) return ERR_PTR(err); } /* Split any trailing portion of the VMA. */ - if (vma->vm_end > vmg->end) { - int err = split_vma(vmg->vmi, vma, vmg->end, 0); + if (vma->vm_end > end) { + int err = split_vma(vmg->vmi, vma, end, 0); if (err) return ERR_PTR(err);