]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
conf: add support for discard_granularity
authorKristina Hanicova <khanicov@redhat.com>
Fri, 25 Aug 2023 12:50:31 +0000 (14:50 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Fri, 25 Aug 2023 13:05:13 +0000 (15:05 +0200)
This introduces the ability to set the discard granularity option
for a disk.  It defines the smallest amount of data that can be
discarded in a single operation (useful for managing and
optimizing storage).

However, most hypervisors automatically set the proper discard
granularity and users usually do not need to change the default
setting.

Signed-off-by: Kristina Hanicova <khanicov@redhat.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
docs/formatdomain.rst
src/conf/domain_conf.c
src/conf/domain_conf.h
src/conf/domain_validate.c
src/conf/schemas/domaincommon.rng
src/qemu/qemu_domain.c
src/vz/vz_utils.c

index 9787933d4d1a3a07a592b5d621a52f02a5e6649b..68f54ab3ed62c332284cfa064faefeee554d2a9a 100644 (file)
@@ -2588,7 +2588,7 @@ paravirtualized driver is specified via the ``disk`` element.
        <driver name='qemu' type='raw'/>
        <source dev='/dev/sda'/>
        <geometry cyls='16383' heads='16' secs='63' trans='lba'/>
-       <blockio logical_block_size='512' physical_block_size='4096'/>
+       <blockio logical_block_size='512' physical_block_size='4096' discard_granularity='4096'/>
        <target dev='hdj' bus='ide'/>
      </disk>
      <disk type='volume' device='disk'>
@@ -3453,6 +3453,11 @@ paravirtualized driver is specified via the ``disk`` element.
       this would be the value returned by the BLKPBSZGET ioctl and describes the
       disk's hardware sector size which can be relevant for the alignment of
       disk data.
+   ``discard_granularity``
+      The smallest amount of data that can be discarded in a single operation.
+      It impacts the unmap operations and it must be a multiple of a
+      ``logical_block_size``. This is usually properly configured by the
+      hypervisor.
 
 Filesystems
 ~~~~~~~~~~~
index 69934026efec746796f57e63a9ffb9c535ed6bf2..bb4f1fdb948d6852d9ccc3168545071d3afaade9 100644 (file)
@@ -8073,6 +8073,10 @@ virDomainDiskDefParseXML(virDomainXMLOption *xmlopt,
         if (virXMLPropUInt(blockioNode, "physical_block_size", 10, VIR_XML_PROP_NONE,
                            &def->blockio.physical_block_size) < 0)
             return NULL;
+
+        if (virXMLPropUInt(blockioNode, "discard_granularity", 10, VIR_XML_PROP_NONE,
+                           &def->blockio.discard_granularity) < 0)
+            return NULL;
     }
 
     if ((driverNode = virXPathNode("./driver", ctxt))) {
@@ -19836,6 +19840,13 @@ virDomainDiskBlockIoCheckABIStability(virDomainDiskDef *src,
                        dst->blockio.physical_block_size, src->blockio.physical_block_size);
         return false;
     }
+
+    if (src->blockio.discard_granularity != dst->blockio.discard_granularity) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                       _("Target disk discard_granularity %1$u does not match source %2$u"),
+                       dst->blockio.discard_granularity, src->blockio.discard_granularity);
+        return false;
+    }
     return true;
 }
 
@@ -22132,7 +22143,8 @@ virDomainDiskBlockIoDefFormat(virBuffer *buf,
                               virDomainDiskDef *def)
 {
     if (def->blockio.logical_block_size > 0 ||
-        def->blockio.physical_block_size > 0) {
+        def->blockio.physical_block_size > 0 ||
+        def->blockio.discard_granularity > 0) {
         virBufferAddLit(buf, "<blockio");
         if (def->blockio.logical_block_size > 0) {
             virBufferAsprintf(buf,
@@ -22144,6 +22156,11 @@ virDomainDiskBlockIoDefFormat(virBuffer *buf,
                               " physical_block_size='%u'",
                               def->blockio.physical_block_size);
         }
+        if (def->blockio.discard_granularity > 0) {
+            virBufferAsprintf(buf,
+                              " discard_granularity='%u'",
+                              def->blockio.discard_granularity);
+        }
         virBufferAddLit(buf, "/>\n");
     }
 }
index 8bef097542a426260f82655bc9e78171c8315454..ca195a52d2130992af40651698314148f1ecc225 100644 (file)
@@ -579,6 +579,7 @@ struct _virDomainDiskDef {
     struct {
         unsigned int logical_block_size;
         unsigned int physical_block_size;
+        unsigned int discard_granularity;
     } blockio;
 
     virDomainBlockIoTuneInfo blkdeviotune;
index b286990b1916e3b425c155702e82e7f03bc46e25..fd3eed32302a6734664bf7b9d097d9833ed8ffb7 100644 (file)
@@ -466,7 +466,8 @@ virDomainDiskVhostUserValidate(const virDomainDiskDef *disk)
     }
 
     if (disk->blockio.logical_block_size > 0 ||
-        disk->blockio.physical_block_size > 0) {
+        disk->blockio.physical_block_size > 0 ||
+        disk->blockio.discard_granularity > 0) {
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
                        _("blockio is not supported with vhostuser disk"));
         return -1;
index 2556ac01edc99b9971a7dc133bcd7b86de747068..de3bd1c35c551fd9f19ea9de58ff6a7141c6e9e7 100644 (file)
           <data type="integer"/>
         </attribute>
       </optional>
+      <optional>
+        <attribute name="discard_granularity">
+          <data type="integer"/>
+        </attribute>
+      </optional>
     </element>
   </define>
   <!--
index 0b2b22a219a2091f047e61ed24a014f3bc51d5e6..bfeddc774604a79e8ca2bc2120929054e3a29cf9 100644 (file)
@@ -8426,6 +8426,8 @@ qemuDomainDiskChangeSupported(virDomainDiskDef *disk,
              "blockio logical_block_size", false);
     CHECK_EQ(blockio.physical_block_size,
              "blockio physical_block_size", false);
+    CHECK_EQ(blockio.discard_granularity,
+             "blockio discard_granularity", false);
 
     CHECK_EQ(blkdeviotune.total_bytes_sec,
              "blkdeviotune total_bytes_sec",
index 7db7dbd419aff43a1b18aefd1014c4d480928b95..de707df883b1ea008af409a2dd24f08b4539e5c9 100644 (file)
@@ -279,7 +279,8 @@ vzCheckDiskUnsupportedParams(virDomainDiskDef *disk)
     }
 
     if (disk->blockio.logical_block_size ||
-        disk->blockio.physical_block_size) {
+        disk->blockio.physical_block_size ||
+        disk->blockio.discard_granularity) {
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
                        _("Setting disk block sizes is not "
                          "supported by vz driver."));