this adds support for optimized zlib settings which almost
tripples the compression speed while maintaining about
the same compressed size.
Signed-off-by: Peter Lieven
---
block/qcow2-cluster.c | 3 ++-
block/qcow2.c | 11 +--
block/qcow2.h | 1 +
qemu-img.texi | 1 +
4 files changed, 13 insertions(+), 3 deletions(-)
diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c
index ecb059b..d8e2378 100644
--- a/block/qcow2-cluster.c
+++ b/block/qcow2-cluster.c
@@ -1532,6 +1532,7 @@ static int decompress_buffer(uint8_t *out_buf, int
out_buf_size,
switch (compression_algorithm_id) {
case QCOW2_COMPRESSION_ZLIB:
+case QCOW2_COMPRESSION_ZLIB_FAST:
memset(strm, 0, sizeof(*strm));
strm->next_in = (uint8_t *)buf;
@@ -1539,7 +1540,7 @@ static int decompress_buffer(uint8_t *out_buf, int
out_buf_size,
strm->next_out = out_buf;
strm->avail_out = out_buf_size;
-ret = inflateInit2(strm, -12);
+ret = inflateInit2(strm, -15);
if (ret != Z_OK) {
return -1;
}
diff --git a/block/qcow2.c b/block/qcow2.c
index bd65582..f07d8f0 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -87,6 +87,8 @@ static uint32_t is_compression_algorithm_supported(char
*algorithm)
/* no algorithm means the old default of zlib compression
* with 12 window bits */
return QCOW2_COMPRESSION_ZLIB;
+} else if (!strcmp(algorithm, "zlib-fast")) {
+return QCOW2_COMPRESSION_ZLIB_FAST;
#ifdef CONFIG_LZO
} else if (!strcmp(algorithm, "lzo")) {
return QCOW2_COMPRESSION_LZO;
@@ -2722,6 +2724,7 @@ qcow2_co_pwritev_compressed(BlockDriverState *bs,
uint64_t offset,
QEMUIOVector hd_qiov;
struct iovec iov;
z_stream strm;
+int z_level = Z_DEFAULT_COMPRESSION, z_windowBits = -12;
int ret, out_len = 0;
uint8_t *buf, *out_buf = NULL, *local_buf = NULL, *work_buf = NULL;
uint64_t cluster_offset;
@@ -2749,13 +2752,17 @@ qcow2_co_pwritev_compressed(BlockDriverState *bs,
uint64_t offset,
}
switch (s->compression_algorithm_id) {
+case QCOW2_COMPRESSION_ZLIB_FAST:
+z_level = Z_BEST_SPEED;
+z_windowBits = -15;
+/* fall-through */
case QCOW2_COMPRESSION_ZLIB:
out_buf = g_malloc(s->cluster_size);
/* best compression, small window, no zlib header */
memset(&strm, 0, sizeof(strm));
-ret = deflateInit2(&strm, Z_DEFAULT_COMPRESSION,
- Z_DEFLATED, -12,
+ret = deflateInit2(&strm, z_level,
+ Z_DEFLATED, z_windowBits,
9, Z_DEFAULT_STRATEGY);
if (ret != 0) {
ret = -EINVAL;
diff --git a/block/qcow2.h b/block/qcow2.h
index 716012c..a89f986 100644
--- a/block/qcow2.h
+++ b/block/qcow2.h
@@ -173,6 +173,7 @@ typedef struct Qcow2UnknownHeaderExtension {
enum {
QCOW2_COMPRESSION_ZLIB = 0xC0318301,
QCOW2_COMPRESSION_LZO = 0xC0318302,
+QCOW2_COMPRESSION_ZLIB_FAST = 0xC0318303,
};
enum {
diff --git a/qemu-img.texi b/qemu-img.texi
index 043c1ba..83a5db2 100644
--- a/qemu-img.texi
+++ b/qemu-img.texi
@@ -627,6 +627,7 @@ The following options are available if support for the
respective libraries
has been enabled at compile time:
zlibUses standard zlib compression (default)
+ zlib-fast Uses zlib compression with optimized compression parameters
lzo Uses LZO1X compression
The compression algorithm can only be defined at image create time and cannot
--
1.9.1