Skip to content

Commit

Permalink
qcow2: do decompression in threads
Browse files Browse the repository at this point in the history
Do decompression in threads, like it is already done for compression.
This improves asynchronous compressed reads performance.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Alberto Garcia <berto@igalia.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
  • Loading branch information
Vladimir Sementsov-Ogievskiy authored and kevmw committed Dec 14, 2018
1 parent c3c10f7 commit e23c9d7
Showing 1 changed file with 27 additions and 7 deletions.
34 changes: 27 additions & 7 deletions block/qcow2.c
Expand Up @@ -3807,20 +3807,24 @@ static ssize_t qcow2_decompress(void *dest, size_t dest_size,

#define MAX_COMPRESS_THREADS 4

typedef ssize_t (*Qcow2CompressFunc)(void *dest, size_t dest_size,
const void *src, size_t src_size);
typedef struct Qcow2CompressData {
void *dest;
size_t dest_size;
const void *src;
size_t src_size;
ssize_t ret;

Qcow2CompressFunc func;
} Qcow2CompressData;

static int qcow2_compress_pool_func(void *opaque)
{
Qcow2CompressData *data = opaque;

data->ret = qcow2_compress(data->dest, data->dest_size,
data->src, data->src_size);
data->ret = data->func(data->dest, data->dest_size,
data->src, data->src_size);

return 0;
}
Expand All @@ -3830,10 +3834,9 @@ static void qcow2_compress_complete(void *opaque, int ret)
qemu_coroutine_enter(opaque);
}

/* See qcow2_compress definition for parameters description */
static ssize_t qcow2_co_compress(BlockDriverState *bs,
void *dest, size_t dest_size,
const void *src, size_t src_size)
static ssize_t coroutine_fn
qcow2_co_do_compress(BlockDriverState *bs, void *dest, size_t dest_size,
const void *src, size_t src_size, Qcow2CompressFunc func)
{
BDRVQcow2State *s = bs->opaque;
BlockAIOCB *acb;
Expand All @@ -3843,6 +3846,7 @@ static ssize_t qcow2_co_compress(BlockDriverState *bs,
.dest_size = dest_size,
.src = src,
.src_size = src_size,
.func = func,
};

while (s->nb_compress_threads >= MAX_COMPRESS_THREADS) {
Expand All @@ -3865,6 +3869,22 @@ static ssize_t qcow2_co_compress(BlockDriverState *bs,
return arg.ret;
}

static ssize_t coroutine_fn
qcow2_co_compress(BlockDriverState *bs, void *dest, size_t dest_size,
const void *src, size_t src_size)
{
return qcow2_co_do_compress(bs, dest, dest_size, src, src_size,
qcow2_compress);
}

static ssize_t coroutine_fn
qcow2_co_decompress(BlockDriverState *bs, void *dest, size_t dest_size,
const void *src, size_t src_size)
{
return qcow2_co_do_compress(bs, dest, dest_size, src, src_size,
qcow2_decompress);
}

/* XXX: put compressed sectors first, then all the cluster aligned
tables to avoid losing bytes in alignment */
static coroutine_fn int
Expand Down Expand Up @@ -3993,7 +4013,7 @@ qcow2_co_preadv_compressed(BlockDriverState *bs,
goto fail;
}

if (qcow2_decompress(out_buf, s->cluster_size, buf, csize) < 0) {
if (qcow2_co_decompress(bs, out_buf, s->cluster_size, buf, csize) < 0) {
ret = -EIO;
goto fail;
}
Expand Down

0 comments on commit e23c9d7

Please sign in to comment.