From nobody Mon Feb 9 02:15:16 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1590332554; cv=none; d=zohomail.com; s=zohoarc; b=mmWAZqQ5+ITc7Nfqub/zcV4R6apIpkhmgXOhoYKsq67nGxtHxb99AApUqE/YVjFg+5xJtQygyWWxSQmngBxQT+H1+s8yvaWLh2WZqc5PibSC3H9eZ9FJ+1KFBevQaPh5Bf6HyzFhcRmfvhvKRvAilIs3y+VtHVeOAcPGbqzOUsM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1590332554; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=//w0RWG0HTTNwsZSH8Y3F78WOUGFQck1pgrxaNq9wA0=; b=eo36v4HdiNkh7/3ekiU1sEgqdoV70jlHed4F1xCl+s0YVbTsYpctB1XZO+lP+gKnChpohe20t9CkGQeccS/Lb2tX+I147mGvhG2ktcBptoA3s2EuxJZJMxA109rAKTN4nTLx6fvgwsIB72xZUhOBNV2GzuKskhC9i6n8SsWs5tw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1590332554650636.9130461779774; Sun, 24 May 2020 08:02:34 -0700 (PDT) Received: from localhost ([::1]:57684 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jcs93-0003hG-8K for importer@patchew.org; Sun, 24 May 2020 11:02:33 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45806) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jcrzx-0002uA-S3; Sun, 24 May 2020 10:53:09 -0400 Received: from fanzine.igalia.com ([178.60.130.6]:37973) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1jcrzw-0002le-9O; Sun, 24 May 2020 10:53:09 -0400 Received: from [81.0.38.199] (helo=perseus.local) by fanzine.igalia.com with esmtpsa (Cipher TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim) id 1jcrzF-0007GW-Kk; Sun, 24 May 2020 16:52:25 +0200 Received: from berto by perseus.local with local (Exim 4.92) (envelope-from ) id 1jcryv-0005Kg-BE; Sun, 24 May 2020 16:52:05 +0200 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=igalia.com; s=20170329; h=Content-Transfer-Encoding:MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From; bh=//w0RWG0HTTNwsZSH8Y3F78WOUGFQck1pgrxaNq9wA0=; b=YrXt6dIP8cKX8MD/uSULUAydo6B7JDvToPSxuJq0qRTz5JnpV095gAjRpcBt+DKwqNYSUNt94wtVzA+fG1oEfkdeaLnge+v6238AKugbrOiaMH8aOT/8UPKRlILGhd4gOMyl7LRgE0gw2NQLJNAmcC01GNU2rJ8jE7Ro5ixaYyy5Sn8+YVy2G79lJ9kQESb3GBy5QpLIUKhjZz7glFLpO4SMsvuwGNoAinBg27A6VZwtNXJxbt0ROkPbt90auH9rl46ShPyY+BGs5ycbWdtZbhj+r6S2rIgIsYRR2pIBGrP4IBbaupA+mtTgPB2JCSp55TsqGVozaNaP4dhikiP7KA==; From: Alberto Garcia To: qemu-devel@nongnu.org Subject: [PATCH v6 22/32] qcow2: Add subcluster support to zero_in_l2_slice() Date: Sun, 24 May 2020 16:51:42 +0200 Message-Id: <987f0f761b05286a40a24008e32f376184bdddb2.1590331741.git.berto@igalia.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=178.60.130.6; envelope-from=berto@igalia.com; helo=fanzine.igalia.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/05/24 10:52:20 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x (no timestamps) [generic] [fuzzy] X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_PASS=-0.001, URIBL_BLOCKED=0.001 autolearn=_AUTOLEARN X-Spam_action: no action 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: Kevin Wolf , Vladimir Sementsov-Ogievskiy , Alberto Garcia , qemu-block@nongnu.org, Derek Su , Max Reitz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" The QCOW_OFLAG_ZERO bit that indicates that a cluster reads as zeroes is only used in standard L2 entries. Extended L2 entries use individual 'all zeroes' bits for each subcluster. This must be taken into account when updating the L2 entry and also when deciding that an existing entry does not need to be updated. Signed-off-by: Alberto Garcia --- block/qcow2-cluster.c | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c index 2f3bd3a882..4e59bbd545 100644 --- a/block/qcow2-cluster.c +++ b/block/qcow2-cluster.c @@ -1956,7 +1956,6 @@ static int zero_in_l2_slice(BlockDriverState *bs, uin= t64_t offset, int l2_index; int ret; int i; - bool unmap =3D !!(flags & BDRV_REQ_MAY_UNMAP); =20 ret =3D get_cluster_table(bs, offset, &l2_slice, &l2_index); if (ret < 0) { @@ -1968,28 +1967,31 @@ static int zero_in_l2_slice(BlockDriverState *bs, u= int64_t offset, assert(nb_clusters <=3D INT_MAX); =20 for (i =3D 0; i < nb_clusters; i++) { - uint64_t old_offset; - QCow2ClusterType cluster_type; + uint64_t old_l2_entry =3D get_l2_entry(s, l2_slice, l2_index + i); + uint64_t old_l2_bitmap =3D get_l2_bitmap(s, l2_slice, l2_index + i= ); + QCow2ClusterType type =3D qcow2_get_cluster_type(bs, old_l2_entry); + bool unmap =3D (type =3D=3D QCOW2_CLUSTER_COMPRESSED) || + ((flags & BDRV_REQ_MAY_UNMAP) && qcow2_cluster_is_allocated(ty= pe)); + uint64_t new_l2_entry =3D unmap ? 0 : old_l2_entry; + uint64_t new_l2_bitmap =3D old_l2_bitmap; =20 - old_offset =3D get_l2_entry(s, l2_slice, l2_index + i); + if (has_subclusters(s)) { + new_l2_bitmap =3D QCOW_L2_BITMAP_ALL_ZEROES; + } else { + new_l2_entry |=3D QCOW_OFLAG_ZERO; + } =20 - /* - * Minimize L2 changes if the cluster already reads back as - * zeroes with correct allocation. - */ - cluster_type =3D qcow2_get_cluster_type(bs, old_offset); - if (cluster_type =3D=3D QCOW2_CLUSTER_ZERO_PLAIN || - (cluster_type =3D=3D QCOW2_CLUSTER_ZERO_ALLOC && !unmap)) { + if (old_l2_entry =3D=3D new_l2_entry && old_l2_bitmap =3D=3D new_l= 2_bitmap) { continue; } =20 qcow2_cache_entry_mark_dirty(s->l2_table_cache, l2_slice); - if (cluster_type =3D=3D QCOW2_CLUSTER_COMPRESSED || unmap) { - set_l2_entry(s, l2_slice, l2_index + i, QCOW_OFLAG_ZERO); - qcow2_free_any_clusters(bs, old_offset, 1, QCOW2_DISCARD_REQUE= ST); - } else { - uint64_t entry =3D get_l2_entry(s, l2_slice, l2_index + i); - set_l2_entry(s, l2_slice, l2_index + i, entry | QCOW_OFLAG_ZER= O); + if (unmap) { + qcow2_free_any_clusters(bs, old_l2_entry, 1, QCOW2_DISCARD_REQ= UEST); + } + set_l2_entry(s, l2_slice, l2_index + i, new_l2_entry); + if (has_subclusters(s)) { + set_l2_bitmap(s, l2_slice, l2_index + i, new_l2_bitmap); } } =20 --=20 2.20.1