From: Peter Lieven <pl@kamp.de>
To: qemu-block@nongnu.org
Cc: qemu-devel@nongnu.org, kwolf@redhat.com, lersek@redhat.com,
den@openvz.org, mreitz@redhat.com, eblake@redhat.com,
Peter Lieven <pl@kamp.de>
Subject: [Qemu-devel] [PATCH 4/4] block/qcow2: add zlib-fast compression algorithm
Date: Tue, 27 Jun 2017 14:34:10 +0200 [thread overview]
Message-ID: <1498566850-7934-5-git-send-email-pl@kamp.de> (raw)
In-Reply-To: <1498566850-7934-1-git-send-email-pl@kamp.de>
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 <pl@kamp.de>
---
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:
zlib Uses 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
next prev parent reply other threads:[~2017-06-27 12:34 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-06-27 12:34 [Qemu-devel] [PATCH 0/4] block/qcow2: add compression_algorithm create option Peter Lieven
2017-06-27 12:34 ` [Qemu-devel] [PATCH 1/4] " Peter Lieven
2017-06-27 12:49 ` Eric Blake
2017-06-27 14:49 ` Peter Lieven
2017-06-27 15:04 ` Eric Blake
2017-06-27 15:11 ` Peter Lieven
2017-06-27 15:13 ` Peter Lieven
2017-07-03 19:45 ` Peter Lieven
2017-06-27 13:20 ` Daniel P. Berrange
2017-06-27 13:27 ` Peter Lieven
2017-06-28 14:50 ` Denis V. Lunev
2017-06-28 14:54 ` Denis V. Lunev
2017-06-27 12:34 ` [Qemu-devel] [PATCH 2/4] block/qcow2: optimize qcow2_co_pwritev_compressed Peter Lieven
2017-06-27 12:34 ` [Qemu-devel] [PATCH 3/4] block/qcow2: add lzo compression algorithm Peter Lieven
2017-06-27 12:34 ` Peter Lieven [this message]
2017-06-27 12:53 ` [Qemu-devel] [PATCH 4/4] block/qcow2: add zlib-fast " Eric Blake
2017-06-27 13:14 ` Peter Lieven
2017-06-27 13:16 ` Daniel P. Berrange
2017-06-27 13:23 ` Peter Lieven
2017-06-27 13:46 ` Daniel P. Berrange
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1498566850-7934-5-git-send-email-pl@kamp.de \
--to=pl@kamp.de \
--cc=den@openvz.org \
--cc=eblake@redhat.com \
--cc=kwolf@redhat.com \
--cc=lersek@redhat.com \
--cc=mreitz@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).