While providing guests, it's desirable to resize it's memory on demand. By now, it's possible to do so by creating a guest with a small base memory, hot-plugging all the rest, and using 'movable_node' kernel command-line parameter, which puts all hot-plugged memory in ZONE_MOVABLE, allowing it to be removed whenever needed.
But there is an issue regarding guest reboot: If memory is hot-plugged, and then the guest is rebooted, all hot-plugged memory goes to ZONE_NORMAL, which offers no guaranteed hot-removal. It usually prevents this memory to be hot-removed from the guest. It's possible to use device-tree information to fix that behavior, as it stores flags for LMB ranges on ibm,dynamic-memory-vN. It involves marking each memblock with the correct flags as hotpluggable memory, which mm/memblock.c puts in ZONE_MOVABLE during boot if 'movable_node' is passed. For base memory, qemu assigns these flags for it's LMBs: (DRCONF_MEM_AI_INVALID | DRCONF_MEM_RESERVED) For hot-plugged memory, it assigns (DRCONF_MEM_ASSIGNED). While guest kernel reads the device-tree, early_init_drmem_lmb() is called for every added LMBs, doing nothing for base memory, and adding memblocks for hot-plugged memory. Skipping base memory happens here: if ((lmb->flags & DRCONF_MEM_RESERVED) || !(lmb->flags & DRCONF_MEM_ASSIGNED)) return; Marking memblocks added by this function as hotplugable memory is enough to get the desirable behavior, and should cause no change if 'movable_node' parameter is not passed to kernel. Signed-off-by: Leonardo Bras <leona...@linux.ibm.com> --- arch/powerpc/kernel/prom.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c index 6620f37abe73..f4d14c67bf53 100644 --- a/arch/powerpc/kernel/prom.c +++ b/arch/powerpc/kernel/prom.c @@ -518,6 +518,8 @@ static void __init early_init_drmem_lmb(struct drmem_lmb *lmb, DBG("Adding: %llx -> %llx\n", base, size); if (validate_mem_limit(base, &size)) memblock_add(base, size); + + early_init_dt_mark_hotplug_memory_arch(base, size); } while (--rngs); } #endif /* CONFIG_PPC_PSERIES */ -- 2.24.1