@@ -257,6 +257,11 @@ typedef struct Qcow2BitmapHeaderExt {
uint64_t bitmap_directory_offset;
} QEMU_PACKED Qcow2BitmapHeaderExt;
+typedef struct Qcow2ThreadsState {
+ CoQueue task_queue;
+ int count;
+} Qcow2ThreadsState;
+
typedef struct BDRVQcow2State {
int cluster_bits;
int cluster_size;
@@ -336,8 +341,7 @@ typedef struct BDRVQcow2State {
char *image_backing_file;
char *image_backing_format;
- CoQueue compress_wait_queue;
- int nb_compress_threads;
+ Qcow2ThreadsState threads;
} BDRVQcow2State;
typedef struct Qcow2COWRegion {
@@ -145,6 +145,7 @@ 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;
+ Qcow2ThreadsState *thr = &s->threads;
ThreadPool *pool = aio_get_thread_pool(bdrv_get_aio_context(bs));
Qcow2CompressData arg = {
.dest = dest,
@@ -154,15 +155,15 @@ qcow2_co_do_compress(BlockDriverState *bs, void *dest, size_t dest_size,
.func = func,
};
- while (s->nb_compress_threads >= MAX_COMPRESS_THREADS) {
- qemu_co_queue_wait(&s->compress_wait_queue, NULL);
+ while (thr->count >= MAX_COMPRESS_THREADS) {
+ qemu_co_queue_wait(&thr->task_queue, NULL);
}
- s->nb_compress_threads++;
+ thr->count++;
thread_pool_submit_co(pool, qcow2_compress_pool_func, &arg);
- s->nb_compress_threads--;
+ thr->count--;
- qemu_co_queue_next(&s->compress_wait_queue);
+ qemu_co_queue_next(&thr->task_queue);
return arg.ret;
}
@@ -1600,7 +1600,7 @@ static int coroutine_fn qcow2_do_open(BlockDriverState *bs, QDict *options,
}
#endif
- qemu_co_queue_init(&s->compress_wait_queue);
+ qemu_co_queue_init(&s->threads.task_queue);
return ret;
The state will grow in further commits, so it's good to give it its own structure. Make naming generic, as threads will be used for encryption too. Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> --- block/qcow2.h | 8 ++++++-- block/qcow2-threads.c | 11 ++++++----- block/qcow2.c | 2 +- 3 files changed, 13 insertions(+), 8 deletions(-)