[PATCH] madvise: do not split the maps
Prasanna Meda [Wed, 22 Jun 2005 00:14:36 +0000 (17:14 -0700)]
This attempts to avoid splittings when it is not needed, that is when
vm_flags are same as new flags.  The idea is from the <2.6.11 mlock_fixup
and others.  This will provide base for the next madvise merging patch.

Signed-off-by: Prasanna Meda <pmeda@akamai.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

mm/madvise.c

index 944b5e5..75b81ad 100644 (file)
@@ -19,6 +19,21 @@ static long madvise_behavior(struct vm_area_struct * vma, unsigned long start,
 {
        struct mm_struct * mm = vma->vm_mm;
        int error = 0;
+       int new_flags = vma->vm_flags & ~VM_READHINTMASK;
+
+       switch (behavior) {
+       case MADV_SEQUENTIAL:
+               new_flags |= VM_SEQ_READ;
+               break;
+       case MADV_RANDOM:
+               new_flags |= VM_RAND_READ;
+               break;
+       default:
+               break;
+       }
+
+       if (new_flags == vma->vm_flags)
+               goto out;
 
        if (start != vma->vm_start) {
                error = split_vma(mm, vma, start, 1);
@@ -36,17 +51,7 @@ static long madvise_behavior(struct vm_area_struct * vma, unsigned long start,
         * vm_flags is protected by the mmap_sem held in write mode.
         */
        VM_ClearReadHint(vma);
-
-       switch (behavior) {
-       case MADV_SEQUENTIAL:
-               vma->vm_flags |= VM_SEQ_READ;
-               break;
-       case MADV_RANDOM:
-               vma->vm_flags |= VM_RAND_READ;
-               break;
-       default:
-               break;
-       }
+       vma->vm_flags = new_flags;
 
 out:
        if (error == -ENOMEM)