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 <mhohm...@physnet.uni-hamburg.de> > Signed-off-by: Igor Mammedov <imamm...@redhat.com> > --- > CC: berra...@redhat.com > CC: ehabk...@redhat.com > CC: pbonz...@redhat.com > CC: mhohm...@physnet.uni-hamburg.de > CC: qemu-sta...@nongnu.org > --- > 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é <berra...@redhat.com> 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 :|