aboutsummaryrefslogtreecommitdiffstats
path: root/mm/mmap.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/mmap.c')
-rw-r--r--mm/mmap.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/mm/mmap.c b/mm/mmap.c
index 126d8b976bfd..20ff0c33274c 100644
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -894,7 +894,15 @@ again: remove_next = 1 + (end > next->vm_end);
894static inline int is_mergeable_vma(struct vm_area_struct *vma, 894static inline int is_mergeable_vma(struct vm_area_struct *vma,
895 struct file *file, unsigned long vm_flags) 895 struct file *file, unsigned long vm_flags)
896{ 896{
897 if (vma->vm_flags ^ vm_flags) 897 /*
898 * VM_SOFTDIRTY should not prevent from VMA merging, if we
899 * match the flags but dirty bit -- the caller should mark
900 * merged VMA as dirty. If dirty bit won't be excluded from
901 * comparison, we increase pressue on the memory system forcing
902 * the kernel to generate new VMAs when old one could be
903 * extended instead.
904 */
905 if ((vma->vm_flags ^ vm_flags) & ~VM_SOFTDIRTY)
898 return 0; 906 return 0;
899 if (vma->vm_file != file) 907 if (vma->vm_file != file)
900 return 0; 908 return 0;
@@ -1083,7 +1091,7 @@ static int anon_vma_compatible(struct vm_area_struct *a, struct vm_area_struct *
1083 return a->vm_end == b->vm_start && 1091 return a->vm_end == b->vm_start &&
1084 mpol_equal(vma_policy(a), vma_policy(b)) && 1092 mpol_equal(vma_policy(a), vma_policy(b)) &&
1085 a->vm_file == b->vm_file && 1093 a->vm_file == b->vm_file &&
1086 !((a->vm_flags ^ b->vm_flags) & ~(VM_READ|VM_WRITE|VM_EXEC)) && 1094 !((a->vm_flags ^ b->vm_flags) & ~(VM_READ|VM_WRITE|VM_EXEC|VM_SOFTDIRTY)) &&
1087 b->vm_pgoff == a->vm_pgoff + ((b->vm_start - a->vm_start) >> PAGE_SHIFT); 1095 b->vm_pgoff == a->vm_pgoff + ((b->vm_start - a->vm_start) >> PAGE_SHIFT);
1088} 1096}
1089 1097