1
0
mirror of https://gitlab.com/libvirt/libvirt.git synced 2025-03-07 17:28:15 +00:00

conf: Introduce 'readonly' element into xml for NVDIMM memory

The 'readonly' option allows users to mark vNVDIMM read-only:

<devices>
  ...
  <memory model='nvdimm' access='shared'>
      <source>
          <path>/dev/dax0.0</path>
      </source>
      <target>
          <size unit='MiB'>4094</size>
          <node>0</node>
          <label>
              <size unit='MiB'>2</size>
          </label>
          <readonly/>
      </target>
  </memory>
  ...
</devices>

Signed-off-by: Luyao Zhong <luyao.zhong@intel.com>
Reviewed-by: John Ferlan <jferlan@redhat.com>
This commit is contained in:
Luyao Zhong 2018-12-20 17:14:42 +08:00 committed by John Ferlan
parent 73fc8c491e
commit db521e7d03
7 changed files with 111 additions and 12 deletions

@ -8330,6 +8330,7 @@ qemu-kvm -net nic,model=? /dev/null
&lt;label&gt; &lt;label&gt;
&lt;size unit='KiB'&gt;128&lt;/size&gt; &lt;size unit='KiB'&gt;128&lt;/size&gt;
&lt;/label&gt; &lt;/label&gt;
&lt;readonly/&gt;
&lt;/target&gt; &lt;/target&gt;
&lt;/memory&gt; &lt;/memory&gt;
&lt;memory model='nvdimm'&gt; &lt;memory model='nvdimm'&gt;
@ -8464,6 +8465,13 @@ qemu-kvm -net nic,model=? /dev/null
attach the memory to. The element shall be used only if the guest has attach the memory to. The element shall be used only if the guest has
NUMA nodes configured. NUMA nodes configured.
</p> </p>
<p>
The following optional elements may be used:
</p>
<dl>
<dt><code>label</code></dt>
<dd>
<p> <p>
For NVDIMM type devices one can optionally use For NVDIMM type devices one can optionally use
<code>label</code> and its subelement <code>size</code> <code>label</code> and its subelement <code>size</code>
@ -8475,10 +8483,23 @@ qemu-kvm -net nic,model=? /dev/null
</p> </p>
<ol> <ol>
<li>the minimum label size is 128KiB,</li> <li>the minimum label size is 128KiB,</li>
<li>the remaining size (total-size - label-size) has to be aligned to <li>the remaining size (total-size - label-size) will be aligned
4KiB</li> to 4KiB as default.</li>
</ol> </ol>
</dd> </dd>
<dt><code>readonly</code></dt>
<dd>
<p>
The <code>readonly</code> element is used to mark the vNVDIMM
as read-only. Only the real NVDIMM device backend can guarantee
the guest write persistence, so other backend types should use
the <code>readonly</code> element.
<span class="since">Since 5.0.0</span>
</p>
</dd>
</dl>
</dd>
</dl> </dl>
<h4><a id="elementsIommu">IOMMU devices</a></h4> <h4><a id="elementsIommu">IOMMU devices</a></h4>

@ -5422,6 +5422,11 @@
</element> </element>
</element> </element>
</optional> </optional>
<optional>
<element name="readonly">
<empty/>
</element>
</optional>
</interleave> </interleave>
</element> </element>
</define> </define>

@ -15844,6 +15844,9 @@ virDomainMemoryTargetDefParseXML(xmlNodePtr node,
_("label size must be smaller than NVDIMM size")); _("label size must be smaller than NVDIMM size"));
goto cleanup; goto cleanup;
} }
if (virXPathBoolean("boolean(./readonly)", ctxt))
def->readonly = true;
} }
ret = 0; ret = 0;
@ -22766,6 +22769,13 @@ virDomainMemoryDefCheckABIStability(virDomainMemoryDefPtr src,
"source NVDIMM pmem flag")); "source NVDIMM pmem flag"));
return false; return false;
} }
if (src->readonly != dst->readonly) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("Target NVDIMM readonly flag doesn't match "
"source NVDIMM readonly flag"));
return false;
}
} }
return virDomainDeviceInfoCheckABIStability(&src->info, &dst->info); return virDomainDeviceInfoCheckABIStability(&src->info, &dst->info);
@ -26344,6 +26354,8 @@ virDomainMemoryTargetDefFormat(virBufferPtr buf,
virBufferAdjustIndent(buf, -2); virBufferAdjustIndent(buf, -2);
virBufferAddLit(buf, "</label>\n"); virBufferAddLit(buf, "</label>\n");
} }
if (def->readonly)
virBufferAddLit(buf, "<readonly/>\n");
virBufferAdjustIndent(buf, -2); virBufferAdjustIndent(buf, -2);
virBufferAddLit(buf, "</target>\n"); virBufferAddLit(buf, "</target>\n");

@ -2155,6 +2155,7 @@ struct _virDomainMemoryDef {
int targetNode; int targetNode;
unsigned long long size; /* kibibytes */ unsigned long long size; /* kibibytes */
unsigned long long labelsize; /* kibibytes; valid only for NVDIMM */ unsigned long long labelsize; /* kibibytes; valid only for NVDIMM */
bool readonly; /* valid only for NVDIMM */
virDomainDeviceInfo info; virDomainDeviceInfo info;
}; };

@ -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>
</source>
<target>
<size unit='KiB'>523264</size>
<node>0</node>
<readonly/>
</target>
<address type='dimm' slot='0'/>
</memory>
</devices>
</domain>

@ -0,0 +1 @@
../qemuxml2argvdata/memory-hotplug-nvdimm-readonly.xml

@ -1118,6 +1118,7 @@ mymain(void)
DO_TEST("memory-hotplug-nvdimm-label", NONE); DO_TEST("memory-hotplug-nvdimm-label", NONE);
DO_TEST("memory-hotplug-nvdimm-align", NONE); DO_TEST("memory-hotplug-nvdimm-align", NONE);
DO_TEST("memory-hotplug-nvdimm-pmem", NONE); DO_TEST("memory-hotplug-nvdimm-pmem", NONE);
DO_TEST("memory-hotplug-nvdimm-readonly", NONE);
DO_TEST("net-udp", NONE); DO_TEST("net-udp", NONE);
DO_TEST("video-virtio-gpu-device", NONE); DO_TEST("video-virtio-gpu-device", NONE);