|
@@ -70,10 +70,6 @@ int isolate_lru_page(struct page *page, struct list_head *pagelist)
|
|
|
*/
|
|
|
int migrate_prep(void)
|
|
|
{
|
|
|
- /* Must have swap device for migration */
|
|
|
- if (nr_swap_pages <= 0)
|
|
|
- return -ENODEV;
|
|
|
-
|
|
|
/*
|
|
|
* Clear the LRU lists so pages can be isolated.
|
|
|
* Note that pages may be moved off the LRU after we have
|
|
@@ -245,52 +241,6 @@ out:
|
|
|
pte_unmap_unlock(ptep, ptl);
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
- * swapout a single page
|
|
|
- * page is locked upon entry, unlocked on exit
|
|
|
- */
|
|
|
-static int swap_page(struct page *page)
|
|
|
-{
|
|
|
- struct address_space *mapping = page_mapping(page);
|
|
|
-
|
|
|
- if (page_mapped(page) && mapping)
|
|
|
- if (try_to_unmap(page, 1) != SWAP_SUCCESS)
|
|
|
- goto unlock_retry;
|
|
|
-
|
|
|
- if (PageDirty(page)) {
|
|
|
- /* Page is dirty, try to write it out here */
|
|
|
- switch(pageout(page, mapping)) {
|
|
|
- case PAGE_KEEP:
|
|
|
- case PAGE_ACTIVATE:
|
|
|
- goto unlock_retry;
|
|
|
-
|
|
|
- case PAGE_SUCCESS:
|
|
|
- goto retry;
|
|
|
-
|
|
|
- case PAGE_CLEAN:
|
|
|
- ; /* try to free the page below */
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (PagePrivate(page)) {
|
|
|
- if (!try_to_release_page(page, GFP_KERNEL) ||
|
|
|
- (!mapping && page_count(page) == 1))
|
|
|
- goto unlock_retry;
|
|
|
- }
|
|
|
-
|
|
|
- if (remove_mapping(mapping, page)) {
|
|
|
- /* Success */
|
|
|
- unlock_page(page);
|
|
|
- return 0;
|
|
|
- }
|
|
|
-
|
|
|
-unlock_retry:
|
|
|
- unlock_page(page);
|
|
|
-
|
|
|
-retry:
|
|
|
- return -EAGAIN;
|
|
|
-}
|
|
|
-
|
|
|
/*
|
|
|
* Replace the page in the mapping.
|
|
|
*
|
|
@@ -517,8 +467,7 @@ static int fallback_migrate_page(struct address_space *mapping,
|
|
|
* Two lists are passed to this function. The first list
|
|
|
* contains the pages isolated from the LRU to be migrated.
|
|
|
* The second list contains new pages that the pages isolated
|
|
|
- * can be moved to. If the second list is NULL then all
|
|
|
- * pages are swapped out.
|
|
|
+ * can be moved to.
|
|
|
*
|
|
|
* The function returns after 10 attempts or if no pages
|
|
|
* are movable anymore because to has become empty
|
|
@@ -574,29 +523,11 @@ redo:
|
|
|
* Only wait on writeback if we have already done a pass where
|
|
|
* we we may have triggered writeouts for lots of pages.
|
|
|
*/
|
|
|
- if (pass > 0) {
|
|
|
+ if (pass > 0)
|
|
|
wait_on_page_writeback(page);
|
|
|
- } else {
|
|
|
+ else
|
|
|
if (PageWriteback(page))
|
|
|
goto unlock_page;
|
|
|
- }
|
|
|
-
|
|
|
- /*
|
|
|
- * Anonymous pages must have swap cache references otherwise
|
|
|
- * the information contained in the page maps cannot be
|
|
|
- * preserved.
|
|
|
- */
|
|
|
- if (PageAnon(page) && !PageSwapCache(page)) {
|
|
|
- if (!add_to_swap(page, GFP_KERNEL)) {
|
|
|
- rc = -ENOMEM;
|
|
|
- goto unlock_page;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (!to) {
|
|
|
- rc = swap_page(page);
|
|
|
- goto next;
|
|
|
- }
|
|
|
|
|
|
/*
|
|
|
* Establish swap ptes for anonymous pages or destroy pte
|