diff options
author | Caspar Zhang <caspar@casparzhang.com> | 2011-09-14 19:20:58 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-09-14 21:09:36 -0400 |
commit | 8aacc9f550feb09c8b26470498345c192996a68e (patch) | |
tree | c55adebcb37152e9a504696d468adb0b852d4f04 /mm | |
parent | bcd438be3b66110dfe70f655cadb2b20e201f076 (diff) |
mm/mempolicy.c: fix pgoff in mbind vma merge
commit 9d8cebd4bcd7 ("mm: fix mbind vma merge problem") didn't really
fix the mbind vma merge problem due to wrong pgoff value passing to
vma_merge(), which made vma_merge() always return NULL.
Before the patch applied, we are getting a result like:
addr = 0x7fa58f00c000
[snip]
7fa58f00c000-7fa58f00d000 rw-p 00000000 00:00 0
7fa58f00d000-7fa58f00e000 rw-p 00000000 00:00 0
7fa58f00e000-7fa58f00f000 rw-p 00000000 00:00 0
here 7fa58f00c000->7fa58f00f000 we get 3 VMAs which are expected to be
merged described as described in commit 9d8cebd.
Re-testing the patched kernel with the reproducer provided in commit
9d8cebd, we get the correct result:
addr = 0x7ffa5aaa2000
[snip]
7ffa5aaa2000-7ffa5aaa6000 rw-p 00000000 00:00 0
7fffd556f000-7fffd5584000 rw-p 00000000 00:00 0 [stack]
Signed-off-by: Caspar Zhang <caspar@casparzhang.com>
Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Cc: Christoph Lameter <cl@linux-foundation.org>
Cc: Hugh Dickins <hugh.dickins@tiscali.co.uk>
Cc: Mel Gorman <mel@csn.ul.ie>
Cc: Lee Schermerhorn <lee.schermerhorn@hp.com>
Cc: Minchan Kim <minchan.kim@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm')
-rw-r--r-- | mm/mempolicy.c | 5 |
1 files changed, 2 insertions, 3 deletions
diff --git a/mm/mempolicy.c b/mm/mempolicy.c index 8b57173c1dd5..b1f70d6eec35 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c | |||
@@ -636,7 +636,6 @@ static int mbind_range(struct mm_struct *mm, unsigned long start, | |||
636 | struct vm_area_struct *prev; | 636 | struct vm_area_struct *prev; |
637 | struct vm_area_struct *vma; | 637 | struct vm_area_struct *vma; |
638 | int err = 0; | 638 | int err = 0; |
639 | pgoff_t pgoff; | ||
640 | unsigned long vmstart; | 639 | unsigned long vmstart; |
641 | unsigned long vmend; | 640 | unsigned long vmend; |
642 | 641 | ||
@@ -649,9 +648,9 @@ static int mbind_range(struct mm_struct *mm, unsigned long start, | |||
649 | vmstart = max(start, vma->vm_start); | 648 | vmstart = max(start, vma->vm_start); |
650 | vmend = min(end, vma->vm_end); | 649 | vmend = min(end, vma->vm_end); |
651 | 650 | ||
652 | pgoff = vma->vm_pgoff + ((start - vma->vm_start) >> PAGE_SHIFT); | ||
653 | prev = vma_merge(mm, prev, vmstart, vmend, vma->vm_flags, | 651 | prev = vma_merge(mm, prev, vmstart, vmend, vma->vm_flags, |
654 | vma->anon_vma, vma->vm_file, pgoff, new_pol); | 652 | vma->anon_vma, vma->vm_file, vma->vm_pgoff, |
653 | new_pol); | ||
655 | if (prev) { | 654 | if (prev) { |
656 | vma = prev; | 655 | vma = prev; |
657 | next = vma->vm_next; | 656 | next = vma->vm_next; |