qemu/qapi
Jean-Louis Dupond 42a2890a76 qcow2: add discard-no-unref option
When we for example have a sparse qcow2 image and discard: unmap is enabled,
there can be a lot of fragmentation in the image after some time. Especially on VM's
that do a lot of writes/deletes.
This causes the qcow2 image to grow even over 110% of its virtual size,
because the free gaps in the image get too small to allocate new
continuous clusters. So it allocates new space at the end of the image.

Disabling discard is not an option, as discard is needed to keep the
incremental backup size as low as possible. Without discard, the
incremental backups would become large, as qemu thinks it's just dirty
blocks but it doesn't know the blocks are unneeded.
So we need to avoid fragmentation but also 'empty' the unneeded blocks in
the image to have a small incremental backup.

In addition, we also want to send the discards further down the stack, so
the underlying blocks are still discarded.

Therefor we introduce a new qcow2 option "discard-no-unref".
When setting this option to true, discards will no longer have the qcow2
driver relinquish cluster allocations. Other than that, the request is
handled as normal: All clusters in range are marked as zero, and, if
pass-discard-request is true, it is passed further down the stack.
The only difference is that the now-zero clusters are preallocated
instead of being unallocated.
This will avoid fragmentation on the qcow2 image.

Fixes: https://gitlab.com/qemu-project/qemu/-/issues/1621
Signed-off-by: Jean-Louis Dupond <jean-louis@dupond.be>
Message-Id: <20230605084523.34134-2-jean-louis@dupond.be>
Reviewed-by: Hanna Czenczek <hreitz@redhat.com>
Signed-off-by: Hanna Czenczek <hreitz@redhat.com>
2023-06-05 13:15:42 +02:00
..
acpi.json qapi: Reformat doc comments to conform to current conventions 2023-05-10 10:01:01 +02:00
audio.json qapi: Reformat doc comments to conform to current conventions 2023-05-10 10:01:01 +02:00
authz.json qapi: Reformat doc comments to conform to current conventions 2023-05-10 10:01:01 +02:00
block-core.json qcow2: add discard-no-unref option 2023-06-05 13:15:42 +02:00
block-export.json qapi: Reformat doc comments to conform to current conventions 2023-05-10 10:01:01 +02:00
block.json block: add accounting for zone append operation 2023-05-15 08:18:10 -04:00
char.json qapi: Reformat doc comments to conform to current conventions 2023-05-10 10:01:01 +02:00
common.json qapi: Reformat doc comments to conform to current conventions 2023-05-10 10:01:01 +02:00
compat.json qapi: Reformat doc comments to conform to current conventions 2023-05-10 10:01:01 +02:00
control.json docs/interop: Convert qmp-spec.txt to rST 2023-05-22 10:21:01 +02:00
crypto.json qapi: Reformat doc comments to conform to current conventions 2023-05-10 10:01:01 +02:00
cryptodev.json qapi: Reformat doc comments to conform to current conventions 2023-05-10 10:01:01 +02:00
cxl.json qapi: Reformat doc comments to conform to current conventions 2023-05-10 10:01:01 +02:00
dump.json qapi: Reformat doc comments to conform to current conventions 2023-05-10 10:01:01 +02:00
error.json qapi: Reformat doc comments to conform to current conventions 2023-05-10 10:01:01 +02:00
introspect.json qapi: Reformat doc comments to conform to current conventions 2023-05-10 10:01:01 +02:00
job.json qapi: Reformat doc comments to conform to current conventions 2023-05-10 10:01:01 +02:00
machine-target.json qapi: Reformat doc comments to conform to current conventions 2023-05-10 10:01:01 +02:00
machine.json qapi: Reformat doc comments to conform to current conventions 2023-05-10 10:01:01 +02:00
meson.build hw/mem/cxl_type3: Add CXL RAS Error Injection Support. 2023-03-07 12:39:00 -05:00
migration.json build: move COLO under CONFIG_REPLICATION 2023-05-10 18:48:11 +02:00
misc-target.json qapi: Reformat doc comments to conform to current conventions 2023-05-10 10:01:01 +02:00
misc.json qapi: Reformat doc comments to conform to current conventions 2023-05-10 10:01:01 +02:00
net.json qapi: Reformat doc comments to conform to current conventions 2023-05-10 10:01:01 +02:00
opts-visitor.c cutils: Adjust signature of parse_uint[_full] 2023-06-02 12:27:19 -05:00
pci.json qapi: Reformat doc comments to conform to current conventions 2023-05-10 10:01:01 +02:00
pragma.json qapi/pragma: Tidy up comments 2022-05-16 07:31:26 +02:00
qapi-clone-visitor.c qapi: Make visitor functions taking Error ** return bool, not void 2020-07-10 15:18:08 +02:00
qapi-dealloc-visitor.c qapi: Make visitor functions taking Error ** return bool, not void 2020-07-10 15:18:08 +02:00
qapi-forward-visitor.c qapi: remove needless include 2022-03-22 14:46:18 +04:00
qapi-schema.json docs/interop: Convert qmp-spec.txt to rST 2023-05-22 10:21:01 +02:00
qapi-type-helpers.c monitor: introduce HumanReadableText and HMP support 2021-11-02 15:55:13 +00:00
qapi-util.c qapi: Fix stale reference to scripts/qapi.py in a comment 2022-02-28 11:39:35 +01:00
qapi-visit-core.c qapi: Factor out compat_policy_input_ok() 2021-10-29 21:27:20 +02:00
qdev.json qapi: Reformat doc comments to conform to current conventions 2023-05-10 10:01:01 +02:00
qmp-dispatch.c monitor: mark mixed functions that can suspend 2023-04-20 11:17:35 +02:00
qmp-event.c Replace qemu_gettimeofday() with g_get_real_time() 2022-04-06 10:50:37 +02:00
qmp-registry.c qapi: Generalize command policy checking 2021-10-29 18:24:46 +02:00
qobject-input-visitor.c include: add qemu/keyval.h 2022-04-21 17:03:51 +04:00
qobject-output-visitor.c qapi: Extend -compat to set policy for unstable interfaces 2021-10-29 21:28:01 +02:00
qom.json hostmem-file: add offset option 2023-05-23 16:47:03 +02:00
rdma.json qapi: Reformat doc comments to conform to current conventions 2023-05-10 10:01:01 +02:00
replay.json qapi: Reformat doc comments to conform to current conventions 2023-05-10 10:01:01 +02:00
rocker.json qapi: Reformat doc comments to conform to current conventions 2023-05-10 10:01:01 +02:00
run-state.json qapi: Reformat doc comments to conform to current conventions 2023-05-10 10:01:01 +02:00
sockets.json qapi: Reformat doc comments to conform to current conventions 2023-05-10 10:01:01 +02:00
stats.json qapi: Reformat doc comments to conform to current conventions 2023-05-10 10:01:01 +02:00
string-input-visitor.c qapi, qemu-options: make all parsing visitors parse boolean options the same 2020-11-04 12:00:40 -05:00
string-output-visitor.c qapi: remove needless include 2022-03-22 14:46:18 +04:00
tpm.json qapi: Reformat doc comments to conform to current conventions 2023-05-10 10:01:01 +02:00
trace-events qapi: Generalize struct member policy checking 2021-10-29 18:23:09 +02:00
trace.h trace: switch position of headers to what Meson requires 2020-08-21 06:18:24 -04:00
trace.json qapi: make the vcpu parameters deprecated for 8.1 2023-06-01 11:05:05 -04:00
transaction.json qapi: Reformat doc comments to conform to current conventions 2023-05-10 10:01:01 +02:00
ui.json ui: add the infrastructure to support MT events 2023-05-28 13:08:25 +04:00
virtio.json qapi: Reformat doc comments to conform to current conventions 2023-05-10 10:01:01 +02:00
yank.json qapi: Reformat doc comments to conform to current conventions 2023-05-10 10:01:01 +02:00