|
@@ -817,8 +817,28 @@ again:
|
|
|
}
|
|
|
else if (next)
|
|
|
vma_gap_update(next);
|
|
|
- else
|
|
|
- mm->highest_vm_end = end;
|
|
|
+ else {
|
|
|
+ /*
|
|
|
+ * If remove_next == 2 we obviously can't
|
|
|
+ * reach this path.
|
|
|
+ *
|
|
|
+ * If remove_next == 3 we can't reach this
|
|
|
+ * path because pre-swap() next is always not
|
|
|
+ * NULL. pre-swap() "next" is not being
|
|
|
+ * removed and its next->vm_end is not altered
|
|
|
+ * (and furthermore "end" already matches
|
|
|
+ * next->vm_end in remove_next == 3).
|
|
|
+ *
|
|
|
+ * We reach this only in the remove_next == 1
|
|
|
+ * case if the "next" vma that was removed was
|
|
|
+ * the highest vma of the mm. However in such
|
|
|
+ * case next->vm_end == "end" and the extended
|
|
|
+ * "vma" has vma->vm_end == next->vm_end so
|
|
|
+ * mm->highest_vm_end doesn't need any update
|
|
|
+ * in remove_next == 1 case.
|
|
|
+ */
|
|
|
+ VM_WARN_ON(mm->highest_vm_end != end);
|
|
|
+ }
|
|
|
}
|
|
|
if (insert && file)
|
|
|
uprobe_mmap(insert);
|