From nobody Tue Sep 16 20:04:42 2025 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 7C726C4332F for ; Thu, 29 Dec 2022 08:59:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233058AbiL2I7E (ORCPT ); Thu, 29 Dec 2022 03:59:04 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54192 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229483AbiL2I7A (ORCPT ); Thu, 29 Dec 2022 03:59:00 -0500 Received: from formenos.hmeau.com (helcar.hmeau.com [216.24.177.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9F9271032; Thu, 29 Dec 2022 00:58:57 -0800 (PST) Received: from loth.rohan.me.apana.org.au ([192.168.167.2]) by formenos.hmeau.com with smtp (Exim 4.94.2 #2 (Debian)) id 1pAok1-00Bwg6-1M; Thu, 29 Dec 2022 16:58:22 +0800 Received: by loth.rohan.me.apana.org.au (sSMTP sendmail emulation); Thu, 29 Dec 2022 16:58:21 +0800 Date: Thu, 29 Dec 2022 16:58:21 +0800 From: Herbert Xu To: Christoph Hellwig Cc: Catalin Marinas , Ard Biesheuvel , Will Deacon , Marc Zyngier , Arnd Bergmann , Greg Kroah-Hartman , Andrew Morton , Linus Torvalds , Linux Memory Management List , Linux ARM , LinuxKernelMailingList@gondor.apana.org.au, linux-kernel@vger.kernel.org, "David S. Miller" , Linux Crypto Mailing List , Corentin Labbe Subject: [PATCH] crypto: sun8i-ss - Remove GFP_DMA and add DMA alignment padding Message-ID: References: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" GFP_DMA does not guarantee that the returned memory is aligned for DMA. In fact for sun8i-ss it is superfluous and can be removed. However, kmalloc may start returning DMA-unaligned memory in future so fix this by adding the alignment by hand. Signed-off-by: Herbert Xu diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c b/drivers/= crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c index 902f6be057ec..83c6dfad77e1 100644 Acked-by: Corentin Labbe Reviewed-by: Christoph Hellwig Tested-by: Corentin Labbe --- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c +++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c @@ -452,7 +452,7 @@ int sun8i_ss_aes_setkey(struct crypto_skcipher *tfm, co= nst u8 *key, } kfree_sensitive(op->key); op->keylen =3D keylen; - op->key =3D kmemdup(key, keylen, GFP_KERNEL | GFP_DMA); + op->key =3D kmemdup(key, keylen, GFP_KERNEL); if (!op->key) return -ENOMEM; =20 @@ -475,7 +475,7 @@ int sun8i_ss_des3_setkey(struct crypto_skcipher *tfm, c= onst u8 *key, =20 kfree_sensitive(op->key); op->keylen =3D keylen; - op->key =3D kmemdup(key, keylen, GFP_KERNEL | GFP_DMA); + op->key =3D kmemdup(key, keylen, GFP_KERNEL); if (!op->key) return -ENOMEM; =20 diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c b/drivers/cr= ypto/allwinner/sun8i-ss/sun8i-ss-core.c index ac2329e2b0e5..c9dc06f97857 100644 --- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c +++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -527,7 +528,7 @@ static int allocate_flows(struct sun8i_ss_dev *ss) init_completion(&ss->flows[i].complete); =20 ss->flows[i].biv =3D devm_kmalloc(ss->dev, AES_BLOCK_SIZE, - GFP_KERNEL | GFP_DMA); + GFP_KERNEL); if (!ss->flows[i].biv) { err =3D -ENOMEM; goto error_engine; @@ -535,7 +536,7 @@ static int allocate_flows(struct sun8i_ss_dev *ss) =20 for (j =3D 0; j < MAX_SG; j++) { ss->flows[i].iv[j] =3D devm_kmalloc(ss->dev, AES_BLOCK_SIZE, - GFP_KERNEL | GFP_DMA); + GFP_KERNEL); if (!ss->flows[i].iv[j]) { err =3D -ENOMEM; goto error_engine; @@ -544,13 +545,15 @@ static int allocate_flows(struct sun8i_ss_dev *ss) =20 /* the padding could be up to two block. */ ss->flows[i].pad =3D devm_kmalloc(ss->dev, MAX_PAD_SIZE, - GFP_KERNEL | GFP_DMA); + GFP_KERNEL); if (!ss->flows[i].pad) { err =3D -ENOMEM; goto error_engine; } - ss->flows[i].result =3D devm_kmalloc(ss->dev, SHA256_DIGEST_SIZE, - GFP_KERNEL | GFP_DMA); + ss->flows[i].result =3D + devm_kmalloc(ss->dev, max(SHA256_DIGEST_SIZE, + dma_get_cache_alignment()), + GFP_KERNEL); if (!ss->flows[i].result) { err =3D -ENOMEM; goto error_engine; diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c b/drivers/cr= ypto/allwinner/sun8i-ss/sun8i-ss-hash.c index 36a82b22953c..577bf636f7fb 100644 --- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c +++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c @@ -79,10 +79,10 @@ int sun8i_ss_hmac_setkey(struct crypto_ahash *ahash, co= nst u8 *key, memcpy(tfmctx->key, key, keylen); } =20 - tfmctx->ipad =3D kzalloc(bs, GFP_KERNEL | GFP_DMA); + tfmctx->ipad =3D kzalloc(bs, GFP_KERNEL); if (!tfmctx->ipad) return -ENOMEM; - tfmctx->opad =3D kzalloc(bs, GFP_KERNEL | GFP_DMA); + tfmctx->opad =3D kzalloc(bs, GFP_KERNEL); if (!tfmctx->opad) { ret =3D -ENOMEM; goto err_opad; diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-prng.c b/drivers/cr= ypto/allwinner/sun8i-ss/sun8i-ss-prng.c index dd677e9ed06f..70c7b5d571b8 100644 --- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-prng.c +++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-prng.c @@ -11,6 +11,8 @@ */ #include "sun8i-ss.h" #include +#include +#include #include #include =20 @@ -25,7 +27,7 @@ int sun8i_ss_prng_seed(struct crypto_rng *tfm, const u8 *= seed, ctx->seed =3D NULL; } if (!ctx->seed) - ctx->seed =3D kmalloc(slen, GFP_KERNEL | GFP_DMA); + ctx->seed =3D kmalloc(slen, GFP_KERNEL); if (!ctx->seed) return -ENOMEM; =20 @@ -58,6 +60,7 @@ int sun8i_ss_prng_generate(struct crypto_rng *tfm, const = u8 *src, struct sun8i_ss_rng_tfm_ctx *ctx =3D crypto_rng_ctx(tfm); struct rng_alg *alg =3D crypto_rng_alg(tfm); struct sun8i_ss_alg_template *algt; + unsigned int todo_with_padding; struct sun8i_ss_dev *ss; dma_addr_t dma_iv, dma_dst; unsigned int todo; @@ -81,7 +84,11 @@ int sun8i_ss_prng_generate(struct crypto_rng *tfm, const= u8 *src, todo =3D dlen + PRNG_SEED_SIZE + PRNG_DATA_SIZE; todo -=3D todo % PRNG_DATA_SIZE; =20 - d =3D kzalloc(todo, GFP_KERNEL | GFP_DMA); + todo_with_padding =3D ALIGN(todo, dma_get_cache_alignment()); + if (todo_with_padding < todo || todo < dlen) + return -EOVERFLOW; + + d =3D kzalloc(todo_with_padding, GFP_KERNEL); if (!d) return -ENOMEM; =20 --=20 Email: Herbert Xu Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt