spapr: Revert to memory@XXXX representation for non-hotplugged memory

Don't represent non-hotluggable memory under drconf node. With this
we don't have to create DRC objects for them.

The effect of this patch is that we revert back to memory@XXXX representation
for all the memory specified with -m option and represent the cold
plugged memory and hot-pluggable memory under
ibm,dynamic-reconfiguration-memory.

Signed-off-by: Bharata B Rao <bharata@linux.vnet.ibm.com>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
Bharata B Rao 2015-08-03 11:05:41 +05:30 committed by David Gibson
parent 6663864e95
commit e8f986fc57

View File

@ -560,6 +560,7 @@ static int spapr_populate_memory(sPAPRMachineState *spapr, void *fdt)
} }
if (!mem_start) { if (!mem_start) {
/* ppc_spapr_init() checks for rma_size <= node0_size already */ /* ppc_spapr_init() checks for rma_size <= node0_size already */
spapr_populate_memory_node(fdt, i, 0, spapr->rma_size);
mem_start += spapr->rma_size; mem_start += spapr->rma_size;
node_size -= spapr->rma_size; node_size -= spapr->rma_size;
} }
@ -720,9 +721,7 @@ static int spapr_populate_drconf_memory(sPAPRMachineState *spapr, void *fdt)
int ret, i, offset; int ret, i, offset;
uint64_t lmb_size = SPAPR_MEMORY_BLOCK_SIZE; uint64_t lmb_size = SPAPR_MEMORY_BLOCK_SIZE;
uint32_t prop_lmb_size[] = {0, cpu_to_be32(lmb_size)}; uint32_t prop_lmb_size[] = {0, cpu_to_be32(lmb_size)};
uint32_t nr_rma_lmbs = spapr->rma_size/lmb_size; uint32_t nr_lmbs = (machine->maxram_size - machine->ram_size)/lmb_size;
uint32_t nr_lmbs = machine->maxram_size/lmb_size - nr_rma_lmbs;
uint32_t nr_assigned_lmbs = machine->ram_size/lmb_size - nr_rma_lmbs;
uint32_t *int_buf, *cur_index, buf_len; uint32_t *int_buf, *cur_index, buf_len;
int nr_nodes = nb_numa_nodes ? nb_numa_nodes : 1; int nr_nodes = nb_numa_nodes ? nb_numa_nodes : 1;
@ -755,15 +754,9 @@ static int spapr_populate_drconf_memory(sPAPRMachineState *spapr, void *fdt)
for (i = 0; i < nr_lmbs; i++) { for (i = 0; i < nr_lmbs; i++) {
sPAPRDRConnector *drc; sPAPRDRConnector *drc;
sPAPRDRConnectorClass *drck; sPAPRDRConnectorClass *drck;
uint64_t addr; uint64_t addr = i * lmb_size + spapr->hotplug_memory.base;;
uint32_t *dynamic_memory = cur_index; uint32_t *dynamic_memory = cur_index;
if (i < nr_assigned_lmbs) {
addr = (i + nr_rma_lmbs) * lmb_size;
} else {
addr = (i - nr_assigned_lmbs) * lmb_size +
spapr->hotplug_memory.base;
}
drc = spapr_dr_connector_by_id(SPAPR_DR_CONNECTOR_TYPE_LMB, drc = spapr_dr_connector_by_id(SPAPR_DR_CONNECTOR_TYPE_LMB,
addr/lmb_size); addr/lmb_size);
g_assert(drc); g_assert(drc);
@ -838,8 +831,6 @@ int spapr_h_cas_compose_response(sPAPRMachineState *spapr,
/* Generate memory nodes or ibm,dynamic-reconfiguration-memory node */ /* Generate memory nodes or ibm,dynamic-reconfiguration-memory node */
if (memory_update && smc->dr_lmb_enabled) { if (memory_update && smc->dr_lmb_enabled) {
_FDT((spapr_populate_drconf_memory(spapr, fdt))); _FDT((spapr_populate_drconf_memory(spapr, fdt)));
} else {
_FDT((spapr_populate_memory(spapr, fdt)));
} }
/* Pack resulting tree */ /* Pack resulting tree */
@ -877,23 +868,10 @@ static void spapr_finalize_fdt(sPAPRMachineState *spapr,
/* open out the base tree into a temp buffer for the final tweaks */ /* open out the base tree into a temp buffer for the final tweaks */
_FDT((fdt_open_into(spapr->fdt_skel, fdt, FDT_MAX_SIZE))); _FDT((fdt_open_into(spapr->fdt_skel, fdt, FDT_MAX_SIZE)));
/* ret = spapr_populate_memory(spapr, fdt);
* Add memory@0 node to represent RMA. Rest of the memory is either if (ret < 0) {
* represented by memory nodes or ibm,dynamic-reconfiguration-memory fprintf(stderr, "couldn't setup memory nodes in fdt\n");
* node later during ibm,client-architecture-support call. exit(1);
*
* If NUMA is configured, ensure that memory@0 ends up in the
* first memory-less node.
*/
if (nb_numa_nodes) {
for (i = 0; i < nb_numa_nodes; ++i) {
if (numa_info[i].node_mem) {
spapr_populate_memory_node(fdt, i, 0, spapr->rma_size);
break;
}
}
} else {
spapr_populate_memory_node(fdt, 0, 0, spapr->rma_size);
} }
ret = spapr_populate_vdevice(spapr->vio_bus, fdt); ret = spapr_populate_vdevice(spapr->vio_bus, fdt);
@ -1600,21 +1578,14 @@ static void spapr_create_lmb_dr_connectors(sPAPRMachineState *spapr)
{ {
MachineState *machine = MACHINE(spapr); MachineState *machine = MACHINE(spapr);
uint64_t lmb_size = SPAPR_MEMORY_BLOCK_SIZE; uint64_t lmb_size = SPAPR_MEMORY_BLOCK_SIZE;
uint32_t nr_rma_lmbs = spapr->rma_size/lmb_size; uint32_t nr_lmbs = (machine->maxram_size - machine->ram_size)/lmb_size;
uint32_t nr_lmbs = machine->maxram_size/lmb_size - nr_rma_lmbs;
uint32_t nr_assigned_lmbs = machine->ram_size/lmb_size - nr_rma_lmbs;
int i; int i;
for (i = 0; i < nr_lmbs; i++) { for (i = 0; i < nr_lmbs; i++) {
sPAPRDRConnector *drc; sPAPRDRConnector *drc;
uint64_t addr; uint64_t addr;
if (i < nr_assigned_lmbs) { addr = i * lmb_size + spapr->hotplug_memory.base;
addr = (i + nr_rma_lmbs) * lmb_size;
} else {
addr = (i - nr_assigned_lmbs) * lmb_size +
spapr->hotplug_memory.base;
}
drc = spapr_dr_connector_new(OBJECT(spapr), SPAPR_DR_CONNECTOR_TYPE_LMB, drc = spapr_dr_connector_new(OBJECT(spapr), SPAPR_DR_CONNECTOR_TYPE_LMB,
addr/lmb_size); addr/lmb_size);
qemu_register_reset(spapr_drc_reset, drc); qemu_register_reset(spapr_drc_reset, drc);