Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e798c6e8 authored by Prasanna Meda's avatar Prasanna Meda Committed by Linus Torvalds
Browse files

[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: default avatarPrasanna Meda <pmeda@akamai.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent b15e0905
Loading
Loading
Loading
Loading
+16 −11
Original line number Diff line number Diff line
@@ -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)