From raybry@sgi.com Fri Jul 1 15:40:59 2005 Date: Fri, 1 Jul 2005 15:40:58 -0700 (PDT) From: Ray Bryant To: Hirokazu Takahashi , Andi Kleen , Dave Hansen , Marcelo Tosatti Cc: Christoph Hellwig , linux-mm , Nathan Scott , Ray Bryant , lhms-devel@lists.sourceforge.net, Ray Bryant , Paul Jackson , clameter@sgi.com Subject: [PATCH 2.6.13-rc1 3/11] mm: manual page migration-rc4 -- add-node_map-arg-to-try_to_migrate_pages-rc4.patch This patch changes the interface to try_to_migrate_pages() so that one can specify the nodes where the pages are to be migrated to. This is done by adding a "node_map" argument to try_to_migrate_pages(), node_map is of type "int *". If this argument is NULL, then try_to_migrate_pages() behaves exactly as before and this is the interface the rest of the memory hotplug patch should use. (Note: This patchset does not include the changes for the rest of the memory hotplug patch that will be necessary to use this new interface [if it is accepted]. Those chagnes will be provided as a distinct patch.) If the argument is non-NULL, the node_map points at an array of shorts of size MAX_NUMNODES. node_map[N] is either the id of an online node or -1. If node_map[N] >=0 then pages found in the page list passed to try_to_migrate_pages() that are found on node N are migrated to node node_map[N]. if node_map[N] == -1, then pages found on node N are left where they are. This change depends on previous changes to migrate_onepage() that support migrating a page to a specified node. These changes are already part of the memory migration sub-patch of the memory hotplug patch. Signed-off-by: Ray Bryant include/linux/mmigrate.h | 11 ++++++++++- mm/mmigrate.c | 10 ++++++---- 2 files changed, 16 insertions(+), 5 deletions(-) Index: linux-2.6.13/include/linux/mmigrate.h =================================================================== --- linux-2.6.13.orig/include/linux/mmigrate.h 2005-08-31 13:28:12.000000000 -0700 +++ linux-2.6.13/include/linux/mmigrate.h 2005-08-31 14:27:09.000000000 -0700 @@ -16,7 +16,16 @@ extern int migrate_page_buffer(struct pa extern int page_migratable(struct page *, struct page *, int, struct list_head *); extern struct page * migrate_onepage(struct page *, int nodeid); -extern int try_to_migrate_pages(struct list_head *); +extern int try_to_migrate_pages(struct list_head *, int *); + +static inline struct page *node_migrate_onepage(struct page *page, int *node_map) +{ + if (node_map) + return migrate_onepage(page, node_map[page_to_nid(page)]); + else + return migrate_onepage(page, MIGRATE_NODE_ANY); + +} #else static inline int generic_migrate_page(struct page *page, struct page *newpage, Index: linux-2.6.13/mm/mmigrate.c =================================================================== --- linux-2.6.13.orig/mm/mmigrate.c 2005-08-31 13:28:12.000000000 -0700 +++ linux-2.6.13/mm/mmigrate.c 2005-08-31 14:27:09.000000000 -0700 @@ -501,9 +501,11 @@ out_unlock: /* * This is the main entry point to migrate pages in a specific region. * If a page is inactive, the page may be just released instead of - * migration. + * migration. node_map is supplied in those cases (on NUMA systems) + * where the caller wishes to specify to which nodes the pages are + * migrated. If node_map is null, the target node is MIGRATE_NODE_ANY. */ -int try_to_migrate_pages(struct list_head *page_list) +int try_to_migrate_pages(struct list_head *page_list, int *node_map) { struct page *page, *page2, *newpage; LIST_HEAD(pass1_list); @@ -541,7 +543,7 @@ int try_to_migrate_pages(struct list_hea list_for_each_entry_safe(page, page2, &pass1_list, lru) { list_del(&page->lru); if (PageLocked(page) || PageWriteback(page) || - IS_ERR(newpage = migrate_onepage(page, MIGRATE_NODE_ANY))) { + IS_ERR(newpage = node_migrate_onepage(page, node_map))) { if (page_count(page) == 1) { /* the page is already unused */ putback_page_to_lru(page_zone(page), page); @@ -559,7 +561,7 @@ int try_to_migrate_pages(struct list_hea */ list_for_each_entry_safe(page, page2, &pass2_list, lru) { list_del(&page->lru); - if (IS_ERR(newpage = migrate_onepage(page, MIGRATE_NODE_ANY))) { + if (IS_ERR(newpage = node_migrate_onepage(page, node_map))) { if (page_count(page) == 1) { /* the page is already unused */ putback_page_to_lru(page_zone(page), page); Index: linux-2.6.13/arch/ia64/Kconfig =================================================================== --- linux-2.6.13.orig/arch/ia64/Kconfig 2005-08-31 13:28:12.000000000 -0700 +++ linux-2.6.13/arch/ia64/Kconfig 2005-08-31 14:29:08.000000000 -0700 @@ -50,6 +50,10 @@ config SCHED_NO_NO_OMIT_FRAME_POINTER bool default y +config MEMORY_MIGRATE + bool + default y + config IA64_UNCACHED_ALLOCATOR bool select GENERIC_ALLOCATOR