aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrice Goglin <Brice.Goglin@inria.fr>2008-10-18 23:27:15 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2008-10-20 11:52:33 -0400
commite78bbfa8262424417a29349a8064a535053912b9 (patch)
treedc1f1cdd4390b3f817a2d3a2835c11eb3b41b3ea
parentde7f0cba96786cf9ec9da4532c1b25f733da9b6f (diff)
mm: stop returning -ENOENT from sys_move_pages() if nothing got migrated
A patchset reworking sys_move_pages(). It removes the possibly large vmalloc by using multiple chunks when migrating large buffers. It also dramatically increases the throughput for large buffers since the lookup in new_page_node() is now limited to a single chunk, causing the quadratic complexity to have a much slower impact. There is no need to use any radix-tree-like structure to improve this lookup. sys_move_pages() duration on a 4-quadcore-opteron 2347HE (1.9Gz), migrating between nodes #2 and #3: length move_pages (us) move_pages+patch (us) 4kB 126 98 40kB 198 168 400kB 963 937 4MB 12503 11930 40MB 246867 11848 Patches #1 and #4 are the important ones: 1) stop returning -ENOENT from sys_move_pages() if nothing got migrated 2) don't vmalloc a huge page_to_node array for do_pages_stat() 3) extract do_pages_move() out of sys_move_pages() 4) rework do_pages_move() to work on page_sized chunks 5) move_pages: no need to set pp->page to ZERO_PAGE(0) by default This patch: There is no point in returning -ENOENT from sys_move_pages() if all pages were already on the right node, while we return 0 if only 1 page was not. Most application don't know where their pages are allocated, so it's not an error to try to migrate them anyway. Just return 0 and let the status array in user-space be checked if the application needs details. It will make the upcoming chunked-move_pages() support much easier. Signed-off-by: Brice Goglin <Brice.Goglin@inria.fr> Acked-by: Christoph Lameter <cl@linux-foundation.org> Cc: Nick Piggin <nickpiggin@yahoo.com.au> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--mm/migrate.c3
1 files changed, 1 insertions, 2 deletions
diff --git a/mm/migrate.c b/mm/migrate.c
index 6802a7a3dfe..f233519f045 100644
--- a/mm/migrate.c
+++ b/mm/migrate.c
@@ -896,11 +896,10 @@ set_status:
896 pp->status = err; 896 pp->status = err;
897 } 897 }
898 898
899 err = 0;
899 if (!list_empty(&pagelist)) 900 if (!list_empty(&pagelist))
900 err = migrate_pages(&pagelist, new_page_node, 901 err = migrate_pages(&pagelist, new_page_node,
901 (unsigned long)pm); 902 (unsigned long)pm);
902 else
903 err = -ENOENT;
904 903
905 up_read(&mm->mmap_sem); 904 up_read(&mm->mmap_sem);
906 return err; 905 return err;