[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 08/11] qcow2: bdrv_co_preadv: improve locking
From: |
Vladimir Sementsov-Ogievskiy |
Subject: |
[Qemu-devel] [PATCH 08/11] qcow2: bdrv_co_preadv: improve locking |
Date: |
Fri, 23 Nov 2018 19:55:08 +0300 |
Background: decryption will be done in threads, to take benefit of it,
we should move it out of the lock first.
But let's go further: it turns out, that for locking around switch
cases we have only two variants: when we just do memset(0) not
releasing the lock (it is useless) and when we actually can handle the
whole case out of the lock. So, refactor the whole thing to reduce
locked code region and make it clean.
Signed-off-by: Vladimir Sementsov-Ogievskiy <address@hidden>
---
block/qcow2.c | 48 ++++++++++++++++++++++++------------------------
1 file changed, 24 insertions(+), 24 deletions(-)
diff --git a/block/qcow2.c b/block/qcow2.c
index 1e28f17373..5467089cfe 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -1924,6 +1924,7 @@ static coroutine_fn int qcow2_co_preadv(BlockDriverState
*bs, uint64_t offset,
ret = qcow2_get_cluster_offset(bs, offset, &cur_bytes,
&cluster_offset);
if (ret < 0) {
+ qemu_co_mutex_unlock(&s->lock);
goto fail;
}
@@ -1932,39 +1933,38 @@ static coroutine_fn int
qcow2_co_preadv(BlockDriverState *bs, uint64_t offset,
qemu_iovec_reset(&hd_qiov);
qemu_iovec_concat(&hd_qiov, qiov, bytes_done, cur_bytes);
+ if (ret == QCOW2_CLUSTER_ZERO_PLAIN ||
+ ret == QCOW2_CLUSTER_ZERO_ALLOC ||
+ (ret == QCOW2_CLUSTER_UNALLOCATED && !bs->backing))
+ {
+ /* No sense in releasing the lock */
+
+ qemu_iovec_memset(&hd_qiov, 0, 0, cur_bytes);
+
+ bytes -= cur_bytes;
+ offset += cur_bytes;
+ bytes_done += cur_bytes;
+ continue;
+ }
+
+ qemu_co_mutex_unlock(&s->lock);
+
switch (ret) {
case QCOW2_CLUSTER_UNALLOCATED:
-
- if (bs->backing) {
- BLKDBG_EVENT(bs->file, BLKDBG_READ_BACKING_AIO);
- qemu_co_mutex_unlock(&s->lock);
- ret = bdrv_co_preadv(bs->backing, offset, cur_bytes,
- &hd_qiov, 0);
- qemu_co_mutex_lock(&s->lock);
- if (ret < 0) {
- goto fail;
- }
- } else {
- /* Note: in this case, no need to wait */
- qemu_iovec_memset(&hd_qiov, 0, 0, cur_bytes);
+ BLKDBG_EVENT(bs->file, BLKDBG_READ_BACKING_AIO);
+ ret = bdrv_co_preadv(bs->backing, offset, cur_bytes, &hd_qiov, 0);
+ if (ret < 0) {
+ goto fail;
}
break;
- case QCOW2_CLUSTER_ZERO_PLAIN:
- case QCOW2_CLUSTER_ZERO_ALLOC:
- qemu_iovec_memset(&hd_qiov, 0, 0, cur_bytes);
- break;
-
case QCOW2_CLUSTER_COMPRESSED:
- qemu_co_mutex_unlock(&s->lock);
ret = qcow2_co_preadv_compressed(bs, cluster_offset,
offset, cur_bytes,
&hd_qiov);
- qemu_co_mutex_lock(&s->lock);
if (ret < 0) {
goto fail;
}
-
break;
case QCOW2_CLUSTER_NORMAL:
@@ -1997,11 +1997,9 @@ static coroutine_fn int qcow2_co_preadv(BlockDriverState
*bs, uint64_t offset,
}
BLKDBG_EVENT(bs->file, BLKDBG_READ_AIO);
- qemu_co_mutex_unlock(&s->lock);
ret = bdrv_co_preadv(bs->file,
cluster_offset + offset_in_cluster,
cur_bytes, &hd_qiov, 0);
- qemu_co_mutex_lock(&s->lock);
if (ret < 0) {
goto fail;
}
@@ -2032,12 +2030,14 @@ static coroutine_fn int
qcow2_co_preadv(BlockDriverState *bs, uint64_t offset,
bytes -= cur_bytes;
offset += cur_bytes;
bytes_done += cur_bytes;
+
+ qemu_co_mutex_lock(&s->lock);
}
ret = 0;
-fail:
qemu_co_mutex_unlock(&s->lock);
+fail:
qemu_iovec_destroy(&hd_qiov);
qemu_vfree(cluster_data);
--
2.18.0
- [Qemu-devel] [PATCH 00/11] qcow2: encryption threads, Vladimir Sementsov-Ogievskiy, 2018/11/23
- [Qemu-devel] [PATCH 06/11] qcow2-threads: add per-thread data, Vladimir Sementsov-Ogievskiy, 2018/11/23
- [Qemu-devel] [PATCH 03/11] qcow2-threads: use thread_pool_submit_co, Vladimir Sementsov-Ogievskiy, 2018/11/23
- [Qemu-devel] [PATCH 07/11] qcow2-threads: add encryption, Vladimir Sementsov-Ogievskiy, 2018/11/23
- [Qemu-devel] [PATCH 05/11] qcow2-threads: split out generic path, Vladimir Sementsov-Ogievskiy, 2018/11/23
- [Qemu-devel] [PATCH 01/11] qcow2.h: add missing include, Vladimir Sementsov-Ogievskiy, 2018/11/23
- [Qemu-devel] [PATCH 11/11] qcow2: do encryption in threads, Vladimir Sementsov-Ogievskiy, 2018/11/23
- [Qemu-devel] [PATCH 08/11] qcow2: bdrv_co_preadv: improve locking,
Vladimir Sementsov-Ogievskiy <=
- [Qemu-devel] [PATCH 09/11] qcow2: qcow2_co_preadv: skip using hd_qiov when possible, Vladimir Sementsov-Ogievskiy, 2018/11/23
- [Qemu-devel] [PATCH 04/11] qcow2: split out data processing threads state from BDRVQcow2State, Vladimir Sementsov-Ogievskiy, 2018/11/23
- [Qemu-devel] [PATCH 02/11] qcow2: add separate file for threaded data processing functions, Vladimir Sementsov-Ogievskiy, 2018/11/23
- [Qemu-devel] [PATCH 10/11] qcow2: bdrv_co_pwritev: move encryption code out of the lock, Vladimir Sementsov-Ogievskiy, 2018/11/23
- Re: [Qemu-devel] [PATCH 00/11] qcow2: encryption threads, Daniel P . Berrangé, 2018/11/27