diff options
Diffstat (limited to 'mm/mmap.c')
-rw-r--r-- | mm/mmap.c | 12 |
1 files changed, 10 insertions, 2 deletions
@@ -894,7 +894,15 @@ again: remove_next = 1 + (end > next->vm_end); | |||
894 | static inline int is_mergeable_vma(struct vm_area_struct *vma, | 894 | static 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 | ||