|
@@ -658,6 +658,9 @@ again: remove_next = 1 + (end > next->vm_end);
|
|
|
validate_mm(mm);
|
|
|
}
|
|
|
|
|
|
+/* Flags that can be inherited from an existing mapping when merging */
|
|
|
+#define VM_MERGEABLE_FLAGS (VM_CAN_NONLINEAR)
|
|
|
+
|
|
|
/*
|
|
|
* If the vma has a ->close operation then the driver probably needs to release
|
|
|
* per-vma resources, so we don't attempt to merge those.
|
|
@@ -665,7 +668,7 @@ again: remove_next = 1 + (end > next->vm_end);
|
|
|
static inline int is_mergeable_vma(struct vm_area_struct *vma,
|
|
|
struct file *file, unsigned long vm_flags)
|
|
|
{
|
|
|
- if (vma->vm_flags != vm_flags)
|
|
|
+ if ((vma->vm_flags ^ vm_flags) & ~VM_MERGEABLE_FLAGS)
|
|
|
return 0;
|
|
|
if (vma->vm_file != file)
|
|
|
return 0;
|