提交 e798c6e8 编写于 作者: P Prasanna Meda 提交者: Linus Torvalds

[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: NPrasanna Meda <pmeda@akamai.com>
Signed-off-by: NAndrew Morton <akpm@osdl.org>
Signed-off-by: NLinus Torvalds <torvalds@osdl.org>
上级 b15e0905
...@@ -19,6 +19,21 @@ static long madvise_behavior(struct vm_area_struct * vma, unsigned long start, ...@@ -19,6 +19,21 @@ static long madvise_behavior(struct vm_area_struct * vma, unsigned long start,
{ {
struct mm_struct * mm = vma->vm_mm; struct mm_struct * mm = vma->vm_mm;
int error = 0; 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) { if (start != vma->vm_start) {
error = split_vma(mm, vma, start, 1); error = split_vma(mm, vma, start, 1);
...@@ -36,17 +51,7 @@ static long madvise_behavior(struct vm_area_struct * vma, unsigned long start, ...@@ -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_flags is protected by the mmap_sem held in write mode.
*/ */
VM_ClearReadHint(vma); VM_ClearReadHint(vma);
vma->vm_flags = new_flags;
switch (behavior) {
case MADV_SEQUENTIAL:
vma->vm_flags |= VM_SEQ_READ;
break;
case MADV_RANDOM:
vma->vm_flags |= VM_RAND_READ;
break;
default:
break;
}
out: out:
if (error == -ENOMEM) if (error == -ENOMEM)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册