aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoonsoo Kim <iamjoonsoo.kim@lge.com>2014-01-21 18:51:15 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2014-01-21 19:19:49 -0500
commit32665f2bbfed2e325d37236d9b0071a11a69124e (patch)
tree825cb235a94f3621478bd59792101d78e6948d81
parent354a3363363724c21ea2e4b28370e27983c2452e (diff)
mm/migrate: correct failure handling if !hugepage_migration_support()
We should remove the page from the list if we fail with ENOSYS, since migrate_pages() consider error cases except -ENOMEM and -EAGAIN as permanent failure and it assumes that the page would be removed from the list. Without this patch, we could overcount number of failure. In addition, we should put back the new hugepage if !hugepage_migration_support(). If not, we would leak hugepage memory. Signed-off-by: Joonsoo Kim <iamjoonsoo.kim@lge.com> Acked-by: Christoph Lameter <cl@linux.com> Reviewed-by: Wanpeng Li <liwanp@linux.vnet.ibm.com> Reviewed-by: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com> Cc: Rafael Aquini <aquini@redhat.com> Cc: Vlastimil Babka <vbabka@suse.cz> Cc: Wanpeng Li <liwanp@linux.vnet.ibm.com> Cc: Mel Gorman <mgorman@suse.de> Cc: Rik van Riel <riel@redhat.com> Cc: Vlastimil Babka <vbabka@suse.cz> Cc: Zhang Yanfei <zhangyanfei@cn.fujitsu.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--mm/migrate.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/mm/migrate.c b/mm/migrate.c
index 626ca3c5d07b..13bedcc4656b 100644
--- a/mm/migrate.c
+++ b/mm/migrate.c
@@ -1013,7 +1013,7 @@ static int unmap_and_move_huge_page(new_page_t get_new_page,
1013{ 1013{
1014 int rc = 0; 1014 int rc = 0;
1015 int *result = NULL; 1015 int *result = NULL;
1016 struct page *new_hpage = get_new_page(hpage, private, &result); 1016 struct page *new_hpage;
1017 struct anon_vma *anon_vma = NULL; 1017 struct anon_vma *anon_vma = NULL;
1018 1018
1019 /* 1019 /*
@@ -1023,9 +1023,12 @@ static int unmap_and_move_huge_page(new_page_t get_new_page,
1023 * tables or check whether the hugepage is pmd-based or not before 1023 * tables or check whether the hugepage is pmd-based or not before
1024 * kicking migration. 1024 * kicking migration.
1025 */ 1025 */
1026 if (!hugepage_migration_support(page_hstate(hpage))) 1026 if (!hugepage_migration_support(page_hstate(hpage))) {
1027 putback_active_hugepage(hpage);
1027 return -ENOSYS; 1028 return -ENOSYS;
1029 }
1028 1030
1031 new_hpage = get_new_page(hpage, private, &result);
1029 if (!new_hpage) 1032 if (!new_hpage)
1030 return -ENOMEM; 1033 return -ENOMEM;
1031 1034