Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Caspar Zhang and committed by
Linus Torvalds
8aacc9f5 bcd438be

+2 -3
+2 -3
mm/mempolicy.c
··· 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 ··· 648 649 vmstart = max(start, vma->vm_start); 649 650 vmend = min(end, vma->vm_end); 650 651 651 - pgoff = vma->vm_pgoff + ((start - vma->vm_start) >> PAGE_SHIFT); 652 652 prev = vma_merge(mm, prev, vmstart, vmend, vma->vm_flags, 653 - vma->anon_vma, vma->vm_file, pgoff, new_pol); 653 + vma->anon_vma, vma->vm_file, vma->vm_pgoff, 654 + new_pol); 654 655 if (prev) { 655 656 vma = prev; 656 657 next = vma->vm_next;