diff options
Diffstat (limited to 'mm/swapfile.c')
-rw-r--r-- | mm/swapfile.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/mm/swapfile.c b/mm/swapfile.c index e74112e8e5f4..6c0585b16418 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <linux/seq_file.h> | 22 | #include <linux/seq_file.h> |
23 | #include <linux/init.h> | 23 | #include <linux/init.h> |
24 | #include <linux/module.h> | 24 | #include <linux/module.h> |
25 | #include <linux/ksm.h> | ||
25 | #include <linux/rmap.h> | 26 | #include <linux/rmap.h> |
26 | #include <linux/security.h> | 27 | #include <linux/security.h> |
27 | #include <linux/backing-dev.h> | 28 | #include <linux/backing-dev.h> |
@@ -650,6 +651,8 @@ int reuse_swap_page(struct page *page) | |||
650 | int count; | 651 | int count; |
651 | 652 | ||
652 | VM_BUG_ON(!PageLocked(page)); | 653 | VM_BUG_ON(!PageLocked(page)); |
654 | if (unlikely(PageKsm(page))) | ||
655 | return 0; | ||
653 | count = page_mapcount(page); | 656 | count = page_mapcount(page); |
654 | if (count <= 1 && PageSwapCache(page)) { | 657 | if (count <= 1 && PageSwapCache(page)) { |
655 | count += page_swapcount(page); | 658 | count += page_swapcount(page); |
@@ -658,7 +661,7 @@ int reuse_swap_page(struct page *page) | |||
658 | SetPageDirty(page); | 661 | SetPageDirty(page); |
659 | } | 662 | } |
660 | } | 663 | } |
661 | return count == 1; | 664 | return count <= 1; |
662 | } | 665 | } |
663 | 666 | ||
664 | /* | 667 | /* |
@@ -1185,6 +1188,12 @@ static int try_to_unuse(unsigned int type) | |||
1185 | * read from disk into another page. Splitting into two | 1188 | * read from disk into another page. Splitting into two |
1186 | * pages would be incorrect if swap supported "shared | 1189 | * pages would be incorrect if swap supported "shared |
1187 | * private" pages, but they are handled by tmpfs files. | 1190 | * private" pages, but they are handled by tmpfs files. |
1191 | * | ||
1192 | * Given how unuse_vma() targets one particular offset | ||
1193 | * in an anon_vma, once the anon_vma has been determined, | ||
1194 | * this splitting happens to be just what is needed to | ||
1195 | * handle where KSM pages have been swapped out: re-reading | ||
1196 | * is unnecessarily slow, but we can fix that later on. | ||
1188 | */ | 1197 | */ |
1189 | if (swap_count(*swap_map) && | 1198 | if (swap_count(*swap_map) && |
1190 | PageDirty(page) && PageSwapCache(page)) { | 1199 | PageDirty(page) && PageSwapCache(page)) { |