[libvirt] [PATCH 1/2] qemuBuildMemoryBackendStr: Fix hugepages lookup process

Peter Krempa pkrempa at redhat.com
Fri Jun 26 06:17:14 UTC 2015


On Thu, Jun 25, 2015 at 18:13:02 +0200, Michal Privoznik wrote:
> https://bugzilla.redhat.com/show_bug.cgi?id=1196644
> 
> So this function is called to construct the guest NUMA part of
> the qemu command line. At the beginning, the configured hugepages

This function constructs the backend (host facing) part of the memory
device.

> are searched to find the best match for given guest NUMA node.
> Configured hugepages can have a @nodeset attribute to specify on
> which guest NUMA nodes should be the hugepages backing used.
> There is, however, one 'corner case'. Users may just tell 'use
> hugepages to back all the nodes'. In other words:
> 
>   <memoryBacking>
>     <hugepages/>
>   </memoryBacking>
> 
>   <cpu>
>     <numa>
>       <cell id='0' cpus='0-1' memory='1024000' unit='KiB'/>
>     </numa>
>   </cpu>
> 
> Our code fails in this case. Well, since there's no @nodeset (nor
> any <page/> child element to <hugepages/>) we fail to lookup the
> default hugepage size to use.
> 
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
>  src/qemu/qemu_command.c                            |  41 ++++----
>  .../qemuxml2argv-hugepages-numa.args               |  46 +++++++++
>  .../qemuxml2argv-hugepages-numa.xml                | 107 +++++++++++++++++++++
>  tests/qemuxml2argvtest.c                           |   8 ++
>  4 files changed, 183 insertions(+), 19 deletions(-)
>  create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-hugepages-numa.args
>  create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-hugepages-numa.xml
> 
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index 99755f1..cb31fac 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -4760,9 +4760,6 @@ qemuBuildMemoryBackendStr(unsigned long long size,
>              hugepage = master_hugepage;
>          }
>  
> -        if (hugepage)
> -            pagesize = hugepage->size;
> -

This hunk is a bit awkward here since you add it back in the next patch.
A rebase mistake perhaps?

>          if (hugepage && hugepage->size == system_page_size) {
>              /* However, if user specified to use "huge" page
>               * of regular system page size, it's as if they
> @@ -4778,23 +4775,29 @@ qemuBuildMemoryBackendStr(unsigned long long size,
>              goto cleanup;
>          }
>  
> -        /* Now lets see, if the huge page we want to use is even mounted
> -         * and ready to use */
> -        for (i = 0; i < cfg->nhugetlbfs; i++) {
> -            if (cfg->hugetlbfs[i].size == hugepage->size)
> -                break;
> -        }
> -
> -        if (i == cfg->nhugetlbfs) {
> -            virReportError(VIR_ERR_INTERNAL_ERROR,
> -                           _("Unable to find any usable hugetlbfs mount for %llu KiB"),
> -                           pagesize);
> -            goto cleanup;
> -        }
> -
>          VIR_FREE(mem_path);

mem_path is NULL prior to this free statement, and it is not in a
loop so the VIR_FREE can be removed here.

> -        if (!(mem_path = qemuGetHugepagePath(&cfg->hugetlbfs[i])))
> -            goto cleanup;
> +        if (hugepage->size) {
> +            /* Now lets see, if the huge page we want to use is even mounted
> +             * and ready to use */
> +            for (i = 0; i < cfg->nhugetlbfs; i++) {
> +                if (cfg->hugetlbfs[i].size == hugepage->size)
> +                    break;
> +            }
> +
> +            if (i == cfg->nhugetlbfs) {
> +                virReportError(VIR_ERR_INTERNAL_ERROR,
> +                               _("Unable to find any usable hugetlbfs mount for %llu KiB"),
> +                               hugepage->size);
> +                goto cleanup;
> +            }
> +
> +            if (!(mem_path = qemuGetHugepagePath(&cfg->hugetlbfs[i])))
> +                goto cleanup;
> +        } else {
> +            if (!(mem_path = qemuGetDefaultHugepath(cfg->hugetlbfs,
> +                                                    cfg->nhugetlbfs)))
> +                goto cleanup;
> +        }
>  
>          *backendType = "memory-backend-file";
>  

ACK,

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/20150626/3bc90dee/attachment-0001.sig>


More information about the libvir-list mailing list