From: Michael Roth <mdroth@linux.vnet.ibm.com>
To: Bharata B Rao <bharata@linux.vnet.ibm.com>, qemu-devel@nongnu.org
Cc: david@gibson.dropbear.id.au, nfont@linux.vnet.ibm.com,
aik@ozlabs.ru, qemu-ppc@nongnu.org
Subject: Re: [Qemu-devel] [PATCH v4] spapr: Ensure all LMBs are represented in ibm, dynamic-memory
Date: Fri, 10 Jun 2016 14:29:00 -0500 [thread overview]
Message-ID: <20160610192900.31993.89286@loki> (raw)
In-Reply-To: <1465535688-29001-1-git-send-email-bharata@linux.vnet.ibm.com>
Quoting Bharata B Rao (2016-06-10 00:14:48)
> Memory hotplug can fail for some combinations of RAM and maxmem when
> DDW is enabled in the presence of devices like nec-usb-xhci. DDW depends
> on maximum addressable memory returned by guest and this value is currently
> being calculated wrongly by the guest kernel routine memory_hotplug_max().
> While there is an attempt to fix the guest kernel, this patch works
> around the problem within QEMU itself.
>
> memory_hotplug_max() routine in the guest kernel arrives at max
> addressable memory by multiplying lmb-size with the lmb-count obtained
> from ibm,dynamic-memory property. There are two assumptions here:
>
> - All LMBs are part of ibm,dynamic memory: This is not true for PowerKVM
> where only hot-pluggable LMBs are present in this property.
> - The memory area comprising of RAM and hotplug region is contiguous: This
> needn't be true always for PowerKVM as there can be gap between
> boot time RAM and hotplug region.
>
> To work around this guest kernel bug, ensure that ibm,dynamic-memory
> has information about all the LMBs (RMA, boot-time LMBs, future
> hotpluggable LMBs, and dummy LMBs to cover the gap between RAM and
> hotpluggable region).
>
> RMA is represented separately by memory@0 node. Hence mark RMA LMBs
> and also the LMBs for the gap b/n RAM and hotpluggable region as
> reserved and as having no valid DRC so that these LMBs are not considered
> by the guest.
>
> Signed-off-by: Bharata B Rao <bharata@linux.vnet.ibm.com>
Reviewed-by: Michael Roth <mdroth@linux.vnet.ibm.com>
> ---
> Changes in v4:
>
> - Included address information for all LMBs in ibm,dynamic-memory.
> - Use both RESERVED and DRC_INVALID flag bits for non-hotpluggable LMBs.
>
> v3: https://lists.gnu.org/archive/html/qemu-ppc/2016-06/msg00187.html
>
> hw/ppc/spapr.c | 57 ++++++++++++++++++++++++++++++++------------------
> include/hw/ppc/spapr.h | 6 ++++--
> 2 files changed, 41 insertions(+), 22 deletions(-)
>
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index 0636642..9a4a803 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -762,14 +762,17 @@ 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 hotplug_lmb_start = spapr->hotplug_memory.base / lmb_size;
> + uint32_t nr_lmbs = (spapr->hotplug_memory.base +
> + 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;
>
> /*
> - * Don't create the node if there are no DR LMBs.
> + * Don't create the node if there is no hotpluggable memory
> */
> - if (!nr_lmbs) {
> + if (machine->ram_size == machine->maxram_size) {
> return 0;
> }
>
> @@ -803,26 +806,40 @@ static int spapr_populate_drconf_memory(sPAPRMachineState *spapr, void *fdt)
> int_buf[0] = cpu_to_be32(nr_lmbs);
> cur_index++;
> for (i = 0; i < nr_lmbs; i++) {
> - sPAPRDRConnector *drc;
> - sPAPRDRConnectorClass *drck;
> - uint64_t addr = i * lmb_size + spapr->hotplug_memory.base;;
> + uint64_t addr = i * lmb_size;
> uint32_t *dynamic_memory = cur_index;
>
> - drc = spapr_dr_connector_by_id(SPAPR_DR_CONNECTOR_TYPE_LMB,
> - addr/lmb_size);
> - g_assert(drc);
> - drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
> -
> - dynamic_memory[0] = cpu_to_be32(addr >> 32);
> - dynamic_memory[1] = cpu_to_be32(addr & 0xffffffff);
> - dynamic_memory[2] = cpu_to_be32(drck->get_index(drc));
> - dynamic_memory[3] = cpu_to_be32(0); /* reserved */
> - dynamic_memory[4] = cpu_to_be32(numa_get_node(addr, NULL));
> - if (addr < machine->ram_size ||
> - memory_region_present(get_system_memory(), addr)) {
> - dynamic_memory[5] = cpu_to_be32(SPAPR_LMB_FLAGS_ASSIGNED);
> + if (i >= hotplug_lmb_start) {
> + sPAPRDRConnector *drc;
> + sPAPRDRConnectorClass *drck;
> +
> + drc = spapr_dr_connector_by_id(SPAPR_DR_CONNECTOR_TYPE_LMB, i);
> + g_assert(drc);
> + drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
> +
> + dynamic_memory[0] = cpu_to_be32(addr >> 32);
> + dynamic_memory[1] = cpu_to_be32(addr & 0xffffffff);
> + dynamic_memory[2] = cpu_to_be32(drck->get_index(drc));
> + dynamic_memory[3] = cpu_to_be32(0); /* reserved */
> + dynamic_memory[4] = cpu_to_be32(numa_get_node(addr, NULL));
> + if (memory_region_present(get_system_memory(), addr)) {
> + dynamic_memory[5] = cpu_to_be32(SPAPR_LMB_FLAGS_ASSIGNED);
> + } else {
> + dynamic_memory[5] = cpu_to_be32(0);
> + }
> } else {
> - dynamic_memory[5] = cpu_to_be32(0);
> + /*
> + * LMB information for RMA, boot time RAM and gap b/n RAM and
> + * hotplug memory region -- all these are marked as reserved
> + * and as having no valid DRC.
> + */
> + dynamic_memory[0] = cpu_to_be32(addr >> 32);
> + dynamic_memory[1] = cpu_to_be32(addr & 0xffffffff);
> + dynamic_memory[2] = cpu_to_be32(0);
> + dynamic_memory[3] = cpu_to_be32(0); /* reserved */
> + dynamic_memory[4] = cpu_to_be32(-1);
> + dynamic_memory[5] = cpu_to_be32(SPAPR_LMB_FLAGS_RESERVED |
> + SPAPR_LMB_FLAGS_DRC_INVALID);
> }
>
> cur_index += SPAPR_DR_LMB_LIST_ENTRY_SIZE;
> diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
> index 971df3d..3ac85c0 100644
> --- a/include/hw/ppc/spapr.h
> +++ b/include/hw/ppc/spapr.h
> @@ -620,9 +620,11 @@ int spapr_rng_populate_dt(void *fdt);
> #define SPAPR_DR_LMB_LIST_ENTRY_SIZE 6
>
> /*
> - * This flag value defines the LMB as assigned in ibm,dynamic-memory
> - * property under ibm,dynamic-reconfiguration-memory node.
> + * Defines for flag value in ibm,dynamic-memory property under
> + * ibm,dynamic-reconfiguration-memory node.
> */
> #define SPAPR_LMB_FLAGS_ASSIGNED 0x00000008
> +#define SPAPR_LMB_FLAGS_DRC_INVALID 0x00000020
> +#define SPAPR_LMB_FLAGS_RESERVED 0x00000080
>
> #endif /* !defined (__HW_SPAPR_H__) */
> --
> 2.1.0
>
next prev parent reply other threads:[~2016-06-10 19:29 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-06-10 5:14 [Qemu-devel] [PATCH v4] spapr: Ensure all LMBs are represented in ibm, dynamic-memory Bharata B Rao
2016-06-10 19:29 ` Michael Roth [this message]
2016-06-13 17:49 ` Nathan Fontenot
2016-06-14 3:20 ` David Gibson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20160610192900.31993.89286@loki \
--to=mdroth@linux.vnet.ibm.com \
--cc=aik@ozlabs.ru \
--cc=bharata@linux.vnet.ibm.com \
--cc=david@gibson.dropbear.id.au \
--cc=nfont@linux.vnet.ibm.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.