Ping? On 2018/5/29 20:38, Jie Wang wrote: > QEMU has add the 'align' option to 'memory-backend-file'. Expose > this option to users by new element align. > > Signed-off-by: Jie Wang <wangjie88@xxxxxxxxxx> > --- > docs/formatdomain.html.in | 18 +++++++ > docs/schemas/domaincommon.rng | 7 +++ > src/conf/domain_conf.c | 14 +++++ > src/conf/domain_conf.h | 1 + > src/qemu/qemu_command.c | 4 ++ > .../memory-hotplug-nvdimm-align.args | 31 +++++++++++ > .../memory-hotplug-nvdimm-align.xml | 63 ++++++++++++++++++++++ > tests/qemuxml2argvtest.c | 3 ++ > .../memory-hotplug-nvdimm-align.xml | 1 + > tests/qemuxml2xmltest.c | 1 + > 10 files changed, 143 insertions(+) > create mode 100644 tests/qemuxml2argvdata/memory-hotplug-nvdimm-align.args > create mode 100644 tests/qemuxml2argvdata/memory-hotplug-nvdimm-align.xml > create mode 100644 tests/qemuxml2xmloutdata/memory-hotplug-nvdimm-align.xml > > diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in > index 0d0fd3b..29fe145 100644 > --- a/docs/formatdomain.html.in > +++ b/docs/formatdomain.html.in > @@ -7932,6 +7932,9 @@ qemu-kvm -net nic,model=? /dev/null > </target> > </memory> > <memory model='nvdimm'> > + <align> > + <sieze unit='KiB'>2048</size> > + </align> > <source> > <path>/tmp/nvdimm</path> > </source> > @@ -7983,6 +7986,21 @@ qemu-kvm -net nic,model=? /dev/null > </p> > </dd> > > + <dt><code>align</code></dt> > + <dd> > + <p> > + For NVDIMM type devices one can optionally use > + <code>align</code> and its subelement <code>size</code> > + to configure the size of alignment within the NVDIMM module. > + The <code>size</code> element has usual meaning described > + <a href="#elementsMemoryAllocation">here</a>. > + For QEMU domains the following restrictions apply: > + </p> > + <ol> > + <li>the alignment must be multiples of page size 4KiB,</li> > + </ol> > + </dd> > + > <dt><code>source</code></dt> > <dd> > <p> > diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng > index 71ac3d0..9e994b1 100644 > --- a/docs/schemas/domaincommon.rng > +++ b/docs/schemas/domaincommon.rng > @@ -5145,6 +5145,13 @@ > <ref name="virYesNo"/> > </attribute> > </optional> > + <optional> > + <element name="align"> > + <element name="size"> > + <ref name="scaledInteger"/> > + </element> > + </element> > + </optional> > <interleave> > <optional> > <ref name="memorydev-source"/> > diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c > index 3689ac0..bf91167 100644 > --- a/src/conf/domain_conf.c > +++ b/src/conf/domain_conf.c > @@ -15739,6 +15739,12 @@ virDomainMemoryDefParseXML(virDomainXMLOptionPtr xmlopt, > } > VIR_FREE(tmp); > > + if ((node = virXPathNode("./align", ctxt))) { > + if (virDomainParseMemory("./align/size", "./align/size/@unit", ctxt, > + &def->align, true, false) < 0) > + goto error; > + } > + > /* source */ > if ((node = virXPathNode("./source", ctxt)) && > virDomainMemorySourceDefParseXML(node, ctxt, def) < 0) > @@ -25334,6 +25340,14 @@ virDomainMemoryDefFormat(virBufferPtr buf, > virBufferAddLit(buf, ">\n"); > virBufferAdjustIndent(buf, 2); > > + if (def->align) { > + virBufferAddLit(buf, "<align>\n"); > + virBufferAdjustIndent(buf, 2); > + virBufferAsprintf(buf, "<size unit='KiB'>%llu</size>\n", def->align); > + virBufferAdjustIndent(buf, -2); > + virBufferAddLit(buf, "</align>\n"); > + } > + > if (virDomainMemorySourceDefFormat(buf, def) < 0) > return -1; > > diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h > index a78fdee..1155c84 100644 > --- a/src/conf/domain_conf.h > +++ b/src/conf/domain_conf.h > @@ -2107,6 +2107,7 @@ typedef enum { > struct _virDomainMemoryDef { > virDomainMemoryAccess access; > virTristateBool discard; > + unsigned long long align; > > /* source */ > virBitmapPtr sourceNodes; > diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c > index c423733..5862457 100644 > --- a/src/qemu/qemu_command.c > +++ b/src/qemu/qemu_command.c > @@ -3186,6 +3186,10 @@ qemuBuildMemoryBackendStr(virJSONValuePtr *backendProps, > if (virJSONValueObjectAdd(props, "U:size", mem->size * 1024, NULL) < 0) > goto cleanup; > > + if (mem->align && > + virJSONValueObjectAdd(props, "u:align", mem->align * 1024, NULL) < 0) > + goto cleanup; > + > if (mem->sourceNodes) { > nodemask = mem->sourceNodes; > } else { > diff --git a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-align.args b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-align.args > new file mode 100644 > index 0000000..e6fcf58 > --- /dev/null > +++ b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-align.args > @@ -0,0 +1,31 @@ > +LC_ALL=C \ > +PATH=/bin \ > +HOME=/home/test \ > +USER=test \ > +LOGNAME=test \ > +QEMU_AUDIO_DRV=none \ > +/usr/bin/qemu-system-i686 \ > +-name QEMUGuest1 \ > +-S \ > +-machine pc,accel=tcg,usb=off,dump-guest-core=off,nvdimm=on \ > +-m size=219136k,slots=16,maxmem=1099511627776k \ > +-smp 2,sockets=2,cores=1,threads=1 \ > +-numa node,nodeid=0,cpus=0-1,mem=214 \ > +-object memory-backend-file,id=memnvdimm0,prealloc=yes,mem-path=/tmp/nvdimm,\ > +share=no,size=536870912,align=2097152 \ > +-device nvdimm,node=0,label-size=131072,memdev=memnvdimm0,id=nvdimm0,slot=0 \ > +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ > +-display none \ > +-no-user-config \ > +-nodefaults \ > +-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/monitor.sock,\ > +server,nowait \ > +-mon chardev=charmonitor,id=monitor,mode=control \ > +-rtc base=utc \ > +-no-shutdown \ > +-no-acpi \ > +-boot c \ > +-usb \ > +-drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-ide0-0-0 \ > +-device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 \ > +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 > diff --git a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-align.xml b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-align.xml > new file mode 100644 > index 0000000..aa9e99b > --- /dev/null > +++ b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-align.xml > @@ -0,0 +1,63 @@ > +<domain type='qemu'> > + <name>QEMUGuest1</name> > + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> > + <maxMemory slots='16' unit='KiB'>1099511627776</maxMemory> > + <memory unit='KiB'>1267710</memory> > + <currentMemory unit='KiB'>1267710</currentMemory> > + <vcpu placement='static' cpuset='0-1'>2</vcpu> > + <os> > + <type arch='i686' machine='pc'>hvm</type> > + <boot dev='hd'/> > + </os> > + <idmap> > + <uid start='0' target='1000' count='10'/> > + <gid start='0' target='1000' count='10'/> > + </idmap> > + <cpu> > + <topology sockets='2' cores='1' threads='1'/> > + <numa> > + <cell id='0' cpus='0-1' memory='219136' unit='KiB'/> > + </numa> > + </cpu> > + <clock offset='utc'/> > + <on_poweroff>destroy</on_poweroff> > + <on_reboot>restart</on_reboot> > + <on_crash>destroy</on_crash> > + <devices> > + <emulator>/usr/bin/qemu-system-i686</emulator> > + <disk type='block' device='disk'> > + <driver name='qemu' type='raw'/> > + <source dev='/dev/HostVG/QEMUGuest1'/> > + <target dev='hda' bus='ide'/> > + <address type='drive' controller='0' bus='0' target='0' unit='0'/> > + </disk> > + <controller type='ide' index='0'> > + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/> > + </controller> > + <controller type='usb' index='0'> > + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> > + </controller> > + <controller type='pci' index='0' model='pci-root'/> > + <input type='mouse' bus='ps2'/> > + <input type='keyboard' bus='ps2'/> > + <memballoon model='virtio'> > + <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> > + </memballoon> > + <memory model='nvdimm' access='private'> > + <align> > + <size unit='KiB'>2048</size> > + </align> > + <source> > + <path>/tmp/nvdimm</path> > + </source> > + <target> > + <size unit='KiB'>523264</size> > + <node>0</node> > + <label> > + <size unit='KiB'>128</size> > + </label> > + </target> > + <address type='dimm' slot='0'/> > + </memory> > + </devices> > +</domain> > diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c > index 07e5ba1..4674ded 100644 > --- a/tests/qemuxml2argvtest.c > +++ b/tests/qemuxml2argvtest.c > @@ -2588,6 +2588,9 @@ mymain(void) > DO_TEST("memory-hotplug-nvdimm-label", > QEMU_CAPS_DEVICE_NVDIMM, > QEMU_CAPS_NUMA, QEMU_CAPS_OBJECT_MEMORY_RAM, QEMU_CAPS_OBJECT_MEMORY_FILE); > + DO_TEST("memory-hotplug-nvdimm-align", > + QEMU_CAPS_DEVICE_NVDIMM, > + QEMU_CAPS_NUMA, QEMU_CAPS_OBJECT_MEMORY_RAM, QEMU_CAPS_OBJECT_MEMORY_FILE); > > DO_TEST("machine-aeskeywrap-on-caps", > QEMU_CAPS_AES_KEY_WRAP, > diff --git a/tests/qemuxml2xmloutdata/memory-hotplug-nvdimm-align.xml b/tests/qemuxml2xmloutdata/memory-hotplug-nvdimm-align.xml > new file mode 100644 > index 0000000..9fc6001 > --- /dev/null > +++ b/tests/qemuxml2xmloutdata/memory-hotplug-nvdimm-align.xml > @@ -0,0 +1 @@ > +../qemuxml2argvdata/memory-hotplug-nvdimm-align.xml > \ No newline at end of file > diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c > index 7cedc2b..822e98a 100644 > --- a/tests/qemuxml2xmltest.c > +++ b/tests/qemuxml2xmltest.c > @@ -1098,6 +1098,7 @@ mymain(void) > DO_TEST("memory-hotplug-nvdimm", NONE); > DO_TEST("memory-hotplug-nvdimm-access", NONE); > DO_TEST("memory-hotplug-nvdimm-label", NONE); > + DO_TEST("memory-hotplug-nvdimm-align", NONE); > DO_TEST("net-udp", NONE); > > DO_TEST("video-virtio-gpu-device", NONE); > -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list