]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
crypto/arm64: sm4-ce-ccm - Avoid pointless yield of the NEON unit
authorArd Biesheuvel <ardb@kernel.org>
Wed, 17 Sep 2025 21:30:18 +0000 (23:30 +0200)
committerArd Biesheuvel <ardb@kernel.org>
Wed, 12 Nov 2025 08:52:01 +0000 (09:52 +0100)
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>
arch/arm64/crypto/sm4-ce-ccm-glue.c

index e9cc1c1364ec6298fa927b8526edb26a0ef27f88..e92cbdf1aaee70398fcc30a41caaf8ee33a81ab4 100644 (file)
@@ -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;
 }