diff options
author | Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> | 2012-07-31 19:42:06 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-07-31 21:42:40 -0400 |
commit | 189ebff2894a9d0f4e250dd1e154d282ef0a6779 (patch) | |
tree | e498573190660e2cfe6f64ff3fcc8cf3d44a58da /mm/memory-failure.c | |
parent | 24669e58477e2752c1fbca9c1c988e9dd0d79d15 (diff) |
hugetlb: simplify migrate_huge_page()
Since we migrate only one hugepage, don't use linked list for passing the
page around. Directly pass the page that need to be migrated as argument.
This also removes the usage of page->lru in the migrate path.
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Reviewed-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Cc: David Rientjes <rientjes@google.com>
Cc: Hillf Danton <dhillf@gmail.com>
Reviewed-by: Michal Hocko <mhocko@suse.cz>
Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/memory-failure.c')
-rw-r--r-- | mm/memory-failure.c | 15 |
1 files changed, 4 insertions, 11 deletions
diff --git a/mm/memory-failure.c b/mm/memory-failure.c index 6de0d613bbe6..b04ff2d6f73d 100644 --- a/mm/memory-failure.c +++ b/mm/memory-failure.c | |||
@@ -1416,7 +1416,6 @@ static int soft_offline_huge_page(struct page *page, int flags) | |||
1416 | int ret; | 1416 | int ret; |
1417 | unsigned long pfn = page_to_pfn(page); | 1417 | unsigned long pfn = page_to_pfn(page); |
1418 | struct page *hpage = compound_head(page); | 1418 | struct page *hpage = compound_head(page); |
1419 | LIST_HEAD(pagelist); | ||
1420 | 1419 | ||
1421 | ret = get_any_page(page, pfn, flags); | 1420 | ret = get_any_page(page, pfn, flags); |
1422 | if (ret < 0) | 1421 | if (ret < 0) |
@@ -1431,24 +1430,18 @@ static int soft_offline_huge_page(struct page *page, int flags) | |||
1431 | } | 1430 | } |
1432 | 1431 | ||
1433 | /* Keep page count to indicate a given hugepage is isolated. */ | 1432 | /* Keep page count to indicate a given hugepage is isolated. */ |
1434 | 1433 | ret = migrate_huge_page(hpage, new_page, MPOL_MF_MOVE_ALL, false, | |
1435 | list_add(&hpage->lru, &pagelist); | ||
1436 | ret = migrate_huge_pages(&pagelist, new_page, MPOL_MF_MOVE_ALL, false, | ||
1437 | MIGRATE_SYNC); | 1434 | MIGRATE_SYNC); |
1435 | put_page(hpage); | ||
1438 | if (ret) { | 1436 | if (ret) { |
1439 | struct page *page1, *page2; | ||
1440 | list_for_each_entry_safe(page1, page2, &pagelist, lru) | ||
1441 | put_page(page1); | ||
1442 | |||
1443 | pr_info("soft offline: %#lx: migration failed %d, type %lx\n", | 1437 | pr_info("soft offline: %#lx: migration failed %d, type %lx\n", |
1444 | pfn, ret, page->flags); | 1438 | pfn, ret, page->flags); |
1445 | if (ret > 0) | ||
1446 | ret = -EIO; | ||
1447 | return ret; | 1439 | return ret; |
1448 | } | 1440 | } |
1449 | done: | 1441 | done: |
1450 | if (!PageHWPoison(hpage)) | 1442 | if (!PageHWPoison(hpage)) |
1451 | atomic_long_add(1 << compound_trans_order(hpage), &mce_bad_pages); | 1443 | atomic_long_add(1 << compound_trans_order(hpage), |
1444 | &mce_bad_pages); | ||
1452 | set_page_hwpoison_huge_page(hpage); | 1445 | set_page_hwpoison_huge_page(hpage); |
1453 | dequeue_hwpoisoned_huge_page(hpage); | 1446 | dequeue_hwpoisoned_huge_page(hpage); |
1454 | /* keep elevated page count for bad page */ | 1447 | /* keep elevated page count for bad page */ |