The patch titled Subject: mm/memory_hotplug: don't read nid from struct page during hotplug has been removed from the -mm tree. Its filename was mm-memory_hotplug-dont-read-nid-from-struct-page-during-hotplug.patch This patch was dropped because it was merged into mainline or a subsystem tree ------------------------------------------------------ From: Pavel Tatashin <pasha.tatashin@xxxxxxxxxx> Subject: mm/memory_hotplug: don't read nid from struct page during hotplug During memory hotplugging the probe routine will leave struct pages uninitialized, the same as it is currently done during boot. Therefore, we do not want to access the inside of struct pages before __init_single_page() is called during onlining. Because during hotplug we know that pages in one memory block belong to the same numa node, we can skip the checking. We should keep checking for the boot case. [pasha.tatashin@xxxxxxxxxx: s/register_new_memory()/hotplug_memory_register()] Link: http://lkml.kernel.org/r/20180228030308.1116-6-pasha.tatashin@xxxxxxxxxx Link: http://lkml.kernel.org/r/20180215165920.8570-6-pasha.tatashin@xxxxxxxxxx Signed-off-by: Pavel Tatashin <pasha.tatashin@xxxxxxxxxx> Acked-by: Michal Hocko <mhocko@xxxxxxxx> Reviewed-by: Ingo Molnar <mingo@xxxxxxxxxx> Cc: Baoquan He <bhe@xxxxxxxxxx> Cc: Bharata B Rao <bharata@xxxxxxxxxxxxxxxxxx> Cc: Daniel Jordan <daniel.m.jordan@xxxxxxxxxx> Cc: Dan Williams <dan.j.williams@xxxxxxxxx> Cc: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> Cc: "H. Peter Anvin" <hpa@xxxxxxxxx> Cc: Kirill A. Shutemov <kirill.shutemov@xxxxxxxxxxxxxxx> Cc: Mel Gorman <mgorman@xxxxxxxxxxxxxxxxxxx> Cc: Steven Sistare <steven.sistare@xxxxxxxxxx> Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx> Cc: Vlastimil Babka <vbabka@xxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- drivers/base/memory.c | 4 ++-- drivers/base/node.c | 22 +++++++++++++++------- include/linux/memory.h | 2 +- include/linux/node.h | 4 ++-- mm/memory_hotplug.c | 2 +- 5 files changed, 21 insertions(+), 13 deletions(-) diff -puN drivers/base/memory.c~mm-memory_hotplug-dont-read-nid-from-struct-page-during-hotplug drivers/base/memory.c --- a/drivers/base/memory.c~mm-memory_hotplug-dont-read-nid-from-struct-page-during-hotplug +++ a/drivers/base/memory.c @@ -712,7 +712,7 @@ static int add_memory_block(int base_sec * need an interface for the VM to add new memory regions, * but without onlining it. */ -int register_new_memory(int nid, struct mem_section *section) +int hotplug_memory_register(int nid, struct mem_section *section) { int ret = 0; struct memory_block *mem; @@ -731,7 +731,7 @@ int register_new_memory(int nid, struct } if (mem->section_count == sections_per_block) - ret = register_mem_sect_under_node(mem, nid); + ret = register_mem_sect_under_node(mem, nid, false); out: mutex_unlock(&mem_sysfs_mutex); return ret; diff -puN drivers/base/node.c~mm-memory_hotplug-dont-read-nid-from-struct-page-during-hotplug drivers/base/node.c --- a/drivers/base/node.c~mm-memory_hotplug-dont-read-nid-from-struct-page-during-hotplug +++ a/drivers/base/node.c @@ -399,7 +399,8 @@ static int __ref get_nid_for_pfn(unsigne } /* register memory section under specified node if it spans that node */ -int register_mem_sect_under_node(struct memory_block *mem_blk, int nid) +int register_mem_sect_under_node(struct memory_block *mem_blk, int nid, + bool check_nid) { int ret; unsigned long pfn, sect_start_pfn, sect_end_pfn; @@ -425,11 +426,18 @@ int register_mem_sect_under_node(struct continue; } - page_nid = get_nid_for_pfn(pfn); - if (page_nid < 0) - continue; - if (page_nid != nid) - continue; + /* + * We need to check if page belongs to nid only for the boot + * case, during hotplug we know that all pages in the memory + * block belong to the same node. + */ + if (check_nid) { + page_nid = get_nid_for_pfn(pfn); + if (page_nid < 0) + continue; + if (page_nid != nid) + continue; + } ret = sysfs_create_link_nowarn(&node_devices[nid]->dev.kobj, &mem_blk->dev.kobj, kobject_name(&mem_blk->dev.kobj)); @@ -504,7 +512,7 @@ int link_mem_sections(int nid, unsigned mem_blk = find_memory_block_hinted(mem_sect, mem_blk); - ret = register_mem_sect_under_node(mem_blk, nid); + ret = register_mem_sect_under_node(mem_blk, nid, true); if (!err) err = ret; diff -puN include/linux/memory.h~mm-memory_hotplug-dont-read-nid-from-struct-page-during-hotplug include/linux/memory.h --- a/include/linux/memory.h~mm-memory_hotplug-dont-read-nid-from-struct-page-during-hotplug +++ a/include/linux/memory.h @@ -109,7 +109,7 @@ extern int register_memory_notifier(stru extern void unregister_memory_notifier(struct notifier_block *nb); extern int register_memory_isolate_notifier(struct notifier_block *nb); extern void unregister_memory_isolate_notifier(struct notifier_block *nb); -extern int register_new_memory(int, struct mem_section *); +int hotplug_memory_register(int nid, struct mem_section *section); #ifdef CONFIG_MEMORY_HOTREMOVE extern int unregister_memory_section(struct mem_section *); #endif diff -puN include/linux/node.h~mm-memory_hotplug-dont-read-nid-from-struct-page-during-hotplug include/linux/node.h --- a/include/linux/node.h~mm-memory_hotplug-dont-read-nid-from-struct-page-during-hotplug +++ a/include/linux/node.h @@ -67,7 +67,7 @@ extern void unregister_one_node(int nid) extern int register_cpu_under_node(unsigned int cpu, unsigned int nid); extern int unregister_cpu_under_node(unsigned int cpu, unsigned int nid); extern int register_mem_sect_under_node(struct memory_block *mem_blk, - int nid); + int nid, bool check_nid); extern int unregister_mem_sect_under_nodes(struct memory_block *mem_blk, unsigned long phys_index); @@ -97,7 +97,7 @@ static inline int unregister_cpu_under_n return 0; } static inline int register_mem_sect_under_node(struct memory_block *mem_blk, - int nid) + int nid, bool check_nid) { return 0; } diff -puN mm/memory_hotplug.c~mm-memory_hotplug-dont-read-nid-from-struct-page-during-hotplug mm/memory_hotplug.c --- a/mm/memory_hotplug.c~mm-memory_hotplug-dont-read-nid-from-struct-page-during-hotplug +++ a/mm/memory_hotplug.c @@ -279,7 +279,7 @@ static int __meminit __add_section(int n if (!want_memblock) return 0; - return register_new_memory(nid, __pfn_to_section(phys_start_pfn)); + return hotplug_memory_register(nid, __pfn_to_section(phys_start_pfn)); } /* _ Patches currently in -mm which might be from pasha.tatashin@xxxxxxxxxx are xen-mm-allow-deferred-page-initialization-for-xen-pv-domains.patch sparc64-ng4-memset-32-bits-overflow.patch -- To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html