qemu-ppc
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-ppc] [RFC PATCH v0 3/5] spapr: Revert to address@hidden repres


From: Nathan Fontenot
Subject: Re: [Qemu-ppc] [RFC PATCH v0 3/5] spapr: Revert to address@hidden representation for non-hotplugged memory
Date: Tue, 04 Aug 2015 09:33:56 -0500
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0

On 08/03/2015 12:35 AM, Bharata B Rao wrote:
> 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 address@hidden 
> representation
> for all the memory specified with -m option and represent the cold
> plugged memory and hot-pluggable memory under
> ibm,dynamic-reconfiguration-memory.
>

I was looking through this and looking at the kernel code that inits memory
for power systems and I wanted to make sure this is really working and
you are seeing all the memory you expect to see in the guest.

Looking through the memory init code (powerpc/kerne/prom.c) it appears that
the additional address@hidden would get initialized very early in boot, the same
time we currently init the address@hidden node. Then later in boot we would init
the rest of memory, lmbs in the dynamic-reconfiguration property.

Just wanting to make sure I'm understanding how this is working.

Also, since the memory specified in the address@hidden nodes is not removable 
this
should not break any of the userspace tools.

-Nathan


 
> Signed-off-by: Bharata B Rao <address@hidden>
> ---
>  hw/ppc/spapr.c | 47 +++++++++--------------------------------------
>  1 file changed, 9 insertions(+), 38 deletions(-)
> 
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index 7f94f97..669dc43 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -562,6 +562,7 @@ static int spapr_populate_memory(sPAPRMachineState 
> *spapr, void *fdt)
>          }
>          if (!mem_start) {
>              /* 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;
>              node_size -= spapr->rma_size;
>          }
> @@ -724,9 +725,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_rma_lmbs = spapr->rma_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 nr_lmbs = (machine->maxram_size - machine->ram_size)/lmb_size;
>      uint32_t *int_buf, *cur_index, buf_len;
>      int nr_nodes = nb_numa_nodes ? nb_numa_nodes : 1;
> 
> @@ -759,15 +758,9 @@ static int 
> spapr_populate_drconf_memory(sPAPRMachineState *spapr, void *fdt)
>      for (i = 0; i < nr_lmbs; i++) {
>          sPAPRDRConnector *drc;
>          sPAPRDRConnectorClass *drck;
> -        uint64_t addr;
> +        uint64_t addr = i * lmb_size + spapr->hotplug_memory.base;;
>          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,
>                                         addr/lmb_size);
>          g_assert(drc);
> @@ -842,8 +835,6 @@ int spapr_h_cas_compose_response(sPAPRMachineState *spapr,
>      /* Generate memory nodes or ibm,dynamic-reconfiguration-memory node */
>      if (memory_update && smc->dr_lmb_enabled) {
>          _FDT((spapr_populate_drconf_memory(spapr, fdt)));
> -    } else {
> -        _FDT((spapr_populate_memory(spapr, fdt)));
>      }
> 
>      /* Pack resulting tree */
> @@ -881,23 +872,10 @@ static void spapr_finalize_fdt(sPAPRMachineState *spapr,
>      /* open out the base tree into a temp buffer for the final tweaks */
>      _FDT((fdt_open_into(spapr->fdt_skel, fdt, FDT_MAX_SIZE)));
> 
> -    /*
> -     * Add address@hidden node to represent RMA. Rest of the memory is either
> -     * represented by memory nodes or ibm,dynamic-reconfiguration-memory
> -     * node later during ibm,client-architecture-support call.
> -     *
> -     * If NUMA is configured, ensure that address@hidden 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_memory(spapr, fdt);
> +    if (ret < 0) {
> +        fprintf(stderr, "couldn't setup memory nodes in fdt\n");
> +        exit(1);
>      }
> 
>      ret = spapr_populate_vdevice(spapr->vio_bus, fdt);
> @@ -1604,21 +1582,14 @@ static void 
> spapr_create_lmb_dr_connectors(sPAPRMachineState *spapr)
>  {
>      MachineState *machine = MACHINE(spapr);
>      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/lmb_size - nr_rma_lmbs;
> -    uint32_t nr_assigned_lmbs = machine->ram_size/lmb_size - nr_rma_lmbs;
> +    uint32_t nr_lmbs = (machine->maxram_size - machine->ram_size)/lmb_size;
>      int i;
> 
>      for (i = 0; i < nr_lmbs; i++) {
>          sPAPRDRConnector *drc;
>          uint64_t addr;
> 
> -        if (i < nr_assigned_lmbs) {
> -            addr = (i + nr_rma_lmbs) * lmb_size;
> -        } else {
> -            addr = (i - nr_assigned_lmbs) * lmb_size +
> -                    spapr->hotplug_memory.base;
> -        }
> +        addr = i * lmb_size + spapr->hotplug_memory.base;
>          drc = spapr_dr_connector_new(OBJECT(spapr), 
> SPAPR_DR_CONNECTOR_TYPE_LMB,
>                                       addr/lmb_size);
>          qemu_register_reset(spapr_drc_reset, drc);
> 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]