|
@@ -2890,15 +2890,8 @@ int do_swap_page(struct vm_fault *vmf)
|
|
|
if (!page) {
|
|
|
struct swap_info_struct *si = swp_swap_info(entry);
|
|
|
|
|
|
- if (!(si->flags & SWP_SYNCHRONOUS_IO)) {
|
|
|
- if (vma_readahead)
|
|
|
- page = do_swap_page_readahead(entry,
|
|
|
- GFP_HIGHUSER_MOVABLE, vmf, &swap_ra);
|
|
|
- else
|
|
|
- page = swapin_readahead(entry,
|
|
|
- GFP_HIGHUSER_MOVABLE, vma, vmf->address);
|
|
|
- swapcache = page;
|
|
|
- } else {
|
|
|
+ if (si->flags & SWP_SYNCHRONOUS_IO &&
|
|
|
+ __swap_count(si, entry) == 1) {
|
|
|
/* skip swapcache */
|
|
|
page = alloc_page_vma(GFP_HIGHUSER_MOVABLE, vma, vmf->address);
|
|
|
if (page) {
|
|
@@ -2908,6 +2901,14 @@ int do_swap_page(struct vm_fault *vmf)
|
|
|
lru_cache_add_anon(page);
|
|
|
swap_readpage(page, true);
|
|
|
}
|
|
|
+ } else {
|
|
|
+ if (vma_readahead)
|
|
|
+ page = do_swap_page_readahead(entry,
|
|
|
+ GFP_HIGHUSER_MOVABLE, vmf, &swap_ra);
|
|
|
+ else
|
|
|
+ page = swapin_readahead(entry,
|
|
|
+ GFP_HIGHUSER_MOVABLE, vma, vmf->address);
|
|
|
+ swapcache = page;
|
|
|
}
|
|
|
|
|
|
if (!page) {
|