From nobody Sun Dec 14 11:16:54 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; 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; dmarc=pass(p=quarantine dis=none) header.from=avm.de ARC-Seal: i=1; a=rsa-sha256; t=1764686477; cv=none; d=zohomail.com; s=zohoarc; b=dqdI1NeD2ztTs2GA2PYi1EUMh8ttL/8WCiJ/v5c/6HKxRDeJziff45PZ//qqaAc1S9f/dzy4p33OWG/jE8XffTj5QTBikOQq21nWsYRKxvAj2aWmneaDvi6vGdvvVURZsDE79vmlphHSHDtD6bE6Zq0S9WbOxCJcN4Bj3ZLbMUo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1764686477; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=kceri7g1Qn5qGk9Z4X13T2iNwakZ6yJrpWUNKce0kZc=; b=YWPompproReRvjeb2BL8MaLc0S6ip+DgyvjNc+BhHY1Y/+XcDUQqt7ByC68l70XY5dLnrnkyJYKNEWwfmirmS/1lTuOSsDEJ+WQdnjSE1bwPjAuQkeYVqstC65Uv7hXhO4Uu+Dj6Qx6pLgdj6GrD8BoDuiNTyOrd/R6oFq9RttU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; 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; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1764686476955525.5726282044843; Tue, 2 Dec 2025 06:41:16 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vQRY4-0005AG-0O; Tue, 02 Dec 2025 09:40:12 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vQRY2-00058A-0s; Tue, 02 Dec 2025 09:40:10 -0500 Received: from mail.avm.de ([2001:bf0:244:244::120]) by eggs.gnu.org with esmtps (TLS1.2:DHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vQRXz-0001OI-7w; Tue, 02 Dec 2025 09:40:09 -0500 Received: from [172.16.0.1] (helo=mail.avm.de) by mail.avm.de with ESMTP (eXpurgate 4.53.4) (envelope-from ) id 692efa3f-a0ff-7f0000032729-7f000001967c-1 for ; Tue, 02 Dec 2025 15:39:59 +0100 Received: from mail-notes.avm.de (mail-notes.avm.de [172.16.0.1]) by mail.avm.de (Postfix) with ESMTP; Tue, 2 Dec 2025 15:39:59 +0100 (CET) Received: from [127.0.1.1] ([172.17.89.139]) by mail-notes.avm.de (HCL Domino Release 14.0FP4) with ESMTP id 2025120215400012-18429 ; Tue, 2 Dec 2025 15:40:00 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=avm.de; s=mail; t=1764686403; bh=W0C+B/HQ6E2rn8f69u0hr2rqispXBPZi8uNq7mykuhg=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Y6+U46lHZ2GrR8CHuSI+ek7+oTstm2phLfLEAcnDdBTNALb5u17MysFpzcnTBcHCu KDUwVLEXtzSjZBo3Z0vstHnFZEHAKrQjRABgGy8SxZe2PliKpef2pbf71qtAhpMtpN Vxf2kkgnH+xKR/T3aGeD59a9HEcQfr3cTIs6n9sA= From: Christian Speich Date: Tue, 02 Dec 2025 15:39:34 +0100 Subject: [PATCH v2 4/4] hw/sd/sdcard: Optimize erase blocks as zero. MIME-Version: 1.0 Message-Id: <20251202-sdcard-performance-b4-v2-4-d42490b11322@avm.de> References: <20251202-sdcard-performance-b4-v2-0-d42490b11322@avm.de> In-Reply-To: <20251202-sdcard-performance-b4-v2-0-d42490b11322@avm.de> To: qemu-devel@nongnu.org Cc: =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Bin Meng , qemu-block@nongnu.org, Christian Speich X-Mailer: b4 0.14.2 X-MIMETrack: Itemize by SMTP Server on ANIS1/AVM(Release 14.0FP4|March 10, 2025) at 02.12.2025 15:40:00, Serialize by Router on ANIS1/AVM(Release 14.0FP4|March 10, 2025) at 02.12.2025 15:40:00, Serialize complete at 02.12.2025 15:40:00 X-TNEFEvaluated: 1 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" X-purgate-ID: 149429::1764686399-C5E23D7E-CF67ABBC/0/0 X-purgate-type: clean X-purgate-size: 3451 X-purgate-Ad: Categorized by eleven eXpurgate (R) https://www.eleven.de X-purgate: This mail is considered clean (visit https://www.eleven.de for further information) X-purgate: clean 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=2001:bf0:244:244::120; envelope-from=c.speich@avm.de; helo=mail.avm.de 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, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @avm.de) X-ZM-MESSAGEID: 1764686480106019200 When erasing blocks as zero, we can use optimized block functions to achieve this. These allow us to request a large rage to be zeroed, possible optimizing this operation and freeing disk space for sparsesly stored images. This only is possible when erase-blocks-as-zero=3Dtrue is used and can provide a significant performance boost. The case where 0xFF is used during erase is as slow as before. Signed-off-by: Christian Speich --- hw/sd/sd.c | 44 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/hw/sd/sd.c b/hw/sd/sd.c index af7e40faf67c66995b2b615080265dc31da150a6..7fa8e90d36b3b04666de9dfefad= 5830cb2252b1f 100644 --- a/hw/sd/sd.c +++ b/hw/sd/sd.c @@ -1083,6 +1083,17 @@ static void sd_blk_write(SDState *sd, uint64_t addr,= uint32_t len) sd_blk_write_direct(sd, sd->data, addr, len); } =20 +/* Requires sd->buf to be filled with 0xFF */ +static void sd_erase_ff(SDState *sd, uint64_t addr, size_t len) +{ + int erase_len =3D 1 << HWBLOCK_SHIFT; + uint64_t erase_addr; + + for (erase_addr =3D addr; erase_addr < addr + len; erase_addr +=3D era= se_len) { + sd_blk_write(sd, erase_addr, erase_len); + } +} + static void sd_erase(SDState *sd) { uint64_t erase_start =3D sd->erase_start; @@ -1090,7 +1101,6 @@ static void sd_erase(SDState *sd) bool sdsc =3D true; uint64_t wpnum; uint64_t erase_addr; - int erase_len =3D 1 << HWBLOCK_SHIFT; =20 trace_sdcard_erase(sd->erase_start, sd->erase_end); if (sd->erase_start =3D=3D INVALID_ADDRESS @@ -1119,24 +1129,38 @@ static void sd_erase(SDState *sd) sd->erase_end =3D INVALID_ADDRESS; sd->csd[14] |=3D 0x40; =20 - if (sd->erase_blocks_as_zero) { - memset(sd->data, 0x0, erase_len); - } else { - memset(sd->data, 0xFF, erase_len); + if (!sd->erase_blocks_as_zero) { + memset(sd->data, 0xFF, 1 << HWBLOCK_SHIFT); } =20 - for (erase_addr =3D erase_start; erase_addr <=3D erase_end; - erase_addr +=3D erase_len) { - if (sdsc) { - /* Only SDSC cards support write protect groups */ + /* Only SDSC cards support write protect groups */ + if (sdsc) { + for (erase_addr =3D erase_start; erase_addr <=3D erase_end; + erase_addr =3D ROUND_UP(erase_addr + 1, WPGROUP_SIZE)) { + uint64_t wp_group_end =3D ROUND_UP(erase_addr + 1, WPGROUP_SIZ= E) - 1; + size_t to_erase =3D MIN(erase_end, wp_group_end) - erase_addr; + wpnum =3D sd_addr_to_wpnum(erase_addr); assert(wpnum < sd->wp_group_bits); if (test_bit(wpnum, sd->wp_group_bmap)) { sd->card_status |=3D WP_ERASE_SKIP; continue; } + + if (sd->erase_blocks_as_zero) { + blk_pwrite_zeroes(sd->blk, erase_addr + sd_part_offset(sd), + to_erase, 0); + } else { + sd_erase_ff(sd, erase_addr, to_erase); + } + } + } else { + if (sd->erase_blocks_as_zero) { + blk_pwrite_zeroes(sd->blk, erase_start + sd_part_offset(sd), + erase_end - erase_start, 0); + } else { + sd_erase_ff(sd, erase_start, erase_end - erase_start); } - sd_blk_write(sd, erase_addr, erase_len); } } =20 --=20 2.43.0