[libvirt] [RFC PATCH 02/12] conf: Add support for parsing and formatting max memory and slot count
Peter Krempa
pkrempa at redhat.com
Fri Feb 6 17:07:35 UTC 2015
On Thu, Feb 05, 2015 at 20:54:11 -0700, Eric Blake wrote:
> On 01/30/2015 06:20 AM, Peter Krempa wrote:
> > Add a XML element that will allow to specify maximum supportable memory
>
> s/a XML/an XML/
>
> > and the count of memory slots to use with memory hotplug.
>
> Might be nice to demonstrate that XML here in the commit message, not
> just in formatdomain.html.
>
> >
> > To avoid possible confusion and misuse of the new element this patch
> > also explicitly forbids the use of the maxMemory setting in individual
> > drivers's post parse callbacks. This limitation will be lifted when the
>
> s/drivers's/drivers'/
>
> > support will be implemented.
> > ---
> > docs/formatdomain.html.in | 19 +++++++++++
> > docs/schemas/domaincommon.rng | 8 +++++
> > src/bhyve/bhyve_domain.c | 4 +++
> > src/conf/domain_conf.c | 64 ++++++++++++++++++++++++++++++++++++
> > src/conf/domain_conf.h | 7 ++++
> > src/libvirt_private.syms | 1 +
> > src/libxl/libxl_domain.c | 5 +++
> > src/lxc/lxc_domain.c | 4 +++
> > src/openvz/openvz_driver.c | 11 +++++--
> > src/parallels/parallels_driver.c | 6 +++-
> > src/phyp/phyp_driver.c | 6 +++-
> > src/qemu/qemu_domain.c | 4 +++
> > src/uml/uml_driver.c | 6 +++-
> > src/vbox/vbox_common.c | 6 +++-
> > src/vmware/vmware_driver.c | 6 +++-
> > src/vmx/vmx.c | 6 +++-
> > src/xen/xen_driver.c | 4 +++
> > src/xenapi/xenapi_driver.c | 6 +++-
> > tests/domainschemadata/maxMemory.xml | 19 +++++++++++
> > 19 files changed, 183 insertions(+), 9 deletions(-)
> > create mode 100644 tests/domainschemadata/maxMemory.xml
> >
> > diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
> > index f8d5f89..12f7ede 100644
> > --- a/docs/formatdomain.html.in
> > +++ b/docs/formatdomain.html.in
> > @@ -664,6 +664,7 @@
> > <pre>
> > <domain>
> > ...
> > + <maxMemory slots='123' unit='KiB'>1524288</maxMemory>
>
> 123 is unusual; the example would look more realistic with a power of 2.
>
> > <memory unit='KiB'>524288</memory>
> > <currentMemory unit='KiB'>524288</currentMemory>
>
> Hmm. Historically, <memory> was the maximum memory, then ballooning was
> introduced and <currentMemory> was added to show the live difference
> between the ballooned current value and the boot-up maximum.
>
> But with the idea of hot-plug, I see where you are coming from - the
> balloon can only inflate or deflate up to the amount of memory currently
> plugged in, so <maxMemory> is the startup maximum, <memory> becomes the
yes, maxMemory is basically size of guest's address space
> amount plugged in, and <currentMemory> reflects the balloon value (that
Now <memory> is a thing we need to clarify, there are two options:
1) <memory> will still determine the amount of startup memory thus will
not include any memory added via "memory modules" or hotplug.
Pros: - no change to semantics
- no need to take care of changing the value when adding devices
- the value will not change with hotplug or other operations
Cons: - I'll have to add a way to express the "current maximum
memory" - the memory amount with the ballon deflated
2) <memory> will become total of initial and added memory
This will change semantics and require us to recalculate the totals
every time.
Pros: - you are able to see the total memory at any time
- no need to introduce any new parameter for balloon setup
- recalculating the total would actually fix the bug when you
specify /domain/memory less than the sum of
/domain/cpu/numa/cell/@memory :
error: internal error: process exited while connecting to monitor:
2015-02-06T17:00:55.971851Z qemu-system-x86_64: total memory for
NUMA nodes (0x40000000) should equal RAM size (0x100000)
Cons: - we would need to calculate the total memory always (thus
overwrite it's value by a sum of the NUMA node memory and
memory devices memory
- aplications would need to actually check for the change of
the max memory
> is, current <= memory <= max). So I guess this makes sense; it may be
> more interesting figuring out how to expose it all through virsh.
>
> > ...
> > @@ -697,6 +698,24 @@
> > <span class='since'><code>unit</code> since 0.9.11</span>,
> > <span class='since'><code>dumpCore</code> since 0.10.2
> > (QEMU only)</span></dd>
> > + <dt><code>maxMemory</code></dt>
> > + <dd>The run time maximum memory allocation of the guest. The initial
> > + memory specified by <code><memory></code> can be increased by
> > + hot-plugging of memory to the limit specified by this element.
> > +
> > + The <code>unit</code> attribute behaves the same as for
> > + <code>memory</code>.
> > +
> > + The <code>slots</code> attribute specifies the number of slots
> > + available for adding memory to the guest. The bounds are hypervisor
> > + specific.
> > +
> > + Note that due to alignment of the memory chunks added via memory
> > + hotplug the full size allocation specified by this element may be
> > + impossible to achieve.
>
> Is a hypervisor free to reject requests that aren't aligned properly?
> With <memory>, we had the odd situation that we allowed the hypervisor
> to round requests up, so that live numbers were different than the
> original startup numbers; it might be easier to not repeat that.
>
>
> > + <optional>
> > + <element name="maxMemory">
> > + <ref name="scaledInteger"/>
> > + <attribute name="slots">
> > + <ref name="unsignedInt"/>
> > + </attribute>
>
> This says the slots attribute mandatory; is there ever a reason to allow
> it to be optional (defaulting to one slot, an all-or-none hotplug)?
qemu enforces it that way, so I went for strictly all-or-none with the
possibility to relax it once a different hypervisor will not enforce it
>
>
> > +/**
> > + * virDomainDefCheckUnsupportedMemoryHotplug:
> > + * @def: domain definition
> > + *
> > + * Returns -1 if the domain definition would enable memory hotplug via the
> > + * <maxMemory> tunable and reports an error. Otherwise returns 0.
> > + */
> > +int
> > +virDomainDefCheckUnsupportedMemoryHotplug(virDomainDefPtr def)
> > +{
> > + /* memory hotplug tunables are not supported by this driver */
> > + if (def->mem.max_memory > 0 || def->mem.memory_slots > 0) {
>
> Based on the XML, mem.memory_slots cannot be specified unless max_memory
> is also present (at least, assuming that you enforce that <maxMemory> be
> >= <memory>). But I guess it doesn't hurt to check both values.
Hmm, yeah, the part after the logic or is dead code.
Peter
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20150206/0c16895b/attachment-0001.sig>
More information about the libvir-list
mailing list