mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 00:03:54 -06:00
qcow2: do encryption in threads
Do encryption/decryption in threads, like it is already done for compression. This improves asynchronous encrypted io. Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> Reviewed-by: Alberto Garcia <berto@igalia.com> Reviewed-by: Max Reitz <mreitz@redhat.com> Message-id: 20190506142741.41731-9-vsementsov@virtuozzo.com Signed-off-by: Max Reitz <mreitz@redhat.com>
This commit is contained in:
parent
5447c3a03f
commit
8ac0f15f33
4 changed files with 81 additions and 21 deletions
|
@ -30,8 +30,7 @@
|
|||
|
||||
#include "qcow2.h"
|
||||
#include "block/thread-pool.h"
|
||||
|
||||
#define QCOW2_MAX_THREADS 4
|
||||
#include "crypto.h"
|
||||
|
||||
static int coroutine_fn
|
||||
qcow2_co_process(BlockDriverState *bs, ThreadPoolFunc *func, void *arg)
|
||||
|
@ -205,3 +204,65 @@ qcow2_co_decompress(BlockDriverState *bs, void *dest, size_t dest_size,
|
|||
return qcow2_co_do_compress(bs, dest, dest_size, src, src_size,
|
||||
qcow2_decompress);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Cryptography
|
||||
*/
|
||||
|
||||
/*
|
||||
* Qcow2EncDecFunc: common prototype of qcrypto_block_encrypt() and
|
||||
* qcrypto_block_decrypt() functions.
|
||||
*/
|
||||
typedef int (*Qcow2EncDecFunc)(QCryptoBlock *block, uint64_t offset,
|
||||
uint8_t *buf, size_t len, Error **errp);
|
||||
|
||||
typedef struct Qcow2EncDecData {
|
||||
QCryptoBlock *block;
|
||||
uint64_t offset;
|
||||
uint8_t *buf;
|
||||
size_t len;
|
||||
|
||||
Qcow2EncDecFunc func;
|
||||
} Qcow2EncDecData;
|
||||
|
||||
static int qcow2_encdec_pool_func(void *opaque)
|
||||
{
|
||||
Qcow2EncDecData *data = opaque;
|
||||
|
||||
return data->func(data->block, data->offset, data->buf, data->len, NULL);
|
||||
}
|
||||
|
||||
static int coroutine_fn
|
||||
qcow2_co_encdec(BlockDriverState *bs, uint64_t file_cluster_offset,
|
||||
uint64_t offset, void *buf, size_t len, Qcow2EncDecFunc func)
|
||||
{
|
||||
BDRVQcow2State *s = bs->opaque;
|
||||
Qcow2EncDecData arg = {
|
||||
.block = s->crypto,
|
||||
.offset = s->crypt_physical_offset ?
|
||||
file_cluster_offset + offset_into_cluster(s, offset) :
|
||||
offset,
|
||||
.buf = buf,
|
||||
.len = len,
|
||||
.func = func,
|
||||
};
|
||||
|
||||
return qcow2_co_process(bs, qcow2_encdec_pool_func, &arg);
|
||||
}
|
||||
|
||||
int coroutine_fn
|
||||
qcow2_co_encrypt(BlockDriverState *bs, uint64_t file_cluster_offset,
|
||||
uint64_t offset, void *buf, size_t len)
|
||||
{
|
||||
return qcow2_co_encdec(bs, file_cluster_offset, offset, buf, len,
|
||||
qcrypto_block_encrypt);
|
||||
}
|
||||
|
||||
int coroutine_fn
|
||||
qcow2_co_decrypt(BlockDriverState *bs, uint64_t file_cluster_offset,
|
||||
uint64_t offset, void *buf, size_t len)
|
||||
{
|
||||
return qcow2_co_encdec(bs, file_cluster_offset, offset, buf, len,
|
||||
qcrypto_block_decrypt);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue