|
@@ -646,6 +646,7 @@ static int try_to_unuse(unsigned int type)
|
|
*/
|
|
*/
|
|
swap_map = &si->swap_map[i];
|
|
swap_map = &si->swap_map[i];
|
|
entry = swp_entry(type, i);
|
|
entry = swp_entry(type, i);
|
|
|
|
+again:
|
|
page = read_swap_cache_async(entry, NULL, 0);
|
|
page = read_swap_cache_async(entry, NULL, 0);
|
|
if (!page) {
|
|
if (!page) {
|
|
/*
|
|
/*
|
|
@@ -680,6 +681,12 @@ static int try_to_unuse(unsigned int type)
|
|
wait_on_page_locked(page);
|
|
wait_on_page_locked(page);
|
|
wait_on_page_writeback(page);
|
|
wait_on_page_writeback(page);
|
|
lock_page(page);
|
|
lock_page(page);
|
|
|
|
+ if (!PageSwapCache(page)) {
|
|
|
|
+ /* Page migration has occured */
|
|
|
|
+ unlock_page(page);
|
|
|
|
+ page_cache_release(page);
|
|
|
|
+ goto again;
|
|
|
|
+ }
|
|
wait_on_page_writeback(page);
|
|
wait_on_page_writeback(page);
|
|
|
|
|
|
/*
|
|
/*
|