Accommodate enough space in hotplug memory region so that it will be possible to align memory in each slot to 256M. When PowerPC memory hotplug enables inter-dimm gaps, then we could end up having unused/unassigned 256M memory chucks between DIMMs in the hotplug memory region. Hence create DRC objects spanning the entire alignment-adjusted hotplug memory region instead of just the acutal hotpluggable size (machine->maxram_size - machine->ram_size).
In addition, pass 256M alignment to pc_dimm_memory_plug() so that the DIMM address gets aligned to 256M. Signed-off-by: Bharata B Rao <bhar...@linux.vnet.ibm.com> Reviewed-by: Igor Mammedov <imamm...@redhat.com> --- hw/ppc/spapr.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index e1202ce..f29bb10 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -753,7 +753,7 @@ static int spapr_populate_drconf_memory(sPAPRMachineState *spapr, void *fdt) int ret, i, offset; uint64_t lmb_size = SPAPR_MEMORY_BLOCK_SIZE; uint32_t prop_lmb_size[] = {0, cpu_to_be32(lmb_size)}; - uint32_t nr_lmbs = (machine->maxram_size - machine->ram_size)/lmb_size; + uint32_t nr_lmbs = memory_region_size(&spapr->hotplug_memory.mr)/lmb_size; uint32_t *int_buf, *cur_index, buf_len; int nr_nodes = nb_numa_nodes ? nb_numa_nodes : 1; @@ -1647,9 +1647,8 @@ static void spapr_drc_reset(void *opaque) static void spapr_create_lmb_dr_connectors(sPAPRMachineState *spapr) { - MachineState *machine = MACHINE(spapr); uint64_t lmb_size = SPAPR_MEMORY_BLOCK_SIZE; - uint32_t nr_lmbs = (machine->maxram_size - machine->ram_size)/lmb_size; + uint32_t nr_lmbs = memory_region_size(&spapr->hotplug_memory.mr)/lmb_size; int i; for (i = 0; i < nr_lmbs; i++) { @@ -1825,6 +1824,20 @@ static void ppc_spapr_init(MachineState *machine) spapr->hotplug_memory.base = ROUND_UP(machine->ram_size, SPAPR_HOTPLUG_MEM_ALIGN); + + /* + * Ensure that there is enough space in the hotplug memory + * region to support a maximum alignment of 256M per slot. + * Though PowerPC has 16M and 16G huge pages, PowerKVM supports + * only 16M and hence 256M alignment works until we start + * supporting 16G hugepage. + * + * Instead of max hugepage size alignment, we go with 256M + * alignment because we require the DIMM address to be 256M + * aligned as we maintain a DRC object for every 256M memory + * chunk in the hotplug memory region. + */ + hotplug_mem_size += SPAPR_MEMORY_BLOCK_SIZE * machine->ram_slots; memory_region_init(&spapr->hotplug_memory.mr, OBJECT(spapr), "hotplug-memory", hotplug_mem_size); memory_region_add_subregion(sysmem, spapr->hotplug_memory.base, @@ -2147,7 +2160,7 @@ static void spapr_memory_plug(HotplugHandler *hotplug_dev, DeviceState *dev, PCDIMMDevice *dimm = PC_DIMM(dev); PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(dimm); MemoryRegion *mr = ddc->get_memory_region(dimm); - uint64_t align = memory_region_get_alignment(mr); + uint64_t align = SPAPR_MEMORY_BLOCK_SIZE; uint64_t size = memory_region_size(mr); uint64_t addr; -- 2.1.0