From nobody Sat Apr 27 16:23:06 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.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 208.118.235.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 (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1542992432172231.78745675745142; Fri, 23 Nov 2018 09:00:32 -0800 (PST) Received: from localhost ([::1]:53457 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gQEoW-0005Yz-9c for importer@patchew.org; Fri, 23 Nov 2018 12:00:20 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34830) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gQEjj-00083L-L2 for qemu-devel@nongnu.org; Fri, 23 Nov 2018 11:55:25 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gQEje-0002By-Ho for qemu-devel@nongnu.org; Fri, 23 Nov 2018 11:55:23 -0500 Received: from relay.sw.ru ([185.231.240.75]:34486) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gQEje-00027r-46; Fri, 23 Nov 2018 11:55:18 -0500 Received: from [10.28.8.145] (helo=kvm.sw.ru) by relay.sw.ru with esmtp (Exim 4.91) (envelope-from ) id 1gQEjY-0003sc-RM; Fri, 23 Nov 2018 19:55:12 +0300 From: Vladimir Sementsov-Ogievskiy To: qemu-devel@nongnu.org, qemu-block@nongnu.org Date: Fri, 23 Nov 2018 19:55:01 +0300 Message-Id: <20181123165511.416480-2-vsementsov@virtuozzo.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20181123165511.416480-1-vsementsov@virtuozzo.com> References: <20181123165511.416480-1-vsementsov@virtuozzo.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 185.231.240.75 Subject: [Qemu-devel] [PATCH 01/11] qcow2.h: add missing include 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 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" qcow2.h depends on block_int.h. Compilation isn't broken currently only due to block_int.h always included before qcow2.h. Though, it seems better to directly include block_int.h in qcow2.h. Signed-off-by: Vladimir Sementsov-Ogievskiy --- block/qcow2.h | 1 + 1 file changed, 1 insertion(+) diff --git a/block/qcow2.h b/block/qcow2.h index a98d24500b..5095f893a0 100644 --- a/block/qcow2.h +++ b/block/qcow2.h @@ -28,6 +28,7 @@ #include "crypto/block.h" #include "qemu/coroutine.h" #include "qemu/units.h" +#include "block/block_int.h" =20 //#define DEBUG_ALLOC //#define DEBUG_ALLOC2 --=20 2.18.0 From nobody Sat Apr 27 16:23:06 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.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 208.118.235.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 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1542992450257474.25468808021697; Fri, 23 Nov 2018 09:00:50 -0800 (PST) Received: from localhost ([::1]:53460 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gQEos-0005lx-TV for importer@patchew.org; Fri, 23 Nov 2018 12:00:42 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34895) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gQEjm-00088o-C4 for qemu-devel@nongnu.org; Fri, 23 Nov 2018 11:55:28 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gQEje-0002Ck-LH for qemu-devel@nongnu.org; Fri, 23 Nov 2018 11:55:25 -0500 Received: from relay.sw.ru ([185.231.240.75]:34484) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gQEje-00027t-45; Fri, 23 Nov 2018 11:55:18 -0500 Received: from [10.28.8.145] (helo=kvm.sw.ru) by relay.sw.ru with esmtp (Exim 4.91) (envelope-from ) id 1gQEjZ-0003sc-0T; Fri, 23 Nov 2018 19:55:13 +0300 From: Vladimir Sementsov-Ogievskiy To: qemu-devel@nongnu.org, qemu-block@nongnu.org Date: Fri, 23 Nov 2018 19:55:02 +0300 Message-Id: <20181123165511.416480-3-vsementsov@virtuozzo.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20181123165511.416480-1-vsementsov@virtuozzo.com> References: <20181123165511.416480-1-vsementsov@virtuozzo.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 185.231.240.75 Subject: [Qemu-devel] [PATCH 02/11] qcow2: add separate file for threaded data processing functions 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 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" Move compression-on-threads to separate file. Encryption will be in it too. Signed-off-by: Vladimir Sementsov-Ogievskiy --- block/qcow2.h | 7 ++ block/qcow2-threads.c | 197 ++++++++++++++++++++++++++++++++++++++++++ block/qcow2.c | 169 ------------------------------------ block/Makefile.objs | 2 +- 4 files changed, 205 insertions(+), 170 deletions(-) create mode 100644 block/qcow2-threads.c diff --git a/block/qcow2.h b/block/qcow2.h index 5095f893a0..be84d7c96a 100644 --- a/block/qcow2.h +++ b/block/qcow2.h @@ -695,4 +695,11 @@ void qcow2_remove_persistent_dirty_bitmap(BlockDriverS= tate *bs, const char *name, Error **errp); =20 +ssize_t coroutine_fn +qcow2_co_compress(BlockDriverState *bs, void *dest, size_t dest_size, + const void *src, size_t src_size); +ssize_t coroutine_fn +qcow2_co_decompress(BlockDriverState *bs, void *dest, size_t dest_size, + const void *src, size_t src_size); + #endif diff --git a/block/qcow2-threads.c b/block/qcow2-threads.c new file mode 100644 index 0000000000..b75fad6e07 --- /dev/null +++ b/block/qcow2-threads.c @@ -0,0 +1,197 @@ +/* + * Threaded data processing for Qcow2: compression, encryption + * + * Copyright (c) 2004-2006 Fabrice Bellard + * Copyright (c) 2018 Virtuozzo International GmbH. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a= copy + * of this software and associated documentation files (the "Software"), t= o deal + * in the Software without restriction, including without limitation the r= ights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or se= ll + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included= in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS= OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OT= HER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING= FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS = IN + * THE SOFTWARE. + */ + +#include "qemu/osdep.h" + +#define ZLIB_CONST +#include + +#include "qcow2.h" +#include "block/thread-pool.h" + +#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; + +/* + * qcow2_compress() + * + * @dest - destination buffer, @dest_size bytes + * @src - source buffer, @src_size bytes + * + * Returns: compressed size on success + * -1 destination buffer is not enough to store compressed data + * -2 on any other error + */ +static ssize_t qcow2_compress(void *dest, size_t dest_size, + const void *src, size_t src_size) +{ + ssize_t ret; + z_stream strm; + + /* best compression, small window, no zlib header */ + memset(&strm, 0, sizeof(strm)); + ret =3D deflateInit2(&strm, Z_DEFAULT_COMPRESSION, Z_DEFLATED, + -12, 9, Z_DEFAULT_STRATEGY); + if (ret !=3D Z_OK) { + return -2; + } + + /* strm.next_in is not const in old zlib versions, such as those used = on + * OpenBSD/NetBSD, so cast the const away */ + strm.avail_in =3D src_size; + strm.next_in =3D (void *) src; + strm.avail_out =3D dest_size; + strm.next_out =3D dest; + + ret =3D deflate(&strm, Z_FINISH); + if (ret =3D=3D Z_STREAM_END) { + ret =3D dest_size - strm.avail_out; + } else { + ret =3D (ret =3D=3D Z_OK ? -1 : -2); + } + + deflateEnd(&strm); + + return ret; +} + +/* + * qcow2_decompress() + * + * Decompress some data (not more than @src_size bytes) to produce exactly + * @dest_size bytes. + * + * @dest - destination buffer, @dest_size bytes + * @src - source buffer, @src_size bytes + * + * Returns: 0 on success + * -1 on fail + */ +static ssize_t qcow2_decompress(void *dest, size_t dest_size, + const void *src, size_t src_size) +{ + int ret =3D 0; + z_stream strm; + + memset(&strm, 0, sizeof(strm)); + strm.avail_in =3D src_size; + strm.next_in =3D (void *) src; + strm.avail_out =3D dest_size; + strm.next_out =3D dest; + + ret =3D inflateInit2(&strm, -12); + if (ret !=3D Z_OK) { + return -1; + } + + ret =3D inflate(&strm, Z_FINISH); + if ((ret !=3D Z_STREAM_END && ret !=3D Z_BUF_ERROR) || strm.avail_out = !=3D 0) { + /* We approve Z_BUF_ERROR because we need @dest buffer to be fille= d, but + * @src buffer may be processed partly (because in qcow2 we know s= ize of + * compressed data with precision of one sector) */ + ret =3D -1; + } + + inflateEnd(&strm); + + return ret; +} + +static int qcow2_compress_pool_func(void *opaque) +{ + Qcow2CompressData *data =3D opaque; + + data->ret =3D data->func(data->dest, data->dest_size, + data->src, data->src_size); + + return 0; +} + +static void qcow2_compress_complete(void *opaque, int ret) +{ + qemu_coroutine_enter(opaque); +} + +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 f= unc) +{ + BDRVQcow2State *s =3D bs->opaque; + BlockAIOCB *acb; + ThreadPool *pool =3D aio_get_thread_pool(bdrv_get_aio_context(bs)); + Qcow2CompressData arg =3D { + .dest =3D dest, + .dest_size =3D dest_size, + .src =3D src, + .src_size =3D src_size, + .func =3D func, + }; + + while (s->nb_compress_threads >=3D MAX_COMPRESS_THREADS) { + qemu_co_queue_wait(&s->compress_wait_queue, NULL); + } + + s->nb_compress_threads++; + acb =3D thread_pool_submit_aio(pool, qcow2_compress_pool_func, &arg, + qcow2_compress_complete, + qemu_coroutine_self()); + + if (!acb) { + s->nb_compress_threads--; + return -EINVAL; + } + qemu_coroutine_yield(); + s->nb_compress_threads--; + qemu_co_queue_next(&s->compress_wait_queue); + + return arg.ret; +} + +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); +} + +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); +} diff --git a/block/qcow2.c b/block/qcow2.c index 0b5ad13006..3fcb80d747 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -24,9 +24,6 @@ =20 #include "qemu/osdep.h" =20 -#define ZLIB_CONST -#include - #include "block/block_int.h" #include "block/qdict.h" #include "sysemu/block-backend.h" @@ -44,7 +41,6 @@ #include "qapi/qobject-input-visitor.h" #include "qapi/qapi-visit-block-core.h" #include "crypto.h" -#include "block/thread-pool.h" =20 /* Differences with QCOW: @@ -3720,171 +3716,6 @@ fail: return ret; } =20 -/* - * qcow2_compress() - * - * @dest - destination buffer, @dest_size bytes - * @src - source buffer, @src_size bytes - * - * Returns: compressed size on success - * -1 destination buffer is not enough to store compressed data - * -2 on any other error - */ -static ssize_t qcow2_compress(void *dest, size_t dest_size, - const void *src, size_t src_size) -{ - ssize_t ret; - z_stream strm; - - /* best compression, small window, no zlib header */ - memset(&strm, 0, sizeof(strm)); - ret =3D deflateInit2(&strm, Z_DEFAULT_COMPRESSION, Z_DEFLATED, - -12, 9, Z_DEFAULT_STRATEGY); - if (ret !=3D Z_OK) { - return -2; - } - - /* strm.next_in is not const in old zlib versions, such as those used = on - * OpenBSD/NetBSD, so cast the const away */ - strm.avail_in =3D src_size; - strm.next_in =3D (void *) src; - strm.avail_out =3D dest_size; - strm.next_out =3D dest; - - ret =3D deflate(&strm, Z_FINISH); - if (ret =3D=3D Z_STREAM_END) { - ret =3D dest_size - strm.avail_out; - } else { - ret =3D (ret =3D=3D Z_OK ? -1 : -2); - } - - deflateEnd(&strm); - - return ret; -} - -/* - * qcow2_decompress() - * - * Decompress some data (not more than @src_size bytes) to produce exactly - * @dest_size bytes. - * - * @dest - destination buffer, @dest_size bytes - * @src - source buffer, @src_size bytes - * - * Returns: 0 on success - * -1 on fail - */ -static ssize_t qcow2_decompress(void *dest, size_t dest_size, - const void *src, size_t src_size) -{ - int ret =3D 0; - z_stream strm; - - memset(&strm, 0, sizeof(strm)); - strm.avail_in =3D src_size; - strm.next_in =3D (void *) src; - strm.avail_out =3D dest_size; - strm.next_out =3D dest; - - ret =3D inflateInit2(&strm, -12); - if (ret !=3D Z_OK) { - return -1; - } - - ret =3D inflate(&strm, Z_FINISH); - if ((ret !=3D Z_STREAM_END && ret !=3D Z_BUF_ERROR) || strm.avail_out = !=3D 0) { - /* We approve Z_BUF_ERROR because we need @dest buffer to be fille= d, but - * @src buffer may be processed partly (because in qcow2 we know s= ize of - * compressed data with precision of one sector) */ - ret =3D -1; - } - - inflateEnd(&strm); - - return ret; -} - -#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 =3D opaque; - - data->ret =3D data->func(data->dest, data->dest_size, - data->src, data->src_size); - - return 0; -} - -static void qcow2_compress_complete(void *opaque, int ret) -{ - qemu_coroutine_enter(opaque); -} - -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 f= unc) -{ - BDRVQcow2State *s =3D bs->opaque; - BlockAIOCB *acb; - ThreadPool *pool =3D aio_get_thread_pool(bdrv_get_aio_context(bs)); - Qcow2CompressData arg =3D { - .dest =3D dest, - .dest_size =3D dest_size, - .src =3D src, - .src_size =3D src_size, - .func =3D func, - }; - - while (s->nb_compress_threads >=3D MAX_COMPRESS_THREADS) { - qemu_co_queue_wait(&s->compress_wait_queue, NULL); - } - - s->nb_compress_threads++; - acb =3D thread_pool_submit_aio(pool, qcow2_compress_pool_func, &arg, - qcow2_compress_complete, - qemu_coroutine_self()); - - if (!acb) { - s->nb_compress_threads--; - return -EINVAL; - } - qemu_coroutine_yield(); - s->nb_compress_threads--; - qemu_co_queue_next(&s->compress_wait_queue); - - 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 diff --git a/block/Makefile.objs b/block/Makefile.objs index 7a81892a52..ae11605c9f 100644 --- a/block/Makefile.objs +++ b/block/Makefile.objs @@ -6,7 +6,7 @@ block-obj-$(CONFIG_BOCHS) +=3D bochs.o block-obj-$(CONFIG_VVFAT) +=3D vvfat.o block-obj-$(CONFIG_DMG) +=3D dmg.o =20 -block-obj-y +=3D qcow2.o qcow2-refcount.o qcow2-cluster.o qcow2-snapshot.o= qcow2-cache.o qcow2-bitmap.o +block-obj-y +=3D qcow2.o qcow2-refcount.o qcow2-cluster.o qcow2-snapshot.o= qcow2-cache.o qcow2-bitmap.o qcow2-threads.o block-obj-$(CONFIG_QED) +=3D qed.o qed-l2-cache.o qed-table.o qed-cluster.o block-obj-$(CONFIG_QED) +=3D qed-check.o block-obj-y +=3D vhdx.o vhdx-endian.o vhdx-log.o --=20 2.18.0 From nobody Sat Apr 27 16:23:06 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.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 208.118.235.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 (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1542992258651718.9909727846506; Fri, 23 Nov 2018 08:57:38 -0800 (PST) Received: from localhost ([::1]:53445 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gQElm-0002Js-49 for importer@patchew.org; Fri, 23 Nov 2018 11:57:30 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34828) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gQEjj-00083J-KZ for qemu-devel@nongnu.org; Fri, 23 Nov 2018 11:55:25 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gQEje-0002Bs-GL for qemu-devel@nongnu.org; Fri, 23 Nov 2018 11:55:23 -0500 Received: from relay.sw.ru ([185.231.240.75]:34482) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gQEje-00027x-42; Fri, 23 Nov 2018 11:55:18 -0500 Received: from [10.28.8.145] (helo=kvm.sw.ru) by relay.sw.ru with esmtp (Exim 4.91) (envelope-from ) id 1gQEjZ-0003sc-4W; Fri, 23 Nov 2018 19:55:13 +0300 From: Vladimir Sementsov-Ogievskiy To: qemu-devel@nongnu.org, qemu-block@nongnu.org Date: Fri, 23 Nov 2018 19:55:03 +0300 Message-Id: <20181123165511.416480-4-vsementsov@virtuozzo.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20181123165511.416480-1-vsementsov@virtuozzo.com> References: <20181123165511.416480-1-vsementsov@virtuozzo.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 185.231.240.75 Subject: [Qemu-devel] [PATCH 03/11] qcow2-threads: use thread_pool_submit_co 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 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" Use thread_pool_submit_co, instead of reinventing it here. Note, that thread_pool_submit_aio() never returns an error, so checking it was an extra thing. Signed-off-by: Vladimir Sementsov-Ogievskiy --- block/qcow2-threads.c | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/block/qcow2-threads.c b/block/qcow2-threads.c index b75fad6e07..8c10191f2f 100644 --- a/block/qcow2-threads.c +++ b/block/qcow2-threads.c @@ -140,17 +140,11 @@ static int qcow2_compress_pool_func(void *opaque) return 0; } =20 -static void qcow2_compress_complete(void *opaque, int ret) -{ - qemu_coroutine_enter(opaque); -} - 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 f= unc) { BDRVQcow2State *s =3D bs->opaque; - BlockAIOCB *acb; ThreadPool *pool =3D aio_get_thread_pool(bdrv_get_aio_context(bs)); Qcow2CompressData arg =3D { .dest =3D dest, @@ -165,16 +159,9 @@ qcow2_co_do_compress(BlockDriverState *bs, void *dest,= size_t dest_size, } =20 s->nb_compress_threads++; - acb =3D thread_pool_submit_aio(pool, qcow2_compress_pool_func, &arg, - qcow2_compress_complete, - qemu_coroutine_self()); - - if (!acb) { - s->nb_compress_threads--; - return -EINVAL; - } - qemu_coroutine_yield(); + thread_pool_submit_co(pool, qcow2_compress_pool_func, &arg); s->nb_compress_threads--; + qemu_co_queue_next(&s->compress_wait_queue); =20 return arg.ret; --=20 2.18.0 From nobody Sat Apr 27 16:23:06 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.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 208.118.235.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 (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1542992432554856.0609378294887; Fri, 23 Nov 2018 09:00:32 -0800 (PST) Received: from localhost ([::1]:53458 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gQEoW-0005Z5-0W for importer@patchew.org; Fri, 23 Nov 2018 12:00:20 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34896) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gQEjm-00088p-CX for qemu-devel@nongnu.org; Fri, 23 Nov 2018 11:55:27 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gQEje-0002Cr-ML for qemu-devel@nongnu.org; Fri, 23 Nov 2018 11:55:25 -0500 Received: from relay.sw.ru ([185.231.240.75]:34508) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gQEje-00027n-46; Fri, 23 Nov 2018 11:55:18 -0500 Received: from [10.28.8.145] (helo=kvm.sw.ru) by relay.sw.ru with esmtp (Exim 4.91) (envelope-from ) id 1gQEjZ-0003sc-7D; Fri, 23 Nov 2018 19:55:13 +0300 From: Vladimir Sementsov-Ogievskiy To: qemu-devel@nongnu.org, qemu-block@nongnu.org Date: Fri, 23 Nov 2018 19:55:04 +0300 Message-Id: <20181123165511.416480-5-vsementsov@virtuozzo.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20181123165511.416480-1-vsementsov@virtuozzo.com> References: <20181123165511.416480-1-vsementsov@virtuozzo.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 185.231.240.75 Subject: [Qemu-devel] [PATCH 04/11] qcow2: split out data processing threads state from BDRVQcow2State 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 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" 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 --- block/qcow2.h | 8 ++++++-- block/qcow2-threads.c | 11 ++++++----- block/qcow2.c | 2 +- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/block/qcow2.h b/block/qcow2.h index be84d7c96a..abe51a385c 100644 --- a/block/qcow2.h +++ b/block/qcow2.h @@ -257,6 +257,11 @@ typedef struct Qcow2BitmapHeaderExt { uint64_t bitmap_directory_offset; } QEMU_PACKED Qcow2BitmapHeaderExt; =20 +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; =20 - CoQueue compress_wait_queue; - int nb_compress_threads; + Qcow2ThreadsState threads; } BDRVQcow2State; =20 typedef struct Qcow2COWRegion { diff --git a/block/qcow2-threads.c b/block/qcow2-threads.c index 8c10191f2f..028cf3175e 100644 --- a/block/qcow2-threads.c +++ b/block/qcow2-threads.c @@ -145,6 +145,7 @@ qcow2_co_do_compress(BlockDriverState *bs, void *dest, = size_t dest_size, const void *src, size_t src_size, Qcow2CompressFunc f= unc) { BDRVQcow2State *s =3D bs->opaque; + Qcow2ThreadsState *thr =3D &s->threads; ThreadPool *pool =3D aio_get_thread_pool(bdrv_get_aio_context(bs)); Qcow2CompressData arg =3D { .dest =3D dest, @@ -154,15 +155,15 @@ qcow2_co_do_compress(BlockDriverState *bs, void *dest= , size_t dest_size, .func =3D func, }; =20 - while (s->nb_compress_threads >=3D MAX_COMPRESS_THREADS) { - qemu_co_queue_wait(&s->compress_wait_queue, NULL); + while (thr->count >=3D MAX_COMPRESS_THREADS) { + qemu_co_queue_wait(&thr->task_queue, NULL); } =20 - s->nb_compress_threads++; + thr->count++; thread_pool_submit_co(pool, qcow2_compress_pool_func, &arg); - s->nb_compress_threads--; + thr->count--; =20 - qemu_co_queue_next(&s->compress_wait_queue); + qemu_co_queue_next(&thr->task_queue); =20 return arg.ret; } diff --git a/block/qcow2.c b/block/qcow2.c index 3fcb80d747..295ae926ee 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -1600,7 +1600,7 @@ static int coroutine_fn qcow2_do_open(BlockDriverStat= e *bs, QDict *options, } #endif =20 - qemu_co_queue_init(&s->compress_wait_queue); + qemu_co_queue_init(&s->threads.task_queue); =20 return ret; =20 --=20 2.18.0 From nobody Sat Apr 27 16:23:06 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.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 208.118.235.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 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1542992267417768.0266437543062; Fri, 23 Nov 2018 08:57:47 -0800 (PST) Received: from localhost ([::1]:53447 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gQEls-0002MV-A2 for importer@patchew.org; Fri, 23 Nov 2018 11:57:36 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34834) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gQEjj-00083M-Mz for qemu-devel@nongnu.org; Fri, 23 Nov 2018 11:55:25 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gQEje-0002CD-ID for qemu-devel@nongnu.org; Fri, 23 Nov 2018 11:55:23 -0500 Received: from relay.sw.ru ([185.231.240.75]:34510) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gQEje-00027w-44; Fri, 23 Nov 2018 11:55:18 -0500 Received: from [10.28.8.145] (helo=kvm.sw.ru) by relay.sw.ru with esmtp (Exim 4.91) (envelope-from ) id 1gQEjZ-0003sc-Fq; Fri, 23 Nov 2018 19:55:13 +0300 From: Vladimir Sementsov-Ogievskiy To: qemu-devel@nongnu.org, qemu-block@nongnu.org Date: Fri, 23 Nov 2018 19:55:05 +0300 Message-Id: <20181123165511.416480-6-vsementsov@virtuozzo.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20181123165511.416480-1-vsementsov@virtuozzo.com> References: <20181123165511.416480-1-vsementsov@virtuozzo.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 185.231.240.75 Subject: [Qemu-devel] [PATCH 05/11] qcow2-threads: split out generic path 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 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" Move generic part out of qcow2_co_do_compress, to reuse it for encryption and rename things that would be shared with encryption path. Signed-off-by: Vladimir Sementsov-Ogievskiy --- block/qcow2-threads.c | 41 ++++++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/block/qcow2-threads.c b/block/qcow2-threads.c index 028cf3175e..a09f07e2f9 100644 --- a/block/qcow2-threads.c +++ b/block/qcow2-threads.c @@ -31,7 +31,33 @@ #include "qcow2.h" #include "block/thread-pool.h" =20 -#define MAX_COMPRESS_THREADS 4 +#define QCOW2_MAX_THREADS 4 + +static int coroutine_fn +qcow2_co_process(BlockDriverState *bs, ThreadPoolFunc *func, void *arg) +{ + int ret; + BDRVQcow2State *s =3D bs->opaque; + Qcow2ThreadsState *thr =3D &s->threads; + ThreadPool *pool =3D aio_get_thread_pool(bdrv_get_aio_context(bs)); + + while (thr->count >=3D QCOW2_MAX_THREADS) { + qemu_co_queue_wait(&thr->task_queue, NULL); + } + + thr->count++; + ret =3D thread_pool_submit_co(pool, func, arg); + thr->count--; + + qemu_co_queue_next(&thr->task_queue); + + return ret; +} + + +/* + * Compression + */ =20 typedef ssize_t (*Qcow2CompressFunc)(void *dest, size_t dest_size, const void *src, size_t src_size); @@ -144,9 +170,6 @@ 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 f= unc) { - BDRVQcow2State *s =3D bs->opaque; - Qcow2ThreadsState *thr =3D &s->threads; - ThreadPool *pool =3D aio_get_thread_pool(bdrv_get_aio_context(bs)); Qcow2CompressData arg =3D { .dest =3D dest, .dest_size =3D dest_size, @@ -155,15 +178,7 @@ qcow2_co_do_compress(BlockDriverState *bs, void *dest,= size_t dest_size, .func =3D func, }; =20 - while (thr->count >=3D MAX_COMPRESS_THREADS) { - qemu_co_queue_wait(&thr->task_queue, NULL); - } - - thr->count++; - thread_pool_submit_co(pool, qcow2_compress_pool_func, &arg); - thr->count--; - - qemu_co_queue_next(&thr->task_queue); + qcow2_co_process(bs, qcow2_compress_pool_func, &arg); =20 return arg.ret; } --=20 2.18.0 From nobody Sat Apr 27 16:23:06 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.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 208.118.235.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 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1542992823361443.1638858839399; Fri, 23 Nov 2018 09:07:03 -0800 (PST) Received: from localhost ([::1]:53540 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gQEuz-00031q-R5 for importer@patchew.org; Fri, 23 Nov 2018 12:07:01 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34829) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gQEjj-00083K-Kp for qemu-devel@nongnu.org; Fri, 23 Nov 2018 11:55:25 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gQEje-0002Bc-Fv for qemu-devel@nongnu.org; Fri, 23 Nov 2018 11:55:23 -0500 Received: from relay.sw.ru ([185.231.240.75]:34490) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gQEje-00027m-3w; Fri, 23 Nov 2018 11:55:18 -0500 Received: from [10.28.8.145] (helo=kvm.sw.ru) by relay.sw.ru with esmtp (Exim 4.91) (envelope-from ) id 1gQEjZ-0003sc-Kv; Fri, 23 Nov 2018 19:55:13 +0300 From: Vladimir Sementsov-Ogievskiy To: qemu-devel@nongnu.org, qemu-block@nongnu.org Date: Fri, 23 Nov 2018 19:55:06 +0300 Message-Id: <20181123165511.416480-7-vsementsov@virtuozzo.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20181123165511.416480-1-vsementsov@virtuozzo.com> References: <20181123165511.416480-1-vsementsov@virtuozzo.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 185.231.240.75 Subject: [Qemu-devel] [PATCH 06/11] qcow2-threads: add per-thread data 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 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" We'll need per-thread data (crypto blocks) for encryption threads. Prepare threads infrastructure for it. Signed-off-by: Vladimir Sementsov-Ogievskiy --- block/qcow2.h | 6 ++++++ block/qcow2-threads.c | 25 ++++++++++++++++++++++--- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/block/qcow2.h b/block/qcow2.h index abe51a385c..7bef0393ce 100644 --- a/block/qcow2.h +++ b/block/qcow2.h @@ -257,9 +257,15 @@ typedef struct Qcow2BitmapHeaderExt { uint64_t bitmap_directory_offset; } QEMU_PACKED Qcow2BitmapHeaderExt; =20 +#define QCOW2_MAX_THREADS 4 +typedef struct Qcow2PerThreadData { + bool in_use; +} Qcow2PerThreadData; + typedef struct Qcow2ThreadsState { CoQueue task_queue; int count; + Qcow2PerThreadData per_thread[QCOW2_MAX_THREADS]; } Qcow2ThreadsState; =20 typedef struct BDRVQcow2State { diff --git a/block/qcow2-threads.c b/block/qcow2-threads.c index a09f07e2f9..3ed990ef2f 100644 --- a/block/qcow2-threads.c +++ b/block/qcow2-threads.c @@ -31,24 +31,42 @@ #include "qcow2.h" #include "block/thread-pool.h" =20 -#define QCOW2_MAX_THREADS 4 +typedef struct Qcow2ProcessData { + Qcow2PerThreadData *self; + void *arg; +} Qcow2ProcessData; =20 static int coroutine_fn qcow2_co_process(BlockDriverState *bs, ThreadPoolFunc *func, void *arg) { int ret; + int ind; BDRVQcow2State *s =3D bs->opaque; Qcow2ThreadsState *thr =3D &s->threads; ThreadPool *pool =3D aio_get_thread_pool(bdrv_get_aio_context(bs)); + Qcow2ProcessData data =3D { + .arg =3D arg + }; =20 while (thr->count >=3D QCOW2_MAX_THREADS) { qemu_co_queue_wait(&thr->task_queue, NULL); } =20 + for (ind =3D 0; ind < QCOW2_MAX_THREADS; ind++) { + if (!thr->per_thread[ind].in_use) { + data.self =3D &thr->per_thread[ind]; + thr->per_thread[ind].in_use =3D true; + break; + } + } + assert(ind < QCOW2_MAX_THREADS); + thr->count++; - ret =3D thread_pool_submit_co(pool, func, arg); + ret =3D thread_pool_submit_co(pool, func, &data); thr->count--; =20 + thr->per_thread[ind].in_use =3D false; + qemu_co_queue_next(&thr->task_queue); =20 return ret; @@ -158,7 +176,8 @@ static ssize_t qcow2_decompress(void *dest, size_t dest= _size, =20 static int qcow2_compress_pool_func(void *opaque) { - Qcow2CompressData *data =3D opaque; + Qcow2ProcessData *pdata =3D opaque; + Qcow2CompressData *data =3D pdata->arg; =20 data->ret =3D data->func(data->dest, data->dest_size, data->src, data->src_size); --=20 2.18.0 From nobody Sat Apr 27 16:23:06 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.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 208.118.235.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 (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1542992640442273.12989283545573; Fri, 23 Nov 2018 09:04:00 -0800 (PST) Received: from localhost ([::1]:53486 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gQErt-0008UY-TZ for importer@patchew.org; Fri, 23 Nov 2018 12:03:49 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34839) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gQEjj-00083O-PB for qemu-devel@nongnu.org; Fri, 23 Nov 2018 11:55:25 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gQEje-0002CI-J7 for qemu-devel@nongnu.org; Fri, 23 Nov 2018 11:55:23 -0500 Received: from relay.sw.ru ([185.231.240.75]:34496) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gQEje-00027o-43; Fri, 23 Nov 2018 11:55:18 -0500 Received: from [10.28.8.145] (helo=kvm.sw.ru) by relay.sw.ru with esmtp (Exim 4.91) (envelope-from ) id 1gQEjZ-0003sc-Qu; Fri, 23 Nov 2018 19:55:13 +0300 From: Vladimir Sementsov-Ogievskiy To: qemu-devel@nongnu.org, qemu-block@nongnu.org Date: Fri, 23 Nov 2018 19:55:07 +0300 Message-Id: <20181123165511.416480-8-vsementsov@virtuozzo.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20181123165511.416480-1-vsementsov@virtuozzo.com> References: <20181123165511.416480-1-vsementsov@virtuozzo.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 185.231.240.75 Subject: [Qemu-devel] [PATCH 07/11] qcow2-threads: add encryption 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 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" Add thread-based encrypt/decrypt. QCrypto don't support parallel operations with one block, so we need QCryptoBlock for each thread. Signed-off-by: Vladimir Sementsov-Ogievskiy --- block/qcow2.h | 12 +++++++++ block/qcow2-threads.c | 62 +++++++++++++++++++++++++++++++++++++++++++ block/qcow2.c | 57 ++++++++++++++++++++++++++++++++------- 3 files changed, 122 insertions(+), 9 deletions(-) diff --git a/block/qcow2.h b/block/qcow2.h index 7bef0393ce..351ad8d3e7 100644 --- a/block/qcow2.h +++ b/block/qcow2.h @@ -260,6 +260,12 @@ typedef struct Qcow2BitmapHeaderExt { #define QCOW2_MAX_THREADS 4 typedef struct Qcow2PerThreadData { bool in_use; + + /* QCryptoBlock doesn't support parallel operations in threads, so we = can't + * use BDRVQcow2State.crypto and instead we need separate crypto block= for + * each thread. + */ + QCryptoBlock *crypto; } Qcow2PerThreadData; =20 typedef struct Qcow2ThreadsState { @@ -711,5 +717,11 @@ qcow2_co_compress(BlockDriverState *bs, void *dest, si= ze_t dest_size, ssize_t coroutine_fn qcow2_co_decompress(BlockDriverState *bs, void *dest, size_t dest_size, const void *src, size_t src_size); +int coroutine_fn +qcow2_co_encrypt(BlockDriverState *bs, uint64_t file_cluster_offset, + uint64_t offset, void *buf, size_t len); +int coroutine_fn +qcow2_co_decrypt(BlockDriverState *bs, uint64_t file_cluster_offset, + uint64_t offset, void *buf, size_t len); =20 #endif diff --git a/block/qcow2-threads.c b/block/qcow2-threads.c index 3ed990ef2f..0a75c1aead 100644 --- a/block/qcow2-threads.c +++ b/block/qcow2-threads.c @@ -30,6 +30,7 @@ =20 #include "qcow2.h" #include "block/thread-pool.h" +#include "crypto.h" =20 typedef struct Qcow2ProcessData { Qcow2PerThreadData *self; @@ -217,3 +218,64 @@ 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); } + + +/* + * Encryption + */ + +typedef int (*Qcow2EncryptFunc)(QCryptoBlock *block, uint64_t offset, + uint8_t *buf, size_t len, Error **errp); +/* + * encrypt functions are qcrypto_block_encrypt() and qcrypto_block_decrypt= () + */ + +typedef struct Qcow2EncryptData { + uint64_t offset; + uint8_t *buf; + size_t len; + + Qcow2EncryptFunc func; +} Qcow2EncryptData; + +static int qcow2_encrypt_pool_func(void *opaque) +{ + Qcow2ProcessData *pdata =3D opaque; + Qcow2EncryptData *data =3D pdata->arg; + + return data->func(pdata->self->crypto, + data->offset, data->buf, data->len, NULL); +} + +static int coroutine_fn +qcow2_co_do_crypt(BlockDriverState *bs, uint64_t file_cluster_offset, + uint64_t offset, void *buf, size_t len, Qcow2EncryptFunc= func) +{ + BDRVQcow2State *s =3D bs->opaque; + Qcow2EncryptData arg =3D { + .offset =3D s->crypt_physical_offset ? + file_cluster_offset + offset_into_cluster(s, offset)= : + offset, + .buf =3D buf, + .len =3D len, + .func =3D func, + }; + + return qcow2_co_process(bs, qcow2_encrypt_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_do_crypt(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_do_crypt(bs, file_cluster_offset, offset, buf, len, + qcrypto_block_decrypt); +} diff --git a/block/qcow2.c b/block/qcow2.c index 295ae926ee..1e28f17373 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -170,6 +170,47 @@ static ssize_t qcow2_crypto_hdr_write_func(QCryptoBloc= k *block, size_t offset, return ret; } =20 +static void qcow2_crypto_blocks_free(BDRVQcow2State *s) +{ + int i; + + qcrypto_block_free(s->crypto); + s->crypto =3D NULL; + + for (i =3D 0; i < QCOW2_MAX_THREADS; i++) { + qcrypto_block_free(s->threads.per_thread[i].crypto); + s->threads.per_thread[i].crypto =3D NULL; + } +} + +static int qcow2_crypto_blocks_open(BDRVQcow2State *s, + const char *optprefix, + QCryptoBlockReadFunc readfunc, + void *opaque, + unsigned int flags, + Error **errp) +{ + int i; + + s->crypto =3D qcrypto_block_open(s->crypto_opts, optprefix, + readfunc, opaque, flags, errp); + if (!s->crypto) { + qcrypto_block_free(s->crypto); + return -EINVAL; + } + + for (i =3D 0; i < QCOW2_MAX_THREADS; i++) { + s->threads.per_thread[i].crypto =3D + qcrypto_block_open(s->crypto_opts, optprefix, + readfunc, opaque, flags, errp); + if (!s->threads.per_thread[i].crypto) { + qcow2_crypto_blocks_free(s); + return -EINVAL; + } + } + + return 0; +} =20 /*=20 * read qcow2 extension and fill bs @@ -295,11 +336,11 @@ static int qcow2_read_extensions(BlockDriverState *bs= , uint64_t start_offset, if (flags & BDRV_O_NO_IO) { cflags |=3D QCRYPTO_BLOCK_OPEN_NO_IO; } - s->crypto =3D qcrypto_block_open(s->crypto_opts, "encrypt.", + ret =3D qcow2_crypto_blocks_open(s, "encrypt.", qcow2_crypto_hdr_read_func, bs, cflags, errp); - if (!s->crypto) { - return -EINVAL; + if (ret < 0) { + return ret; } } break; =20 @@ -1446,10 +1487,9 @@ static int coroutine_fn qcow2_do_open(BlockDriverSta= te *bs, QDict *options, if (flags & BDRV_O_NO_IO) { cflags |=3D QCRYPTO_BLOCK_OPEN_NO_IO; } - s->crypto =3D qcrypto_block_open(s->crypto_opts, "encrypt.", + ret =3D qcow2_crypto_blocks_open(s, "encrypt.", NULL, NULL, cflags, errp); - if (!s->crypto) { - ret =3D -EINVAL; + if (ret < 0) { goto fail; } } else if (!(flags & BDRV_O_NO_IO)) { @@ -1619,7 +1659,7 @@ static int coroutine_fn qcow2_do_open(BlockDriverStat= e *bs, QDict *options, if (s->refcount_block_cache) { qcow2_cache_destroy(s->refcount_block_cache); } - qcrypto_block_free(s->crypto); + qcow2_crypto_blocks_free(s); qapi_free_QCryptoBlockOpenOptions(s->crypto_opts); return ret; } @@ -2214,8 +2254,7 @@ static void qcow2_close(BlockDriverState *bs) qcow2_cache_destroy(s->l2_table_cache); qcow2_cache_destroy(s->refcount_block_cache); =20 - qcrypto_block_free(s->crypto); - s->crypto =3D NULL; + qcow2_crypto_blocks_free(s); =20 g_free(s->unknown_header_fields); cleanup_unknown_header_ext(bs); --=20 2.18.0 From nobody Sat Apr 27 16:23:06 2024 Delivered-To: importer@patchew.org Received-SPF: temperror (zoho.com: Error in retrieving data from DNS) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=temperror (zoho.com: Error in retrieving data from DNS) 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 (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1542992438309754.2025337806309; Fri, 23 Nov 2018 09:00:38 -0800 (PST) Received: from localhost ([::1]:53459 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gQEob-0005d9-1a for importer@patchew.org; Fri, 23 Nov 2018 12:00:25 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34836) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gQEjj-00083N-O0 for qemu-devel@nongnu.org; Fri, 23 Nov 2018 11:55:25 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gQEje-0002CU-KM for qemu-devel@nongnu.org; Fri, 23 Nov 2018 11:55:23 -0500 Received: from relay.sw.ru ([185.231.240.75]:34500) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gQEje-00027y-3y; Fri, 23 Nov 2018 11:55:18 -0500 Received: from [10.28.8.145] (helo=kvm.sw.ru) by relay.sw.ru with esmtp (Exim 4.91) (envelope-from ) id 1gQEjZ-0003sc-Vz; Fri, 23 Nov 2018 19:55:14 +0300 From: Vladimir Sementsov-Ogievskiy To: qemu-devel@nongnu.org, qemu-block@nongnu.org Date: Fri, 23 Nov 2018 19:55:08 +0300 Message-Id: <20181123165511.416480-9-vsementsov@virtuozzo.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20181123165511.416480-1-vsementsov@virtuozzo.com> References: <20181123165511.416480-1-vsementsov@virtuozzo.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 185.231.240.75 Subject: [Qemu-devel] [PATCH 08/11] qcow2: bdrv_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 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 --- 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(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 @@ -1932,39 +1933,38 @@ 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)) + { + /* No sense in releasing the lock */ + + 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: @@ -1997,11 +1997,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(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(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 From nobody Sat Apr 27 16:23:06 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.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 208.118.235.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 [208.118.235.17]) by mx.zohomail.com with SMTPS id 15429922601091010.8009320595928; Fri, 23 Nov 2018 08:57:40 -0800 (PST) Received: from localhost ([::1]:53446 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gQElr-0002Ls-OW for importer@patchew.org; Fri, 23 Nov 2018 11:57:35 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34842) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gQEjj-00083P-SP for qemu-devel@nongnu.org; Fri, 23 Nov 2018 11:55:25 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gQEje-0002CN-IL for qemu-devel@nongnu.org; Fri, 23 Nov 2018 11:55:23 -0500 Received: from relay.sw.ru ([185.231.240.75]:34492) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gQEje-00027s-41; Fri, 23 Nov 2018 11:55:18 -0500 Received: from [10.28.8.145] (helo=kvm.sw.ru) by relay.sw.ru with esmtp (Exim 4.91) (envelope-from ) id 1gQEja-0003sc-5g; Fri, 23 Nov 2018 19:55:14 +0300 From: Vladimir Sementsov-Ogievskiy To: qemu-devel@nongnu.org, qemu-block@nongnu.org Date: Fri, 23 Nov 2018 19:55:09 +0300 Message-Id: <20181123165511.416480-10-vsementsov@virtuozzo.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20181123165511.416480-1-vsementsov@virtuozzo.com> References: <20181123165511.416480-1-vsementsov@virtuozzo.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 185.231.240.75 Subject: [Qemu-devel] [PATCH 09/11] qcow2: qcow2_co_preadv: skip using hd_qiov when possible 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 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" qemu_iovec_memset has @offset parameter, so using hd_qiov for it is not needed. Signed-off-by: Vladimir Sementsov-Ogievskiy --- block/qcow2.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/block/qcow2.c b/block/qcow2.c index 5467089cfe..bbd6df3614 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -1928,18 +1928,13 @@ static coroutine_fn int qcow2_co_preadv(BlockDriver= State *bs, uint64_t offset, goto fail; } =20 - offset_in_cluster =3D offset_into_cluster(s, offset); - - qemu_iovec_reset(&hd_qiov); - qemu_iovec_concat(&hd_qiov, qiov, bytes_done, cur_bytes); - if (ret =3D=3D QCOW2_CLUSTER_ZERO_PLAIN || ret =3D=3D QCOW2_CLUSTER_ZERO_ALLOC || (ret =3D=3D QCOW2_CLUSTER_UNALLOCATED && !bs->backing)) { /* No sense in releasing the lock */ =20 - qemu_iovec_memset(&hd_qiov, 0, 0, cur_bytes); + qemu_iovec_memset(qiov, bytes_done, 0, cur_bytes); =20 bytes -=3D cur_bytes; offset +=3D cur_bytes; @@ -1947,6 +1942,11 @@ static coroutine_fn int qcow2_co_preadv(BlockDriverS= tate *bs, uint64_t offset, continue; } =20 + offset_in_cluster =3D offset_into_cluster(s, offset); + + qemu_iovec_reset(&hd_qiov); + qemu_iovec_concat(&hd_qiov, qiov, bytes_done, cur_bytes); + qemu_co_mutex_unlock(&s->lock); =20 switch (ret) { --=20 2.18.0 From nobody Sat Apr 27 16:23:06 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.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 208.118.235.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 (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1542992664632909.0059172250305; Fri, 23 Nov 2018 09:04:24 -0800 (PST) Received: from localhost ([::1]:53489 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gQEsJ-0000uB-HA for importer@patchew.org; Fri, 23 Nov 2018 12:04:15 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35065) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gQEk1-0000Wh-0H for qemu-devel@nongnu.org; Fri, 23 Nov 2018 11:55:41 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gQEk0-0002ph-6T for qemu-devel@nongnu.org; Fri, 23 Nov 2018 11:55:40 -0500 Received: from relay.sw.ru ([185.231.240.75]:34514) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gQEjz-000280-Ll; Fri, 23 Nov 2018 11:55:40 -0500 Received: from [10.28.8.145] (helo=kvm.sw.ru) by relay.sw.ru with esmtp (Exim 4.91) (envelope-from ) id 1gQEja-0003sc-JB; Fri, 23 Nov 2018 19:55:14 +0300 From: Vladimir Sementsov-Ogievskiy To: qemu-devel@nongnu.org, qemu-block@nongnu.org Date: Fri, 23 Nov 2018 19:55:10 +0300 Message-Id: <20181123165511.416480-11-vsementsov@virtuozzo.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20181123165511.416480-1-vsementsov@virtuozzo.com> References: <20181123165511.416480-1-vsementsov@virtuozzo.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 185.231.240.75 Subject: [Qemu-devel] [PATCH 10/11] qcow2: bdrv_co_pwritev: move encryption code out of the lock 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 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" Encryption will be done in threads, to take benefit of it, we should move it out of the lock first. Signed-off-by: Vladimir Sementsov-Ogievskiy --- block/qcow2.c | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/block/qcow2.c b/block/qcow2.c index bbd6df3614..3fa7e3ea27 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -2118,11 +2118,20 @@ static coroutine_fn int qcow2_co_pwritev(BlockDrive= rState *bs, uint64_t offset, ret =3D qcow2_alloc_cluster_offset(bs, offset, &cur_bytes, &cluster_offset, &l2meta); if (ret < 0) { - goto fail; + goto out_locked; } =20 assert((cluster_offset & 511) =3D=3D 0); =20 + ret =3D qcow2_pre_write_overlap_check(bs, 0, + cluster_offset + offset_in_clu= ster, + cur_bytes); + if (ret < 0) { + goto out_locked; + } + + qemu_co_mutex_unlock(&s->lock); + qemu_iovec_reset(&hd_qiov); qemu_iovec_concat(&hd_qiov, qiov, bytes_done, cur_bytes); =20 @@ -2134,7 +2143,7 @@ static coroutine_fn int qcow2_co_pwritev(BlockDriverS= tate *bs, uint64_t offset, * s->cluster_size); if (cluster_data =3D=3D NULL) { ret =3D -ENOMEM; - goto fail; + goto out_unlocked; } } =20 @@ -2149,40 +2158,34 @@ static coroutine_fn int qcow2_co_pwritev(BlockDrive= rState *bs, uint64_t offset, cluster_data, cur_bytes, NULL) < 0) { ret =3D -EIO; - goto fail; + goto out_unlocked; } =20 qemu_iovec_reset(&hd_qiov); qemu_iovec_add(&hd_qiov, cluster_data, cur_bytes); } =20 - ret =3D qcow2_pre_write_overlap_check(bs, 0, - cluster_offset + offset_in_cluster, cur_bytes); - if (ret < 0) { - goto fail; - } - /* If we need to do COW, check if it's possible to merge the * writing of the guest data together with that of the COW regions. * If it's not possible (or not necessary) then write the * guest data now. */ if (!merge_cow(offset, cur_bytes, &hd_qiov, l2meta)) { - qemu_co_mutex_unlock(&s->lock); BLKDBG_EVENT(bs->file, BLKDBG_WRITE_AIO); trace_qcow2_writev_data(qemu_coroutine_self(), cluster_offset + offset_in_cluster); ret =3D bdrv_co_pwritev(bs->file, cluster_offset + offset_in_cluster, cur_bytes, &hd_qiov, 0); - qemu_co_mutex_lock(&s->lock); if (ret < 0) { - goto fail; + goto out_unlocked; } } =20 + qemu_co_mutex_lock(&s->lock); + ret =3D qcow2_handle_l2meta(bs, &l2meta, true); if (ret) { - goto fail; + goto out_locked; } =20 bytes -=3D cur_bytes; @@ -2191,8 +2194,12 @@ static coroutine_fn int qcow2_co_pwritev(BlockDriver= State *bs, uint64_t offset, trace_qcow2_writev_done_part(qemu_coroutine_self(), cur_bytes); } ret =3D 0; + goto out_locked; =20 -fail: +out_unlocked: + qemu_co_mutex_lock(&s->lock); + +out_locked: qcow2_handle_l2meta(bs, &l2meta, false); =20 qemu_co_mutex_unlock(&s->lock); --=20 2.18.0 From nobody Sat Apr 27 16:23:06 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.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 208.118.235.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 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1542992255505149.066161335865; Fri, 23 Nov 2018 08:57:35 -0800 (PST) Received: from localhost ([::1]:53444 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gQElm-0002J7-9l for importer@patchew.org; Fri, 23 Nov 2018 11:57:30 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34843) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gQEjj-00083Q-SV for qemu-devel@nongnu.org; Fri, 23 Nov 2018 11:55:25 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gQEje-0002CZ-J0 for qemu-devel@nongnu.org; Fri, 23 Nov 2018 11:55:23 -0500 Received: from relay.sw.ru ([185.231.240.75]:34518) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gQEje-00027p-48; Fri, 23 Nov 2018 11:55:18 -0500 Received: from [10.28.8.145] (helo=kvm.sw.ru) by relay.sw.ru with esmtp (Exim 4.91) (envelope-from ) id 1gQEja-0003sc-Ox; Fri, 23 Nov 2018 19:55:14 +0300 From: Vladimir Sementsov-Ogievskiy To: qemu-devel@nongnu.org, qemu-block@nongnu.org Date: Fri, 23 Nov 2018 19:55:11 +0300 Message-Id: <20181123165511.416480-12-vsementsov@virtuozzo.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20181123165511.416480-1-vsementsov@virtuozzo.com> References: <20181123165511.416480-1-vsementsov@virtuozzo.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 185.231.240.75 Subject: [Qemu-devel] [PATCH 11/11] qcow2: do encryption in threads 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 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" Do encryption/decryption in threads, like it is already done for compression. This improves asynchronous encrypted io. Signed-off-by: Vladimir Sementsov-Ogievskiy --- block/qcow2.c | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/block/qcow2.c b/block/qcow2.c index 3fa7e3ea27..a7d77a2178 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -2007,13 +2007,8 @@ static coroutine_fn int qcow2_co_preadv(BlockDriverS= tate *bs, uint64_t offset, assert(s->crypto); assert((offset & (BDRV_SECTOR_SIZE - 1)) =3D=3D 0); assert((cur_bytes & (BDRV_SECTOR_SIZE - 1)) =3D=3D 0); - if (qcrypto_block_decrypt(s->crypto, - (s->crypt_physical_offset ? - cluster_offset + offset_in_clus= ter : - offset), - cluster_data, - cur_bytes, - NULL) < 0) { + if (qcow2_co_decrypt(bs, cluster_offset, offset, + cluster_data, cur_bytes) < 0) { ret =3D -EIO; goto fail; } @@ -2151,12 +2146,8 @@ static coroutine_fn int qcow2_co_pwritev(BlockDriver= State *bs, uint64_t offset, QCOW_MAX_CRYPT_CLUSTERS * s->cluster_size); qemu_iovec_to_buf(&hd_qiov, 0, cluster_data, hd_qiov.size); =20 - if (qcrypto_block_encrypt(s->crypto, - (s->crypt_physical_offset ? - cluster_offset + offset_in_cluster : - offset), - cluster_data, - cur_bytes, NULL) < 0) { + if (qcow2_co_encrypt(bs, cluster_offset, offset, + cluster_data, cur_bytes) < 0) { ret =3D -EIO; goto out_unlocked; } --=20 2.18.0