|
@@ -22,6 +22,7 @@
|
|
|
#include <linux/mmu_notifier.h>
|
|
|
#include <linux/sched/sysctl.h>
|
|
|
#include <linux/uaccess.h>
|
|
|
+#include <linux/mm-arch-hooks.h>
|
|
|
|
|
|
#include <asm/cacheflush.h>
|
|
|
#include <asm/tlbflush.h>
|
|
@@ -286,13 +287,17 @@ static unsigned long move_vma(struct vm_area_struct *vma,
|
|
|
old_len = new_len;
|
|
|
old_addr = new_addr;
|
|
|
new_addr = -ENOMEM;
|
|
|
- } else if (vma->vm_file && vma->vm_file->f_op->mremap) {
|
|
|
- err = vma->vm_file->f_op->mremap(vma->vm_file, new_vma);
|
|
|
- if (err < 0) {
|
|
|
- move_page_tables(new_vma, new_addr, vma, old_addr,
|
|
|
- moved_len, true);
|
|
|
- return err;
|
|
|
+ } else {
|
|
|
+ if (vma->vm_file && vma->vm_file->f_op->mremap) {
|
|
|
+ err = vma->vm_file->f_op->mremap(vma->vm_file, new_vma);
|
|
|
+ if (err < 0) {
|
|
|
+ move_page_tables(new_vma, new_addr, vma,
|
|
|
+ old_addr, moved_len, true);
|
|
|
+ return err;
|
|
|
+ }
|
|
|
}
|
|
|
+ arch_remap(mm, old_addr, old_addr + old_len,
|
|
|
+ new_addr, new_addr + new_len);
|
|
|
}
|
|
|
|
|
|
/* Conceal VM_ACCOUNT so old reservation is not undone */
|