Received: by 2002:ac0:a5a6:0:0:0:0:0 with SMTP id m35-v6csp47595imm; Thu, 30 Aug 2018 08:02:42 -0700 (PDT) X-Google-Smtp-Source: ANB0Vdb+3HCTHKTESI4NlUlyCQVDbqlZNdVn92APeh11d6UwQQxKheLLfL+tkKvz83gbpHCwbTQ+ X-Received: by 2002:a62:760a:: with SMTP id r10-v6mr10946771pfc.207.1535641362474; Thu, 30 Aug 2018 08:02:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1535641362; cv=none; d=google.com; s=arc-20160816; b=EFu8SgW+uIvrp9sFxN1WwaxVeK+MinTHJQjwiqXR3rekREe8QmhoZZJajvtgfLgXb9 anOB4uLWWyE/ejuzYyusLJ1OJZbyt6yUIXdi0kDFwY4/py+dUSiLXDsVHGGiF7X6rvz4 Zwel6houDJC8+v9B48OkJdR7jhr53mfdkzdAOQk8nhpvGmfHImrUMeIsKCMkSml+3Be7 sbYaJK2Yi4nBcVpO9hcTYQZQUIwKCQNmlESBFPQiAmWDvKHF2+zyo2l9kz/LzAf6poFo gEa2oSMSnpOox5PgI02BGbgxJkSKO69KNnrkjlpbC3Ws9WlfxcpS0QcFFWS1SEx9vQDw YAHw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=1e1K3MhBNY2jDkcLVndaw3WNWPGoBINwHiPtsrd6t3A=; b=yPMa0kYpI+OUhhdH34nLAgXdXnxWCYDRyPHs3eRmSSO3GNP2k2RLlr+wYvCfGVCHxd Rc5pu+TjfSzv3xGekF4csEDRuTlcLIk6RnmpyWmsHk+tOpMhR0lR1aDElNActcnt8WFe D8oZe3+TD+iB8OgLLoo1Jho1kxCqG4uSySNw1KPpUuGgB3M76e9G95t2zBwiMdg+do7d M35XokobVZITSe+qzXi1r/4mlbHnDd5l/Yk0rEoVpw/v1Evzaz1SSAqdrahe19hdvCnh 6/iu1/4AnHeHtJhPhnx8cOjDDICFnPyy4MS7HvQpfr+XMRUTFKF8++rwX8sCe0bNlw6z mbrg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@oracle.com header.s=corp-2018-07-02 header.b=Ige6I2N7; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=oracle.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id h3-v6si6951396pld.114.2018.08.30.08.02.20; Thu, 30 Aug 2018 08:02:42 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@oracle.com header.s=corp-2018-07-02 header.b=Ige6I2N7; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=oracle.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729458AbeH3TDV (ORCPT + 99 others); Thu, 30 Aug 2018 15:03:21 -0400 Received: from userp2120.oracle.com ([156.151.31.85]:53548 "EHLO userp2120.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728449AbeH3TDV (ORCPT ); Thu, 30 Aug 2018 15:03:21 -0400 Received: from pps.filterd (userp2120.oracle.com [127.0.0.1]) by userp2120.oracle.com (8.16.0.22/8.16.0.22) with SMTP id w7UExSLP126924; Thu, 30 Aug 2018 15:00:22 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2018-07-02; bh=1e1K3MhBNY2jDkcLVndaw3WNWPGoBINwHiPtsrd6t3A=; b=Ige6I2N7EzpULqSen9FrFV/JzU9wGdXItB0z0NLx9taWEc15T25qJSYhTTTqQnMWn6x3 soVMbdBfoo4pE7MzaN+l2IVkz36YdSCz1ycfCUHJdyjtuNxprHUUiQp01xs7Kdvj5ehy krvNlTL3Fkcd67g4ei5V4JDwgf+UNBdUbRPpya6beDV6Zg7i6AcKnjvXQSNN7+Vyw/d8 3BPzL2Q+KcQlMzrOpbCg7t9TBT6SJnPpekc0TDudvrcTxnDf27SrkTS/Oq32imtMzmuu /QHiHMIAOAdRN/MdAwK1DezNABN6ySiq8GwwoPfu3oaxN7laDX3iaBJL+vN8QcV/siLc 5g== Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp2120.oracle.com with ESMTP id 2m2yrqmxsu-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 30 Aug 2018 15:00:22 +0000 Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0022.oracle.com (8.14.4/8.14.4) with ESMTP id w7UF0LH0002541 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 30 Aug 2018 15:00:21 GMT Received: from abhmp0019.oracle.com (abhmp0019.oracle.com [141.146.116.25]) by aserv0121.oracle.com (8.14.4/8.13.8) with ESMTP id w7UF0KmM015577; Thu, 30 Aug 2018 15:00:20 GMT Received: from ca-mkp.ca.oracle.com (/10.156.108.201) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 30 Aug 2018 08:00:20 -0700 From: "Martin K. Petersen" To: herbert@gondor.apana.org.au Cc: Jeff.Lien@wdc.com, ard.biesheuvel@linaro.org, david.darrington@wdc.com, hch@infradead.org, jeff.furlong@wdc.com, linux-block@vger.kernel.org, linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, martin.petersen@oracle.com, tim.c.chen@linux.intel.com Subject: [PATCH v2 2/3] crc-t10dif: Pick better transform if one becomes available Date: Thu, 30 Aug 2018 11:00:15 -0400 Message-Id: <20180830150016.15661-2-martin.petersen@oracle.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180830150016.15661-1-martin.petersen@oracle.com> References: <20180827060918.tfz7ljufqhlej4kq@gondor.apana.org.au> <20180830150016.15661-1-martin.petersen@oracle.com> X-Proofpoint-Virus-Version: vendor=nai engine=5900 definitions=9000 signatures=668708 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=3 malwarescore=0 phishscore=0 bulkscore=0 spamscore=0 mlxscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1807170000 definitions=main-1808300155 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org T10 CRC library is linked into the kernel thanks to block and SCSI. The crypto accelerators are typically loaded later as modules and are therefore not available when the T10 CRC library is initialized. Use the crypto notifier facility to trigger a switch to a better algorithm if one becomes available after the initial hash has been registered. Use RCU to protect the original transform while the new one is being set up. Suggested-by: Ard Biesheuvel Signed-off-by: Martin K. Petersen --- include/linux/crc-t10dif.h | 1 + lib/crc-t10dif.c | 46 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/include/linux/crc-t10dif.h b/include/linux/crc-t10dif.h index 1fe0cfcdea30..6bb0c0bf357b 100644 --- a/include/linux/crc-t10dif.h +++ b/include/linux/crc-t10dif.h @@ -6,6 +6,7 @@ #define CRC_T10DIF_DIGEST_SIZE 2 #define CRC_T10DIF_BLOCK_SIZE 1 +#define CRC_T10DIF_STRING "crct10dif" extern __u16 crc_t10dif_generic(__u16 crc, const unsigned char *buffer, size_t len); diff --git a/lib/crc-t10dif.c b/lib/crc-t10dif.c index 1ad33e555805..52f577a3868d 100644 --- a/lib/crc-t10dif.c +++ b/lib/crc-t10dif.c @@ -14,10 +14,47 @@ #include #include #include +#include #include +#include -static struct crypto_shash *crct10dif_tfm; +static struct crypto_shash __rcu *crct10dif_tfm; static struct static_key crct10dif_fallback __read_mostly; +DEFINE_MUTEX(crc_t10dif_mutex); + +static int crc_t10dif_rehash(struct notifier_block *self, unsigned long val, void *data) +{ + struct crypto_alg *alg = data; + struct crypto_shash *new, *old; + + if (val != CRYPTO_MSG_ALG_LOADED || + static_key_false(&crct10dif_fallback) || + strncmp(alg->cra_name, CRC_T10DIF_STRING, strlen(CRC_T10DIF_STRING))) + return 0; + + mutex_lock(&crc_t10dif_mutex); + old = rcu_dereference_protected(crct10dif_tfm, + lockdep_is_held(&crc_t10dif_mutex)); + if (!old) { + mutex_unlock(&crc_t10dif_mutex); + return 0; + } + new = crypto_alloc_shash("crct10dif", 0, 0); + if (IS_ERR(new)) { + mutex_unlock(&crc_t10dif_mutex); + return 0; + } + rcu_assign_pointer(crct10dif_tfm, new); + mutex_unlock(&crc_t10dif_mutex); + + synchronize_rcu(); + crypto_free_shash(old); + return 0; +} + +static struct notifier_block crc_t10dif_nb = { + .notifier_call = crc_t10dif_rehash, +}; __u16 crc_t10dif_update(__u16 crc, const unsigned char *buffer, size_t len) { @@ -30,11 +67,14 @@ __u16 crc_t10dif_update(__u16 crc, const unsigned char *buffer, size_t len) if (static_key_false(&crct10dif_fallback)) return crc_t10dif_generic(crc, buffer, len); - desc.shash.tfm = crct10dif_tfm; + rcu_read_lock(); + desc.shash.tfm = rcu_dereference(crct10dif_tfm); desc.shash.flags = 0; *(__u16 *)desc.ctx = crc; err = crypto_shash_update(&desc.shash, buffer, len); + rcu_read_unlock(); + BUG_ON(err); return *(__u16 *)desc.ctx; @@ -49,6 +89,7 @@ EXPORT_SYMBOL(crc_t10dif); static int __init crc_t10dif_mod_init(void) { + crypto_register_notifier(&crc_t10dif_nb); crct10dif_tfm = crypto_alloc_shash("crct10dif", 0, 0); if (IS_ERR(crct10dif_tfm)) { static_key_slow_inc(&crct10dif_fallback); @@ -59,6 +100,7 @@ static int __init crc_t10dif_mod_init(void) static void __exit crc_t10dif_mod_fini(void) { + crypto_unregister_notifier(&crc_t10dif_nb); crypto_free_shash(crct10dif_tfm); } -- 2.17.1