Re: [PATCH v1] pseries/hotplug-memory: hot-add: skip redundant LMB lookup
From: Michael Ellerman <mpe@ellerman.id.au>
Date: 2020-09-11 13:17:49
Hi Scott, Scott Cheloha [off-list ref] writes:
During memory hot-add, dlpar_add_lmb() calls memory_add_physaddr_to_nid() to determine which node id (nid) to use when later calling __add_memory().
...
Consider an LPAR with 126976 LMBs. In one test, hot-adding 126000
Nice little machine you got there :P
LMBs on an upatched kernel took ~3.5 hours while a patched kernel completed the same operation in ~2 hours:
...
quoted hunk ↗ jump to hunk
diff --git a/arch/powerpc/platforms/pseries/hotplug-memory.c b/arch/powerpc/platforms/pseries/hotplug-memory.c index 0ea976d1cac4..9cd572440175 100644 --- a/arch/powerpc/platforms/pseries/hotplug-memory.c +++ b/arch/powerpc/platforms/pseries/hotplug-memory.c@@ -595,6 +595,8 @@ static int dlpar_memory_remove_by_ic(u32 lmbs_to_remove, u32 drc_index) } #endif /* CONFIG_MEMORY_HOTREMOVE */ +extern int of_drconf_to_nid_single(struct drmem_lmb *); +
This needs to go in a header. It should probably go in arch/powerpc/include/asm/topology.h cheers
quoted hunk ↗ jump to hunk
static int dlpar_add_lmb(struct drmem_lmb *lmb) { unsigned long block_sz;@@ -611,8 +613,10 @@ static int dlpar_add_lmb(struct drmem_lmb *lmb) block_sz = memory_block_size_bytes(); - /* Find the node id for this address. */ - nid = memory_add_physaddr_to_nid(lmb->base_addr); + /* Find the node id for this address. Fake one if necessary. */ + nid = of_drconf_to_nid_single(lmb); + if (nid < 0 || !node_possible(nid)) + nid = first_online_node; /* Add the memory */ rc = __add_memory(nid, lmb->base_addr, block_sz);-- 2.24.1