swap: Catch pages with errors and mark as bad
Subsystems (5)
PATCH 3/9 swap: Catch pages with errors and mark as bad
Check for pages with errors within shrink_page_list() and if found, try to unuse them which will trigger the functions to mark the page bad. The page will then be allocated a new swap page.
If a swap page write error occurs, don't disable page reclaim.
Based on a patch by Nick Piggin and some of my own changes as discussed on LKML.
Signed-off-by Richard Purdie <[email protected]>
--- mm/page_io.c | 3 --- mm/vmscan.c | 9 +++++++++ 2 files changed, 9 insertions(+), 3 deletions(-)
mm/page_io.c +0 -3
@@ -59,15 +59,12 @@ static int end_swap_bio_write(struct bio* Re-dirty the page in order to avoid it being reclaimed. * Also print a dire warning that things will go BAD (tm) * very quickly. -* -* Also clear PG_reclaim to avoid rotate_reclaimable_page() */ set_page_dirty (page);printk (KERN_ALERT "Write-error on swap-device (%u:%u:%Lu)\n" ,imajor (bio->bi_bdev->bd_inode),iminor (bio->bi_bdev->bd_inode), (unsigned long long )bio->bi_sector); -ClearPageReclaim (page); }end_page_writeback (page);bio_put (bio);
mm/vmscan.c +9 -0
@@ -490,6 +490,15 @@ static unsigned long shrink_page_list(st#ifdef CONFIG_SWAP /* +* Encountered an error last time? Try to remove the +* page from its current position, which will notice +* the error and mark that swap entry bad. Then we can +* try allocating another swap entry. +*/ +if (PageSwapCache (page) &&unlikely (PageError (page))) +try_to_unuse_page_entry (page); + +/* * Anonymous process memory has backing store? * Try to allocate it some swap space here. */