diff options
Diffstat (limited to 'mm/memory.c')
-rw-r--r-- | mm/memory.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/mm/memory.c b/mm/memory.c index 7a11ddd5060f..2bee1f21aa8a 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
@@ -1871,6 +1871,7 @@ static int do_swap_page(struct mm_struct *mm, struct vm_area_struct *vma, | |||
1871 | goto out; | 1871 | goto out; |
1872 | 1872 | ||
1873 | entry = pte_to_swp_entry(orig_pte); | 1873 | entry = pte_to_swp_entry(orig_pte); |
1874 | again: | ||
1874 | page = lookup_swap_cache(entry); | 1875 | page = lookup_swap_cache(entry); |
1875 | if (!page) { | 1876 | if (!page) { |
1876 | swapin_readahead(entry, address, vma); | 1877 | swapin_readahead(entry, address, vma); |
@@ -1894,6 +1895,12 @@ static int do_swap_page(struct mm_struct *mm, struct vm_area_struct *vma, | |||
1894 | 1895 | ||
1895 | mark_page_accessed(page); | 1896 | mark_page_accessed(page); |
1896 | lock_page(page); | 1897 | lock_page(page); |
1898 | if (!PageSwapCache(page)) { | ||
1899 | /* Page migration has occured */ | ||
1900 | unlock_page(page); | ||
1901 | page_cache_release(page); | ||
1902 | goto again; | ||
1903 | } | ||
1897 | 1904 | ||
1898 | /* | 1905 | /* |
1899 | * Back out if somebody else already faulted in this pte. | 1906 | * Back out if somebody else already faulted in this pte. |