Skip to content

Commit

Permalink
[PATCH] madvise: do not split the maps
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Prasanna Meda authored and Linus Torvalds committed Jun 22, 2005
1 parent b15e090 commit e798c6e
Showing 1 changed file with 16 additions and 11 deletions.
27 changes: 16 additions & 11 deletions mm/madvise.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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)
Expand Down

0 comments on commit e798c6e

Please sign in to comment.