[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:
parent
b15e0905f2
commit
e798c6e87b
27
mm/madvise.c
27
mm/madvise.c
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue