[PATCH] madvise: do not split the maps

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>
This commit is contained in:
Prasanna Meda 2005-06-21 17:14:36 -07:00 committed by Linus Torvalds
parent b15e0905f2
commit e798c6e87b
1 changed files with 16 additions and 11 deletions

View 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)