--- y/mm/mmap.c +++ m/mm/mmap.c @@ -674,6 +674,7 @@ int __vma_adjust(struct vm_area_struct * int remove_next = 0; MA_STATE(mas, &mm->mm_mt, 0, 0); struct vm_area_struct *exporter = NULL, *importer = NULL; + bool valid_ptr = true; if (next && !insert) { if (end >= next->vm_end) { @@ -760,6 +761,8 @@ again: vma_adjust_trans_huge(orig_vma, start, end, adjust_next); if (mas_preallocate(&mas, vma, GFP_KERNEL)) { + if (!valid_ptr) + return -ENOMEM; if (exporter && exporter->anon_vma) unlink_anon_vmas(importer); return -ENOMEM; @@ -915,6 +918,7 @@ again: mas_reset(&mas); remove_next = 1; end = next->vm_end; + valid_ptr = false; goto again; } }