mem-hotplug: alloc new page from a nearest neighbor node when mem-offline
Subsystems (2)
PATCH v3 1/1 mem-hotplug: alloc new page from a nearest neighbor node when mem-offline
If we offline a node, alloc the new page from a nearest neighbor node instead of the current node or other remote nodes, because re-migrate is a waste of time and the distance of the remote nodes is often very large.
Also use GFP_HIGHUSER_MOVABLE to alloc new page if the zone is movable zone or highmem zone.
Changelog:
V3:
-alloc new page from a nearest neighbor node for both movable zone and non-movable zone
V2:
-alloc new page from the next node for only movable zone
--- mm/memory_hotplug.c | 38 +++++++++++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 5 deletions(-)
mm/memory_hotplug.c +33 -5
@@ -1501,6 +1501,37 @@ static unsigned long scan_movable_pages(unsigned long start, unsigned long end)return 0 ; } +static struct page *new_node_page (struct page *page,unsigned long private, +int **result) +{ +gfp_t gfp_mask =GFP_USER | __GFP_MOVABLE; +int nid =page_to_nid (page); +nodemask_t nmask = node_online_map; +struct page *new_page; + +/* +* TODO: allocate a destination hugepage from a nearest neighbor node, +* accordance with memory policy of the user process if possible. For +* now as a simple work-around, we use the next node for destination. +*/ +if (PageHuge (page)) +return alloc_huge_page_node (page_hstate (compound_head (page)), +next_node_in (nid, nmask)); + +node_clear (nid, nmask); +if (PageHighMem (page) + || (zone_idx (page_zone (page)) ==ZONE_MOVABLE )) + gfp_mask |= __GFP_HIGHMEM; + + new_page =__alloc_pages_nodemask (gfp_mask,0 , +node_zonelist (nid, gfp_mask), &nmask); +if (!new_page) + new_page =__alloc_pages (gfp_mask,0 , +node_zonelist (nid, gfp_mask)); + +return new_page; +} +#define NR_OFFLINE_AT_ONCE_PAGES (256)static int do_migrate_range (unsigned long start_pfn,unsigned long end_pfn)
@@ -1564,11 +1595,8 @@ do_migrate_range(unsigned long start_pfn, unsigned long end_pfn) goto out; } -/* -* alloc_migrate_target should be improooooved!! -* migrate_pages returns # of failed pages. -*/ - ret =migrate_pages (&source, alloc_migrate_target,NULL ,0 , +/* Allocate a new page from the nearest neighbor node */ + ret =migrate_pages (&source, new_node_page,NULL ,0 ,MIGRATE_SYNC ,MR_MEMORY_HOTPLUG );if (ret)putback_movable_pages (&source);
Signature · 1 line
1.8.3.1
Andrew Morton
maintainerQuoted 1 line · On Mon, 25 Jul 2016 17:53:15 +0800 Xishi Qiu <[email protected]> wrote:
Subject: [PATCH v3] mem-hotplug: alloc new page from a nearest neighbor node when mem-offline
argh.
This is "v3" but there is no v1 and no v2. Please don't change the name of patches in this manner. Or if you do, please be clear which patch is being updated.
I'll drop your mem-hotplug-use-different-mempolicy-in-alloc_migrate_target.patch.
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Quoted 4 lines · Andrew Morton
Quoted 1 line · On Mon, 25 Jul 2016 17:53:15 +0800 Xishi Qiu <[email protected]> wrote:
Subject: [PATCH v3] mem-hotplug: alloc new page from a nearest neighbor node when mem-offline
Quoted 9 lines
argh.
This is "v3" but there is no v1 and no v2. Please don't change the name of patches in this manner. Or if you do, please be clear which patch is being updated.
I'll drop your mem-hotplug-use-different-mempolicy-in-alloc_migrate_target.patch.
Hi Andrew,
Sorry for the confusion of title.
The following patches are all the old versions and please drop them all.
[PATCH] mem-hotplug: use GFP_HIGHUSER_MOVABLE and alloc from next node in alloc_migrate_target() [PATCH 1/2] mem-hotplug: use GFP_HIGHUSER_MOVABLE in, alloc_migrate_target() [PATCH 2/2] mem-hotplug: use different mempolicy in alloc_migrate_target() [PATCH v2] mem-hotplug: alloc new page from the next node if zone is MOVABLE_ZONE
Thanks,
Xishi Qiu
Quoted 2 lines
.