...if a machine memory-backend using shared memory is configured for
the guest. This is especially important for QEMU machine types that
don't have NUMA but virtiofs support.
An example snippet:
<domain type='kvm'>
<name>test</name>
<memory unit='KiB'>2097152</memory>
<memoryBacking>
<access mode='shared'/>
</memoryBacking>
<devices>
<filesystem type='mount' accessmode='passthrough'>
<driver type='virtiofs'/>
<source dir='/tmp/test'/>
<target dir='coffee'/>
</filesystem>
...
</devices>
...
</domain>
and the corresponding QEMU command line:
/usr/bin/qemu-system-s390x \
-machine s390-ccw-virtio-5.2,memory-backend=s390.ram \
-m 2048 \
-object
memory-backend-file,id=s390.ram,mem-path=/var/lib/libvirt/qemu/ram/46-test/s390.ram,share=yes,size=2147483648 \
...
Signed-off-by: Marc Hartmayer <mhartmay@linux.ibm.com>
---
Note: There are still some TODOs left... e.g. adapt the virtiofs
documentation of libvirt.
---
src/qemu/qemu_validate.c | 15 +++++++++++----
1 file changed, 11 insertions(+), 4 deletions(-)
diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c
index a212605579d2..077a85b30802 100644
--- a/src/qemu/qemu_validate.c
+++ b/src/qemu/qemu_validate.c
@@ -3470,14 +3470,21 @@ qemuValidateDomainDeviceDefGraphics(const virDomainGraphicsDef *graphics,
static int
-qemuValidateDomainDefVirtioFSSharedMemory(const virDomainDef *def)
+qemuValidateDomainDefVirtioFSSharedMemory(const virDomainDef *def,
+ virQEMUCapsPtr qemuCaps)
{
+ const char *defaultRAMId = virQEMUCapsGetMachineDefaultRAMid(qemuCaps,
+ def->virtType,
+ def->os.machine);
size_t numa_nodes = virDomainNumaGetNodeCount(def->numa);
size_t i;
- if (numa_nodes == 0) {
+ if (numa_nodes == 0 &&
+ !(defaultRAMId && def->mem.access == VIR_DOMAIN_MEMORY_ACCESS_SHARED)) {
+ /* TODO do we need further checks here (e.g. check whether
+ * memory backend is supported by the QEMU binary)? */
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
- _("virtiofs requires one or more NUMA nodes"));
+ _("virtiofs requires shared memory"));
return -1;
}
@@ -3591,7 +3598,7 @@ qemuValidateDomainDeviceDefFS(virDomainFSDefPtr fs,
_("virtiofs does not support multidevs"));
return -1;
}
- if (qemuValidateDomainDefVirtioFSSharedMemory(def) < 0)
+ if (qemuValidateDomainDefVirtioFSSharedMemory(def, qemuCaps) < 0)
return -1;
break;
--
2.25.4
On Tue, Oct 06, 2020 at 06:20 PM +0200, Marc Hartmayer <mhartmay@linux.ibm.com> wrote: > ...if a machine memory-backend using shared memory is configured for > the guest. This is especially important for QEMU machine types that > don't have NUMA but virtiofs support. > > An example snippet: > > <domain type='kvm'> > <name>test</name> > <memory unit='KiB'>2097152</memory> > <memoryBacking> > <access mode='shared'/> > </memoryBacking> > <devices> > <filesystem type='mount' accessmode='passthrough'> > <driver type='virtiofs'/> > <source dir='/tmp/test'/> > <target dir='coffee'/> > </filesystem> > ... > </devices> > ... > </domain> > > and the corresponding QEMU command line: > > /usr/bin/qemu-system-s390x \ > -machine s390-ccw-virtio-5.2,memory-backend=s390.ram \ > -m 2048 \ > -object > memory-backend-file,id=s390.ram,mem-path=/var/lib/libvirt/qemu/ram/46-test/s390.ram,share=yes,size=2147483648 \ > ... > > Signed-off-by: Marc Hartmayer <mhartmay@linux.ibm.com> > --- > Note: There are still some TODOs left... e.g. adapt the virtiofs > documentation of libvirt. > --- > src/qemu/qemu_validate.c | 15 +++++++++++---- > 1 file changed, 11 insertions(+), 4 deletions(-) > > diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c > index a212605579d2..077a85b30802 100644 > --- a/src/qemu/qemu_validate.c > +++ b/src/qemu/qemu_validate.c > @@ -3470,14 +3470,21 @@ qemuValidateDomainDeviceDefGraphics(const virDomainGraphicsDef *graphics, > > > static int > -qemuValidateDomainDefVirtioFSSharedMemory(const virDomainDef *def) > +qemuValidateDomainDefVirtioFSSharedMemory(const virDomainDef *def, > + virQEMUCapsPtr qemuCaps) > { > + const char *defaultRAMId = virQEMUCapsGetMachineDefaultRAMid(qemuCaps, > + def->virtType, > + def->os.machine); > size_t numa_nodes = virDomainNumaGetNodeCount(def->numa); > size_t i; > > - if (numa_nodes == 0) { > + if (numa_nodes == 0 && > + !(defaultRAMId && def->mem.access == VIR_DOMAIN_MEMORY_ACCESS_SHARED)) { > + /* TODO do we need further checks here (e.g. check whether > + * memory backend is supported by the QEMU binary)? */ > virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", > - _("virtiofs requires one or more NUMA nodes")); > + _("virtiofs requires shared memory")); > return -1; > } > > @@ -3591,7 +3598,7 @@ qemuValidateDomainDeviceDefFS(virDomainFSDefPtr fs, > _("virtiofs does not support multidevs")); > return -1; > } > - if (qemuValidateDomainDefVirtioFSSharedMemory(def) < 0) > + if (qemuValidateDomainDefVirtioFSSharedMemory(def, qemuCaps) < 0) > return -1; > break; > > -- > 2.25.4 > Gentle ping :) -- Kind regards / Beste Grüße Marc Hartmayer IBM Deutschland Research & Development GmbH Vorsitzender des Aufsichtsrats: Gregor Pillen Geschäftsführung: Dirk Wittkopp Sitz der Gesellschaft: Böblingen Registergericht: Amtsgericht Stuttgart, HRB 243294
On 10/6/20 6:20 PM, Marc Hartmayer wrote: > ...if a machine memory-backend using shared memory is configured for > the guest. This is especially important for QEMU machine types that > don't have NUMA but virtiofs support. > > An example snippet: > > <domain type='kvm'> > <name>test</name> > <memory unit='KiB'>2097152</memory> > <memoryBacking> > <access mode='shared'/> > </memoryBacking> > <devices> > <filesystem type='mount' accessmode='passthrough'> > <driver type='virtiofs'/> > <source dir='/tmp/test'/> > <target dir='coffee'/> > </filesystem> > ... > </devices> > ... > </domain> > > and the corresponding QEMU command line: > > /usr/bin/qemu-system-s390x \ > -machine s390-ccw-virtio-5.2,memory-backend=s390.ram \ > -m 2048 \ > -object > memory-backend-file,id=s390.ram,mem-path=/var/lib/libvirt/qemu/ram/46-test/s390.ram,share=yes,size=2147483648 \ > ... > > Signed-off-by: Marc Hartmayer <mhartmay@linux.ibm.com> > --- > Note: There are still some TODOs left... e.g. adapt the virtiofs > documentation of libvirt. Yep, but looks good. > --- > src/qemu/qemu_validate.c | 15 +++++++++++---- > 1 file changed, 11 insertions(+), 4 deletions(-) > > diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c > index a212605579d2..077a85b30802 100644 > --- a/src/qemu/qemu_validate.c > +++ b/src/qemu/qemu_validate.c > @@ -3470,14 +3470,21 @@ qemuValidateDomainDeviceDefGraphics(const virDomainGraphicsDef *graphics, > > > static int > -qemuValidateDomainDefVirtioFSSharedMemory(const virDomainDef *def) > +qemuValidateDomainDefVirtioFSSharedMemory(const virDomainDef *def, > + virQEMUCapsPtr qemuCaps) > { > + const char *defaultRAMId = virQEMUCapsGetMachineDefaultRAMid(qemuCaps, > + def->virtType, > + def->os.machine); > size_t numa_nodes = virDomainNumaGetNodeCount(def->numa); > size_t i; > > - if (numa_nodes == 0) { > + if (numa_nodes == 0 && > + !(defaultRAMId && def->mem.access == VIR_DOMAIN_MEMORY_ACCESS_SHARED)) { > + /* TODO do we need further checks here (e.g. check whether > + * memory backend is supported by the QEMU binary)? */ I don't think we need that. memory backends can't be compiled out (well, unless a distro has a patch on the top of qemu which would do exactly that), can defaultRAMId exposed is strictly newer than memory backends. I think this comment can be removed and the rest can be kept as is (plus the docs). Michal
© 2016 - 2024 Red Hat, Inc.