[libvirt] [PATCHv4 2/3] conf: Add new xml elements for file memorybacking support

Michal Privoznik mprivozn at redhat.com
Sat Jan 28 14:03:10 UTC 2017


On 13.12.2016 13:12, Jaroslav Safka wrote:
> This first change introduces new xml elements for file based
> memorybacking support and their parsing.
> It allows vhost-user to be used without hugepages.
> 
> New xml elements:
> <memoryBacking>
>   <source type="file|anonymous"/>
>   <access mode="shared|private"/>
>   <allocation mode="immediate|ondemand"/>
> </memoryBacking>
> ---
>  docs/formatdomain.html.in                          |   9 ++
>  docs/schemas/domaincommon.rng                      |  30 +++++
>  src/conf/domain_conf.c                             | 133 ++++++++++++++++-----
>  src/conf/domain_conf.h                             |  22 ++++
>  .../qemuxml2argv-memorybacking-set.xml             |  24 ++++
>  .../qemuxml2argv-memorybacking-unset.xml           |  24 ++++
>  .../qemuxml2xmlout-memorybacking-set.xml           |  32 +++++
>  .../qemuxml2xmlout-memorybacking-unset.xml         |  32 +++++
>  tests/qemuxml2xmltest.c                            |   3 +
>  9 files changed, 276 insertions(+), 33 deletions(-)
>  create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-memorybacking-set.xml
>  create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-memorybacking-unset.xml
>  create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-memorybacking-set.xml
>  create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-memorybacking-unset.xml
> 
> diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
> index 9218eec..fc194bf 100644
> --- a/docs/formatdomain.html.in
> +++ b/docs/formatdomain.html.in
> @@ -903,6 +903,9 @@
>      </hugepages>
>      <nosharepages/>
>      <locked/>
> +    <source type="file|anonymous"/>
> +    <access mode="shared|private"/>
> +    <allocation mode="immediate|ondemand"/>
>    </memoryBacking>
>    ...
>  </domain>
> @@ -942,6 +945,12 @@
>          most of the host's memory). Doing so may be dangerous to both the
>          domain and the host itself since the host's kernel may run out of
>          memory. <span class="since">Since 1.0.6</span></dd>
> +       <dt><code>source</code></dt>
> +       <dd>In this attribute you can switch to file memorybacking or keep default anonymous.</dd>
> +       <dt><code>access</code></dt>
> +       <dd>Specify if memory is shared or private. This can be overridden per numa node by <code>memAccess</code></dd>
> +       <dt><code>allocation</code></dt>
> +       <dd>Specify when allocate the memory</dd>
>      </dl>
>  
>  
> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
> index c004233..363ee2f 100644
> --- a/docs/schemas/domaincommon.rng
> +++ b/docs/schemas/domaincommon.rng
> @@ -560,6 +560,36 @@
>                  <empty/>
>                </element>
>              </optional>
> +            <optional>
> +              <element name="source">
> +                <attribute name="type">
> +                  <choice>
> +                    <value>file</value>
> +                    <value>anonymous</value>
> +                  </choice>
> +                </attribute>
> +              </element>
> +            </optional>
> +            <optional>
> +              <element name="access">
> +                <attribute name="mode">
> +                  <choice>
> +                    <value>shared</value>
> +                    <value>private</value>
> +                  </choice>
> +                </attribute>
> +              </element>
> +            </optional>
> +            <optional>
> +              <element name="allocation">
> +                <attribute name="mode">
> +                  <choice>
> +                    <value>immediate</value>
> +                    <value>ondemand</value>
> +                  </choice>
> +                </attribute>
> +              </element>
> +            </optional>
>            </interleave>
>          </element>
>        </optional>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index b0bd38d..c54fc97 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -837,6 +837,16 @@ VIR_ENUM_IMPL(virDomainDiskMirrorState, VIR_DOMAIN_DISK_MIRROR_STATE_LAST,
>                "abort",
>                "pivot")
>  
> +VIR_ENUM_IMPL(virDomainMemorySource, VIR_DOMAIN_MEMORY_SOURCE_LAST,
> +              "none",
> +              "file",
> +              "anonymous")
> +
> +VIR_ENUM_IMPL(virDomainMemoryAllocation, VIR_DOMAIN_MEMORY_ALLOCATION_LAST,
> +              "none",
> +              "immediate",
> +              "ondemand")
> +
>  VIR_ENUM_IMPL(virDomainLoader,
>                VIR_DOMAIN_LOADER_TYPE_LAST,
>                "rom",
> @@ -16528,48 +16538,93 @@ virDomainDefParseXML(xmlDocPtr xml,
>      }
>      VIR_FREE(tmp);
>  
> -    if ((n = virXPathNodeSet("./memoryBacking/hugepages/page", ctxt, &nodes)) < 0) {
> -        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> -                       _("cannot extract hugepages nodes"));
> -        goto error;
> +    tmp = virXPathString("string(./memoryBacking/source/@type)", ctxt);
> +    if (tmp) {
> +        if ((def->mem.source = virDomainMemorySourceTypeFromString(tmp)) < 0) {

This will not fly. def->mem.source is typeof enum virDomainMemorySource
which can have values 0, 1 or 2. Now, should
virDomainMemorySourceTypeFromString() return an error (-1) (because of
unknown @type value), this gets squeezed into the enum range, which
always falls into 0-2 range. IOW, this condition will never be true.
That's why we have all those:

  int blah; /* enum virMyAwesomeEnum */

lines in the definition. Had the @source been an int, this starts
working. Except, we might want to disallow "none" and thus the condition
should be "<= 0". This also apply for the other two variables.

> +            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> +                           _("unknown memoryBacking/source/type '%s'"), tmp);
> +            goto error;
> +        }
> +        VIR_FREE(tmp);
>      }

ACK with that change.

Michal




More information about the libvir-list mailing list