The patch titled Subject: mm/memory_hotplug.c: clean up unregister_mem_sect_under_nodes() has been added to the -mm tree. Its filename is mm-memory_hotplug-cleanup-unregister_mem_sect_under_nodes.patch This patch should soon appear at http://ozlabs.org/~akpm/mmots/broken-out/mm-memory_hotplug-cleanup-unregister_mem_sect_under_nodes.patch and later at http://ozlabs.org/~akpm/mmotm/broken-out/mm-memory_hotplug-cleanup-unregister_mem_sect_under_nodes.patch Before you just go and hit "reply", please: a) Consider who else should be cc'ed b) Prefer to cc a suitable mailing list as well c) Ideally: find the original patch on the mailing list and do a reply-to-all to that, adding suitable additional cc's *** Remember to use Documentation/process/submit-checklist.rst when testing your code *** The -mm tree is included into linux-next and is updated there every 3-4 working days ------------------------------------------------------ From: Oscar Salvador <osalvador@xxxxxxx> Subject: mm/memory_hotplug.c: clean up unregister_mem_sect_under_nodes() With the assumption that the relationship between memory_block <-> node is 1:1, we can refactor this function a bit. This assumption is being taken from register_mem_sect_under_node() code. register_mem_sect_under_node() takes the mem_blk's nid, and compares it to the pfn's nid we are checking. If they match, we go ahead and link both objects. Once done, we just return. So the relationship between memory_block <-> node seems to stand. Currently, unregister_mem_sect_under_nodes() defines a nodemask_t which is being checked in the loop to see if we have already unlinked a certain node. But since a memory_block can only belong to a single node, we can drop the nodemask and the check within the loop. If we find a match between the mem_block->nid and the nid of the pfn we are checking, we unlink the objects and return, as unlinking the objects once is enough. Link: http://lkml.kernel.org/r/20180810152931.23004-4-osalvador@xxxxxxxxxxxxxxxxxx Signed-off-by: Oscar Salvador <osalvador@xxxxxxx> Cc: Dan Williams <dan.j.williams@xxxxxxxxx> Cc: David Hildenbrand <david@xxxxxxxxxx> Cc: Jonathan Cameron <jonathan.cameron@xxxxxxxxxx> Cc: Michal Hocko <mhocko@xxxxxxxx> Cc: Vlastimil Babka <vbabka@xxxxxxx> Cc: <yasu.isimatu@xxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- drivers/base/node.c | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) --- a/drivers/base/node.c~mm-memory_hotplug-cleanup-unregister_mem_sect_under_nodes +++ a/drivers/base/node.c @@ -448,35 +448,27 @@ int register_mem_sect_under_node(struct return 0; } -/* unregister memory section under all nodes that it spans */ +/* unregister memory section from the node it belongs to */ int unregister_mem_sect_under_nodes(struct memory_block *mem_blk, unsigned long phys_index) { - NODEMASK_ALLOC(nodemask_t, unlinked_nodes, GFP_KERNEL); unsigned long pfn, sect_start_pfn, sect_end_pfn; - - if (!unlinked_nodes) - return -ENOMEM; - nodes_clear(*unlinked_nodes); + int nid = mem_blk->nid; sect_start_pfn = section_nr_to_pfn(phys_index); sect_end_pfn = sect_start_pfn + PAGES_PER_SECTION - 1; for (pfn = sect_start_pfn; pfn <= sect_end_pfn; pfn++) { - int nid; + int page_nid = get_nid_for_pfn(pfn); - nid = get_nid_for_pfn(pfn); - if (nid < 0) - continue; - if (!node_online(nid)) - continue; - if (node_test_and_set(nid, *unlinked_nodes)) - continue; - sysfs_remove_link(&node_devices[nid]->dev.kobj, - kobject_name(&mem_blk->dev.kobj)); - sysfs_remove_link(&mem_blk->dev.kobj, - kobject_name(&node_devices[nid]->dev.kobj)); + if (page_nid >= 0 && page_nid == nid) { + sysfs_remove_link(&node_devices[nid]->dev.kobj, + kobject_name(&mem_blk->dev.kobj)); + sysfs_remove_link(&mem_blk->dev.kobj, + kobject_name(&node_devices[nid]->dev.kobj)); + break; + } } - NODEMASK_FREE(unlinked_nodes); + return 0; } _ Patches currently in -mm which might be from osalvador@xxxxxxx are mm-memory_hotplug-make-add_memory_resource-use-__try_online_node.patch mm-memory_hotplug-call-register_mem_sect_under_node.patch mm-memory_hotplug-make-register_mem_sect_under_node-a-cb-of-walk_memory_range.patch mm-memory_hotplug-drop-unnecessary-checks-from-register_mem_sect_under_node.patch mm-sparse-make-sparse_init_one_section-void-and-remove-check.patch mm-remove-zone_id-and-make-use-of-zone_idx-in-is_dev_zone.patch mm-page_alloc-move-ifdefery-out-of-free_area_init_core.patch mm-page_alloc-inline-function-to-handle-config_deferred_struct_page_init.patch mm-page_alloc-introduce-free_area_init_core_hotplug.patch mm-page_alloc-introduce-free_area_init_core_hotplug-v6.patch mm-memory_hotplug-drop-unused-args-from-remove_memory_section.patch mm-memory_hotplug-drop-unneeded-check-from-unregister_mem_sect_under_nodes.patch mm-memory_hotplug-cleanup-unregister_mem_sect_under_nodes.patch