|
@@ -1871,6 +1871,7 @@ static int do_swap_page(struct mm_struct *mm, struct vm_area_struct *vma,
|
|
|
goto out;
|
|
|
|
|
|
entry = pte_to_swp_entry(orig_pte);
|
|
|
+again:
|
|
|
page = lookup_swap_cache(entry);
|
|
|
if (!page) {
|
|
|
swapin_readahead(entry, address, vma);
|
|
@@ -1894,6 +1895,12 @@ static int do_swap_page(struct mm_struct *mm, struct vm_area_struct *vma,
|
|
|
|
|
|
mark_page_accessed(page);
|
|
|
lock_page(page);
|
|
|
+ if (!PageSwapCache(page)) {
|
|
|
+ /* Page migration has occured */
|
|
|
+ unlock_page(page);
|
|
|
+ page_cache_release(page);
|
|
|
+ goto again;
|
|
|
+ }
|
|
|
|
|
|
/*
|
|
|
* Back out if somebody else already faulted in this pte.
|