qemu-stable
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] hostmem: don't use mbind() if host-nodes is epmty


From: Daniel P . Berrangé
Subject: Re: [PATCH] hostmem: don't use mbind() if host-nodes is epmty
Date: Fri, 1 May 2020 09:57:08 +0100
User-agent: Mutt/1.13.3 (2020-01-12)

On Thu, Apr 30, 2020 at 11:46:06AM -0400, Igor Mammedov wrote:
> Since 5.0 QEMU uses hostmem backend for allocating main guest RAM.
> The backend however calls mbind() which is typically NOP
> in case of default policy/absent host-nodes bitmap.
> However when runing in container with black-listed mbind()
> syscall, QEMU fails to start with error
>  "cannot bind memory to host NUMA nodes: Operation not permitted"
> even when user hasn't provided host-nodes to pin to explictly
> (which is the case with -m option)
> 
> To fix issue, call mbind() only in case when user has provided
> host-nodes explicitly (i.e. host_nodes bitmap is not empty).
> That should allow to run QEMU in containers with black-listed
> mbind() without memory pinning. If QEMU provided memory-pinning
> is required user still has to white-list mbind() in container
> configuration.
> 
> Reported-by: Manuel Hohmann <address@hidden>
> Signed-off-by: Igor Mammedov <address@hidden>
> ---
> CC: address@hidden
> CC: address@hidden
> CC: address@hidden
> CC: address@hidden
> CC: address@hidden
> ---
>  backends/hostmem.c | 6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/backends/hostmem.c b/backends/hostmem.c
> index 327f9eebc3..0efd7b7bd6 100644
> --- a/backends/hostmem.c
> +++ b/backends/hostmem.c
> @@ -383,8 +383,10 @@ host_memory_backend_memory_complete(UserCreatable *uc, 
> Error **errp)
>          assert(sizeof(backend->host_nodes) >=
>                 BITS_TO_LONGS(MAX_NODES + 1) * sizeof(unsigned long));
>          assert(maxnode <= MAX_NODES);
> -        if (mbind(ptr, sz, backend->policy,
> -                  maxnode ? backend->host_nodes : NULL, maxnode + 1, flags)) 
> {
> +
> +        if (maxnode &&
> +            mbind(ptr, sz, backend->policy, backend->host_nodes, maxnode + 1,
> +                  flags)) {
>              if (backend->policy != MPOL_DEFAULT || errno != ENOSYS) {
>                  error_setg_errno(errp, errno,
>                                   "cannot bind memory to host NUMA nodes");

personally I would have found this code clearer if the
check had been  "if (backend->policy != MPOL_DEFAULT && ..."
as I had to read quite a few lines to understand that the
'maxnode' is zero if-and-only-if  policy == MPOL_DEFAULT

Regardless though, this is functionally correct so

   Reviewed-by: Daniel P. Berrangé <address@hidden>

Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|




reply via email to

[Prev in Thread] Current Thread [Next in Thread]