diff options
author | Brice Goglin <Brice.Goglin@inria.fr> | 2008-10-18 23:27:15 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-10-20 11:52:33 -0400 |
commit | e78bbfa8262424417a29349a8064a535053912b9 (patch) | |
tree | dc1f1cdd4390b3f817a2d3a2835c11eb3b41b3ea | |
parent | de7f0cba96786cf9ec9da4532c1b25f733da9b6f (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.c | 3 |
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; |