|
@@ -731,20 +731,6 @@ static int __unmap_and_move(struct page *page, struct page *newpage,
|
|
|
lock_page(page);
|
|
|
}
|
|
|
|
|
|
- /*
|
|
|
- * Only memory hotplug's offline_pages() caller has locked out KSM,
|
|
|
- * and can safely migrate a KSM page. The other cases have skipped
|
|
|
- * PageKsm along with PageReserved - but it is only now when we have
|
|
|
- * the page lock that we can be certain it will not go KSM beneath us
|
|
|
- * (KSM will not upgrade a page from PageAnon to PageKsm when it sees
|
|
|
- * its pagecount raised, but only here do we take the page lock which
|
|
|
- * serializes that).
|
|
|
- */
|
|
|
- if (PageKsm(page) && !offlining) {
|
|
|
- rc = -EBUSY;
|
|
|
- goto unlock;
|
|
|
- }
|
|
|
-
|
|
|
/* charge against new page */
|
|
|
mem_cgroup_prepare_migration(page, newpage, &mem);
|
|
|
|
|
@@ -771,7 +757,7 @@ static int __unmap_and_move(struct page *page, struct page *newpage,
|
|
|
* File Caches may use write_page() or lock_page() in migration, then,
|
|
|
* just care Anon page here.
|
|
|
*/
|
|
|
- if (PageAnon(page)) {
|
|
|
+ if (PageAnon(page) && !PageKsm(page)) {
|
|
|
/*
|
|
|
* Only page_lock_anon_vma_read() understands the subtleties of
|
|
|
* getting a hold on an anon_vma from outside one of its mms.
|
|
@@ -851,7 +837,6 @@ uncharge:
|
|
|
mem_cgroup_end_migration(mem, page, newpage,
|
|
|
(rc == MIGRATEPAGE_SUCCESS ||
|
|
|
rc == MIGRATEPAGE_BALLOON_SUCCESS));
|
|
|
-unlock:
|
|
|
unlock_page(page);
|
|
|
out:
|
|
|
return rc;
|
|
@@ -1155,7 +1140,7 @@ static int do_move_page_to_node_array(struct mm_struct *mm,
|
|
|
goto set_status;
|
|
|
|
|
|
/* Use PageReserved to check for zero page */
|
|
|
- if (PageReserved(page) || PageKsm(page))
|
|
|
+ if (PageReserved(page))
|
|
|
goto put_and_set;
|
|
|
|
|
|
pp->page = page;
|
|
@@ -1317,7 +1302,7 @@ static void do_pages_stat_array(struct mm_struct *mm, unsigned long nr_pages,
|
|
|
|
|
|
err = -ENOENT;
|
|
|
/* Use PageReserved to check for zero page */
|
|
|
- if (!page || PageReserved(page) || PageKsm(page))
|
|
|
+ if (!page || PageReserved(page))
|
|
|
goto set_status;
|
|
|
|
|
|
err = page_to_nid(page);
|