[libvirt] [PATCH 5/5] qemu: Use memory-backing-file only when needed

John Ferlan jferlan at redhat.com
Thu Oct 1 23:50:09 UTC 2015



On 10/01/2015 08:10 AM, Martin Kletzander wrote:
> We are using memory-backing-file even when it's not needed, for example
> if user requests hugepages for mamory backing, but does not specify any
                                 ^^^^^^
Different body part altogether ;-)

> pagesize, neither memory node pinning.  This causes migrations to fail

           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Doesn't read well - as in I'm not quite sure what you meant... Neither
and nor are usually paired together if that helps any

> when migrating from older libvirt that did not do this.  So similarly to
> commit 7832fac84741d65e851dbdbfaf474785cbfdcf3c which does it for
> memory-backend-ram, this commit makes is more generic and
> backend-agnostic, so the backend is not used if there is no specific
> pagesize of hugepages requested, no nodeset the memory node should be
> bound to, no memory access change required, and so on.
> 
> Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1266856
> 
> Signed-off-by: Martin Kletzander <mkletzan at redhat.com>
> ---
>  src/qemu/qemu_command.c                            | 36 ++++++++++------------
>  .../qemuxml2argv-hugepages-numa.args               |  6 ++--
>  2 files changed, 19 insertions(+), 23 deletions(-)
> 
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index 321a5e931350..7ff3e535a543 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -5120,12 +5120,6 @@ qemuBuildMemoryBackendStr(unsigned long long size,
>      }
> 
>      if (pagesize || hugepage) {
> -        if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_MEMORY_FILE)) {
> -            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> -                           _("this qemu doesn't support hugepage memory backing"));
> -            goto cleanup;
> -        }
> -

Wasn't clear to me why this was removed.  The code that follows within
the if will create a memory-backend-file

I see below the check is made in the else case but there's no hugepage
the list of !x && !y && !z ...

Perhaps I'm being thrown by the use of "pagesize" and "hugepage"
conditions.  The 'hugepage' only gets set if 'pagesize = 0'... If
'hugepage' is set, can pagesize be '0' (outside if pagesize ==
system_page_size)

Sorry - just trying to think through the logic...

I guess removing it is fine, but it's not obvious without digging in a
bit...

>          if (pagesize) {
>              /* Now lets see, if the huge page we want to use is even mounted
>               * and ready to use */
> @@ -5204,29 +5198,31 @@ qemuBuildMemoryBackendStr(unsigned long long size,
>              goto cleanup;
>      }
> 
> -    if (!hugepage && !pagesize) {
> -
> -        if ((userNodeset || nodeSpecified || force) &&
> -            !virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_MEMORY_RAM)) {
> +    /* If none of the following is requested... */
> +    if (!pagesize && !userNodeset && !memAccess && !nodeSpecified && !force) {

hmmm. force isn't documented - in the input args... I know different problem

> +        /* report back that using the new backend is not necessary
> +         * to achieve the desired configuration */
> +        ret = 1;
> +    } else {
> +        /* otherwise check the required capability */
> +        if (STREQ(*backendType, "memory-backend-file") &&
> +            !virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_MEMORY_FILE)) {
>              virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
>                             _("this qemu doesn't support the "
> -                             "memory-backend-ram object"));
> +                             "memory-backend-file object"));
>              goto cleanup;
> +        } else if (STREQ(*backendType, "memory-backend-ram") &&
> +                   !virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_MEMORY_RAM)) {
> +            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> +                           _("this qemu doesn't support the "
> +                             "memory-backend-ram object"));
>          }
> 
> -        /* report back that using the new backend is not necessary to achieve
> -         * the desired configuration */
> -        if (!userNodeset && !nodeSpecified) {
> -            *backendProps = props;
> -            props = NULL;
> -            ret = 1;
> -            goto cleanup;
> -        }
> +        ret = 0;

As confusing as the diff is - it looks cleaner in it's final version.

Hopefully Michal or Peter can also look at the final product - it looks
good to me though

ACK with some adjustments

John
>      }
> 
>      *backendProps = props;
>      props = NULL;
> -    ret = 0;
> 
>   cleanup:
>      virJSONValueFree(props);
> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hugepages-numa.args b/tests/qemuxml2argvdata/qemuxml2argv-hugepages-numa.args
> index 37511b109b6e..3496cf1a732d 100644
> --- a/tests/qemuxml2argvdata/qemuxml2argv-hugepages-numa.args
> +++ b/tests/qemuxml2argvdata/qemuxml2argv-hugepages-numa.args
> @@ -4,9 +4,9 @@ LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=spice \
>  -M pc-i440fx-2.3 \
>  -m size=1048576k,slots=16,maxmem=1099511627776k \
>  -smp 2 \
> --object memory-backend-file,id=ram-node0,prealloc=yes,\
> -mem-path=/dev/hugepages2M/libvirt/qemu,size=1073741824 \
> --numa node,nodeid=0,cpus=0-1,memdev=ram-node0 \
> +-mem-prealloc \
> +-mem-path /dev/hugepages2M/libvirt/qemu \
> +-numa node,nodeid=0,cpus=0-1,mem=1024 \
>  -object memory-backend-file,id=memdimm0,prealloc=yes,\
>  mem-path=/dev/hugepages1G/libvirt/qemu,size=1073741824,host-nodes=1-3,policy=bind \
>  -device pc-dimm,node=0,memdev=memdimm0,id=dimm0 \
> 




More information about the libvir-list mailing list