Message ID | 1434709077-17491-2-git-send-email-bharata@linux.vnet.ibm.com |
---|---|
State | New |
Headers | show |
On Fri, Jun 19, 2015 at 03:47:53PM +0530, Bharata B Rao wrote: > Initialize a hotplug memory region under which all the hotplugged > memory is accommodated. Also enable memory hotplug by setting > CONFIG_MEM_HOTPLUG. > > Modelled on i386 memory hotplug. > > Signed-off-by: Bharata B Rao <bharata@linux.vnet.ibm.com> > --- > default-configs/ppc64-softmmu.mak | 1 + > hw/ppc/spapr.c | 28 ++++++++++++++++++++++++++++ > include/hw/ppc/spapr.h | 12 ++++++++++++ > 3 files changed, 41 insertions(+) > > diff --git a/default-configs/ppc64-softmmu.mak b/default-configs/ppc64-softmmu.mak > index ab62cc7..e77cb1a 100644 > --- a/default-configs/ppc64-softmmu.mak > +++ b/default-configs/ppc64-softmmu.mak > @@ -52,3 +52,4 @@ CONFIG_XICS_KVM=$(and $(CONFIG_PSERIES),$(CONFIG_KVM)) > # For PReP > CONFIG_MC146818RTC=y > CONFIG_ISA_TESTDEV=y > +CONFIG_MEM_HOTPLUG=y > diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c > index 5ca817c..87a29dc 100644 > --- a/hw/ppc/spapr.c > +++ b/hw/ppc/spapr.c > @@ -1549,6 +1549,34 @@ static void ppc_spapr_init(MachineState *machine) > memory_region_add_subregion(sysmem, 0, rma_region); > } > > + /* initialize hotplug memory address space */ > + if (machine->ram_size < machine->maxram_size) { > + ram_addr_t hotplug_mem_size = machine->maxram_size - machine->ram_size; > + > + if (machine->ram_slots > SPAPR_MAX_RAM_SLOTS) { > + error_report("unsupported amount of memory slots: %"PRIu64, > + machine->ram_slots); > + exit(EXIT_FAILURE); > + } > + > + spapr->hotplug_memory.base = ROUND_UP(machine->ram_size, > + SPAPR_HOTPLUG_MEM_ALIGN); > + > + hotplug_mem_size += SPAPR_HOTPLUG_MEM_ALIGN * machine->ram_slots; I'm not sure what this adjustment is about. Are you putting a gap of size SPAPR_HOTPLUG_MEM_ALIGN between each memory slot? That doesn't see to match the DRC initialization code in the next patch which assigns all the LMBs in the hotplug area contiguous addresses. > + if ((spapr->hotplug_memory.base + hotplug_mem_size) < > + hotplug_mem_size) { > + error_report("unsupported amount of maximum memory: " RAM_ADDR_FMT, > + machine->maxram_size); > + exit(EXIT_FAILURE); > + } > + > + memory_region_init(&spapr->hotplug_memory.mr, OBJECT(spapr), > + "hotplug-memory", hotplug_mem_size); > + memory_region_add_subregion(sysmem, spapr->hotplug_memory.base, > + &spapr->hotplug_memory.mr); > + } > + > filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, "spapr-rtas.bin"); > if (!filename) { > error_report("Could not find LPAR rtas '%s'", "spapr-rtas.bin"); > diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h > index 91a61ab..8a1929b 100644 > --- a/include/hw/ppc/spapr.h > +++ b/include/hw/ppc/spapr.h > @@ -5,6 +5,7 @@ > #include "hw/boards.h" > #include "hw/ppc/xics.h" > #include "hw/ppc/spapr_drc.h" > +#include "hw/mem/pc-dimm.h" > > struct VIOsPAPRBus; > struct sPAPRPHBState; > @@ -76,6 +77,7 @@ struct sPAPRMachineState { > > /*< public >*/ > char *kvm_type; > + MemoryHotplugState hotplug_memory; > }; > > #define H_SUCCESS 0 > @@ -609,4 +611,14 @@ int spapr_rtc_import_offset(DeviceState *dev, int64_t legacy_offset); > > #define SPAPR_MEMORY_BLOCK_SIZE (1 << 28) /* 256MB */ > > +/* > + * This defines the maximum number of DIMM slots we can have for sPAPR > + * guest. This is not defined by sPAPR but we are defining it to 32 slots > + * based on default number of slots provided by PowerPC kernel. > + */ > +#define SPAPR_MAX_RAM_SLOTS 32 > + > +/* 1GB alignment for hotplug memory region */ > +#define SPAPR_HOTPLUG_MEM_ALIGN (1ULL << 30) > + > #endif /* !defined (__HW_SPAPR_H__) */
On Tue, Jun 23, 2015 at 11:33:58AM +1000, David Gibson wrote: > On Fri, Jun 19, 2015 at 03:47:53PM +0530, Bharata B Rao wrote: > > Initialize a hotplug memory region under which all the hotplugged > > memory is accommodated. Also enable memory hotplug by setting > > CONFIG_MEM_HOTPLUG. > > > > Modelled on i386 memory hotplug. > > > > Signed-off-by: Bharata B Rao <bharata@linux.vnet.ibm.com> > > --- > > default-configs/ppc64-softmmu.mak | 1 + > > hw/ppc/spapr.c | 28 ++++++++++++++++++++++++++++ > > include/hw/ppc/spapr.h | 12 ++++++++++++ > > 3 files changed, 41 insertions(+) > > > > diff --git a/default-configs/ppc64-softmmu.mak b/default-configs/ppc64-softmmu.mak > > index ab62cc7..e77cb1a 100644 > > --- a/default-configs/ppc64-softmmu.mak > > +++ b/default-configs/ppc64-softmmu.mak > > @@ -52,3 +52,4 @@ CONFIG_XICS_KVM=$(and $(CONFIG_PSERIES),$(CONFIG_KVM)) > > # For PReP > > CONFIG_MC146818RTC=y > > CONFIG_ISA_TESTDEV=y > > +CONFIG_MEM_HOTPLUG=y > > diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c > > index 5ca817c..87a29dc 100644 > > --- a/hw/ppc/spapr.c > > +++ b/hw/ppc/spapr.c > > @@ -1549,6 +1549,34 @@ static void ppc_spapr_init(MachineState *machine) > > memory_region_add_subregion(sysmem, 0, rma_region); > > } > > > > + /* initialize hotplug memory address space */ > > + if (machine->ram_size < machine->maxram_size) { > > + ram_addr_t hotplug_mem_size = machine->maxram_size - machine->ram_size; > > + > > + if (machine->ram_slots > SPAPR_MAX_RAM_SLOTS) { > > + error_report("unsupported amount of memory slots: %"PRIu64, > > + machine->ram_slots); > > + exit(EXIT_FAILURE); > > + } > > + > > + spapr->hotplug_memory.base = ROUND_UP(machine->ram_size, > > + SPAPR_HOTPLUG_MEM_ALIGN); > > + > > + hotplug_mem_size += SPAPR_HOTPLUG_MEM_ALIGN * machine->ram_slots; > > I'm not sure what this adjustment is about. Are you putting a gap of > size SPAPR_HOTPLUG_MEM_ALIGN between each memory slot? That doesn't > see to match the DRC initialization code in the next patch which > assigns all the LMBs in the hotplug area contiguous addresses. Right, this is some leftover alignment bits from x86 implementation which to me looks like not needed in Power. Let me clean this up in the next iteration. Regards, Bharata.
diff --git a/default-configs/ppc64-softmmu.mak b/default-configs/ppc64-softmmu.mak index ab62cc7..e77cb1a 100644 --- a/default-configs/ppc64-softmmu.mak +++ b/default-configs/ppc64-softmmu.mak @@ -52,3 +52,4 @@ CONFIG_XICS_KVM=$(and $(CONFIG_PSERIES),$(CONFIG_KVM)) # For PReP CONFIG_MC146818RTC=y CONFIG_ISA_TESTDEV=y +CONFIG_MEM_HOTPLUG=y diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 5ca817c..87a29dc 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -1549,6 +1549,34 @@ static void ppc_spapr_init(MachineState *machine) memory_region_add_subregion(sysmem, 0, rma_region); } + /* initialize hotplug memory address space */ + if (machine->ram_size < machine->maxram_size) { + ram_addr_t hotplug_mem_size = machine->maxram_size - machine->ram_size; + + if (machine->ram_slots > SPAPR_MAX_RAM_SLOTS) { + error_report("unsupported amount of memory slots: %"PRIu64, + machine->ram_slots); + exit(EXIT_FAILURE); + } + + spapr->hotplug_memory.base = ROUND_UP(machine->ram_size, + SPAPR_HOTPLUG_MEM_ALIGN); + + hotplug_mem_size += SPAPR_HOTPLUG_MEM_ALIGN * machine->ram_slots; + + if ((spapr->hotplug_memory.base + hotplug_mem_size) < + hotplug_mem_size) { + error_report("unsupported amount of maximum memory: " RAM_ADDR_FMT, + machine->maxram_size); + exit(EXIT_FAILURE); + } + + memory_region_init(&spapr->hotplug_memory.mr, OBJECT(spapr), + "hotplug-memory", hotplug_mem_size); + memory_region_add_subregion(sysmem, spapr->hotplug_memory.base, + &spapr->hotplug_memory.mr); + } + filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, "spapr-rtas.bin"); if (!filename) { error_report("Could not find LPAR rtas '%s'", "spapr-rtas.bin"); diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index 91a61ab..8a1929b 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -5,6 +5,7 @@ #include "hw/boards.h" #include "hw/ppc/xics.h" #include "hw/ppc/spapr_drc.h" +#include "hw/mem/pc-dimm.h" struct VIOsPAPRBus; struct sPAPRPHBState; @@ -76,6 +77,7 @@ struct sPAPRMachineState { /*< public >*/ char *kvm_type; + MemoryHotplugState hotplug_memory; }; #define H_SUCCESS 0 @@ -609,4 +611,14 @@ int spapr_rtc_import_offset(DeviceState *dev, int64_t legacy_offset); #define SPAPR_MEMORY_BLOCK_SIZE (1 << 28) /* 256MB */ +/* + * This defines the maximum number of DIMM slots we can have for sPAPR + * guest. This is not defined by sPAPR but we are defining it to 32 slots + * based on default number of slots provided by PowerPC kernel. + */ +#define SPAPR_MAX_RAM_SLOTS 32 + +/* 1GB alignment for hotplug memory region */ +#define SPAPR_HOTPLUG_MEM_ALIGN (1ULL << 30) + #endif /* !defined (__HW_SPAPR_H__) */
Initialize a hotplug memory region under which all the hotplugged memory is accommodated. Also enable memory hotplug by setting CONFIG_MEM_HOTPLUG. Modelled on i386 memory hotplug. Signed-off-by: Bharata B Rao <bharata@linux.vnet.ibm.com> --- default-configs/ppc64-softmmu.mak | 1 + hw/ppc/spapr.c | 28 ++++++++++++++++++++++++++++ include/hw/ppc/spapr.h | 12 ++++++++++++ 3 files changed, 41 insertions(+)