From nobody Mon Feb 9 11:51:24 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=virtuozzo.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1554219920317895.7523278973904; Tue, 2 Apr 2019 08:45:20 -0700 (PDT) Received: from localhost ([127.0.0.1]:38943 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hBLbB-0007UZ-2q for importer@patchew.org; Tue, 02 Apr 2019 11:45:17 -0400 Received: from eggs.gnu.org ([209.51.188.92]:49561) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hBLTm-0001eT-0k for qemu-devel@nongnu.org; Tue, 02 Apr 2019 11:37:39 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hBLTk-0000VF-MC for qemu-devel@nongnu.org; Tue, 02 Apr 2019 11:37:37 -0400 Received: from relay.sw.ru ([185.231.240.75]:43490) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hBLTk-0000Th-Aj; Tue, 02 Apr 2019 11:37:36 -0400 Received: from [10.28.8.145] (helo=kvm.sw.ru) by relay.sw.ru with esmtp (Exim 4.91) (envelope-from ) id 1hBLTg-0001s1-Ml; Tue, 02 Apr 2019 18:37:32 +0300 From: Vladimir Sementsov-Ogievskiy To: qemu-devel@nongnu.org, qemu-block@nongnu.org Date: Tue, 2 Apr 2019 18:37:27 +0300 Message-Id: <20190402153730.54145-8-vsementsov@virtuozzo.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20190402153730.54145-1-vsementsov@virtuozzo.com> References: <20190402153730.54145-1-vsementsov@virtuozzo.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 185.231.240.75 Subject: [Qemu-devel] [PATCH v5 07/10] qcow2: qcow2_co_preadv: improve locking X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, vsementsov@virtuozzo.com, berto@igalia.com, mreitz@redhat.com, den@openvz.org, pbonzini@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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 Reviewed-by: Alberto Garcia --- block/qcow2.c | 46 ++++++++++++++++++++++------------------------ 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/block/qcow2.c b/block/qcow2.c index 46e8e39da5..fcf92a7eb6 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -1983,6 +1983,7 @@ static coroutine_fn int qcow2_co_preadv(BlockDriverSt= ate *bs, uint64_t offset, =20 ret =3D qcow2_get_cluster_offset(bs, offset, &cur_bytes, &cluster_= offset); if (ret < 0) { + qemu_co_mutex_unlock(&s->lock); goto fail; } =20 @@ -1991,39 +1992,36 @@ static coroutine_fn int qcow2_co_preadv(BlockDriver= State *bs, uint64_t offset, qemu_iovec_reset(&hd_qiov); qemu_iovec_concat(&hd_qiov, qiov, bytes_done, cur_bytes); =20 + if (ret =3D=3D QCOW2_CLUSTER_ZERO_PLAIN || + ret =3D=3D QCOW2_CLUSTER_ZERO_ALLOC || + (ret =3D=3D QCOW2_CLUSTER_UNALLOCATED && !bs->backing)) + { + qemu_iovec_memset(&hd_qiov, 0, 0, cur_bytes); + + bytes -=3D cur_bytes; + offset +=3D cur_bytes; + bytes_done +=3D 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 =3D 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 =3D bdrv_co_preadv(bs->backing, offset, cur_bytes, &hd_qio= v, 0); + if (ret < 0) { + goto fail; } break; =20 - 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 =3D qcow2_co_preadv_compressed(bs, cluster_offset, offset, cur_bytes, &hd_qiov); - qemu_co_mutex_lock(&s->lock); if (ret < 0) { goto fail; } - break; =20 case QCOW2_CLUSTER_NORMAL: @@ -2056,11 +2054,9 @@ static coroutine_fn int qcow2_co_preadv(BlockDriverS= tate *bs, uint64_t offset, } =20 BLKDBG_EVENT(bs->file, BLKDBG_READ_AIO); - qemu_co_mutex_unlock(&s->lock); ret =3D bdrv_co_preadv(s->data_file, cluster_offset + offset_in_cluster, cur_bytes, &hd_qiov, 0); - qemu_co_mutex_lock(&s->lock); if (ret < 0) { goto fail; } @@ -2091,12 +2087,14 @@ static coroutine_fn int qcow2_co_preadv(BlockDriver= State *bs, uint64_t offset, bytes -=3D cur_bytes; offset +=3D cur_bytes; bytes_done +=3D cur_bytes; + + qemu_co_mutex_lock(&s->lock); } ret =3D 0; =20 -fail: qemu_co_mutex_unlock(&s->lock); =20 +fail: qemu_iovec_destroy(&hd_qiov); qemu_vfree(cluster_data); =20 --=20 2.18.0