aboutsummaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
authorMichal Hocko <mhocko@suse.com>2018-04-20 17:55:35 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2018-04-20 20:18:35 -0400
commit8f175cf5c99dc0e3add2aac0ea1cd54e0f9ca87d (patch)
tree3885a1fc6fe50b2b3e384571b491e338e9e33551 /mm
parente01e80634ecdde1dd113ac43b3adad21b47f3957 (diff)
mm: fix do_pages_move status handling
Li Wang has reported that LTP move_pages04 test fails with the current tree: LTP move_pages04: TFAIL : move_pages04.c:143: status[1] is EPERM, expected EFAULT The test allocates an array of two pages, one is present while the other is not (resp. backed by zero page) and it expects EFAULT for the second page as the man page suggests. We are reporting EPERM which doesn't make any sense and this is a result of a bug from cf5f16b23ec9 ("mm: unclutter THP migration"). do_pages_move tries to handle as many pages in one batch as possible so we queue all pages with the same node target together and that corresponds to [start, i] range which is then used to update status array. add_page_for_migration will correctly notice the zero (resp. !present) page and returns with EFAULT which gets written to the status. But if this is the last page in the array we do not update start and so the last store_status after the loop will overwrite the range of the last batch with NUMA_NO_NODE (which corresponds to EPERM). Fix this by simply bailing out from the last flush if the pagelist is empty as there is clearly nothing more to do. Link: http://lkml.kernel.org/r/20180418121255.334-1-mhocko@kernel.org Fixes: cf5f16b23ec9 ("mm: unclutter THP migration") Signed-off-by: Michal Hocko <mhocko@suse.com> Reported-by: Li Wang <liwang@redhat.com> Tested-by: Li Wang <liwang@redhat.com> Cc: Zi Yan <zi.yan@cs.rutgers.edu> Cc: "Kirill A. Shutemov" <kirill@shutemov.name> 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/migrate.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/mm/migrate.c b/mm/migrate.c
index f65dd69e1fd1..70ef794cccae 100644
--- a/mm/migrate.c
+++ b/mm/migrate.c
@@ -1622,6 +1622,9 @@ static int do_pages_move(struct mm_struct *mm, nodemask_t task_nodes,
1622 current_node = NUMA_NO_NODE; 1622 current_node = NUMA_NO_NODE;
1623 } 1623 }
1624out_flush: 1624out_flush:
1625 if (list_empty(&pagelist))
1626 return err;
1627
1625 /* Make sure we do not overwrite the existing error */ 1628 /* Make sure we do not overwrite the existing error */
1626 err1 = do_move_pages_to_node(mm, &pagelist, current_node); 1629 err1 = do_move_pages_to_node(mm, &pagelist, current_node);
1627 if (!err1) 1630 if (!err1)