From: Anand Jain <anand.jain@oracle.com>
To: David Sterba <dsterba@suse.com>, linux-btrfs@vger.kernel.org
Subject: Re: [PATCH v2 3/4] btrfs: add checksum implementation selection after mount
Date: Wed, 3 Aug 2022 08:22:05 +0800 [thread overview]
Message-ID: <e9c54ed3-7dc9-e185-491c-aca6b0afe244@oracle.com> (raw)
In-Reply-To: <cc590040e5393aad0294e3d7c592de991706cf2e.1659443199.git.dsterba@suse.com>
On 02/08/2022 20:28, David Sterba wrote:
> 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.
Hmm ok.
What happens in the scenario if the accelerated module is loaded? Will
the crypto API use the accelerated module?
- Anand
> 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 <dsterba@suse.com>
> ---
> 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)
next prev parent reply other threads:[~2022-08-03 0:22 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-08-02 12:28 [PATCH v2 0/4] Selectable checksum implementation David Sterba
2022-08-02 12:28 ` [PATCH v2 1/4] btrfs: prepare more slots for checksum shash David Sterba
2022-08-02 13:00 ` Johannes Thumshirn
2022-08-03 13:34 ` David Sterba
2022-08-04 10:55 ` Anand Jain
2022-08-02 12:28 ` [PATCH v2 2/4] btrfs: assign checksum shash slots on init David Sterba
2022-08-02 20:30 ` kernel test robot
2022-08-02 21:10 ` kernel test robot
2022-08-02 12:28 ` [PATCH v2 3/4] btrfs: add checksum implementation selection after mount David Sterba
2022-08-02 13:00 ` Johannes Thumshirn
2022-08-02 13:21 ` David Sterba
2022-08-03 0:06 ` Anand Jain
2022-08-03 14:00 ` David Sterba
2022-08-04 11:12 ` Anand Jain
2022-08-03 0:22 ` Anand Jain [this message]
2022-08-03 13:24 ` David Sterba
2022-08-02 12:28 ` [PATCH v2 4/4] btrfs: sysfs: print all loaded csums implementations David Sterba
2022-08-02 13:16 ` Johannes Thumshirn
-- strict thread matches above, loose matches on Subject: below --
2022-07-29 17:42 [PATCH v2 0/4] Selectable checksum implementation David Sterba
2022-07-29 17:42 ` [PATCH v2 3/4] btrfs: add checksum implementation selection after mount David Sterba
2022-08-01 8:31 ` Johannes Thumshirn
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=e9c54ed3-7dc9-e185-491c-aca6b0afe244@oracle.com \
--to=anand.jain@oracle.com \
--cc=dsterba@suse.com \
--cc=linux-btrfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).