[libvirt] [PATCH v5 01/11] nvdimm: introduce 'alignsize' element into xml for NVDIMM memory

Luyao Zhong posted 11 patches 7 years, 1 month ago
[libvirt] [PATCH v5 01/11] nvdimm: introduce 'alignsize' element into xml for NVDIMM memory
Posted by Luyao Zhong 7 years, 1 month ago
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 will be introduced to allow users specifying 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>
---
 docs/formatdomain.html.in                          | 23 +++++++--
 docs/schemas/domaincommon.rng                      | 13 +++--
 src/conf/domain_conf.c                             | 32 +++++++++---
 src/conf/domain_conf.h                             |  1 +
 .../memory-hotplug-nvdimm-align.xml                | 58 ++++++++++++++++++++++
 .../memory-hotplug-nvdimm-align.xml                |  1 +
 tests/qemuxml2xmltest.c                            |  1 +
 7 files changed, 116 insertions(+), 13 deletions(-)
 create mode 100644 tests/qemuxml2argvdata/memory-hotplug-nvdimm-align.xml
 create mode 120000 tests/qemuxml2xmloutdata/memory-hotplug-nvdimm-align.xml

diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index a18d063..515e656 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -8322,6 +8322,7 @@ qemu-kvm -net nic,model=? /dev/null
   &lt;memory model='nvdimm'&gt;
     &lt;source&gt;
       &lt;path&gt;/tmp/nvdimm&lt;/path&gt;
+      &lt;alignsize unit='KiB'&gt;2048&lt;/alignsize&gt;
     &lt;/source&gt;
     &lt;target&gt;
       &lt;size unit='KiB'&gt;524288&lt;/size&gt;
@@ -8403,10 +8404,26 @@ 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. If
+          <code>nvdimm</code> is provided, then the following optional
+          elements can be provided as well:
         </p>
+
+        <dl>
+          <dt><code>alignsize</code></dt>
+          <dd>
+            <p>
+              This element can be used to specify a proper alignment.
+              When mmap(2) the backend files, QEMU uses the host page
+              size by default as the alignment of mapping address. However,
+              some backends may require alignments different from the page.
+              For example, mmap a real NVDIMM device maybe 2M-aligned required.
+              <span class="since">Since 5.0.0</span>
+            </p>
+          </dd>
+        </dl>
       </dd>
 
       <dt><code>target</code></dt>
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 76b49aa..21006c3 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -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>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index d8dfd16..7e59d8c 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -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:
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 5814997..848bd94 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -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 */
diff --git a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-align.xml b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-align.xml
new file mode 100644
index 0000000..a8c5198
--- /dev/null
+++ b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-align.xml
@@ -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>
diff --git a/tests/qemuxml2xmloutdata/memory-hotplug-nvdimm-align.xml b/tests/qemuxml2xmloutdata/memory-hotplug-nvdimm-align.xml
new file mode 120000
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 1062dee..5161f4a 100644
--- a/tests/qemuxml2xmltest.c
+++ b/tests/qemuxml2xmltest.c
@@ -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);
-- 
2.7.4

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH v5 01/11] nvdimm: introduce 'alignsize' element into xml for NVDIMM memory
Posted by John Ferlan 7 years, 1 month ago
$SUBJ:

s/nvdimm: introduce/conf: Introduce/

On 12/20/18 4:14 AM, Luyao Zhong wrote:
> 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 will be introduced to allow users specifying the proper

s/will be/is
s/users specifying/specification of/

> 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>
> ---
>  docs/formatdomain.html.in                          | 23 +++++++--
>  docs/schemas/domaincommon.rng                      | 13 +++--
>  src/conf/domain_conf.c                             | 32 +++++++++---
>  src/conf/domain_conf.h                             |  1 +
>  .../memory-hotplug-nvdimm-align.xml                | 58 ++++++++++++++++++++++
>  .../memory-hotplug-nvdimm-align.xml                |  1 +
>  tests/qemuxml2xmltest.c                            |  1 +
>  7 files changed, 116 insertions(+), 13 deletions(-)
>  create mode 100644 tests/qemuxml2argvdata/memory-hotplug-nvdimm-align.xml
>  create mode 120000 tests/qemuxml2xmloutdata/memory-hotplug-nvdimm-align.xml
> 
> diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
> index a18d063..515e656 100644
> --- a/docs/formatdomain.html.in
> +++ b/docs/formatdomain.html.in
> @@ -8322,6 +8322,7 @@ qemu-kvm -net nic,model=? /dev/null
>    &lt;memory model='nvdimm'&gt;
>      &lt;source&gt;
>        &lt;path&gt;/tmp/nvdimm&lt;/path&gt;
> +      &lt;alignsize unit='KiB'&gt;2048&lt;/alignsize&gt;
>      &lt;/source&gt;
>      &lt;target&gt;
>        &lt;size unit='KiB'&gt;524288&lt;/size&gt;
> @@ -8403,10 +8404,26 @@ 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. If
> +          <code>nvdimm</code> is provided, then the following optional
> +          elements can be provided as well:

s/If ... as well:/The following optional elements may be used:/

>          </p>
> +
> +        <dl>
> +          <dt><code>alignsize</code></dt>
> +          <dd>
> +            <p>
> +              This element can be used to specify a proper alignment.
> +              When mmap(2) the backend files, QEMU uses the host page
> +              size by default as the alignment of mapping address. However,
> +              some backends may require alignments different from the page.

How about:

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.

NB: This makes the description hypvervisor agnostic and "simpler".

> +              For example, mmap a real NVDIMM device maybe 2M-aligned required.

Change to:

For example, to mmap a real NVDIMM device a 2M-aligned may be required.


With your OK, then I can make these changes for you.

Reviewed-by: John Ferlan <jferlan@redhat.com>

John

[...]

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list