summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArd Biesheuvel <ardb@kernel.org>2025-09-17 23:30:18 +0200
committerArd Biesheuvel <ardb@kernel.org>2025-11-12 09:52:01 +0100
commit9520ef37713308e2741a5e80c4843d43bbf906eb (patch)
tree7a6bb33dc2280ed33b239185ec101b56fa18f123
parente9426f3e6bd408aaf6f484b2b43eddd63c6b3f8c (diff)
crypto/arm64: sm4-ce-ccm - Avoid pointless yield of the NEON unit
Kernel mode NEON sections are now preemptible on arm64, and so there is no need to yield it when calling APIs that may sleep. Also, move the calls to kernel_neon_end() to the same scope as kernel_neon_begin(). This is needed for a subsequent change where a stack buffer is allocated transparently and passed to kernel_neon_begin(). Reviewed-by: Eric Biggers <ebiggers@kernel.org> Acked-by: Herbert Xu <herbert@gondor.apana.org.au> Acked-by: Catalin Marinas <catalin.marinas@arm.com> Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
-rw-r--r--arch/arm64/crypto/sm4-ce-ccm-glue.c25
1 files changed, 6 insertions, 19 deletions
diff --git a/arch/arm64/crypto/sm4-ce-ccm-glue.c b/arch/arm64/crypto/sm4-ce-ccm-glue.c
index e9cc1c1364ec..e92cbdf1aaee 100644
--- a/arch/arm64/crypto/sm4-ce-ccm-glue.c
+++ b/arch/arm64/crypto/sm4-ce-ccm-glue.c
@@ -172,35 +172,22 @@ static int ccm_crypt(struct aead_request *req, struct skcipher_walk *walk,
if (req->assoclen)
ccm_calculate_auth_mac(req, mac);
- while (walk->nbytes && walk->nbytes != walk->total) {
+ while (walk->nbytes) {
unsigned int tail = walk->nbytes % SM4_BLOCK_SIZE;
+ if (walk->nbytes == walk->total)
+ tail = 0;
+
sm4_ce_ccm_crypt(rkey_enc, walk->dst.virt.addr,
walk->src.virt.addr, walk->iv,
walk->nbytes - tail, mac);
- kernel_neon_end();
-
err = skcipher_walk_done(walk, tail);
-
- kernel_neon_begin();
}
- if (walk->nbytes) {
- sm4_ce_ccm_crypt(rkey_enc, walk->dst.virt.addr,
- walk->src.virt.addr, walk->iv,
- walk->nbytes, mac);
-
- sm4_ce_ccm_final(rkey_enc, ctr0, mac);
+ sm4_ce_ccm_final(rkey_enc, ctr0, mac);
- kernel_neon_end();
-
- err = skcipher_walk_done(walk, 0);
- } else {
- sm4_ce_ccm_final(rkey_enc, ctr0, mac);
-
- kernel_neon_end();
- }
+ kernel_neon_end();
return err;
}