From nobody Mon May 6 14:29:39 2024 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 ARC-Seal: i=1; a=rsa-sha256; t=1565165382; cv=none; d=zoho.com; s=zohoarc; b=Plo++h7wppaX2fPeJU4YeUa+JlukwcyV0QcsVxUvF3AKbUMEr2rHMlr0lwhCNaud1/H0FWfIWVa30Uy6ToRaQf8fLklaEC8Lbyzgsg+FdFRAKYFKQv3/hW5wFDw9A/Kh0LSBtXMafft/nLfmeRxaMpGNfHbb5LnhGNIW6cUjQCM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1565165382; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=l8ebXgz4SZ2CSO7sOP4VT2XdIPHSPYJWsZxD9YmIp1A=; b=hQFL6Q6D7fAfK4ZunssFlsTvpVc5e6s0xgfecoCqo8GjPrV5cdGmT54/rOgh5ME0tA1RoykzNuIRx8YYU0NXS84KbArWcRfsAkCA3pi7efeLO2n4IdBAhYN2WTRR4csaJuTcZ7jPJsVUYodpXTqDqNwgA9z8xqrp7SWowyyv5DU= ARC-Authentication-Results: i=1; mx.zoho.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 header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 156516538231364.5237920299038; Wed, 7 Aug 2019 01:09:42 -0700 (PDT) Received: from localhost ([::1]:38112 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hvH0v-0004RO-Cb for importer@patchew.org; Wed, 07 Aug 2019 04:09:41 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:40455) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hvGzG-0008CP-9c for qemu-devel@nongnu.org; Wed, 07 Aug 2019 04:07:59 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hvGzF-0006s6-1P for qemu-devel@nongnu.org; Wed, 07 Aug 2019 04:07:58 -0400 Received: from relay.sw.ru ([185.231.240.75]:53642) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hvGzC-0006oL-8Q; Wed, 07 Aug 2019 04:07:54 -0400 Received: from [10.94.3.0] (helo=kvm.qa.sw.ru) by relay.sw.ru with esmtp (Exim 4.92) (envelope-from ) id 1hvGz8-000300-JG; Wed, 07 Aug 2019 11:07:50 +0300 From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Date: Wed, 7 Aug 2019 11:07:43 +0300 Message-Id: <20190807080750.15950-2-vsementsov@virtuozzo.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20190807080750.15950-1-vsementsov@virtuozzo.com> References: <20190807080750.15950-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 1/8] block/backup: deal with zero detection X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: fam@euphon.net, kwolf@redhat.com, vsementsov@virtuozzo.com, armbru@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com, stefanha@redhat.com, den@openvz.org, jsnow@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" We have detect_zeroes option, so at least for blockdev-backup user should define it if zero-detection is needed. For drive-backup leave detection enabled by default but do it through existing option instead of open-coding. Signed-off-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Max Reitz --- block/backup.c | 15 ++++++--------- blockdev.c | 8 ++++---- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/block/backup.c b/block/backup.c index 2073db279f..526897350d 100644 --- a/block/backup.c +++ b/block/backup.c @@ -113,7 +113,10 @@ static int coroutine_fn backup_cow_with_bounce_buffer(= BackupBlockJob *job, BlockBackend *blk =3D job->common.blk; int nbytes; int read_flags =3D is_write_notifier ? BDRV_REQ_NO_SERIALISING : 0; - int write_flags =3D job->serialize_target_writes ? BDRV_REQ_SERIALISIN= G : 0; + int write_flags =3D + (job->serialize_target_writes ? BDRV_REQ_SERIALISING : 0) | + (job->compress ? BDRV_REQ_WRITE_COMPRESSED : 0); + =20 assert(QEMU_IS_ALIGNED(start, job->cluster_size)); bdrv_reset_dirty_bitmap(job->copy_bitmap, start, job->cluster_size); @@ -131,14 +134,8 @@ static int coroutine_fn backup_cow_with_bounce_buffer(= BackupBlockJob *job, goto fail; } =20 - if (buffer_is_zero(*bounce_buffer, nbytes)) { - ret =3D blk_co_pwrite_zeroes(job->target, start, - nbytes, write_flags | BDRV_REQ_MAY_UNMA= P); - } else { - ret =3D blk_co_pwrite(job->target, start, - nbytes, *bounce_buffer, write_flags | - (job->compress ? BDRV_REQ_WRITE_COMPRESSED : 0= )); - } + ret =3D blk_co_pwrite(job->target, start, nbytes, *bounce_buffer, + write_flags); if (ret < 0) { trace_backup_do_cow_write_fail(job, start, ret); if (error_is_read) { diff --git a/blockdev.c b/blockdev.c index 29c6c6044a..2d7e7be538 100644 --- a/blockdev.c +++ b/blockdev.c @@ -3613,7 +3613,7 @@ static BlockJob *do_drive_backup(DriveBackup *backup,= JobTxn *txn, BlockDriverState *source =3D NULL; BlockJob *job =3D NULL; AioContext *aio_context; - QDict *options =3D NULL; + QDict *options; Error *local_err =3D NULL; int flags; int64_t size; @@ -3686,10 +3686,10 @@ static BlockJob *do_drive_backup(DriveBackup *backu= p, JobTxn *txn, goto out; } =20 + options =3D qdict_new(); + qdict_put_str(options, "discard", "unmap"); + qdict_put_str(options, "detect-zeroes", "unmap"); if (backup->format) { - if (!options) { - options =3D qdict_new(); - } qdict_put_str(options, "driver", backup->format); } =20 --=20 2.18.0 From nobody Mon May 6 14:29:39 2024 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 ARC-Seal: i=1; a=rsa-sha256; t=1565165333; cv=none; d=zoho.com; s=zohoarc; b=SZes/kgwWv9MLB0shWj2/s6+21Fx0FJUcMcIZGAfYTNx2fgEFTzHwvuPYzPtTZmyE93xPlyxStBNNJSHZrJsxoAr6IXXTjzj9VZkOgt+VfL7dqtWs3WL8IbqIqmZ9azk3ib/vQZnrEChvn2GsgyFwwLcCULqZWAL4Hqqcfg8f/g= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1565165333; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=txz/KRi+ZTYUxuqXS25xcF9oF4/OZVTh5L6JaszE+Yg=; b=f7KsBUezVgWHU714TMuj2PEFGLT/YCozOAvZqYYVgpbIcTjNwfV+q0948DxK5uuIicgjmkfK+XsjbAGJ6g/XQBWkeNj4UaI+uYvJxCBFXnBeQ3NwkIa8HSOGYuEXSVQ3LoPngxFBcApX6SaRRLLG32nyYe6mWbkVNncMqN+yVNg= ARC-Authentication-Results: i=1; mx.zoho.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 header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1565165333088966.1206519997776; Wed, 7 Aug 2019 01:08:53 -0700 (PDT) Received: from localhost ([::1]:38092 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hvH05-0001qM-0o for importer@patchew.org; Wed, 07 Aug 2019 04:08:49 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:40445) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hvGzG-0008CJ-5O for qemu-devel@nongnu.org; Wed, 07 Aug 2019 04:07:59 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hvGzF-0006sC-1X for qemu-devel@nongnu.org; Wed, 07 Aug 2019 04:07:58 -0400 Received: from relay.sw.ru ([185.231.240.75]:53652) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hvGzC-0006oR-7K; Wed, 07 Aug 2019 04:07:54 -0400 Received: from [10.94.3.0] (helo=kvm.qa.sw.ru) by relay.sw.ru with esmtp (Exim 4.92) (envelope-from ) id 1hvGz8-000300-Mn; Wed, 07 Aug 2019 11:07:50 +0300 From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Date: Wed, 7 Aug 2019 11:07:44 +0300 Message-Id: <20190807080750.15950-3-vsementsov@virtuozzo.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20190807080750.15950-1-vsementsov@virtuozzo.com> References: <20190807080750.15950-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 2/8] block/backup: refactor write_flags X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: fam@euphon.net, kwolf@redhat.com, vsementsov@virtuozzo.com, armbru@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com, stefanha@redhat.com, den@openvz.org, jsnow@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" write flags are constant, let's store it in BackupBlockJob instead of recalculating. It also makes two boolean fields to be unused, so, drop them. Signed-off-by: Vladimir Sementsov-Ogievskiy Reviewed-by: John Snow Reviewed-by: Max Reitz --- block/backup.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/block/backup.c b/block/backup.c index 526897350d..3cdbe973e6 100644 --- a/block/backup.c +++ b/block/backup.c @@ -50,14 +50,13 @@ typedef struct BackupBlockJob { uint64_t len; uint64_t bytes_read; int64_t cluster_size; - bool compress; NotifierWithReturn before_write; QLIST_HEAD(, CowRequest) inflight_reqs; =20 bool use_copy_range; int64_t copy_range_size; =20 - bool serialize_target_writes; + BdrvRequestFlags write_flags; bool initializing_bitmap; } BackupBlockJob; =20 @@ -113,10 +112,6 @@ static int coroutine_fn backup_cow_with_bounce_buffer(= BackupBlockJob *job, BlockBackend *blk =3D job->common.blk; int nbytes; int read_flags =3D is_write_notifier ? BDRV_REQ_NO_SERIALISING : 0; - int write_flags =3D - (job->serialize_target_writes ? BDRV_REQ_SERIALISING : 0) | - (job->compress ? BDRV_REQ_WRITE_COMPRESSED : 0); - =20 assert(QEMU_IS_ALIGNED(start, job->cluster_size)); bdrv_reset_dirty_bitmap(job->copy_bitmap, start, job->cluster_size); @@ -135,7 +130,7 @@ static int coroutine_fn backup_cow_with_bounce_buffer(B= ackupBlockJob *job, } =20 ret =3D blk_co_pwrite(job->target, start, nbytes, *bounce_buffer, - write_flags); + job->write_flags); if (ret < 0) { trace_backup_do_cow_write_fail(job, start, ret); if (error_is_read) { @@ -163,7 +158,6 @@ static int coroutine_fn backup_cow_with_offload(BackupB= lockJob *job, BlockBackend *blk =3D job->common.blk; int nbytes; int read_flags =3D is_write_notifier ? BDRV_REQ_NO_SERIALISING : 0; - int write_flags =3D job->serialize_target_writes ? BDRV_REQ_SERIALISIN= G : 0; =20 assert(QEMU_IS_ALIGNED(job->copy_range_size, job->cluster_size)); assert(QEMU_IS_ALIGNED(start, job->cluster_size)); @@ -172,7 +166,7 @@ static int coroutine_fn backup_cow_with_offload(BackupB= lockJob *job, bdrv_reset_dirty_bitmap(job->copy_bitmap, start, job->cluster_size * nr_clusters); ret =3D blk_co_copy_range(blk, start, job->target, start, nbytes, - read_flags, write_flags); + read_flags, job->write_flags); if (ret < 0) { trace_backup_do_cow_copy_range_fail(job, start, ret); bdrv_set_dirty_bitmap(job->copy_bitmap, start, @@ -748,10 +742,16 @@ BlockJob *backup_job_create(const char *job_id, Block= DriverState *bs, job->sync_mode =3D sync_mode; job->sync_bitmap =3D sync_bitmap; job->bitmap_mode =3D bitmap_mode; - job->compress =3D compress; =20 - /* Detect image-fleecing (and similar) schemes */ - job->serialize_target_writes =3D bdrv_chain_contains(target, bs); + /* + * Set write flags: + * 1. Detect image-fleecing (and similar) schemes + * 2. Handle compression + */ + job->write_flags =3D + (bdrv_chain_contains(target, bs) ? BDRV_REQ_SERIALISING : 0) | + (compress ? BDRV_REQ_WRITE_COMPRESSED : 0); + job->cluster_size =3D cluster_size; job->copy_bitmap =3D copy_bitmap; copy_bitmap =3D NULL; --=20 2.18.0 From nobody Mon May 6 14:29:39 2024 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 ARC-Seal: i=1; a=rsa-sha256; t=1565165430; cv=none; d=zoho.com; s=zohoarc; b=iEdg89S0SpO8Xiq63RpP/VORvsa8g3+5KTf8IgyCcAQ2HZef4+usMHoytBkmEbHH2t6h+427XGrHY6vrM46l1kEmznHqqkKa0NFQHSgdz08oljRgLp8U7EuvRZgZn239G16sA0n8wxaRYnAggZev+EuG8WGVqSRs0vf/cmWwNCY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1565165430; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=OwWOI+w9VwKc28rpsiQfRxjmOYmF8nOjsHe6xorsVzI=; b=C0iIsC+4fRxlXi/+6qHjbSgLhfLpiwlPDItf+zUFU0u3Gsgwz262ks8J7sdd1s8PcGM/zrTKVvfXuNQR4lLxXWV3rwTd+OKbBeahBN/Mr2bw32QZ/gfs6jN7iYqqIvMiQlGgMse02j62ccLSYk9AX5UpD9Q7kaj9euHsRUoc00M= ARC-Authentication-Results: i=1; mx.zoho.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 header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 156516543004175.43612689960923; Wed, 7 Aug 2019 01:10:30 -0700 (PDT) Received: from localhost ([::1]:38128 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hvH1h-0006qK-4a for importer@patchew.org; Wed, 07 Aug 2019 04:10:29 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:40465) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hvGzG-0008DA-Jc for qemu-devel@nongnu.org; Wed, 07 Aug 2019 04:07:59 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hvGzF-0006sP-5M for qemu-devel@nongnu.org; Wed, 07 Aug 2019 04:07:58 -0400 Received: from relay.sw.ru ([185.231.240.75]:53644) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hvGzC-0006oQ-8L; Wed, 07 Aug 2019 04:07:54 -0400 Received: from [10.94.3.0] (helo=kvm.qa.sw.ru) by relay.sw.ru with esmtp (Exim 4.92) (envelope-from ) id 1hvGz8-000300-PH; Wed, 07 Aug 2019 11:07:50 +0300 From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Date: Wed, 7 Aug 2019 11:07:45 +0300 Message-Id: <20190807080750.15950-4-vsementsov@virtuozzo.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20190807080750.15950-1-vsementsov@virtuozzo.com> References: <20190807080750.15950-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 3/8] block/io: handle alignment and max_transfer for copy_range X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: fam@euphon.net, kwolf@redhat.com, vsementsov@virtuozzo.com, armbru@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com, stefanha@redhat.com, den@openvz.org, jsnow@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" copy_range ignores these limitations, let's improve it. block/backup code handles max_transfer for copy_range by itself, now it's not needed more, drop it. Signed-off-by: Vladimir Sementsov-Ogievskiy --- block/backup.c | 11 ++--------- block/io.c | 41 +++++++++++++++++++++++++++++++++-------- 2 files changed, 35 insertions(+), 17 deletions(-) diff --git a/block/backup.c b/block/backup.c index 3cdbe973e6..11e27c844d 100644 --- a/block/backup.c +++ b/block/backup.c @@ -54,7 +54,6 @@ typedef struct BackupBlockJob { QLIST_HEAD(, CowRequest) inflight_reqs; =20 bool use_copy_range; - int64_t copy_range_size; =20 BdrvRequestFlags write_flags; bool initializing_bitmap; @@ -156,12 +155,11 @@ static int coroutine_fn backup_cow_with_offload(Backu= pBlockJob *job, int ret; int nr_clusters; BlockBackend *blk =3D job->common.blk; - int nbytes; + int nbytes =3D end - start; int read_flags =3D is_write_notifier ? BDRV_REQ_NO_SERIALISING : 0; =20 - assert(QEMU_IS_ALIGNED(job->copy_range_size, job->cluster_size)); + assert(end - start < INT_MAX); assert(QEMU_IS_ALIGNED(start, job->cluster_size)); - nbytes =3D MIN(job->copy_range_size, end - start); nr_clusters =3D DIV_ROUND_UP(nbytes, job->cluster_size); bdrv_reset_dirty_bitmap(job->copy_bitmap, start, job->cluster_size * nr_clusters); @@ -756,11 +754,6 @@ BlockJob *backup_job_create(const char *job_id, BlockD= riverState *bs, job->copy_bitmap =3D copy_bitmap; copy_bitmap =3D NULL; job->use_copy_range =3D !compress; /* compression isn't supported for = it */ - job->copy_range_size =3D MIN_NON_ZERO(blk_get_max_transfer(job->common= .blk), - blk_get_max_transfer(job->target)); - job->copy_range_size =3D MAX(job->cluster_size, - QEMU_ALIGN_UP(job->copy_range_size, - job->cluster_size)); =20 /* Required permissions are already taken with target's blk_new() */ block_job_add_bdrv(&job->common, "target", target, 0, BLK_PERM_ALL, diff --git a/block/io.c b/block/io.c index 06305c6ea6..5abbd0fff2 100644 --- a/block/io.c +++ b/block/io.c @@ -3005,6 +3005,12 @@ static int coroutine_fn bdrv_co_copy_range_internal( { BdrvTrackedRequest req; int ret; + uint32_t align =3D MAX(src->bs->bl.request_alignment, + dst->bs->bl.request_alignment); + uint32_t max_transfer =3D + QEMU_ALIGN_DOWN(MIN_NON_ZERO(MIN_NON_ZERO(src->bs->bl.max_tran= sfer, + dst->bs->bl.max_tran= sfer), + INT_MAX), align); =20 /* TODO We can support BDRV_REQ_NO_FALLBACK here */ assert(!(read_flags & BDRV_REQ_NO_FALLBACK)); @@ -3031,7 +3037,10 @@ static int coroutine_fn bdrv_co_copy_range_internal( =20 if (!src->bs->drv->bdrv_co_copy_range_from || !dst->bs->drv->bdrv_co_copy_range_to - || src->bs->encrypted || dst->bs->encrypted) { + || src->bs->encrypted || dst->bs->encrypted || + !QEMU_IS_ALIGNED(src_offset, src->bs->bl.request_alignment) || + !QEMU_IS_ALIGNED(dst_offset, dst->bs->bl.request_alignment) || + !QEMU_IS_ALIGNED(bytes, align)) { return -ENOTSUP; } =20 @@ -3046,11 +3055,22 @@ static int coroutine_fn bdrv_co_copy_range_internal( wait_serialising_requests(&req); } =20 - ret =3D src->bs->drv->bdrv_co_copy_range_from(src->bs, - src, src_offset, - dst, dst_offset, - bytes, - read_flags, write_flag= s); + while (bytes) { + int num =3D MIN(bytes, max_transfer); + + ret =3D src->bs->drv->bdrv_co_copy_range_from(src->bs, + src, src_offset, + dst, dst_offset, + num, + read_flags, + write_flags); + if (ret < 0) { + break; + } + bytes -=3D num; + src_offset +=3D num; + dst_offset +=3D num; + } =20 tracked_request_end(&req); bdrv_dec_in_flight(src->bs); @@ -3060,12 +3080,17 @@ static int coroutine_fn bdrv_co_copy_range_internal( BDRV_TRACKED_WRITE); ret =3D bdrv_co_write_req_prepare(dst, dst_offset, bytes, &req, write_flags); - if (!ret) { + while (!ret && bytes) { + int num =3D MIN(bytes, max_transfer); + ret =3D dst->bs->drv->bdrv_co_copy_range_to(dst->bs, src, src_offset, dst, dst_offset, - bytes, + num, read_flags, write_fl= ags); + bytes -=3D num; + src_offset +=3D num; + dst_offset +=3D num; } bdrv_co_write_req_finish(dst, dst_offset, bytes, &req, ret); tracked_request_end(&req); --=20 2.18.0 From nobody Mon May 6 14:29:39 2024 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 ARC-Seal: i=1; a=rsa-sha256; t=1565165379; cv=none; d=zoho.com; s=zohoarc; b=PQLr66hMO1OzWucVFS3toHh3wx1LKSnLz0KPO/Vy6EDFPj1CFpNtTmEERf3Ca9IbOjhxgo4BO1k5xv2A5I1/Q9cRLBdkJ7qm/UA3DUUXqQlB2qRRJGtkBZw/BBTL3JJTQIchw3bUHvrlnn6aCpNwzEZ707tBAHAD2RSeCwSbHs0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1565165379; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=oQ4Ifk+NDD8escA3zyNpEmBQXJVDsg/jMPOLcoOCq58=; b=cLvJdNCD4AdsqHKuYZgfdFrQRLRYOotIz6E3YW5I9vyKfkHVfRIuo5JaFn4F37RoQGzRPtRaOxfVTNweb01BtZnB0ZHmDLIEu1dNm78a2pejY1VTUj6WTn69lEnFndjtwoGtGhFaVhD90S0ZVBwmry3Jb40RxqxKuxqX7xZsovE= ARC-Authentication-Results: i=1; mx.zoho.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 header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1565165379283440.8948311023356; Wed, 7 Aug 2019 01:09:39 -0700 (PDT) Received: from localhost ([::1]:38108 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hvH0q-0004Ag-8a for importer@patchew.org; Wed, 07 Aug 2019 04:09:36 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:40460) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hvGzG-0008Cr-G5 for qemu-devel@nongnu.org; Wed, 07 Aug 2019 04:07:59 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hvGzF-0006sj-C4 for qemu-devel@nongnu.org; Wed, 07 Aug 2019 04:07:58 -0400 Received: from relay.sw.ru ([185.231.240.75]:53658) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hvGzC-0006oS-61; Wed, 07 Aug 2019 04:07:54 -0400 Received: from [10.94.3.0] (helo=kvm.qa.sw.ru) by relay.sw.ru with esmtp (Exim 4.92) (envelope-from ) id 1hvGz8-000300-Sj; Wed, 07 Aug 2019 11:07:50 +0300 From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Date: Wed, 7 Aug 2019 11:07:46 +0300 Message-Id: <20190807080750.15950-5-vsementsov@virtuozzo.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20190807080750.15950-1-vsementsov@virtuozzo.com> References: <20190807080750.15950-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 4/8] block/backup: improve unallocated clusters skipping X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: fam@euphon.net, kwolf@redhat.com, vsementsov@virtuozzo.com, armbru@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com, stefanha@redhat.com, den@openvz.org, jsnow@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" Limit block_status querying to request bounds on write notifier to avoid extra seeking. Signed-off-by: Vladimir Sementsov-Ogievskiy --- block/backup.c | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/block/backup.c b/block/backup.c index 11e27c844d..a4d37d2d62 100644 --- a/block/backup.c +++ b/block/backup.c @@ -180,14 +180,14 @@ static int coroutine_fn backup_cow_with_offload(Backu= pBlockJob *job, * return via pnum the number of contiguous clusters sharing this allocati= on. */ static int backup_is_cluster_allocated(BackupBlockJob *s, int64_t offset, - int64_t *pnum) + int64_t bytes, int64_t *pnum) { BlockDriverState *bs =3D blk_bs(s->common.blk); int64_t count, total_count =3D 0; - int64_t bytes =3D s->len - offset; int ret; =20 assert(QEMU_IS_ALIGNED(offset, s->cluster_size)); + bytes =3D MIN(s->len - offset, bytes); =20 while (true) { ret =3D bdrv_is_allocated(bs, offset, bytes, &count); @@ -224,12 +224,13 @@ static int backup_is_cluster_allocated(BackupBlockJob= *s, int64_t offset, * 1 otherwise, and -ret on error. */ static int64_t backup_bitmap_reset_unallocated(BackupBlockJob *s, - int64_t offset, int64_t *co= unt) + int64_t offset, int64_t byt= es, + int64_t *pnum) { int ret; - int64_t clusters, bytes, estimate; + int64_t clusters, estimate; =20 - ret =3D backup_is_cluster_allocated(s, offset, &clusters); + ret =3D backup_is_cluster_allocated(s, offset, bytes, &clusters); if (ret < 0) { return ret; } @@ -242,7 +243,7 @@ static int64_t backup_bitmap_reset_unallocated(BackupBl= ockJob *s, job_progress_set_remaining(&s->common.job, estimate); } =20 - *count =3D bytes; + *pnum =3D bytes; return ret; } =20 @@ -255,7 +256,6 @@ static int coroutine_fn backup_do_cow(BackupBlockJob *j= ob, int ret =3D 0; int64_t start, end; /* bytes */ void *bounce_buffer =3D NULL; - int64_t skip_bytes; =20 qemu_co_rwlock_rdlock(&job->flush_rwlock); =20 @@ -267,6 +267,18 @@ static int coroutine_fn backup_do_cow(BackupBlockJob *= job, wait_for_overlapping_requests(job, start, end); cow_request_begin(&cow_request, job, start, end); =20 + if (job->initializing_bitmap) { + int64_t off, chunk; + + for (off =3D offset; offset < end; offset +=3D chunk) { + ret =3D backup_bitmap_reset_unallocated(job, off, end - off, &= chunk); + if (ret < 0) { + chunk =3D job->cluster_size; + } + } + } + ret =3D 0; + while (start < end) { int64_t dirty_end; =20 @@ -276,15 +288,6 @@ static int coroutine_fn backup_do_cow(BackupBlockJob *= job, continue; /* already copied */ } =20 - if (job->initializing_bitmap) { - ret =3D backup_bitmap_reset_unallocated(job, start, &skip_byte= s); - if (ret =3D=3D 0) { - trace_backup_do_cow_skip_range(job, start, skip_bytes); - start +=3D skip_bytes; - continue; - } - } - dirty_end =3D bdrv_dirty_bitmap_next_zero(job->copy_bitmap, start, end - start); if (dirty_end < 0) { @@ -546,7 +549,8 @@ static int coroutine_fn backup_run(Job *job, Error **er= rp) goto out; } =20 - ret =3D backup_bitmap_reset_unallocated(s, offset, &count); + ret =3D backup_bitmap_reset_unallocated(s, offset, s->len - of= fset, + &count); if (ret < 0) { goto out; } --=20 2.18.0 From nobody Mon May 6 14:29:39 2024 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 ARC-Seal: i=1; a=rsa-sha256; t=1565165380; cv=none; d=zoho.com; s=zohoarc; b=KyGwzzhSqxtZ7/cEzYkT5+xVOMKyxZb1eObLDUo7/6ToCmAT7beVfVnVBSbrN978ihlVmBqeDgdJZ+XBhafRz61oXxzEcaMqKkvT+2Kp2Of+1s6JS0BYpHvU/RIM930EWvrOQn+l9DZouvSjSzP6uGNmRGxSNEivVFs1a8OLHxg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1565165380; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=O5QOTiTtHyA2VH5yDTztrpUtRZGl4Ly2Ynmvuxryiy8=; b=kWG8juMwhrCxwLAJuYCPyEQHCQUoK0Js673Va9LmFSdQLySNmh9X3pUKf/DQxIbkhYILsRAYTRCBGLwJ55hpkEyVtHtYLJn+OiV5izlxt4nPyLbxcYTXHGHtPjs98yQtMABi6d5S5fQp1GUes992ZOfvBx8hpZ9/V+fhJlKgH1I= ARC-Authentication-Results: i=1; mx.zoho.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 header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1565165380083664.419926799557; Wed, 7 Aug 2019 01:09:40 -0700 (PDT) Received: from localhost ([::1]:38110 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hvH0r-0004Dh-1r for importer@patchew.org; Wed, 07 Aug 2019 04:09:37 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:40421) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hvGzF-0008CF-Nm for qemu-devel@nongnu.org; Wed, 07 Aug 2019 04:07:58 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hvGzE-0006rw-SZ for qemu-devel@nongnu.org; Wed, 07 Aug 2019 04:07:57 -0400 Received: from relay.sw.ru ([185.231.240.75]:53660) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hvGzC-0006oO-8N; Wed, 07 Aug 2019 04:07:54 -0400 Received: from [10.94.3.0] (helo=kvm.qa.sw.ru) by relay.sw.ru with esmtp (Exim 4.92) (envelope-from ) id 1hvGz8-000300-Vy; Wed, 07 Aug 2019 11:07:51 +0300 From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Date: Wed, 7 Aug 2019 11:07:47 +0300 Message-Id: <20190807080750.15950-6-vsementsov@virtuozzo.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20190807080750.15950-1-vsementsov@virtuozzo.com> References: <20190807080750.15950-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 5/8] block/backup: fix backup_cow_with_offload for last cluster X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: fam@euphon.net, kwolf@redhat.com, vsementsov@virtuozzo.com, armbru@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com, stefanha@redhat.com, den@openvz.org, jsnow@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" We shouldn't try to copy bytes beyond EOF. Fix it. Signed-off-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Max Reitz --- block/backup.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/block/backup.c b/block/backup.c index a4d37d2d62..eb41e4af4f 100644 --- a/block/backup.c +++ b/block/backup.c @@ -155,7 +155,7 @@ static int coroutine_fn backup_cow_with_offload(BackupB= lockJob *job, int ret; int nr_clusters; BlockBackend *blk =3D job->common.blk; - int nbytes =3D end - start; + int nbytes =3D MIN(end - start, job->len - start); int read_flags =3D is_write_notifier ? BDRV_REQ_NO_SERIALISING : 0; =20 assert(end - start < INT_MAX); --=20 2.18.0 From nobody Mon May 6 14:29:39 2024 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 ARC-Seal: i=1; a=rsa-sha256; t=1565165331; cv=none; d=zoho.com; s=zohoarc; b=OB/GXxDN7C8fud5D8mdxDUDajCvC45ZoWm+AK3QppxYJpq14JQnrRp1JiybUPZOhbQVqjxenCUcL/koW0ZFeVpdrxXWekKFwcYaxR0lQC9TVlfGR3Z+S1J521n2RtMkuuP9GvYFbDOKgn9trFvqEWP/uv1Y9Fqd7tskKdkX5qQI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1565165331; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=bHaGyX208ICAHMyJtR5KJz5+h8Q3zKsN7njkRHNKLbs=; b=cD4Ox75Q6BYtF4zafgISofX5aw/HaQTUwvhoL2ihMCCAQuZqMd1nNMbIgnWoTl5KeRRuA56Eog4Daa9sSnTA000IslaAM2jU2buDGUImF8POzydjPPuL9mrlYS8q0rC7qZ5oIxCV4S+Am2KJWymskLJogqjMkUN+jZiBimWMCzo= ARC-Authentication-Results: i=1; mx.zoho.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 header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1565165331745545.2888193237768; Wed, 7 Aug 2019 01:08:51 -0700 (PDT) Received: from localhost ([::1]:38090 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hvH00-0001bf-2i for importer@patchew.org; Wed, 07 Aug 2019 04:08:44 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:40459) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hvGzG-0008Cp-Fh for qemu-devel@nongnu.org; Wed, 07 Aug 2019 04:07:59 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hvGzF-0006sd-AL for qemu-devel@nongnu.org; Wed, 07 Aug 2019 04:07:58 -0400 Received: from relay.sw.ru ([185.231.240.75]:53632) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hvGzC-0006oM-8X; Wed, 07 Aug 2019 04:07:54 -0400 Received: from [10.94.3.0] (helo=kvm.qa.sw.ru) by relay.sw.ru with esmtp (Exim 4.92) (envelope-from ) id 1hvGz9-000300-2g; Wed, 07 Aug 2019 11:07:51 +0300 From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Date: Wed, 7 Aug 2019 11:07:48 +0300 Message-Id: <20190807080750.15950-7-vsementsov@virtuozzo.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20190807080750.15950-1-vsementsov@virtuozzo.com> References: <20190807080750.15950-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 6/8] block/backup: teach backup_cow_with_bounce_buffer to copy more at once X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: fam@euphon.net, kwolf@redhat.com, vsementsov@virtuozzo.com, armbru@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com, stefanha@redhat.com, den@openvz.org, jsnow@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" backup_cow_with_offload can transfer more than on cluster. Let backup_cow_with_bounce_buffer behave similarly. It reduces number of IO and there are no needs to copy cluster by cluster. Signed-off-by: Vladimir Sementsov-Ogievskiy --- block/backup.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/block/backup.c b/block/backup.c index eb41e4af4f..c765c073ad 100644 --- a/block/backup.c +++ b/block/backup.c @@ -104,22 +104,24 @@ static int coroutine_fn backup_cow_with_bounce_buffer= (BackupBlockJob *job, int64_t start, int64_t end, bool is_write_notifi= er, - bool *error_is_read, - void **bounce_buffer) + bool *error_is_read) { int ret; BlockBackend *blk =3D job->common.blk; int nbytes; int read_flags =3D is_write_notifier ? BDRV_REQ_NO_SERIALISING : 0; + void *bounce_buffer =3D blk_try_blockalign(blk, end); =20 - assert(QEMU_IS_ALIGNED(start, job->cluster_size)); - bdrv_reset_dirty_bitmap(job->copy_bitmap, start, job->cluster_size); - nbytes =3D MIN(job->cluster_size, job->len - start); - if (!*bounce_buffer) { - *bounce_buffer =3D blk_blockalign(blk, job->cluster_size); + if (!bounce_buffer) { + return -ENOMEM; } =20 - ret =3D blk_co_pread(blk, start, nbytes, *bounce_buffer, read_flags); + assert(QEMU_IS_ALIGNED(start, job->cluster_size)); + bdrv_reset_dirty_bitmap(job->copy_bitmap, start, end - start); + + nbytes =3D MIN(end - start, job->len - start); + + ret =3D blk_co_pread(blk, start, nbytes, bounce_buffer, read_flags); if (ret < 0) { trace_backup_do_cow_read_fail(job, start, ret); if (error_is_read) { @@ -128,7 +130,7 @@ static int coroutine_fn backup_cow_with_bounce_buffer(B= ackupBlockJob *job, goto fail; } =20 - ret =3D blk_co_pwrite(job->target, start, nbytes, *bounce_buffer, + ret =3D blk_co_pwrite(job->target, start, nbytes, bounce_buffer, job->write_flags); if (ret < 0) { trace_backup_do_cow_write_fail(job, start, ret); @@ -138,9 +140,12 @@ static int coroutine_fn backup_cow_with_bounce_buffer(= BackupBlockJob *job, goto fail; } =20 + qemu_vfree(bounce_buffer); return nbytes; + fail: bdrv_set_dirty_bitmap(job->copy_bitmap, start, job->cluster_size); + qemu_vfree(bounce_buffer); return ret; =20 } @@ -255,7 +260,6 @@ static int coroutine_fn backup_do_cow(BackupBlockJob *j= ob, CowRequest cow_request; int ret =3D 0; int64_t start, end; /* bytes */ - void *bounce_buffer =3D NULL; =20 qemu_co_rwlock_rdlock(&job->flush_rwlock); =20 @@ -306,7 +310,7 @@ static int coroutine_fn backup_do_cow(BackupBlockJob *j= ob, if (!job->use_copy_range) { ret =3D backup_cow_with_bounce_buffer(job, start, dirty_end, is_write_notifier, - error_is_read, &bounce_buf= fer); + error_is_read); } if (ret < 0) { break; @@ -321,10 +325,6 @@ static int coroutine_fn backup_do_cow(BackupBlockJob *= job, ret =3D 0; } =20 - if (bounce_buffer) { - qemu_vfree(bounce_buffer); - } - cow_request_end(&cow_request); =20 trace_backup_do_cow_return(job, offset, bytes, ret); --=20 2.18.0 From nobody Mon May 6 14:29:39 2024 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 ARC-Seal: i=1; a=rsa-sha256; t=1565165429; cv=none; d=zoho.com; s=zohoarc; b=gkMmVgGKUn9pqvkHt72pAbvoKgv74eu8BX0VvWaPM2oB0rBi/yNGOOiGiXhX8aJLjmogSFVkrb3RD0t0SbyVjEpqPigaw2993K3PNLAbTKengHEA6zWf1lJhMFY2S4m0cFfCSoLXOftHQENMnwTiv4TCdj+RJZF72y0o8Y7DZA4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1565165429; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=Tv4mQ9raiLne49+XLFKjimARPa+EHPBveNKg4SdRASc=; b=FlyJBf8fNhYPtRjyelYIJBd+dEppmHVreRWTc2FUBT76na1yjAJ9GqZ1+DQ7CQ1laC9DjiC4qv+bDSkDfmGFqyqbf7fuR9FfnTA2SSItHIdAncphh1YPgC2by6NAnzQ8sorqurgmpu4doYvDCd25S1eLQhDrazJwcD4730fzfHo= ARC-Authentication-Results: i=1; mx.zoho.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 header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1565165429612864.3856049686601; Wed, 7 Aug 2019 01:10:29 -0700 (PDT) Received: from localhost ([::1]:38126 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hvH1g-0006ok-MC for importer@patchew.org; Wed, 07 Aug 2019 04:10:28 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:40467) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hvGzG-0008DW-Lt for qemu-devel@nongnu.org; Wed, 07 Aug 2019 04:08:00 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hvGzF-0006sq-Cw for qemu-devel@nongnu.org; Wed, 07 Aug 2019 04:07:58 -0400 Received: from relay.sw.ru ([185.231.240.75]:53630) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hvGzC-0006oN-8W; Wed, 07 Aug 2019 04:07:54 -0400 Received: from [10.94.3.0] (helo=kvm.qa.sw.ru) by relay.sw.ru with esmtp (Exim 4.92) (envelope-from ) id 1hvGz9-000300-5v; Wed, 07 Aug 2019 11:07:51 +0300 From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Date: Wed, 7 Aug 2019 11:07:49 +0300 Message-Id: <20190807080750.15950-8-vsementsov@virtuozzo.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20190807080750.15950-1-vsementsov@virtuozzo.com> References: <20190807080750.15950-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 7/8] block/backup: merge duplicated logic into backup_do_cow X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: fam@euphon.net, kwolf@redhat.com, vsementsov@virtuozzo.com, armbru@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com, stefanha@redhat.com, den@openvz.org, jsnow@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" backup_cow_with_offload and backup_cow_with_bounce_buffer contains a lot of duplicated logic. Move it into backup_do_cow. Signed-off-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Max Reitz --- block/backup.c | 83 +++++++++++++++++++------------------------------- 1 file changed, 31 insertions(+), 52 deletions(-) diff --git a/block/backup.c b/block/backup.c index c765c073ad..f19c9195fe 100644 --- a/block/backup.c +++ b/block/backup.c @@ -100,84 +100,60 @@ static void cow_request_end(CowRequest *req) =20 /* Copy range to target with a bounce buffer and return the bytes copied. = If * error occurred, return a negative error number */ -static int coroutine_fn backup_cow_with_bounce_buffer(BackupBlockJob *job, - int64_t start, - int64_t end, - bool is_write_notifi= er, - bool *error_is_read) +static int coroutine_fn backup_cow_with_bounce_buffer( + BackupBlockJob *job, int64_t offset, int64_t bytes, + BdrvRequestFlags read_flags, bool *error_is_read) { - int ret; + int ret =3D 0; BlockBackend *blk =3D job->common.blk; - int nbytes; - int read_flags =3D is_write_notifier ? BDRV_REQ_NO_SERIALISING : 0; - void *bounce_buffer =3D blk_try_blockalign(blk, end); + void *bounce_buffer =3D blk_try_blockalign(blk, bytes); =20 if (!bounce_buffer) { return -ENOMEM; } =20 - assert(QEMU_IS_ALIGNED(start, job->cluster_size)); - bdrv_reset_dirty_bitmap(job->copy_bitmap, start, end - start); - - nbytes =3D MIN(end - start, job->len - start); - - ret =3D blk_co_pread(blk, start, nbytes, bounce_buffer, read_flags); + ret =3D blk_co_pread(blk, offset, bytes, bounce_buffer, read_flags); if (ret < 0) { - trace_backup_do_cow_read_fail(job, start, ret); + trace_backup_do_cow_read_fail(job, offset, ret); if (error_is_read) { *error_is_read =3D true; } - goto fail; + goto out; } =20 - ret =3D blk_co_pwrite(job->target, start, nbytes, bounce_buffer, + ret =3D blk_co_pwrite(job->target, offset, bytes, bounce_buffer, job->write_flags); if (ret < 0) { - trace_backup_do_cow_write_fail(job, start, ret); + trace_backup_do_cow_write_fail(job, offset, ret); if (error_is_read) { *error_is_read =3D false; } - goto fail; + goto out; } =20 +out: qemu_vfree(bounce_buffer); - return nbytes; =20 -fail: - bdrv_set_dirty_bitmap(job->copy_bitmap, start, job->cluster_size); - qemu_vfree(bounce_buffer); return ret; - } =20 /* Copy range to target and return the bytes copied. If error occurred, re= turn a * negative error number. */ static int coroutine_fn backup_cow_with_offload(BackupBlockJob *job, - int64_t start, - int64_t end, - bool is_write_notifier) + int64_t offset, + int64_t bytes, + BdrvRequestFlags read_flag= s) { int ret; - int nr_clusters; BlockBackend *blk =3D job->common.blk; - int nbytes =3D MIN(end - start, job->len - start); - int read_flags =3D is_write_notifier ? BDRV_REQ_NO_SERIALISING : 0; - - assert(end - start < INT_MAX); - assert(QEMU_IS_ALIGNED(start, job->cluster_size)); - nr_clusters =3D DIV_ROUND_UP(nbytes, job->cluster_size); - bdrv_reset_dirty_bitmap(job->copy_bitmap, start, - job->cluster_size * nr_clusters); - ret =3D blk_co_copy_range(blk, start, job->target, start, nbytes, + + ret =3D blk_co_copy_range(blk, offset, job->target, offset, bytes, read_flags, job->write_flags); if (ret < 0) { - trace_backup_do_cow_copy_range_fail(job, start, ret); - bdrv_set_dirty_bitmap(job->copy_bitmap, start, - job->cluster_size * nr_clusters); - return ret; + trace_backup_do_cow_copy_range_fail(job, offset, ret); } =20 - return nbytes; + return ret; } =20 /* @@ -260,6 +236,8 @@ static int coroutine_fn backup_do_cow(BackupBlockJob *j= ob, CowRequest cow_request; int ret =3D 0; int64_t start, end; /* bytes */ + BdrvRequestFlags read_flags =3D + is_write_notifier ? BDRV_REQ_NO_SERIALISING : 0; =20 qemu_co_rwlock_rdlock(&job->flush_rwlock); =20 @@ -285,6 +263,7 @@ static int coroutine_fn backup_do_cow(BackupBlockJob *j= ob, =20 while (start < end) { int64_t dirty_end; + int64_t cur_bytes; =20 if (!bdrv_dirty_bitmap_get(job->copy_bitmap, start)) { trace_backup_do_cow_skip(job, start); @@ -299,30 +278,30 @@ static int coroutine_fn backup_do_cow(BackupBlockJob = *job, } =20 trace_backup_do_cow_process(job, start); + cur_bytes =3D MIN(dirty_end - start, job->len - start); + bdrv_reset_dirty_bitmap(job->copy_bitmap, start, dirty_end - start= ); =20 if (job->use_copy_range) { - ret =3D backup_cow_with_offload(job, start, dirty_end, - is_write_notifier); + ret =3D backup_cow_with_offload(job, start, cur_bytes, read_fl= ags); if (ret < 0) { job->use_copy_range =3D false; } } if (!job->use_copy_range) { - ret =3D backup_cow_with_bounce_buffer(job, start, dirty_end, - is_write_notifier, - error_is_read); + ret =3D backup_cow_with_bounce_buffer(job, start, cur_bytes, + read_flags, error_is_read); } if (ret < 0) { + bdrv_set_dirty_bitmap(job->copy_bitmap, start, dirty_end - sta= rt); break; } =20 /* Publish progress, guest I/O counts as progress too. Note that = the * offset field is an opaque progress value, it is not a disk offs= et. */ - start +=3D ret; - job->bytes_read +=3D ret; - job_progress_update(&job->common.job, ret); - ret =3D 0; + start +=3D cur_bytes; + job->bytes_read +=3D cur_bytes; + job_progress_update(&job->common.job, cur_bytes); } =20 cow_request_end(&cow_request); --=20 2.18.0 From nobody Mon May 6 14:29:39 2024 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 ARC-Seal: i=1; a=rsa-sha256; t=1565165435; cv=none; d=zoho.com; s=zohoarc; b=hCFlTjLAXOo8iFykJ3RLmdwhPlqwTVeSHXjLoOmBcw4GyBihiBcszoedmqxSapMmFKcp8FPwCzU63BL0bjy1UAB7Kj1CFzY7asRkhDGs6fNM7EWBgMkxcgcr8uqn8yvcIgGfvUYdpEb8DOmkMZBb+filFDb1XaRVEJpCjhdneFU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1565165435; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=0ljHLPi2K+zCuXV6WUyemUJM0AW9kmX4xZ+YP4AtVfg=; b=Gi6FcRoc/yuUcykOP1XhUAEYufl+MEFE6WhrqS4V85oZeEUhToeSNGIkiune8xinKj3pBZAkfFd+BUTtcDHZY/MHCu2j45fFsxJ6ba4cDRLAI9qx3M24OHC1WE6RVfEK1RUaG0HyBmcT0UVIZYY9cGTB5czrxJx7vCt2KqvXv0s= ARC-Authentication-Results: i=1; mx.zoho.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 header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 156516543524928.61663141726308; Wed, 7 Aug 2019 01:10:35 -0700 (PDT) Received: from localhost ([::1]:38130 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hvH1m-00073d-Aq for importer@patchew.org; Wed, 07 Aug 2019 04:10:34 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:40458) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hvGzG-0008Co-Ff for qemu-devel@nongnu.org; Wed, 07 Aug 2019 04:07:59 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hvGzF-0006sY-AB for qemu-devel@nongnu.org; Wed, 07 Aug 2019 04:07:58 -0400 Received: from relay.sw.ru ([185.231.240.75]:53648) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hvGzC-0006oK-8M; Wed, 07 Aug 2019 04:07:54 -0400 Received: from [10.94.3.0] (helo=kvm.qa.sw.ru) by relay.sw.ru with esmtp (Exim 4.92) (envelope-from ) id 1hvGz9-000300-8d; Wed, 07 Aug 2019 11:07:51 +0300 From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Date: Wed, 7 Aug 2019 11:07:50 +0300 Message-Id: <20190807080750.15950-9-vsementsov@virtuozzo.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20190807080750.15950-1-vsementsov@virtuozzo.com> References: <20190807080750.15950-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 8/8] block/backup: backup_do_cow: use bdrv_dirty_bitmap_next_dirty_area X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: fam@euphon.net, kwolf@redhat.com, vsementsov@virtuozzo.com, armbru@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com, stefanha@redhat.com, den@openvz.org, jsnow@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" Use effective bdrv_dirty_bitmap_next_dirty_area interface. Signed-off-by: Vladimir Sementsov-Ogievskiy --- block/backup.c | 56 ++++++++++++++++++++++---------------------------- 1 file changed, 24 insertions(+), 32 deletions(-) diff --git a/block/backup.c b/block/backup.c index f19c9195fe..5ede0c8290 100644 --- a/block/backup.c +++ b/block/backup.c @@ -235,25 +235,28 @@ static int coroutine_fn backup_do_cow(BackupBlockJob = *job, { CowRequest cow_request; int ret =3D 0; - int64_t start, end; /* bytes */ + uint64_t off, cur_bytes; + int64_t aligned_offset, aligned_bytes, aligned_end; BdrvRequestFlags read_flags =3D is_write_notifier ? BDRV_REQ_NO_SERIALISING : 0; =20 qemu_co_rwlock_rdlock(&job->flush_rwlock); =20 - start =3D QEMU_ALIGN_DOWN(offset, job->cluster_size); - end =3D QEMU_ALIGN_UP(bytes + offset, job->cluster_size); + aligned_offset =3D QEMU_ALIGN_DOWN(offset, job->cluster_size); + aligned_end =3D QEMU_ALIGN_UP(bytes + offset, job->cluster_size); + aligned_bytes =3D aligned_end - aligned_offset; =20 - trace_backup_do_cow_enter(job, start, offset, bytes); + trace_backup_do_cow_enter(job, aligned_offset, offset, bytes); =20 - wait_for_overlapping_requests(job, start, end); - cow_request_begin(&cow_request, job, start, end); + wait_for_overlapping_requests(job, aligned_offset, aligned_end); + cow_request_begin(&cow_request, job, aligned_offset, aligned_end); =20 if (job->initializing_bitmap) { - int64_t off, chunk; + int64_t chunk; =20 - for (off =3D offset; offset < end; offset +=3D chunk) { - ret =3D backup_bitmap_reset_unallocated(job, off, end - off, &= chunk); + for (off =3D aligned_offset; off < aligned_end; off +=3D chunk) { + ret =3D backup_bitmap_reset_unallocated(job, off, aligned_end = - off, + &chunk); if (ret < 0) { chunk =3D job->cluster_size; } @@ -261,47 +264,36 @@ static int coroutine_fn backup_do_cow(BackupBlockJob = *job, } ret =3D 0; =20 - while (start < end) { - int64_t dirty_end; - int64_t cur_bytes; - - if (!bdrv_dirty_bitmap_get(job->copy_bitmap, start)) { - trace_backup_do_cow_skip(job, start); - start +=3D job->cluster_size; - continue; /* already copied */ - } - - dirty_end =3D bdrv_dirty_bitmap_next_zero(job->copy_bitmap, start, - end - start); - if (dirty_end < 0) { - dirty_end =3D end; - } - - trace_backup_do_cow_process(job, start); - cur_bytes =3D MIN(dirty_end - start, job->len - start); - bdrv_reset_dirty_bitmap(job->copy_bitmap, start, dirty_end - start= ); + off =3D aligned_offset; + cur_bytes =3D aligned_bytes; + while (bdrv_dirty_bitmap_next_dirty_area(job->copy_bitmap, + &off, &cur_bytes)) + { + trace_backup_do_cow_process(job, off); + bdrv_reset_dirty_bitmap(job->copy_bitmap, off, cur_bytes); =20 if (job->use_copy_range) { - ret =3D backup_cow_with_offload(job, start, cur_bytes, read_fl= ags); + ret =3D backup_cow_with_offload(job, off, cur_bytes, read_flag= s); if (ret < 0) { job->use_copy_range =3D false; } } if (!job->use_copy_range) { - ret =3D backup_cow_with_bounce_buffer(job, start, cur_bytes, + ret =3D backup_cow_with_bounce_buffer(job, off, cur_bytes, read_flags, error_is_read); } if (ret < 0) { - bdrv_set_dirty_bitmap(job->copy_bitmap, start, dirty_end - sta= rt); + bdrv_set_dirty_bitmap(job->copy_bitmap, off, cur_bytes); break; } =20 /* Publish progress, guest I/O counts as progress too. Note that = the * offset field is an opaque progress value, it is not a disk offs= et. */ - start +=3D cur_bytes; + off +=3D cur_bytes; job->bytes_read +=3D cur_bytes; job_progress_update(&job->common.job, cur_bytes); + cur_bytes =3D offset + bytes - off; } =20 cow_request_end(&cow_request); --=20 2.18.0