aboutsummaryrefslogtreecommitdiffstats
path: root/mm/memory.c
diff options
context:
space:
mode:
authorChristoph Lameter <clameter@sgi.com>2006-06-23 05:03:04 -0400
committerLinus Torvalds <torvalds@g5.osdl.org>2006-06-23 10:42:45 -0400
commit4da5eda0dca9730f59f391230304526ab4bffec7 (patch)
tree948701e336ec4ca2742b69f7197b89aa61df27d2 /mm/memory.c
parentcb2b95e1c6b56e3d2369d3a5f4bc97f4fa180683 (diff)
[PATCH] Page Migration: Make do_swap_page redo the fault
It is better to redo the complete fault if do_swap_page() finds that the page is not in PageSwapCache() because the page migration code may have replaced the swap pte already with a pte pointing to valid memory. do_swap_page() may interpret an invalid swap entry without this patch because we do not reload the pte if we are looping back. The page migration code may already have reused the swap entry referenced by our local swp_entry. Signed-off-by: Christoph Lameter <clameter@sgi.com> Cc: Hugh Dickins <hugh@veritas.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'mm/memory.c')
-rw-r--r--mm/memory.c7
1 files changed, 0 insertions, 7 deletions
diff --git a/mm/memory.c b/mm/memory.c
index 0ec7bc644271..7e3683fd4f3c 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -1879,7 +1879,6 @@ static int do_swap_page(struct mm_struct *mm, struct vm_area_struct *vma,
1879 goto out; 1879 goto out;
1880 1880
1881 entry = pte_to_swp_entry(orig_pte); 1881 entry = pte_to_swp_entry(orig_pte);
1882again:
1883 page = lookup_swap_cache(entry); 1882 page = lookup_swap_cache(entry);
1884 if (!page) { 1883 if (!page) {
1885 swapin_readahead(entry, address, vma); 1884 swapin_readahead(entry, address, vma);
@@ -1903,12 +1902,6 @@ again:
1903 1902
1904 mark_page_accessed(page); 1903 mark_page_accessed(page);
1905 lock_page(page); 1904 lock_page(page);
1906 if (!PageSwapCache(page)) {
1907 /* Page migration has occured */
1908 unlock_page(page);
1909 page_cache_release(page);
1910 goto again;
1911 }
1912 1905
1913 /* 1906 /*
1914 * Back out if somebody else already faulted in this pte. 1907 * Back out if somebody else already faulted in this pte.