diff options
author | Christoph Lameter <clameter@engr.sgi.com> | 2006-02-10 04:51:15 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-02-10 11:13:13 -0500 |
commit | 418aade459f03318defd18ef0b11981a63bd81b0 (patch) | |
tree | b13a46e3d7050fa92e390b3374910882ae867254 /mm/vmscan.c | |
parent | 8977d929e49021d9a6e031310aab01fa72f849c2 (diff) |
[PATCH] Updates for page migration
This adds some additional comments in order to help others figure out how
exactly the code works. And fix a variable name.
Also swap_page does need to ignore all reference bits when unmapping a
page. Otherwise we may have to repeatedly unmap a frequently touched page.
So change the try_to_unmap parameter to 1.
Signed-off-by: Christoph Lameter <clameter@sgi.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'mm/vmscan.c')
-rw-r--r-- | mm/vmscan.c | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/mm/vmscan.c b/mm/vmscan.c index 5a610804cd06..5db32fdfaf39 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
@@ -632,7 +632,7 @@ static int swap_page(struct page *page) | |||
632 | struct address_space *mapping = page_mapping(page); | 632 | struct address_space *mapping = page_mapping(page); |
633 | 633 | ||
634 | if (page_mapped(page) && mapping) | 634 | if (page_mapped(page) && mapping) |
635 | if (try_to_unmap(page, 0) != SWAP_SUCCESS) | 635 | if (try_to_unmap(page, 1) != SWAP_SUCCESS) |
636 | goto unlock_retry; | 636 | goto unlock_retry; |
637 | 637 | ||
638 | if (PageDirty(page)) { | 638 | if (PageDirty(page)) { |
@@ -839,7 +839,7 @@ EXPORT_SYMBOL(migrate_page); | |||
839 | * pages are swapped out. | 839 | * pages are swapped out. |
840 | * | 840 | * |
841 | * The function returns after 10 attempts or if no pages | 841 | * The function returns after 10 attempts or if no pages |
842 | * are movable anymore because t has become empty | 842 | * are movable anymore because to has become empty |
843 | * or no retryable pages exist anymore. | 843 | * or no retryable pages exist anymore. |
844 | * | 844 | * |
845 | * Return: Number of pages not migrated when "to" ran empty. | 845 | * Return: Number of pages not migrated when "to" ran empty. |
@@ -928,12 +928,21 @@ redo: | |||
928 | goto unlock_both; | 928 | goto unlock_both; |
929 | 929 | ||
930 | if (mapping->a_ops->migratepage) { | 930 | if (mapping->a_ops->migratepage) { |
931 | /* | ||
932 | * Most pages have a mapping and most filesystems | ||
933 | * should provide a migration function. Anonymous | ||
934 | * pages are part of swap space which also has its | ||
935 | * own migration function. This is the most common | ||
936 | * path for page migration. | ||
937 | */ | ||
931 | rc = mapping->a_ops->migratepage(newpage, page); | 938 | rc = mapping->a_ops->migratepage(newpage, page); |
932 | goto unlock_both; | 939 | goto unlock_both; |
933 | } | 940 | } |
934 | 941 | ||
935 | /* | 942 | /* |
936 | * Trigger writeout if page is dirty | 943 | * Default handling if a filesystem does not provide |
944 | * a migration function. We can only migrate clean | ||
945 | * pages so try to write out any dirty pages first. | ||
937 | */ | 946 | */ |
938 | if (PageDirty(page)) { | 947 | if (PageDirty(page)) { |
939 | switch (pageout(page, mapping)) { | 948 | switch (pageout(page, mapping)) { |
@@ -949,9 +958,10 @@ redo: | |||
949 | ; /* try to migrate the page below */ | 958 | ; /* try to migrate the page below */ |
950 | } | 959 | } |
951 | } | 960 | } |
961 | |||
952 | /* | 962 | /* |
953 | * If we have no buffer or can release the buffer | 963 | * Buffers are managed in a filesystem specific way. |
954 | * then do a simple migration. | 964 | * We must have no buffers or drop them. |
955 | */ | 965 | */ |
956 | if (!page_has_buffers(page) || | 966 | if (!page_has_buffers(page) || |
957 | try_to_release_page(page, GFP_KERNEL)) { | 967 | try_to_release_page(page, GFP_KERNEL)) { |
@@ -966,6 +976,11 @@ redo: | |||
966 | * swap them out. | 976 | * swap them out. |
967 | */ | 977 | */ |
968 | if (pass > 4) { | 978 | if (pass > 4) { |
979 | /* | ||
980 | * Persistently unable to drop buffers..... As a | ||
981 | * measure of last resort we fall back to | ||
982 | * swap_page(). | ||
983 | */ | ||
969 | unlock_page(newpage); | 984 | unlock_page(newpage); |
970 | newpage = NULL; | 985 | newpage = NULL; |
971 | rc = swap_page(page); | 986 | rc = swap_page(page); |