mirror of https://gitee.com/openkylin/libvirt.git
conf: Introduce 'alignsize' element into xml for NVDIMM memory
NVDIMM emulation will mmap the backend file, it uses host pagesize as the alignment of mapping address before, but some backends may require alignments different from the pagesize. So the 'alignsize' option is introduced to allow specification of the proper alignment: <devices> ... <memory model='nvdimm' access='shared'> <source> <path>/dev/dax0.0</path> <alignsize unit='MiB'>2</alignsize> </source> <target> <size unit='MiB'>4094</size> <node>0</node> <label> <size unit='MiB'>2</size> </label> </target> </memory> ... </devices> Signed-off-by: Luyao Zhong <luyao.zhong@intel.com> Reviewed-by: John Ferlan <jferlan@redhat.com>
This commit is contained in:
parent
7dc31fe503
commit
80d1ed9773
|
@ -8322,6 +8322,7 @@ qemu-kvm -net nic,model=? /dev/null
|
|||
<memory model='nvdimm'>
|
||||
<source>
|
||||
<path>/tmp/nvdimm</path>
|
||||
<alignsize unit='KiB'>2048</alignsize>
|
||||
</source>
|
||||
<target>
|
||||
<size unit='KiB'>524288</size>
|
||||
|
@ -8403,10 +8404,25 @@ qemu-kvm -net nic,model=? /dev/null
|
|||
</dl>
|
||||
|
||||
<p>
|
||||
For model <code>nvdimm</code> this element is mandatory and has a
|
||||
single child element <code>path</code> that represents a path
|
||||
in the host that backs the nvdimm module in the guest.
|
||||
For model <code>nvdimm</code> this element is mandatory. The
|
||||
mandatory child element <code>path</code> represents a path in
|
||||
the host that backs the nvdimm module in the guest. The following
|
||||
optional elements may be used:
|
||||
</p>
|
||||
|
||||
<dl>
|
||||
<dt><code>alignsize</code></dt>
|
||||
<dd>
|
||||
<p>
|
||||
The <code>alignsize</code> element defines the page size
|
||||
alignment used to mmap the address range for the backend
|
||||
<code>path</code>. If not supplied the host page size is used.
|
||||
For example, to mmap a real NVDIMM device a 2M-aligned page may
|
||||
be required.
|
||||
<span class="since">Since 5.0.0</span>
|
||||
</p>
|
||||
</dd>
|
||||
</dl>
|
||||
</dd>
|
||||
|
||||
<dt><code>target</code></dt>
|
||||
|
|
|
@ -5384,9 +5384,16 @@
|
|||
</interleave>
|
||||
</group>
|
||||
<group>
|
||||
<element name="path">
|
||||
<ref name="absFilePath"/>
|
||||
</element>
|
||||
<interleave>
|
||||
<element name="path">
|
||||
<ref name="absFilePath"/>
|
||||
</element>
|
||||
<optional>
|
||||
<element name="alignsize">
|
||||
<ref name="scaledInteger"/>
|
||||
</element>
|
||||
</optional>
|
||||
</interleave>
|
||||
</group>
|
||||
</choice>
|
||||
</element>
|
||||
|
|
|
@ -15780,6 +15780,11 @@ virDomainMemorySourceDefParseXML(xmlNodePtr node,
|
|||
_("path is required for model 'nvdimm'"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (virDomainParseMemory("./alignsize", "./alignsize/@unit", ctxt,
|
||||
&def->alignsize, false, false) < 0)
|
||||
goto cleanup;
|
||||
|
||||
break;
|
||||
|
||||
case VIR_DOMAIN_MEMORY_MODEL_NONE:
|
||||
|
@ -22735,13 +22740,22 @@ virDomainMemoryDefCheckABIStability(virDomainMemoryDefPtr src,
|
|||
return false;
|
||||
}
|
||||
|
||||
if (src->model == VIR_DOMAIN_MEMORY_MODEL_NVDIMM &&
|
||||
src->labelsize != dst->labelsize) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
_("Target NVDIMM label size '%llu' doesn't match "
|
||||
"source NVDIMM label size '%llu'"),
|
||||
src->labelsize, dst->labelsize);
|
||||
return false;
|
||||
if (src->model == VIR_DOMAIN_MEMORY_MODEL_NVDIMM) {
|
||||
if (src->labelsize != dst->labelsize) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
_("Target NVDIMM label size '%llu' doesn't match "
|
||||
"source NVDIMM label size '%llu'"),
|
||||
src->labelsize, dst->labelsize);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (src->alignsize != dst->alignsize) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
_("Target NVDIMM alignment '%llu' doesn't match "
|
||||
"source NVDIMM alignment '%llu'"),
|
||||
src->alignsize, dst->alignsize);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return virDomainDeviceInfoCheckABIStability(&src->info, &dst->info);
|
||||
|
@ -26278,6 +26292,10 @@ virDomainMemorySourceDefFormat(virBufferPtr buf,
|
|||
|
||||
case VIR_DOMAIN_MEMORY_MODEL_NVDIMM:
|
||||
virBufferEscapeString(buf, "<path>%s</path>\n", def->nvdimmPath);
|
||||
|
||||
if (def->alignsize)
|
||||
virBufferAsprintf(buf, "<alignsize unit='KiB'>%llu</alignsize>\n",
|
||||
def->alignsize);
|
||||
break;
|
||||
|
||||
case VIR_DOMAIN_MEMORY_MODEL_NONE:
|
||||
|
|
|
@ -2147,6 +2147,7 @@ struct _virDomainMemoryDef {
|
|||
virBitmapPtr sourceNodes;
|
||||
unsigned long long pagesize; /* kibibytes */
|
||||
char *nvdimmPath;
|
||||
unsigned long long alignsize; /* kibibytes; valid only for NVDIMM */
|
||||
|
||||
/* target */
|
||||
int model; /* virDomainMemoryModel */
|
||||
|
|
|
@ -0,0 +1,58 @@
|
|||
<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'>
|
||||
<source>
|
||||
<path>/tmp/nvdimm</path>
|
||||
<alignsize unit='KiB'>2048</alignsize>
|
||||
</source>
|
||||
<target>
|
||||
<size unit='KiB'>523264</size>
|
||||
<node>0</node>
|
||||
</target>
|
||||
<address type='dimm' slot='0'/>
|
||||
</memory>
|
||||
</devices>
|
||||
</domain>
|
|
@ -0,0 +1 @@
|
|||
../qemuxml2argvdata/memory-hotplug-nvdimm-align.xml
|
|
@ -1116,6 +1116,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);
|
||||
|
|
Loading…
Reference in New Issue