[libvirt] [PATCH 3/5] conf: Add support for unmap limit

Lin Ma lma at suse.com
Tue Jun 16 07:54:36 UTC 2020


Signed-off-by: Lin Ma <lma at suse.com>
---
 docs/formatdomain.html.in     | 12 ++++++++++++
 docs/schemas/domaincommon.rng |  5 +++++
 src/conf/domain_conf.c        | 26 +++++++++++++++++++++++++-
 src/conf/domain_conf.h        |  1 +
 src/qemu/qemu_domain.c        |  2 ++
 5 files changed, 45 insertions(+), 1 deletion(-)

diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 59ee50225a..c4c510ab5f 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -3015,6 +3015,13 @@
     <target dev='sda' bus='scsi'/>
     <address type='drive' controller='0' bus='0' target='3' unit='0'/>
   </disk>
+  <disk type='file' device='disk'>
+    <driver name='qemu' type='qcow2'/>
+    <source file='/var/lib/libvirt/images/domain.qcow2'/>
+    <blockio max_unmap_size='1073741824'/>
+    <target dev='sdb' bus='scsi'/>
+    <address type='drive' controller='0' bus='0' target='0' unit='0'/>
+  </disk>
   <disk type='block' device='disk'>
     <driver name='qemu' type='raw'/>
     <source dev='/dev/sda'/>
@@ -4071,6 +4078,11 @@
           <dd>Its value impacts the Optimal Unmap Granularity field in
             the block limits VPD page. <span class="since">Since 6.5.0</span>
           </dd>
+          <dt><code>max_unmap_size</code></dt>
+          <dd>Available for scsi disks only. It impacts the Maximum
+            Unmap LBA count field in the block limits VPD page.
+            <span class="since">Since 6.5.0 (QEMU 2.0)</span>
+          </dd>
         </dl>
       </dd>
     </dl>
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 5206c4e246..8d037c4d07 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -2182,6 +2182,11 @@
           <data type="integer"/>
         </attribute>
       </optional>
+      <optional>
+        <attribute name="max_unmap_size">
+          <data type="integer"/>
+        </attribute>
+      </optional>
     </element>
   </define>
   <!--
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 7a6a124ffd..a546d9cc6f 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -6145,6 +6145,13 @@ virDomainDiskDefValidate(const virDomainDef *def,
         return -1;
     }
 
+    if (disk->blockio.max_unmap_size && disk->bus != VIR_DOMAIN_DISK_BUS_SCSI) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                       _("max_unmap_size attribute is only supported by "
+                         "scsi-hd or scsi-block"));
+        return -1;
+    }
+
     if (disk->bus != VIR_DOMAIN_DISK_BUS_VIRTIO &&
         (disk->model == VIR_DOMAIN_DISK_MODEL_VIRTIO ||
          disk->model == VIR_DOMAIN_DISK_MODEL_VIRTIO_TRANSITIONAL ||
@@ -10426,6 +10433,7 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt,
     g_autofree char *product = NULL;
     g_autofree char *domain_name = NULL;
     g_autofree char *discard_granularity = NULL;
+    g_autofree char *max_unmap_size = NULL;
 
     if (!(def = virDomainDiskDefNew(xmlopt)))
         return NULL;
@@ -10533,6 +10541,16 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt,
                                discard_granularity);
                 goto error;
             }
+            max_unmap_size =
+                virXMLPropString(cur, "max_unmap_size");
+            if (max_unmap_size &&
+                virStrToLong_ui(max_unmap_size, NULL, 0,
+                                &def->blockio.max_unmap_size) < 0) {
+                virReportError(VIR_ERR_INTERNAL_ERROR,
+                               _("invalid unmap limits size '%s'"),
+                               max_unmap_size);
+                goto error;
+            }
         } else if (!virDomainDiskGetDriver(def) &&
                    virXMLNodeNameEqual(cur, "driver")) {
             if (virDomainVirtioOptionsParseXML(cur, &def->virtio) < 0)
@@ -24970,7 +24988,8 @@ virDomainDiskBlockIoDefFormat(virBufferPtr buf,
 {
     if (def->blockio.logical_block_size > 0 ||
         def->blockio.physical_block_size > 0 ||
-        def->blockio.discard_granularity > 0) {
+        def->blockio.discard_granularity > 0 ||
+        def->blockio.max_unmap_size > 0) {
         virBufferAddLit(buf, "<blockio");
         if (def->blockio.logical_block_size > 0) {
             virBufferAsprintf(buf,
@@ -24987,6 +25006,11 @@ virDomainDiskBlockIoDefFormat(virBufferPtr buf,
                               " discard_granularity='%u'",
                               def->blockio.discard_granularity);
         }
+        if (def->blockio.max_unmap_size > 0) {
+            virBufferAsprintf(buf,
+                              " max_unmap_size='%u'",
+                              def->blockio.max_unmap_size);
+        }
         virBufferAddLit(buf, "/>\n");
     }
 }
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 9056e5e9b6..79bb30b666 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -550,6 +550,7 @@ struct _virDomainDiskDef {
         unsigned int logical_block_size;
         unsigned int physical_block_size;
         unsigned int discard_granularity;
+        unsigned int max_unmap_size;
     } blockio;
 
     virDomainBlockIoTuneInfo blkdeviotune;
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index c582550def..28564f48ec 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -8745,6 +8745,8 @@ qemuDomainDiskChangeSupported(virDomainDiskDefPtr disk,
              "blockio physical_block_size", false);
     CHECK_EQ(blockio.discard_granularity,
              "blockio discard_granularity", false);
+    CHECK_EQ(blockio.max_unmap_size,
+             "blockio max_unmap_size", false);
 
     CHECK_EQ(blkdeviotune.total_bytes_sec,
              "blkdeviotune total_bytes_sec",
-- 
2.26.0





More information about the libvir-list mailing list