On Thu, Jun 23, 2016 at 01:25:29PM +0100, Jaroslav Safka wrote: > Add conversion from xml to argv for subelements > source,access and allocation of <memoryBacking> > > This change introduces support for preallocated > shared file descriptor based memory backing. > It allows vhost-user to be used without hugepages. > > Configured by these elements: > <memoryBacking> > <source type="file|anonymous"/> > <access Mode="shared|private"/> > <allocation mode="immediate|ondemand"/> > </memoryBacking> > --- > src/qemu/qemu_command.c | 56 ++++++++++++++++++++++ > src/qemu/qemu_command.h | 4 ++ > .../qemuxml2argv-memorybacking-set.args | 6 ++- > tests/qemuxml2argvtest.c | 3 ++ > 4 files changed, 68 insertions(+), 1 deletion(-) > > diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c > index 6944129..321e71f 100644 > --- a/src/qemu/qemu_command.c > +++ b/src/qemu/qemu_command.c > @@ -9328,6 +9328,9 @@ qemuBuildCommandLine(virQEMUDriverPtr driver, > if (qemuBuildNVRAMCommandLine(cmd, def, qemuCaps) < 0) > goto error; > > + if (qemuBuildMemoryBackendCommandLine(cmd, def, qemuCaps) < 0) > + goto error; > + > if (snapshot) > virCommandAddArgList(cmd, "-loadvm", snapshot->def->name, NULL); > > @@ -9592,3 +9595,56 @@ qemuBuildChrDeviceStr(char **deviceStr, > > return ret; > } > + > +static char * > +qemuBuildMemoryBackendFileStr(const virDomainDef *def) > +{ > + virBuffer buf = VIR_BUFFER_INITIALIZER; > + const char template[] = "memory-backend-file,id=mem,size=1024M,mem-path=/var/lib/libvirt/qemu"; As Michael has pointed out - this is just insanity - you can't hardcode memory size like this. > + > + if (VIR_DOMAIN_MEMORY_ACCESS_SHARED == def->mem.access) { > + // add ",share=on" to -object memory-backend-file > + virBufferAsprintf(&buf, "%s,share=on", template); > + } else { > + virBufferAsprintf(&buf, "%s", template); > + } > + > + > + if (virBufferCheckError(&buf) < 0) > + goto error; > + > + return virBufferContentAndReset(&buf); > + > + error: > + virBufferFreeAndReset(&buf); > + return NULL; > +} > + > + > +int > +qemuBuildMemoryBackendCommandLine(virCommandPtr cmd, > + const virDomainDef *def, > + virQEMUCapsPtr qemuCaps __attribute__((unused))) > +{ > + char *optstr = NULL; > + > + if (VIR_DOMAIN_MEMORY_ALLOCATION_IMMEDIATE == def->mem.allocation) { > + // add '-mem-prealloc' > + virCommandAddArg(cmd, "-mem-prealloc"); > + } > + You need todo > + if (VIR_DOMAIN_MEMORY_SOURCE_FILE == def->mem.source) { > + optstr = qemuBuildMemoryBackendFileStr(def); > + if (optstr) { > + virCommandAddArg(cmd, "-object"); > + virCommandAddArg(cmd, optstr); > + VIR_FREE(optstr); > + } You're ignoring the error here - you must propagate the NULL error. > + > + // add '-object memory-backend-file,id=mem,size=1024M,mem-path=/var/lib/libvirt/qemu' > + // add '-numa node,memdev=mem' > + virCommandAddArgList(cmd, "-numa", "node,memdev=mem", NULL); > + } We already have code that runs when the guest has NUMA topology configured. This existing code must be adapted to honour the top level VIR_DOMAIN_MEMORY_ACCESS_* setting, vs the per-cell setting. This new code you're adding should only be used when a non-NUMA guest config is requested, and it should be using the -mem-path command line argument to set the file - not = creating a NUMA topology in a non-NUMA requested guest. Regards, Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list