Commit 8aacc9f550feb09c8b26470498345c192996a68e
Committed by
Linus Torvalds
1 parent
bcd438be3b
Exists in
master
and in
6 other branches
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>
Showing 1 changed file with 2 additions and 3 deletions Side-by-side Diff
mm/mempolicy.c
... | ... | @@ -636,7 +636,6 @@ |
636 | 636 | struct vm_area_struct *prev; |
637 | 637 | struct vm_area_struct *vma; |
638 | 638 | int err = 0; |
639 | - pgoff_t pgoff; | |
640 | 639 | unsigned long vmstart; |
641 | 640 | unsigned long vmend; |
642 | 641 | |
643 | 642 | |
... | ... | @@ -649,9 +648,9 @@ |
649 | 648 | vmstart = max(start, vma->vm_start); |
650 | 649 | vmend = min(end, vma->vm_end); |
651 | 650 | |
652 | - pgoff = vma->vm_pgoff + ((start - vma->vm_start) >> PAGE_SHIFT); | |
653 | 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 | 654 | if (prev) { |
656 | 655 | vma = prev; |
657 | 656 | next = vma->vm_next; |