[PATCH v5 05/16] qemu: Build command line for virtio-mem

Jing Qi jinqi at redhat.com
Wed Sep 15 06:16:05 UTC 2021


Hi Michal,
I tried to test the virtio-mem with upstream version v7.7.0-136-g9b49c2c6d3
adding the current patch
(with qemu-6.1.0-7.fc36.x86_64) -


<maxMemory slots='16' unit='KiB'>8388608</maxMemory>
  <memory unit='KiB'>1179648</memory>
  <currentMemory unit='KiB'>1179648</currentMemory>
 <memoryBacking>
    <allocation mode='immediate'/>
  </memoryBacking>
 ....
  <cpu mode='custom' match='exact' check='none'>
    <model fallback='forbid'>qemu64</model>
    <numa>
      <cell id='0' cpus='0-1' memory='1048576' unit='KiB' discard='yes'/>
    </numa>
  </cpu>
...
 <memory model='virtio-mem'>
      <source>
        <nodemask>0</nodemask>
        <pagesize unit='KiB'>2048</pagesize>
      </source>
      <target>
        <size unit='KiB'>131072</size>
        <node>0</node>
        <block unit='KiB'>2048</block>
        <requested unit='KiB'>131072</requested>
      </target>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03'
function='0x0'/>
    </memory>

The vm was started successfully and there was no "prealloc: true"  in the
command line.
But I also found when <allocation mode='immediate'/> was added in the
domain and the "virtio-mem" device was not added, the qemu command line
also didn't have "prealloc:true". Is this correct? This result is
different in "libvirt-7.6.0-3.module+el8.5.0+12510+80564ecf.x86_64" &
"qemu-kvm-6.0.0-29.module+el8.5.0+12386+43574bac.x86_64".

Best Regards,
Jing Qi

On Tue, Sep 14, 2021 at 9:07 PM David Hildenbrand <david at redhat.com> wrote:

> On 13.09.21 16:52, Michal Privoznik wrote:
> > Nothing special is happening here. All important changes were
> > done when for 'virtio-pmem' (adjusting the code to put virtio
> > memory on PCI bus, generating alias using
> > qemuDomainDeviceAliasIndex(). The only bit that might look
> > suspicious is no prealloc for virtio-mem. But if you think about
> > it, the whole purpose of this device is to change amount of
> > memory exposed to guest on the fly. There is no point in locking
> > the whole backend in memory.
>
> Do I understand correctly that we'll always try setting "reserve=off",
> and "prealloc=off"? That would be awesome :)
>
> I do wonder if we want to warn or bail out if "priv->memPrealloc" is set
> but we are temporarily not able to support it -- as discussed, because
> virtio-mem in QEMU yet has to be taught about it.
>
> FYI: QEMU will bail out if "reserve=off,prealloc=on" is set in combination.
>
> >
> > Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> > ---
> >   src/qemu/qemu_alias.c                         |  9 +++-
> >   src/qemu/qemu_command.c                       | 24 +++++++++--
> >   ...mory-hotplug-virtio-mem.x86_64-latest.args | 41 +++++++++++++++++++
> >   tests/qemuxml2argvtest.c                      |  1 +
> >   4 files changed, 70 insertions(+), 5 deletions(-)
> >   create mode 100644
> tests/qemuxml2argvdata/memory-hotplug-virtio-mem.x86_64-latest.args
> >
> > diff --git a/src/qemu/qemu_alias.c b/src/qemu/qemu_alias.c
> > index 79e8953b2f..81a1e7eeed 100644
> > --- a/src/qemu/qemu_alias.c
> > +++ b/src/qemu/qemu_alias.c
> > @@ -475,8 +475,11 @@ qemuDeviceMemoryGetAliasID(virDomainDef *def,
> >       size_t i;
> >       int maxidx = 0;
> >
> > -    /* virtio-pmem goes onto PCI bus and thus DIMM address is not valid
> */
> > -    if (!oldAlias && mem->model != VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM)
> > +    /* virtio-pmem and virtio-mem go onto PCI bus and thus DIMM address
> is not
> > +     * valid */
> > +    if (!oldAlias &&
> > +        mem->model != VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM &&
> > +        mem->model != VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM)
> >           return mem->info.addr.dimm.slot;
> >
> >       for (i = 0; i < def->nmems; i++) {
> > @@ -523,6 +526,8 @@ qemuAssignDeviceMemoryAlias(virDomainDef *def,
> >           prefix = "virtiopmem";
> >           break;
> >       case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM:
> > +        prefix = "virtiomem";
> > +        break;
> >       case VIR_DOMAIN_MEMORY_MODEL_NONE:
> >       case VIR_DOMAIN_MEMORY_MODEL_LAST:
> >       default:
> > diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> > index 594e5643b1..91f3094ac8 100644
> > --- a/src/qemu/qemu_command.c
> > +++ b/src/qemu/qemu_command.c
> > @@ -3136,9 +3136,19 @@ qemuBuildMemoryBackendProps(virJSONValue
> **backendProps,
> >           virJSONValueObjectAdd(props,
> "b:x-use-canonical-path-for-ramblock-id", false, NULL) < 0)
> >           return -1;
> >
> > -    if (!priv->memPrealloc &&
> > -        virJSONValueObjectAdd(props, "B:prealloc", prealloc, NULL) < 0)
> > -        return -1;
> > +    if (mem->model == VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM) {
> > +        /* Explicitly disable prealloc for virtio-mem */
> > +        if (priv->memPrealloc &&
> > +            virJSONValueObjectAppendBoolean(props, "prealloc", 0) < 0)
> > +            return -1;
> > +        if (virQEMUCapsGet(priv->qemuCaps,
> QEMU_CAPS_MEMORY_BACKEND_RESERVE) &&
> > +            virJSONValueObjectAppendBoolean(props, "reserve", 0) < 0)
> > +            return -1;
> > +    } else {
> > +        if (!priv->memPrealloc &&
> > +            virJSONValueObjectAdd(props, "B:prealloc", prealloc, NULL)
> < 0)
> > +            return -1;
> > +    }
> >
> >       if (virJSONValueObjectAdd(props, "U:size", mem->size * 1024, NULL)
> < 0)
> >           return -1;
> > @@ -3318,6 +3328,9 @@ qemuBuildMemoryDeviceStr(const virDomainDef *def,
> >           break;
> >
> >       case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM:
> > +        device = "virtio-mem-pci";
> > +        break;
> > +
> >       case VIR_DOMAIN_MEMORY_MODEL_NONE:
> >       case VIR_DOMAIN_MEMORY_MODEL_LAST:
> >       default:
> > @@ -3334,6 +3347,11 @@ qemuBuildMemoryDeviceStr(const virDomainDef *def,
> >       if (mem->labelsize)
> >           virBufferAsprintf(&buf, "label-size=%llu,", mem->labelsize *
> 1024);
> >
> > +    if (mem->blocksize) {
> > +        virBufferAsprintf(&buf, "block-size=%llu,", mem->blocksize *
> 1024);
> > +        virBufferAsprintf(&buf, "requested-size=%llu,",
> mem->requestedsize * 1024);
> > +    }
> > +
> >       if (mem->uuid) {
> >           char uuidstr[VIR_UUID_STRING_BUFLEN];
> >
> > diff --git
> a/tests/qemuxml2argvdata/memory-hotplug-virtio-mem.x86_64-latest.args
> b/tests/qemuxml2argvdata/memory-hotplug-virtio-mem.x86_64-latest.args
> > new file mode 100644
> > index 0000000000..22ee1bc459
> > --- /dev/null
> > +++ b/tests/qemuxml2argvdata/memory-hotplug-virtio-mem.x86_64-latest.args
> > @@ -0,0 +1,41 @@
> > +LC_ALL=C \
> > +PATH=/bin \
> > +HOME=/tmp/lib/domain--1-QEMUGuest1 \
> > +USER=test \
> > +LOGNAME=test \
> > +XDG_DATA_HOME=/tmp/lib/domain--1-QEMUGuest1/.local/share \
> > +XDG_CACHE_HOME=/tmp/lib/domain--1-QEMUGuest1/.cache \
> > +XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
> > +/usr/bin/qemu-system-i386 \
> > +-name guest=QEMUGuest1,debug-threads=on \
> > +-S \
> > +-object
> '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}'
> \
> > +-machine pc,accel=kvm,usb=off,dump-guest-core=off \
> > +-cpu qemu64 \
> > +-m size=2095104k,slots=16,maxmem=1099511627776k \
> > +-overcommit mem-lock=off \
> > +-smp 2,sockets=2,dies=1,cores=1,threads=1 \
> > +-object
> '{"qom-type":"memory-backend-ram","id":"ram-node0","size":2145386496}' \
> > +-numa node,nodeid=0,cpus=0-1,memdev=ram-node0 \
> > +-object
> '{"qom-type":"memory-backend-ram","id":"memvirtiomem0","reserve":false,"size":1073741824}'
> \
> > +-device
> virtio-mem-pci,node=0,block-size=2097152,requested-size=536870912,memdev=memvirtiomem0,id=virtiomem0,bus=pci.0,addr=0x2
> \
> > +-object
> '{"qom-type":"memory-backend-file","id":"memvirtiomem1","mem-path":"/dev/hugepages2M/libvirt/qemu/-1-QEMUGuest1","reserve":false,"size":2147483648,"host-nodes":[1,2,3],"policy":"bind"}'
> \
> > +-device
> virtio-mem-pci,node=0,block-size=2097152,requested-size=1073741824,memdev=memvirtiomem1,id=virtiomem1,bus=pci.0,addr=0x3
> \
> > +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
> > +-display none \
> > +-no-user-config \
> > +-nodefaults \
> > +-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \
> > +-mon chardev=charmonitor,id=monitor,mode=control \
> > +-rtc base=utc \
> > +-no-shutdown \
> > +-no-acpi \
> > +-boot strict=on \
> > +-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \
> > +-blockdev
> '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}'
> \
> > +-blockdev
> '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw","file":"libvirt-1-storage"}'
> \
> > +-device
> ide-hd,bus=ide.0,unit=0,drive=libvirt-1-format,id=ide0-0-0,bootindex=1 \
> > +-audiodev id=audio1,driver=none \
> > +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x4 \
> > +-sandbox
> on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \
> > +-msg timestamp=on
> > diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
> > index 74af93b08f..23f4a8471f 100644
> > --- a/tests/qemuxml2argvtest.c
> > +++ b/tests/qemuxml2argvtest.c
> > @@ -3143,6 +3143,7 @@ mymain(void)
> >                    ARG_END);
> >       DO_TEST_CAPS_VER("memory-hotplug-virtio-pmem", "5.2.0");
> >       DO_TEST_CAPS_LATEST("memory-hotplug-virtio-pmem");
> > +    DO_TEST_CAPS_LATEST("memory-hotplug-virtio-mem");
> >
> >       DO_TEST("machine-aeskeywrap-on-caps",
> >               QEMU_CAPS_AES_KEY_WRAP,
> >
>
>
> --
> Thanks,
>
> David / dhildenb
>
>

-- 
Thanks & Regards,
Jing,Qi
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20210915/932450a5/attachment-0001.htm>


More information about the libvir-list mailing list