[libvirt] [PATCH 08/10] conf: Prepare making memory device target node optional
John Ferlan
jferlan at redhat.com
Tue Oct 20 21:31:57 UTC 2015
On 10/16/2015 08:11 AM, Peter Krempa wrote:
> Adjust the config code so that it does not enforce that target memory
> node is specified. To avoid breakage, adjust the qemu memory hotplug
> config checker to disallow such config for now.
> ---
> docs/formatdomain.html.in | 5 +++--
> docs/schemas/domaincommon.rng | 8 +++++---
> src/conf/domain_conf.c | 10 +++++++---
> src/qemu/qemu_domain.c | 7 +++++++
> 4 files changed, 22 insertions(+), 8 deletions(-)
>
It almost feels like patches 9 & 10 should precede this one. Perhaps
easier with the html.in change. Consider this as a review for 8-10 as
well as some other random thoughts.
So if I'm reading things correctly, a PPC64 guest "can" supply NUMA
guest nodes, but it doesn't have to. Is that a fair assumption? It
matters mostly to help describe things. If it can have it, then perhaps
another test (copy qemuxml2argv-memory-hotplug-ppc64-nonuma.xml to
qemuxml2argv-memory-hotplug-ppc64.xml and add the numa node defs).
If PPC64 doesn't support NUMA guest nodes, then does it make sense in
post processing code to set targetNode = -1 if ARCH_IS_PPC64? It
wouldn't be the first PPC64 specific code. Along the same lines, would
be ignoring targetNode in patch 9 if PPC64. Furthermore, if PPC64
doesn't support NUMA guest nodes, I would have expected a check during
parse - I didn't look that hard for this case. I was merely thinking
what happens if PPC64 does define NUMA guest nodes and those can be used
by the memory device.
> diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
> index c88b032..279424d 100644
> --- a/docs/formatdomain.html.in
> +++ b/docs/formatdomain.html.in
> @@ -6300,8 +6300,9 @@ qemu-kvm -net nic,model=? /dev/null
> added memory as a scaled integer.
> </p>
> <p>
> - The mandatory <code>node</code> subelement configures the guest NUMA
> - node to attach the memory to.
> + The <code>node</code> subelement configures the guest NUMA node to
> + attach the memory to. Note: Some hypervisors or specific
> + configurations may require that <code>node</code> is specified.
How about:
The optional <code>node</code> subelement provides the guest <a
href="#elementsCPU">cpu NUMA node or cell id</a> to attach the memory.
<p> Note: The hypervisor may require the <code>node</code> to be
specified for some architectures.</p>
FWIW: It almost feels like we need an example of what is meant - that is
"For QEMU/KVM, the PowerPC64 pseries guests do not require that the
<code>node</code> subelement is defined. If not defined, then the memory
device will be attached to [???]."
BTW: The additional text only makes sense as of patch 10 and it wasn't
clear if PPC64 "could" support numa guest nodes.
> </p>
> </dd>
> </dl>
> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
> index f196177..994face 100644
> --- a/docs/schemas/domaincommon.rng
> +++ b/docs/schemas/domaincommon.rng
> @@ -4532,9 +4532,11 @@
> <element name="size">
> <ref name="scaledInteger"/>
> </element>
> - <element name="node">
> - <ref name="unsignedInt"/>
> - </element>
> + <optional>
> + <element name="node">
> + <ref name="unsignedInt"/>
> + </element>
> + </optional>
> </interleave>
> </element>
> </define>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 514bd8a..a5ab29c 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -12520,11 +12520,15 @@ virDomainMemoryTargetDefParseXML(xmlNodePtr node,
> int ret = -1;
> xmlNodePtr save = ctxt->node;
> ctxt->node = node;
> + int rv;
>
> - if (virXPathInt("string(./node)", ctxt, &def->targetNode) < 0 ||
> - def->targetNode < 0) {
> + /* initialize to value which marks that the user didn't speify it */
specify
This feels like a need for something like the Tristate{Bool|State}
structs... Or way to force optional fields to something specific
> + def->targetNode = -1;
> +
> + if ((rv = virXPathInt("string(./node)", ctxt, &def->targetNode)) == -2 ||
> + (rv == 0 && def->targetNode < 0)) {
> virReportError(VIR_ERR_XML_ERROR, "%s",
> - _("invalid or missing value of memory device node"));
> + _("invalid value of memory device node"));
...value for memory...
> goto cleanup;
> }
>
> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> index a22e5ad..29fed1d 100644
> --- a/src/qemu/qemu_domain.c
> +++ b/src/qemu/qemu_domain.c
> @@ -3591,6 +3591,13 @@ qemuDomainDefValidateMemoryHotplugDevice(const virDomainMemoryDef *mem,
> return -1;
> }
>
> + if (mem->targetNode == -1) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> + _("target NUMA node needs to be specifed for memory "
specified
Before an explicit ACK - a few adjustments I think would be beneficial.
John
> + "device"));
> + return -1;
> + }
> +
> if (mem->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DIMM) {
> if (mem->info.addr.dimm.slot >= def->mem.memory_slots) {
> virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
>
More information about the libvir-list
mailing list