From patchwork Tue Aug 2 12:28:21 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Sterba X-Patchwork-Id: 12934612 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 23A08C19F2B for ; Tue, 2 Aug 2022 12:33:30 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236208AbiHBMd2 (ORCPT ); Tue, 2 Aug 2022 08:33:28 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52508 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236120AbiHBMd0 (ORCPT ); Tue, 2 Aug 2022 08:33:26 -0400 Received: from smtp-out2.suse.de (smtp-out2.suse.de [IPv6:2001:67c:2178:6::1d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B4ACE33A1E for ; Tue, 2 Aug 2022 05:33:23 -0700 (PDT) Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id 5EEA11FD71; Tue, 2 Aug 2022 12:33:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1659443602; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=2CmiGUD32KJuNwiZ7RC5DjMMpuook+8acby188BqW6Y=; b=BOcgASG6d79GOXxyjW2inPs41hnBgfPxtZsaZWUkSf5Us4q3as2epJ75aw0joWwl3ZpK91 8dQTbMmGQSkR5gzARFq/SxFwGjqzoQpChupWp9iG2pzGl1RhNkfsDzLrLOYpBpo1Qg4Y5H dJw146GqyZ4JlQR62RcHywoadcQRF7Y= Received: from ds.suse.cz (ds.suse.cz [10.100.12.205]) by relay2.suse.de (Postfix) with ESMTP id 562322C141; Tue, 2 Aug 2022 12:33:22 +0000 (UTC) Received: by ds.suse.cz (Postfix, from userid 10065) id 0BCECDA85A; Tue, 2 Aug 2022 14:28:21 +0200 (CEST) From: David Sterba To: linux-btrfs@vger.kernel.org Cc: David Sterba Subject: [PATCH v2 1/4] btrfs: prepare more slots for checksum shash Date: Tue, 2 Aug 2022 14:28:21 +0200 Message-Id: <42f231d8d6f95fdc731b423fdc7c3ae2a6685318.1659443199.git.dsterba@suse.com> X-Mailer: git-send-email 2.36.1 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org There's now one checksum template fs_info::csum_shash that contains whatever the crypto API decides is the best available implementation. To allow loading other implementations after mount add more slots and symbolic names. The slot 0 is always used when calculating checksum, other slots may be set later or left empty. Signed-off-by: David Sterba Reviewed-by: Johannes Thumshirn --- fs/btrfs/check-integrity.c | 4 ++-- fs/btrfs/ctree.h | 13 ++++++++++++- fs/btrfs/disk-io.c | 19 ++++++++++--------- fs/btrfs/file-item.c | 4 ++-- fs/btrfs/inode.c | 2 +- fs/btrfs/scrub.c | 12 ++++++------ fs/btrfs/sysfs.c | 2 +- 7 files changed, 34 insertions(+), 22 deletions(-) diff --git a/fs/btrfs/check-integrity.c b/fs/btrfs/check-integrity.c index 5d20137b7b67..dbabdd01ed66 100644 --- a/fs/btrfs/check-integrity.c +++ b/fs/btrfs/check-integrity.c @@ -1647,7 +1647,7 @@ static noinline_for_stack int btrfsic_test_for_metadata( char **datav, unsigned int num_pages) { struct btrfs_fs_info *fs_info = state->fs_info; - SHASH_DESC_ON_STACK(shash, fs_info->csum_shash); + SHASH_DESC_ON_STACK(shash, fs_info->csum_shash[CSUM_DEFAULT]); struct btrfs_header *h; u8 csum[BTRFS_CSUM_SIZE]; unsigned int i; @@ -1660,7 +1660,7 @@ static noinline_for_stack int btrfsic_test_for_metadata( if (memcmp(h->fsid, fs_info->fs_devices->fsid, BTRFS_FSID_SIZE)) return 1; - shash->tfm = fs_info->csum_shash; + shash->tfm = fs_info->csum_shash[CSUM_DEFAULT]; crypto_shash_init(shash); for (i = 0; i < num_pages; i++) { diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index e6a084a9214c..1e55dfa49827 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h @@ -674,6 +674,13 @@ struct btrfs_commit_stats { u64 total_commit_dur; }; +enum btrfs_csum_impl { + CSUM_DEFAULT, + CSUM_GENERIC, + CSUM_ACCEL, + CSUM_COUNT +}; + struct btrfs_fs_info { u8 chunk_tree_uuid[BTRFS_UUID_SIZE]; unsigned long flags; @@ -1061,7 +1068,11 @@ struct btrfs_fs_info { spinlock_t swapfile_pins_lock; struct rb_root swapfile_pins; - struct crypto_shash *csum_shash; + /* + * Templates for checksum calculation, slot 0 is for the currently used + * one, other slots are optional for available implementations. + */ + struct crypto_shash *csum_shash[CSUM_COUNT]; /* Type of exclusive operation running, protected by super_lock */ enum btrfs_exclusive_operation exclusive_operation; diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 6ac8d73d4b51..3c2251199f0c 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -65,8 +65,9 @@ static void btrfs_error_commit_super(struct btrfs_fs_info *fs_info); static void btrfs_free_csum_hash(struct btrfs_fs_info *fs_info) { - if (fs_info->csum_shash) - crypto_free_shash(fs_info->csum_shash); + for (int i = 0; i < CSUM_COUNT; i++) + if (fs_info->csum_shash[i]) + crypto_free_shash(fs_info->csum_shash[i]); } /* @@ -176,11 +177,11 @@ static void csum_tree_block(struct extent_buffer *buf, u8 *result) struct btrfs_fs_info *fs_info = buf->fs_info; const int num_pages = num_extent_pages(buf); const int first_page_part = min_t(u32, PAGE_SIZE, fs_info->nodesize); - SHASH_DESC_ON_STACK(shash, fs_info->csum_shash); + SHASH_DESC_ON_STACK(shash, fs_info->csum_shash[CSUM_DEFAULT]); char *kaddr; int i; - shash->tfm = fs_info->csum_shash; + shash->tfm = fs_info->csum_shash[CSUM_DEFAULT]; crypto_shash_init(shash); kaddr = page_address(buf->pages[0]) + offset_in_page(buf->start); crypto_shash_update(shash, kaddr + BTRFS_CSUM_SIZE, @@ -255,9 +256,9 @@ static int btrfs_check_super_csum(struct btrfs_fs_info *fs_info, struct btrfs_super_block *disk_sb = (struct btrfs_super_block *)raw_disk_sb; char result[BTRFS_CSUM_SIZE]; - SHASH_DESC_ON_STACK(shash, fs_info->csum_shash); + SHASH_DESC_ON_STACK(shash, fs_info->csum_shash[CSUM_DEFAULT]); - shash->tfm = fs_info->csum_shash; + shash->tfm = fs_info->csum_shash[CSUM_DEFAULT]; /* * The super_block structure does not span the whole @@ -2429,7 +2430,7 @@ static int btrfs_init_csum_hash(struct btrfs_fs_info *fs_info, u16 csum_type) return PTR_ERR(csum_shash); } - fs_info->csum_shash = csum_shash; + fs_info->csum_shash[CSUM_DEFAULT] = csum_shash; btrfs_info(fs_info, "using %s (%s) checksum algorithm", btrfs_super_csum_name(csum_type), @@ -4012,7 +4013,7 @@ static int write_dev_supers(struct btrfs_device *device, { struct btrfs_fs_info *fs_info = device->fs_info; struct address_space *mapping = device->bdev->bd_inode->i_mapping; - SHASH_DESC_ON_STACK(shash, fs_info->csum_shash); + SHASH_DESC_ON_STACK(shash, fs_info->csum_shash[CSUM_DEFAULT]); int i; int errors = 0; int ret; @@ -4021,7 +4022,7 @@ static int write_dev_supers(struct btrfs_device *device, if (max_mirrors == 0) max_mirrors = BTRFS_SUPER_MIRROR_MAX; - shash->tfm = fs_info->csum_shash; + shash->tfm = fs_info->csum_shash[CSUM_DEFAULT]; for (i = 0; i < max_mirrors; i++) { struct page *page; diff --git a/fs/btrfs/file-item.c b/fs/btrfs/file-item.c index c828f971a346..6e416230733b 100644 --- a/fs/btrfs/file-item.c +++ b/fs/btrfs/file-item.c @@ -635,7 +635,7 @@ blk_status_t btrfs_csum_one_bio(struct btrfs_inode *inode, struct bio *bio, u64 offset, bool one_ordered) { struct btrfs_fs_info *fs_info = inode->root->fs_info; - SHASH_DESC_ON_STACK(shash, fs_info->csum_shash); + SHASH_DESC_ON_STACK(shash, fs_info->csum_shash[CSUM_DEFAULT]); struct btrfs_ordered_sum *sums; struct btrfs_ordered_extent *ordered = NULL; const bool use_page_offsets = (offset == (u64)-1); @@ -663,7 +663,7 @@ blk_status_t btrfs_csum_one_bio(struct btrfs_inode *inode, struct bio *bio, sums->bytenr = bio->bi_iter.bi_sector << 9; index = 0; - shash->tfm = fs_info->csum_shash; + shash->tfm = fs_info->csum_shash[CSUM_DEFAULT]; bio_for_each_segment(bvec, bio, iter) { if (use_page_offsets) diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index ecc5fa3343fc..a16a7379c58d 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -3429,7 +3429,7 @@ int btrfs_check_sector_csum(struct btrfs_fs_info *fs_info, struct page *page, ASSERT(pgoff + fs_info->sectorsize <= PAGE_SIZE); - shash->tfm = fs_info->csum_shash; + shash->tfm = fs_info->csum_shash[CSUM_DEFAULT]; kaddr = kmap_local_page(page) + pgoff; crypto_shash_digest(shash, kaddr, fs_info->sectorsize, csum); diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c index 3afe5fa50a63..f67a35cf0446 100644 --- a/fs/btrfs/scrub.c +++ b/fs/btrfs/scrub.c @@ -1775,7 +1775,7 @@ static int scrub_checksum_data(struct scrub_block *sblock) { struct scrub_ctx *sctx = sblock->sctx; struct btrfs_fs_info *fs_info = sctx->fs_info; - SHASH_DESC_ON_STACK(shash, fs_info->csum_shash); + SHASH_DESC_ON_STACK(shash, fs_info->csum_shash[CSUM_DEFAULT]); u8 csum[BTRFS_CSUM_SIZE]; struct scrub_sector *sector; char *kaddr; @@ -1787,7 +1787,7 @@ static int scrub_checksum_data(struct scrub_block *sblock) kaddr = page_address(sector->page); - shash->tfm = fs_info->csum_shash; + shash->tfm = fs_info->csum_shash[CSUM_DEFAULT]; crypto_shash_init(shash); /* @@ -1806,7 +1806,7 @@ static int scrub_checksum_tree_block(struct scrub_block *sblock) struct scrub_ctx *sctx = sblock->sctx; struct btrfs_header *h; struct btrfs_fs_info *fs_info = sctx->fs_info; - SHASH_DESC_ON_STACK(shash, fs_info->csum_shash); + SHASH_DESC_ON_STACK(shash, fs_info->csum_shash[CSUM_DEFAULT]); u8 calculated_csum[BTRFS_CSUM_SIZE]; u8 on_disk_csum[BTRFS_CSUM_SIZE]; /* @@ -1850,7 +1850,7 @@ static int scrub_checksum_tree_block(struct scrub_block *sblock) BTRFS_UUID_SIZE)) sblock->header_error = 1; - shash->tfm = fs_info->csum_shash; + shash->tfm = fs_info->csum_shash[CSUM_DEFAULT]; crypto_shash_init(shash); crypto_shash_update(shash, kaddr + BTRFS_CSUM_SIZE, sectorsize - BTRFS_CSUM_SIZE); @@ -1872,7 +1872,7 @@ static int scrub_checksum_super(struct scrub_block *sblock) struct btrfs_super_block *s; struct scrub_ctx *sctx = sblock->sctx; struct btrfs_fs_info *fs_info = sctx->fs_info; - SHASH_DESC_ON_STACK(shash, fs_info->csum_shash); + SHASH_DESC_ON_STACK(shash, fs_info->csum_shash[CSUM_DEFAULT]); u8 calculated_csum[BTRFS_CSUM_SIZE]; struct scrub_sector *sector; char *kaddr; @@ -1893,7 +1893,7 @@ static int scrub_checksum_super(struct scrub_block *sblock) if (!scrub_check_fsid(s->fsid, sector)) ++fail_cor; - shash->tfm = fs_info->csum_shash; + shash->tfm = fs_info->csum_shash[CSUM_DEFAULT]; crypto_shash_init(shash); crypto_shash_digest(shash, kaddr + BTRFS_CSUM_SIZE, BTRFS_SUPER_INFO_SIZE - BTRFS_CSUM_SIZE, calculated_csum); diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c index 32714ef8e22b..cc943b236c92 100644 --- a/fs/btrfs/sysfs.c +++ b/fs/btrfs/sysfs.c @@ -1097,7 +1097,7 @@ static ssize_t btrfs_checksum_show(struct kobject *kobj, return sysfs_emit(buf, "%s (%s)\n", btrfs_super_csum_name(csum_type), - crypto_shash_driver_name(fs_info->csum_shash)); + crypto_shash_driver_name(fs_info->csum_shash[CSUM_DEFAULT])); } BTRFS_ATTR(, checksum, btrfs_checksum_show); From patchwork Tue Aug 2 12:28:24 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Sterba X-Patchwork-Id: 12934611 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 605A6C19F2C for ; Tue, 2 Aug 2022 12:33:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236193AbiHBMd2 (ORCPT ); Tue, 2 Aug 2022 08:33:28 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52506 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232845AbiHBMd0 (ORCPT ); Tue, 2 Aug 2022 08:33:26 -0400 Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C246133A32 for ; Tue, 2 Aug 2022 05:33:25 -0700 (PDT) Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out1.suse.de (Postfix) with ESMTP id 795EE35194; Tue, 2 Aug 2022 12:33:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1659443604; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=w7qMRTqhmtGgViGXoFDOE73QKzRmKB6F3dVT9qS9Sb0=; b=hWVQY3LPbyQAen4i69HGvaHVuZoEXyw82126E17t3VoV/flnteu6oZAdZi+XBFVAvrpP38 5d7GPoZZnD6vb5yt2/MatrzMAJcyVXAYbhXRZQxr6PvNgPSapMyt+wXUPFbnb+ZuWhxRJU Ncxc4mSGzxbV9UpS58q1tzY8zCL44PM= Received: from ds.suse.cz (ds.suse.cz [10.100.12.205]) by relay2.suse.de (Postfix) with ESMTP id 717282C141; Tue, 2 Aug 2022 12:33:24 +0000 (UTC) Received: by ds.suse.cz (Postfix, from userid 10065) id 27B61DA85A; Tue, 2 Aug 2022 14:28:24 +0200 (CEST) From: David Sterba To: linux-btrfs@vger.kernel.org Cc: David Sterba Subject: [PATCH v2 2/4] btrfs: assign checksum shash slots on init Date: Tue, 2 Aug 2022 14:28:24 +0200 Message-Id: X-Mailer: git-send-email 2.36.1 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org When initializing checksum implementation on first mount, assign it to the proper slot based on the driver name. If it contains "generic" it's considered the non-accelerated one. Based on that properly set the BTRFS_FS_CSUM_IMPL_FAST bit, previously it could be mistakenly set as fast despite a different checksum (eg. sha256) with generic implementation. Signed-off-by: David Sterba Reported-by: kernel test robot Reported-by: kernel test robot --- fs/btrfs/disk-io.c | 11 +++++++++++ fs/btrfs/super.c | 2 -- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 3c2251199f0c..5ca32bbdad53 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -2430,7 +2430,18 @@ static int btrfs_init_csum_hash(struct btrfs_fs_info *fs_info, u16 csum_type) return PTR_ERR(csum_shash); } + /* + * Find the fastest implementation available, but keep the slots + * matching the type. + */ fs_info->csum_shash[CSUM_DEFAULT] = csum_shash; + if (strstr(crypto_shash_driver_name(csum_shash)), "generic") != NULL) { + fs_info->csum_shash[CSUM_GENERIC] = csum_shash; + clear_bit(BTRFS_FS_CSUM_IMPL_FAST, &fs_info->flags); + } else { + fs_info->csum_shash[CSUM_ACCEL] = csum_shash; + set_bit(BTRFS_FS_CSUM_IMPL_FAST, &fs_info->flags); + } btrfs_info(fs_info, "using %s (%s) checksum algorithm", btrfs_super_csum_name(csum_type), diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 1032aaa2c2f4..595b8d92ef86 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c @@ -1819,8 +1819,6 @@ static struct dentry *btrfs_mount_root(struct file_system_type *fs_type, } else { snprintf(s->s_id, sizeof(s->s_id), "%pg", bdev); btrfs_sb(s)->bdev_holder = fs_type; - if (!strstr(crc32c_impl(), "generic")) - set_bit(BTRFS_FS_CSUM_IMPL_FAST, &fs_info->flags); error = btrfs_fill_super(s, fs_devices, data); } if (!error) From patchwork Tue Aug 2 12:28:26 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Sterba X-Patchwork-Id: 12934613 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id EDF46C00140 for ; Tue, 2 Aug 2022 12:33:30 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236120AbiHBMda (ORCPT ); Tue, 2 Aug 2022 08:33:30 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52536 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236311AbiHBMd2 (ORCPT ); Tue, 2 Aug 2022 08:33:28 -0400 Received: from smtp-out1.suse.de (smtp-out1.suse.de [IPv6:2001:67c:2178:6::1c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 007D83334F for ; Tue, 2 Aug 2022 05:33:27 -0700 (PDT) Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out1.suse.de (Postfix) with ESMTP id A85A435194; Tue, 2 Aug 2022 12:33:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1659443606; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=6Zc2g9pNr05z0kRBooCj0YvueO9O8jMwFGgPUK2uYSo=; b=RXelKXw3QHA0tL6pNdzOkI6afvnvNpRv4JlsGbG1ZJQrsp85AhpW2epcMOGq+tWk3yawY8 1S9ZMUmgvFCYFsgSMEtAidKBsMPzo+3A6hR+qrFLUa4++i1zmxc2B+30JGCG0EjQPEBEOg Q9msQloCZpGN9tH71BeyUfy5STNCDh0= Received: from ds.suse.cz (ds.suse.cz [10.100.12.205]) by relay2.suse.de (Postfix) with ESMTP id A060D2C141; Tue, 2 Aug 2022 12:33:26 +0000 (UTC) Received: by ds.suse.cz (Postfix, from userid 10065) id 4E208DA85A; Tue, 2 Aug 2022 14:28:26 +0200 (CEST) From: David Sterba To: linux-btrfs@vger.kernel.org Cc: David Sterba Subject: [PATCH v2 3/4] btrfs: add checksum implementation selection after mount Date: Tue, 2 Aug 2022 14:28:26 +0200 Message-Id: X-Mailer: git-send-email 2.36.1 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org The sysfs file /sys/fs/btrfs/FSID/checksum shows the filesystem checksum and the crypto module implementing it. In the scenario when there's only the default generic implementation available during mount it's selected, even if there's an unloaded module with accelerated version. This happens with sha256 that's often built-in so the crypto API may not trigger loading the modules and select the fastest implementation. Such filesystem could be left using in the generic for the whole time. Remount can't fix that and full umount/mount cycle may be impossible eg. for a root filesystem. Allow writing strings to the sysfs checksum file that will trigger loading the crypto shash again and check if the found module is the desired one. Possible values: - default - select whatever is considered default by crypto subsystem, either generic or accelerated - accel - try loading an accelerated implementation (must not contain "generic" in the name) - generic - load and select the generic implementation A typical scenario, assuming sha256 is built-in: $ mkfs.btrfs --csum sha256 $ lsmod | grep sha256 $ mount /dev /mnt $ cat ...FSID/checksum sha256 (sha256-generic) $ modprobe sha256 $ lsmod | grep sha256 sha256_ssse3 $ echo accel > ...FSID/checksum sha256 (sha256-ni) The crypto shash for all slots has the same lifetime as the mount, so it's not possible to unload the crypto module. Signed-off-by: David Sterba --- fs/btrfs/sysfs.c | 86 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 85 insertions(+), 1 deletion(-) diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c index cc943b236c92..0044644056ed 100644 --- a/fs/btrfs/sysfs.c +++ b/fs/btrfs/sysfs.c @@ -1100,7 +1100,91 @@ static ssize_t btrfs_checksum_show(struct kobject *kobj, crypto_shash_driver_name(fs_info->csum_shash[CSUM_DEFAULT])); } -BTRFS_ATTR(, checksum, btrfs_checksum_show); +static const char csum_impl[][8] = { + [CSUM_DEFAULT] = "default", + [CSUM_GENERIC] = "generic", + [CSUM_ACCEL] = "accel", +}; + +static int select_checksum(struct btrfs_fs_info *fs_info, enum btrfs_csum_impl type) +{ + /* Already set */ + if (fs_info->csum_shash[CSUM_DEFAULT] == fs_info->csum_shash[type]) + return 0; + + /* Allocate new if needed */ + if (!fs_info->csum_shash[type]) { + const u16 csum_type = btrfs_super_csum_type(fs_info->super_copy); + const char *csum_driver = btrfs_super_csum_driver(csum_type); + struct crypto_shash *shash1, *tmp; + char full_name[32]; + u32 mask = 0; + + /* + * Generic must be requested explicitly, otherwise it could + * be accelerated implementation with highest priority. + */ + scnprintf(full_name, sizeof(full_name), "%s%s", csum_driver, + (type == CSUM_GENERIC ? "-generic" : "")); + + shash1 = crypto_alloc_shash(full_name, 0, mask); + if (IS_ERR(shash1)) + return PTR_ERR(shash1); + + /* Accelerated requested but generic found */ + if (type != CSUM_GENERIC && + strstr(crypto_shash_driver_name(shash1), "generic")) { + crypto_free_shash(shash1); + return -ENOENT; + } + + tmp = cmpxchg(&fs_info->csum_shash[type], NULL, shash1); + if (tmp) { + /* Something raced in */ + crypto_free_shash(shash1); + } + } + + /* Select it */ + fs_info->csum_shash[CSUM_DEFAULT] = fs_info->csum_shash[type]; + return 0; +} + +static bool strmatch(const char *buffer, const char *string); + +static ssize_t btrfs_checksum_store(struct kobject *kobj, + struct kobj_attribute *a, + const char *buf, size_t len) +{ + struct btrfs_fs_info *fs_info = to_fs_info(kobj); + + if (!fs_info) + return -EPERM; + + /* Pick the best available, generic or accelerated */ + if (strmatch(buf, csum_impl[CSUM_DEFAULT])) { + if (fs_info->csum_shash[CSUM_ACCEL]) { + fs_info->csum_shash[CSUM_DEFAULT] = + fs_info->csum_shash[CSUM_ACCEL]; + return len; + } + ASSERT(fs_info->csum_shash[CSUM_GENERIC]); + fs_info->csum_shash[CSUM_DEFAULT] = fs_info->csum_shash[CSUM_GENERIC]; + return len; + } + + for (int i = 1; i < CSUM_COUNT; i++) { + if (strmatch(buf, csum_impl[i])) { + int ret; + + ret = select_checksum(fs_info, i); + return ret < 0 ? ret : len; + } + } + + return -EINVAL; +} +BTRFS_ATTR_RW(, checksum, btrfs_checksum_show, btrfs_checksum_store); static ssize_t btrfs_exclusive_operation_show(struct kobject *kobj, struct kobj_attribute *a, char *buf) From patchwork Tue Aug 2 12:28:28 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Sterba X-Patchwork-Id: 12934614 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5CD4FC19F2C for ; Tue, 2 Aug 2022 12:33:32 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236664AbiHBMdb (ORCPT ); Tue, 2 Aug 2022 08:33:31 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52582 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236311AbiHBMda (ORCPT ); Tue, 2 Aug 2022 08:33:30 -0400 Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 16B0D37F8E for ; Tue, 2 Aug 2022 05:33:30 -0700 (PDT) Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out1.suse.de (Postfix) with ESMTP id C75AD37150; Tue, 2 Aug 2022 12:33:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1659443608; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=E0JpVcS6h02LH5PGP4MdT7IfRGajbIHA2kqjo6COCFg=; b=UcHSbuafrrhWoV5lOfG1NZ1quJORrCrkEN8k25KcGB81XAkwnlNltnL5Ou3OB15w05lE/B 6V0Tf0t+ThzvwsO8Pw5m+JCpyAmmdAbcW81LsrkSwxdRtiYNzGxP0bZSB0QZFsP9ebR5AQ mqJetfZCLqxD7avui3/9FwWFaFJAvtc= Received: from ds.suse.cz (ds.suse.cz [10.100.12.205]) by relay2.suse.de (Postfix) with ESMTP id BEEC82C141; Tue, 2 Aug 2022 12:33:28 +0000 (UTC) Received: by ds.suse.cz (Postfix, from userid 10065) id 74AD6DA85A; Tue, 2 Aug 2022 14:28:28 +0200 (CEST) From: David Sterba To: linux-btrfs@vger.kernel.org Cc: David Sterba Subject: [PATCH v2 4/4] btrfs: sysfs: print all loaded csums implementations Date: Tue, 2 Aug 2022 14:28:28 +0200 Message-Id: <0aab25d0dc9853d035d0ae76810447aac2f3ecf8.1659443199.git.dsterba@suse.com> X-Mailer: git-send-email 2.36.1 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org Extend the sysfs FSID/checksum file and append lines with the selector strings and implementation if loaded, or 'none'. Output may look like: crc32c (crc32c-generic) generic: crc32c-generic accel: crc32c-intel Scripts that rely on single line in the file need to be updated. All available and loaded implementations can be found in /proc/crypto . Signed-off-by: David Sterba Reviewed-by: Johannes Thumshirn --- fs/btrfs/sysfs.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c index 0044644056ed..2f8bd75ce69d 100644 --- a/fs/btrfs/sysfs.c +++ b/fs/btrfs/sysfs.c @@ -1095,9 +1095,18 @@ static ssize_t btrfs_checksum_show(struct kobject *kobj, struct btrfs_fs_info *fs_info = to_fs_info(kobj); u16 csum_type = btrfs_super_csum_type(fs_info->super_copy); - return sysfs_emit(buf, "%s (%s)\n", - btrfs_super_csum_name(csum_type), - crypto_shash_driver_name(fs_info->csum_shash[CSUM_DEFAULT])); + return sysfs_emit(buf, + "%s (%s)\n" + "generic: %s\n" + "accel: %s\n", + btrfs_super_csum_name(csum_type), + crypto_shash_driver_name(fs_info->csum_shash[CSUM_DEFAULT]), + fs_info->csum_shash[CSUM_GENERIC] + ? crypto_shash_driver_name(fs_info->csum_shash[CSUM_GENERIC]) + : "none", + fs_info->csum_shash[CSUM_ACCEL] + ? crypto_shash_driver_name(fs_info->csum_shash[CSUM_ACCEL]) + : "none"); } static const char csum_impl[][8] = {