Prev: cgroups: implement moving a threadgroup's threads atomically with cgroup.procs
Next: [PATCH] wm8350-core: fix wrong kfree in error path
From: KAMEZAWA Hiroyuki on 3 Aug 2010 22:00 This patch is created against 2.6.35. CC'ed stable. Thank you for all helps. = From: KAMEZAWA Hiroyuki <kamezawa.hiroyu(a)jp.fujitsu.com> Since 2.6.31, swap_map[]'s refcounting was changed to show that a used swap entry is just for swap-cache, can be reused. Then, while scanning free entry in swap_map[], a swap entry may be able to be reclaimed and reused. It was by the commit c9e444103b5e7a5a3519f9913f59767f92e33baf. But this caused deta corruption at hibernation. Considering how the image is saved, the calls of try_to_reclaim_swap() changes the status of memory and there will be inconsitency between saved-memory-image's swap_map[] / memmap / swapper_space because memory is saved per page with swap-allocation per page. This patch is for avoiding bug by not reclaiming swap-entry at hibernation. This is a quick fix for backporting. Cc: stable(a)kernel.org Cc: Rafael J. Wysocki <rjw(a)sisk.pl> Reported-by: Ondreg Zary <linux(a)rainbow-software.org> Tested-by: Andrea Gelmini <andrea.gelmini(a)gmail.com> Acked-by: Hugh Dickins <hughd(a)google.com> Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu(a)jp.fujitsu.com> --- mm/swapfile.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) Index: linux-2.6.35.org/mm/swapfile.c =================================================================== --- linux-2.6.35.org.orig/mm/swapfile.c +++ linux-2.6.35.org/mm/swapfile.c @@ -318,8 +318,10 @@ checks: if (offset > si->highest_bit) scan_base = offset = si->lowest_bit; - /* reuse swap entry of cache-only swap if not busy. */ - if (vm_swap_full() && si->swap_map[offset] == SWAP_HAS_CACHE) { + /* reuse swap entry of cache-only swap if not hibernation. */ + if (vm_swap_full() + && usage == SWAP_HAS_CACHE + && si->swap_map[offset] == SWAP_HAS_CACHE) { int swap_was_freed; spin_unlock(&swap_lock); swap_was_freed = __try_to_reclaim_swap(si, offset); -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ |