stable.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* FAILED: patch "[PATCH] crypto: x86/aegis - Fix sleeping when disallowed on" failed to apply to 6.12-stable tree
@ 2025-08-21 12:55 gregkh
  2025-08-22  3:06 ` [PATCH 6.12.y 1/4] crypto: x86/aegis128 - eliminate some indirect calls Sasha Levin
  0 siblings, 1 reply; 11+ messages in thread
From: gregkh @ 2025-08-21 12:55 UTC (permalink / raw)
  To: ebiggers, herbert; +Cc: stable


The patch below does not apply to the 6.12-stable tree.
If someone wants it applied there, or to any other stable or longterm
tree, then please email the backport, including the original git commit
id to <stable@vger.kernel.org>.

To reproduce the conflict and resubmit, you may use the following commands:

git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.12.y
git checkout FETCH_HEAD
git cherry-pick -x c7f49dadfcdf27e1f747442e874e9baa52ab7674
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<stable@vger.kernel.org>' --in-reply-to '2025082102-shrug-unused-8ce2@gregkh' --subject-prefix 'PATCH 6.12.y' HEAD^..

Possible dependencies:



thanks,

greg k-h

------------------ original commit in Linus's tree ------------------

From c7f49dadfcdf27e1f747442e874e9baa52ab7674 Mon Sep 17 00:00:00 2001
From: Eric Biggers <ebiggers@kernel.org>
Date: Tue, 8 Jul 2025 12:38:28 -0700
Subject: [PATCH] crypto: x86/aegis - Fix sleeping when disallowed on
 PREEMPT_RT

skcipher_walk_done() can call kfree(), which takes a spinlock, which
makes it incorrect to call while preemption is disabled on PREEMPT_RT.
Therefore, end the kernel-mode FPU section before calling
skcipher_walk_done(), and restart it afterwards.

Moreover, pass atomic=false to skcipher_walk_aead_encrypt() instead of
atomic=true.  The point of atomic=true was to make skcipher_walk_done()
safe to call while in a kernel-mode FPU section, but that does not
actually work.  So just use the usual atomic=false.

Fixes: 1d373d4e8e15 ("crypto: x86 - Add optimized AEGIS implementations")
Cc: stable@vger.kernel.org
Signed-off-by: Eric Biggers <ebiggers@kernel.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

diff --git a/arch/x86/crypto/aegis128-aesni-glue.c b/arch/x86/crypto/aegis128-aesni-glue.c
index f1b6d40154e3..3cb5c193038b 100644
--- a/arch/x86/crypto/aegis128-aesni-glue.c
+++ b/arch/x86/crypto/aegis128-aesni-glue.c
@@ -119,7 +119,9 @@ crypto_aegis128_aesni_process_crypt(struct aegis_state *state,
 					   walk->dst.virt.addr,
 					   round_down(walk->nbytes,
 						      AEGIS128_BLOCK_SIZE));
+		kernel_fpu_end();
 		skcipher_walk_done(walk, walk->nbytes % AEGIS128_BLOCK_SIZE);
+		kernel_fpu_begin();
 	}
 
 	if (walk->nbytes) {
@@ -131,7 +133,9 @@ crypto_aegis128_aesni_process_crypt(struct aegis_state *state,
 			aegis128_aesni_dec_tail(state, walk->src.virt.addr,
 						walk->dst.virt.addr,
 						walk->nbytes);
+		kernel_fpu_end();
 		skcipher_walk_done(walk, 0);
+		kernel_fpu_begin();
 	}
 }
 
@@ -176,9 +180,9 @@ crypto_aegis128_aesni_crypt(struct aead_request *req,
 	struct aegis_state state;
 
 	if (enc)
-		skcipher_walk_aead_encrypt(&walk, req, true);
+		skcipher_walk_aead_encrypt(&walk, req, false);
 	else
-		skcipher_walk_aead_decrypt(&walk, req, true);
+		skcipher_walk_aead_decrypt(&walk, req, false);
 
 	kernel_fpu_begin();
 


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 6.12.y 1/4] crypto: x86/aegis128 - eliminate some indirect calls
  2025-08-21 12:55 FAILED: patch "[PATCH] crypto: x86/aegis - Fix sleeping when disallowed on" failed to apply to 6.12-stable tree gregkh
@ 2025-08-22  3:06 ` Sasha Levin
  2025-08-22  3:06   ` [PATCH 6.12.y 2/4] crypto: x86/aegis128 - optimize length block preparation using SSE4.1 Sasha Levin
                     ` (2 more replies)
  0 siblings, 3 replies; 11+ messages in thread
From: Sasha Levin @ 2025-08-22  3:06 UTC (permalink / raw)
  To: stable; +Cc: Eric Biggers, Ondrej Mosnacek, Herbert Xu, Sasha Levin

From: Eric Biggers <ebiggers@google.com>

[ Upstream commit b8d2e7bac3f768e5ab0b52a4a6dd65aa130113be ]

Instead of using a struct of function pointers to decide whether to call
the encryption or decryption assembly functions, use a conditional
branch on a bool.  Force-inline the functions to avoid actually
generating the branch.  This improves performance slightly since
indirect calls are slow.  Remove the now-unnecessary CFI stubs.

Note that just force-inlining the existing functions might cause the
compiler to optimize out the indirect branches, but that would not be a
reliable way to do it and the CFI stubs would still be required.

Reviewed-by: Ondrej Mosnacek <omosnace@redhat.com>
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Stable-dep-of: c7f49dadfcdf ("crypto: x86/aegis - Fix sleeping when disallowed on PREEMPT_RT")
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 arch/x86/crypto/aegis128-aesni-asm.S  |  9 ++--
 arch/x86/crypto/aegis128-aesni-glue.c | 74 +++++++++++++--------------
 2 files changed, 40 insertions(+), 43 deletions(-)

diff --git a/arch/x86/crypto/aegis128-aesni-asm.S b/arch/x86/crypto/aegis128-aesni-asm.S
index 2de859173940..1b57558548c7 100644
--- a/arch/x86/crypto/aegis128-aesni-asm.S
+++ b/arch/x86/crypto/aegis128-aesni-asm.S
@@ -7,7 +7,6 @@
  */
 
 #include <linux/linkage.h>
-#include <linux/cfi_types.h>
 #include <asm/frame.h>
 
 #define STATE0	%xmm0
@@ -403,7 +402,7 @@ SYM_FUNC_END(crypto_aegis128_aesni_ad)
  * void crypto_aegis128_aesni_enc(void *state, unsigned int length,
  *                                const void *src, void *dst);
  */
-SYM_TYPED_FUNC_START(crypto_aegis128_aesni_enc)
+SYM_FUNC_START(crypto_aegis128_aesni_enc)
 	FRAME_BEGIN
 
 	cmp $0x10, LEN
@@ -500,7 +499,7 @@ SYM_FUNC_END(crypto_aegis128_aesni_enc)
  * void crypto_aegis128_aesni_enc_tail(void *state, unsigned int length,
  *                                     const void *src, void *dst);
  */
-SYM_TYPED_FUNC_START(crypto_aegis128_aesni_enc_tail)
+SYM_FUNC_START(crypto_aegis128_aesni_enc_tail)
 	FRAME_BEGIN
 
 	/* load the state: */
@@ -557,7 +556,7 @@ SYM_FUNC_END(crypto_aegis128_aesni_enc_tail)
  * void crypto_aegis128_aesni_dec(void *state, unsigned int length,
  *                                const void *src, void *dst);
  */
-SYM_TYPED_FUNC_START(crypto_aegis128_aesni_dec)
+SYM_FUNC_START(crypto_aegis128_aesni_dec)
 	FRAME_BEGIN
 
 	cmp $0x10, LEN
@@ -654,7 +653,7 @@ SYM_FUNC_END(crypto_aegis128_aesni_dec)
  * void crypto_aegis128_aesni_dec_tail(void *state, unsigned int length,
  *                                     const void *src, void *dst);
  */
-SYM_TYPED_FUNC_START(crypto_aegis128_aesni_dec_tail)
+SYM_FUNC_START(crypto_aegis128_aesni_dec_tail)
 	FRAME_BEGIN
 
 	/* load the state: */
diff --git a/arch/x86/crypto/aegis128-aesni-glue.c b/arch/x86/crypto/aegis128-aesni-glue.c
index 4623189000d8..6c4c2cda2c2d 100644
--- a/arch/x86/crypto/aegis128-aesni-glue.c
+++ b/arch/x86/crypto/aegis128-aesni-glue.c
@@ -56,16 +56,6 @@ struct aegis_ctx {
 	struct aegis_block key;
 };
 
-struct aegis_crypt_ops {
-	int (*skcipher_walk_init)(struct skcipher_walk *walk,
-				  struct aead_request *req, bool atomic);
-
-	void (*crypt_blocks)(void *state, unsigned int length, const void *src,
-			     void *dst);
-	void (*crypt_tail)(void *state, unsigned int length, const void *src,
-			   void *dst);
-};
-
 static void crypto_aegis128_aesni_process_ad(
 		struct aegis_state *state, struct scatterlist *sg_src,
 		unsigned int assoclen)
@@ -114,20 +104,37 @@ static void crypto_aegis128_aesni_process_ad(
 	}
 }
 
-static void crypto_aegis128_aesni_process_crypt(
-		struct aegis_state *state, struct skcipher_walk *walk,
-		const struct aegis_crypt_ops *ops)
+static __always_inline void
+crypto_aegis128_aesni_process_crypt(struct aegis_state *state,
+				    struct skcipher_walk *walk, bool enc)
 {
 	while (walk->nbytes >= AEGIS128_BLOCK_SIZE) {
-		ops->crypt_blocks(state,
-				  round_down(walk->nbytes, AEGIS128_BLOCK_SIZE),
-				  walk->src.virt.addr, walk->dst.virt.addr);
+		if (enc)
+			crypto_aegis128_aesni_enc(
+					state,
+					round_down(walk->nbytes,
+						   AEGIS128_BLOCK_SIZE),
+					walk->src.virt.addr,
+					walk->dst.virt.addr);
+		else
+			crypto_aegis128_aesni_dec(
+					state,
+					round_down(walk->nbytes,
+						   AEGIS128_BLOCK_SIZE),
+					walk->src.virt.addr,
+					walk->dst.virt.addr);
 		skcipher_walk_done(walk, walk->nbytes % AEGIS128_BLOCK_SIZE);
 	}
 
 	if (walk->nbytes) {
-		ops->crypt_tail(state, walk->nbytes, walk->src.virt.addr,
-				walk->dst.virt.addr);
+		if (enc)
+			crypto_aegis128_aesni_enc_tail(state, walk->nbytes,
+						       walk->src.virt.addr,
+						       walk->dst.virt.addr);
+		else
+			crypto_aegis128_aesni_dec_tail(state, walk->nbytes,
+						       walk->src.virt.addr,
+						       walk->dst.virt.addr);
 		skcipher_walk_done(walk, 0);
 	}
 }
@@ -162,23 +169,26 @@ static int crypto_aegis128_aesni_setauthsize(struct crypto_aead *tfm,
 	return 0;
 }
 
-static void crypto_aegis128_aesni_crypt(struct aead_request *req,
-					struct aegis_block *tag_xor,
-					unsigned int cryptlen,
-					const struct aegis_crypt_ops *ops)
+static __always_inline void
+crypto_aegis128_aesni_crypt(struct aead_request *req,
+			    struct aegis_block *tag_xor,
+			    unsigned int cryptlen, bool enc)
 {
 	struct crypto_aead *tfm = crypto_aead_reqtfm(req);
 	struct aegis_ctx *ctx = crypto_aegis128_aesni_ctx(tfm);
 	struct skcipher_walk walk;
 	struct aegis_state state;
 
-	ops->skcipher_walk_init(&walk, req, true);
+	if (enc)
+		skcipher_walk_aead_encrypt(&walk, req, true);
+	else
+		skcipher_walk_aead_decrypt(&walk, req, true);
 
 	kernel_fpu_begin();
 
 	crypto_aegis128_aesni_init(&state, ctx->key.bytes, req->iv);
 	crypto_aegis128_aesni_process_ad(&state, req->src, req->assoclen);
-	crypto_aegis128_aesni_process_crypt(&state, &walk, ops);
+	crypto_aegis128_aesni_process_crypt(&state, &walk, enc);
 	crypto_aegis128_aesni_final(&state, tag_xor, req->assoclen, cryptlen);
 
 	kernel_fpu_end();
@@ -186,18 +196,12 @@ static void crypto_aegis128_aesni_crypt(struct aead_request *req,
 
 static int crypto_aegis128_aesni_encrypt(struct aead_request *req)
 {
-	static const struct aegis_crypt_ops OPS = {
-		.skcipher_walk_init = skcipher_walk_aead_encrypt,
-		.crypt_blocks = crypto_aegis128_aesni_enc,
-		.crypt_tail = crypto_aegis128_aesni_enc_tail,
-	};
-
 	struct crypto_aead *tfm = crypto_aead_reqtfm(req);
 	struct aegis_block tag = {};
 	unsigned int authsize = crypto_aead_authsize(tfm);
 	unsigned int cryptlen = req->cryptlen;
 
-	crypto_aegis128_aesni_crypt(req, &tag, cryptlen, &OPS);
+	crypto_aegis128_aesni_crypt(req, &tag, cryptlen, true);
 
 	scatterwalk_map_and_copy(tag.bytes, req->dst,
 				 req->assoclen + cryptlen, authsize, 1);
@@ -208,12 +212,6 @@ static int crypto_aegis128_aesni_decrypt(struct aead_request *req)
 {
 	static const struct aegis_block zeros = {};
 
-	static const struct aegis_crypt_ops OPS = {
-		.skcipher_walk_init = skcipher_walk_aead_decrypt,
-		.crypt_blocks = crypto_aegis128_aesni_dec,
-		.crypt_tail = crypto_aegis128_aesni_dec_tail,
-	};
-
 	struct crypto_aead *tfm = crypto_aead_reqtfm(req);
 	struct aegis_block tag;
 	unsigned int authsize = crypto_aead_authsize(tfm);
@@ -222,7 +220,7 @@ static int crypto_aegis128_aesni_decrypt(struct aead_request *req)
 	scatterwalk_map_and_copy(tag.bytes, req->src,
 				 req->assoclen + cryptlen, authsize, 0);
 
-	crypto_aegis128_aesni_crypt(req, &tag, cryptlen, &OPS);
+	crypto_aegis128_aesni_crypt(req, &tag, cryptlen, false);
 
 	return crypto_memneq(tag.bytes, zeros.bytes, authsize) ? -EBADMSG : 0;
 }
-- 
2.50.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 6.12.y 2/4] crypto: x86/aegis128 - optimize length block preparation using SSE4.1
  2025-08-22  3:06 ` [PATCH 6.12.y 1/4] crypto: x86/aegis128 - eliminate some indirect calls Sasha Levin
@ 2025-08-22  3:06   ` Sasha Levin
  2025-08-22  3:06   ` [PATCH 6.12.y 3/4] crypto: x86/aegis128 - improve assembly function prototypes Sasha Levin
  2025-08-22  3:06   ` [PATCH 6.12.y 4/4] crypto: x86/aegis - Fix sleeping when disallowed on PREEMPT_RT Sasha Levin
  2 siblings, 0 replies; 11+ messages in thread
From: Sasha Levin @ 2025-08-22  3:06 UTC (permalink / raw)
  To: stable; +Cc: Eric Biggers, Ondrej Mosnacek, Herbert Xu, Sasha Levin

From: Eric Biggers <ebiggers@google.com>

[ Upstream commit af2aff7caf8afb7abbe219a838d61b4c17d88a47 ]

Start using SSE4.1 instructions in the AES-NI AEGIS code, with the first
use case being preparing the length block in fewer instructions.

In practice this does not reduce the set of CPUs on which the code can
run, because all Intel and AMD CPUs with AES-NI also have SSE4.1.

Upgrade the existing SSE2 feature check to SSE4.1, though it seems this
check is not strictly necessary; the aesni-intel module has been getting
away with using SSE4.1 despite checking for AES-NI only.

Reviewed-by: Ondrej Mosnacek <omosnace@redhat.com>
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Stable-dep-of: c7f49dadfcdf ("crypto: x86/aegis - Fix sleeping when disallowed on PREEMPT_RT")
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 arch/x86/crypto/Kconfig               | 4 ++--
 arch/x86/crypto/aegis128-aesni-asm.S  | 6 ++----
 arch/x86/crypto/aegis128-aesni-glue.c | 6 +++---
 3 files changed, 7 insertions(+), 9 deletions(-)

diff --git a/arch/x86/crypto/Kconfig b/arch/x86/crypto/Kconfig
index 46b53ab06165..0cf89264db08 100644
--- a/arch/x86/crypto/Kconfig
+++ b/arch/x86/crypto/Kconfig
@@ -366,7 +366,7 @@ config CRYPTO_CHACHA20_X86_64
 	  - AVX-512VL (Advanced Vector Extensions-512VL)
 
 config CRYPTO_AEGIS128_AESNI_SSE2
-	tristate "AEAD ciphers: AEGIS-128 (AES-NI/SSE2)"
+	tristate "AEAD ciphers: AEGIS-128 (AES-NI/SSE4.1)"
 	depends on X86 && 64BIT
 	select CRYPTO_AEAD
 	select CRYPTO_SIMD
@@ -375,7 +375,7 @@ config CRYPTO_AEGIS128_AESNI_SSE2
 
 	  Architecture: x86_64 using:
 	  - AES-NI (AES New Instructions)
-	  - SSE2 (Streaming SIMD Extensions 2)
+	  - SSE4.1 (Streaming SIMD Extensions 4.1)
 
 config CRYPTO_NHPOLY1305_SSE2
 	tristate "Hash functions: NHPoly1305 (SSE2)"
diff --git a/arch/x86/crypto/aegis128-aesni-asm.S b/arch/x86/crypto/aegis128-aesni-asm.S
index 1b57558548c7..639ba6f31a90 100644
--- a/arch/x86/crypto/aegis128-aesni-asm.S
+++ b/arch/x86/crypto/aegis128-aesni-asm.S
@@ -1,6 +1,6 @@
 /* SPDX-License-Identifier: GPL-2.0-only */
 /*
- * AES-NI + SSE2 implementation of AEGIS-128
+ * AES-NI + SSE4.1 implementation of AEGIS-128
  *
  * Copyright (c) 2017-2018 Ondrej Mosnacek <omosnacek@gmail.com>
  * Copyright (C) 2017-2018 Red Hat, Inc. All rights reserved.
@@ -716,9 +716,7 @@ SYM_FUNC_START(crypto_aegis128_aesni_final)
 
 	/* prepare length block: */
 	movd %edx, MSG
-	movd %ecx, T0
-	pslldq $8, T0
-	pxor T0, MSG
+	pinsrd $2, %ecx, MSG
 	psllq $3, MSG /* multiply by 8 (to get bit count) */
 
 	pxor STATE3, MSG
diff --git a/arch/x86/crypto/aegis128-aesni-glue.c b/arch/x86/crypto/aegis128-aesni-glue.c
index 6c4c2cda2c2d..9b52451f6fee 100644
--- a/arch/x86/crypto/aegis128-aesni-glue.c
+++ b/arch/x86/crypto/aegis128-aesni-glue.c
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: GPL-2.0-or-later
 /*
  * The AEGIS-128 Authenticated-Encryption Algorithm
- *   Glue for AES-NI + SSE2 implementation
+ *   Glue for AES-NI + SSE4.1 implementation
  *
  * Copyright (c) 2017-2018 Ondrej Mosnacek <omosnacek@gmail.com>
  * Copyright (C) 2017-2018 Red Hat, Inc. All rights reserved.
@@ -265,7 +265,7 @@ static struct simd_aead_alg *simd_alg;
 
 static int __init crypto_aegis128_aesni_module_init(void)
 {
-	if (!boot_cpu_has(X86_FEATURE_XMM2) ||
+	if (!boot_cpu_has(X86_FEATURE_XMM4_1) ||
 	    !boot_cpu_has(X86_FEATURE_AES) ||
 	    !cpu_has_xfeatures(XFEATURE_MASK_SSE, NULL))
 		return -ENODEV;
@@ -284,6 +284,6 @@ module_exit(crypto_aegis128_aesni_module_exit);
 
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Ondrej Mosnacek <omosnacek@gmail.com>");
-MODULE_DESCRIPTION("AEGIS-128 AEAD algorithm -- AESNI+SSE2 implementation");
+MODULE_DESCRIPTION("AEGIS-128 AEAD algorithm -- AESNI+SSE4.1 implementation");
 MODULE_ALIAS_CRYPTO("aegis128");
 MODULE_ALIAS_CRYPTO("aegis128-aesni");
-- 
2.50.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 6.12.y 3/4] crypto: x86/aegis128 - improve assembly function prototypes
  2025-08-22  3:06 ` [PATCH 6.12.y 1/4] crypto: x86/aegis128 - eliminate some indirect calls Sasha Levin
  2025-08-22  3:06   ` [PATCH 6.12.y 2/4] crypto: x86/aegis128 - optimize length block preparation using SSE4.1 Sasha Levin
@ 2025-08-22  3:06   ` Sasha Levin
  2025-08-22  3:06   ` [PATCH 6.12.y 4/4] crypto: x86/aegis - Fix sleeping when disallowed on PREEMPT_RT Sasha Levin
  2 siblings, 0 replies; 11+ messages in thread
From: Sasha Levin @ 2025-08-22  3:06 UTC (permalink / raw)
  To: stable; +Cc: Eric Biggers, Ondrej Mosnacek, Herbert Xu, Sasha Levin

From: Eric Biggers <ebiggers@google.com>

[ Upstream commit 8da94b300f67240fbd8880d918200aa9046fc398 ]

Adjust the prototypes of the AEGIS assembly functions:

- Use proper types instead of 'void *', when applicable.

- Move the length parameter to after the buffers it describes rather
  than before, to match the usual convention.  Also shorten its name to
  just len (which is the name used in the assembly code).

- Declare register aliases at the beginning of each function rather than
  once per file.  This was necessary because len was moved, but also it
  allows adding some aliases where raw registers were used before.

- Put assoclen and cryptlen in the correct order when declaring the
  finalization function in the .c file.

- Remove the unnecessary "crypto_" prefix.

Reviewed-by: Ondrej Mosnacek <omosnace@redhat.com>
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Stable-dep-of: c7f49dadfcdf ("crypto: x86/aegis - Fix sleeping when disallowed on PREEMPT_RT")
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 arch/x86/crypto/aegis128-aesni-asm.S  | 105 ++++++++++++++++----------
 arch/x86/crypto/aegis128-aesni-glue.c |  92 +++++++++++-----------
 2 files changed, 112 insertions(+), 85 deletions(-)

diff --git a/arch/x86/crypto/aegis128-aesni-asm.S b/arch/x86/crypto/aegis128-aesni-asm.S
index 639ba6f31a90..6520d0ed9814 100644
--- a/arch/x86/crypto/aegis128-aesni-asm.S
+++ b/arch/x86/crypto/aegis128-aesni-asm.S
@@ -19,11 +19,6 @@
 #define T0	%xmm6
 #define T1	%xmm7
 
-#define STATEP	%rdi
-#define LEN	%esi
-#define SRC	%rdx
-#define DST	%rcx
-
 .section .rodata.cst16.aegis128_const, "aM", @progbits, 32
 .align 16
 .Laegis128_const_0:
@@ -72,6 +67,8 @@
  *   %r9
  */
 SYM_FUNC_START_LOCAL(__load_partial)
+	.set LEN, %ecx
+	.set SRC, %rsi
 	xor %r9d, %r9d
 	pxor MSG, MSG
 
@@ -138,6 +135,8 @@ SYM_FUNC_END(__load_partial)
  *   %r10
  */
 SYM_FUNC_START_LOCAL(__store_partial)
+	.set LEN, %ecx
+	.set DST, %rdx
 	mov LEN, %r8d
 	mov DST, %r9
 
@@ -184,16 +183,21 @@ SYM_FUNC_START_LOCAL(__store_partial)
 SYM_FUNC_END(__store_partial)
 
 /*
- * void crypto_aegis128_aesni_init(void *state, const void *key, const void *iv);
+ * void aegis128_aesni_init(struct aegis_state *state,
+ *			    const struct aegis_block *key,
+ *			    const u8 iv[AEGIS128_NONCE_SIZE]);
  */
-SYM_FUNC_START(crypto_aegis128_aesni_init)
+SYM_FUNC_START(aegis128_aesni_init)
+	.set STATEP, %rdi
+	.set KEYP, %rsi
+	.set IVP, %rdx
 	FRAME_BEGIN
 
 	/* load IV: */
-	movdqu (%rdx), T1
+	movdqu (IVP), T1
 
 	/* load key: */
-	movdqa (%rsi), KEY
+	movdqa (KEYP), KEY
 	pxor KEY, T1
 	movdqa T1, STATE0
 	movdqa KEY, STATE3
@@ -226,13 +230,16 @@ SYM_FUNC_START(crypto_aegis128_aesni_init)
 
 	FRAME_END
 	RET
-SYM_FUNC_END(crypto_aegis128_aesni_init)
+SYM_FUNC_END(aegis128_aesni_init)
 
 /*
- * void crypto_aegis128_aesni_ad(void *state, unsigned int length,
- *                               const void *data);
+ * void aegis128_aesni_ad(struct aegis_state *state, const u8 *data,
+ *			  unsigned int len);
  */
-SYM_FUNC_START(crypto_aegis128_aesni_ad)
+SYM_FUNC_START(aegis128_aesni_ad)
+	.set STATEP, %rdi
+	.set SRC, %rsi
+	.set LEN, %edx
 	FRAME_BEGIN
 
 	cmp $0x10, LEN
@@ -378,7 +385,7 @@ SYM_FUNC_START(crypto_aegis128_aesni_ad)
 .Lad_out:
 	FRAME_END
 	RET
-SYM_FUNC_END(crypto_aegis128_aesni_ad)
+SYM_FUNC_END(aegis128_aesni_ad)
 
 .macro encrypt_block a s0 s1 s2 s3 s4 i
 	movdq\a (\i * 0x10)(SRC), MSG
@@ -399,10 +406,14 @@ SYM_FUNC_END(crypto_aegis128_aesni_ad)
 .endm
 
 /*
- * void crypto_aegis128_aesni_enc(void *state, unsigned int length,
- *                                const void *src, void *dst);
+ * void aegis128_aesni_enc(struct aegis_state *state, const u8 *src, u8 *dst,
+ *			   unsigned int len);
  */
-SYM_FUNC_START(crypto_aegis128_aesni_enc)
+SYM_FUNC_START(aegis128_aesni_enc)
+	.set STATEP, %rdi
+	.set SRC, %rsi
+	.set DST, %rdx
+	.set LEN, %ecx
 	FRAME_BEGIN
 
 	cmp $0x10, LEN
@@ -493,13 +504,17 @@ SYM_FUNC_START(crypto_aegis128_aesni_enc)
 .Lenc_out:
 	FRAME_END
 	RET
-SYM_FUNC_END(crypto_aegis128_aesni_enc)
+SYM_FUNC_END(aegis128_aesni_enc)
 
 /*
- * void crypto_aegis128_aesni_enc_tail(void *state, unsigned int length,
- *                                     const void *src, void *dst);
+ * void aegis128_aesni_enc_tail(struct aegis_state *state, const u8 *src,
+ *				u8 *dst, unsigned int len);
  */
-SYM_FUNC_START(crypto_aegis128_aesni_enc_tail)
+SYM_FUNC_START(aegis128_aesni_enc_tail)
+	.set STATEP, %rdi
+	.set SRC, %rsi
+	.set DST, %rdx
+	.set LEN, %ecx
 	FRAME_BEGIN
 
 	/* load the state: */
@@ -533,7 +548,7 @@ SYM_FUNC_START(crypto_aegis128_aesni_enc_tail)
 
 	FRAME_END
 	RET
-SYM_FUNC_END(crypto_aegis128_aesni_enc_tail)
+SYM_FUNC_END(aegis128_aesni_enc_tail)
 
 .macro decrypt_block a s0 s1 s2 s3 s4 i
 	movdq\a (\i * 0x10)(SRC), MSG
@@ -553,10 +568,14 @@ SYM_FUNC_END(crypto_aegis128_aesni_enc_tail)
 .endm
 
 /*
- * void crypto_aegis128_aesni_dec(void *state, unsigned int length,
- *                                const void *src, void *dst);
+ * void aegis128_aesni_dec(struct aegis_state *state, const u8 *src, u8 *dst,
+ *			   unsigned int len);
  */
-SYM_FUNC_START(crypto_aegis128_aesni_dec)
+SYM_FUNC_START(aegis128_aesni_dec)
+	.set STATEP, %rdi
+	.set SRC, %rsi
+	.set DST, %rdx
+	.set LEN, %ecx
 	FRAME_BEGIN
 
 	cmp $0x10, LEN
@@ -647,13 +666,17 @@ SYM_FUNC_START(crypto_aegis128_aesni_dec)
 .Ldec_out:
 	FRAME_END
 	RET
-SYM_FUNC_END(crypto_aegis128_aesni_dec)
+SYM_FUNC_END(aegis128_aesni_dec)
 
 /*
- * void crypto_aegis128_aesni_dec_tail(void *state, unsigned int length,
- *                                     const void *src, void *dst);
+ * void aegis128_aesni_dec_tail(struct aegis_state *state, const u8 *src,
+ *				u8 *dst, unsigned int len);
  */
-SYM_FUNC_START(crypto_aegis128_aesni_dec_tail)
+SYM_FUNC_START(aegis128_aesni_dec_tail)
+	.set STATEP, %rdi
+	.set SRC, %rsi
+	.set DST, %rdx
+	.set LEN, %ecx
 	FRAME_BEGIN
 
 	/* load the state: */
@@ -697,14 +720,18 @@ SYM_FUNC_START(crypto_aegis128_aesni_dec_tail)
 
 	FRAME_END
 	RET
-SYM_FUNC_END(crypto_aegis128_aesni_dec_tail)
+SYM_FUNC_END(aegis128_aesni_dec_tail)
 
 /*
- * void crypto_aegis128_aesni_final(void *state, void *tag_xor,
- *                                  unsigned int assoclen,
- *                                  unsigned int cryptlen);
+ * void aegis128_aesni_final(struct aegis_state *state,
+ *			     struct aegis_block *tag_xor,
+ *			     unsigned int assoclen, unsigned int cryptlen);
  */
-SYM_FUNC_START(crypto_aegis128_aesni_final)
+SYM_FUNC_START(aegis128_aesni_final)
+	.set STATEP, %rdi
+	.set TAG_XOR, %rsi
+	.set ASSOCLEN, %edx
+	.set CRYPTLEN, %ecx
 	FRAME_BEGIN
 
 	/* load the state: */
@@ -715,8 +742,8 @@ SYM_FUNC_START(crypto_aegis128_aesni_final)
 	movdqu 0x40(STATEP), STATE4
 
 	/* prepare length block: */
-	movd %edx, MSG
-	pinsrd $2, %ecx, MSG
+	movd ASSOCLEN, MSG
+	pinsrd $2, CRYPTLEN, MSG
 	psllq $3, MSG /* multiply by 8 (to get bit count) */
 
 	pxor STATE3, MSG
@@ -731,7 +758,7 @@ SYM_FUNC_START(crypto_aegis128_aesni_final)
 	aegis128_update; pxor MSG, STATE3
 
 	/* xor tag: */
-	movdqu (%rsi), MSG
+	movdqu (TAG_XOR), MSG
 
 	pxor STATE0, MSG
 	pxor STATE1, MSG
@@ -739,8 +766,8 @@ SYM_FUNC_START(crypto_aegis128_aesni_final)
 	pxor STATE3, MSG
 	pxor STATE4, MSG
 
-	movdqu MSG, (%rsi)
+	movdqu MSG, (TAG_XOR)
 
 	FRAME_END
 	RET
-SYM_FUNC_END(crypto_aegis128_aesni_final)
+SYM_FUNC_END(aegis128_aesni_final)
diff --git a/arch/x86/crypto/aegis128-aesni-glue.c b/arch/x86/crypto/aegis128-aesni-glue.c
index 9b52451f6fee..e7a28ccf273b 100644
--- a/arch/x86/crypto/aegis128-aesni-glue.c
+++ b/arch/x86/crypto/aegis128-aesni-glue.c
@@ -23,27 +23,6 @@
 #define AEGIS128_MIN_AUTH_SIZE 8
 #define AEGIS128_MAX_AUTH_SIZE 16
 
-asmlinkage void crypto_aegis128_aesni_init(void *state, void *key, void *iv);
-
-asmlinkage void crypto_aegis128_aesni_ad(
-		void *state, unsigned int length, const void *data);
-
-asmlinkage void crypto_aegis128_aesni_enc(
-		void *state, unsigned int length, const void *src, void *dst);
-
-asmlinkage void crypto_aegis128_aesni_dec(
-		void *state, unsigned int length, const void *src, void *dst);
-
-asmlinkage void crypto_aegis128_aesni_enc_tail(
-		void *state, unsigned int length, const void *src, void *dst);
-
-asmlinkage void crypto_aegis128_aesni_dec_tail(
-		void *state, unsigned int length, const void *src, void *dst);
-
-asmlinkage void crypto_aegis128_aesni_final(
-		void *state, void *tag_xor, unsigned int cryptlen,
-		unsigned int assoclen);
-
 struct aegis_block {
 	u8 bytes[AEGIS128_BLOCK_SIZE] __aligned(AEGIS128_BLOCK_ALIGN);
 };
@@ -56,6 +35,32 @@ struct aegis_ctx {
 	struct aegis_block key;
 };
 
+asmlinkage void aegis128_aesni_init(struct aegis_state *state,
+				    const struct aegis_block *key,
+				    const u8 iv[AEGIS128_NONCE_SIZE]);
+
+asmlinkage void aegis128_aesni_ad(struct aegis_state *state, const u8 *data,
+				  unsigned int len);
+
+asmlinkage void aegis128_aesni_enc(struct aegis_state *state, const u8 *src,
+				   u8 *dst, unsigned int len);
+
+asmlinkage void aegis128_aesni_dec(struct aegis_state *state, const u8 *src,
+				   u8 *dst, unsigned int len);
+
+asmlinkage void aegis128_aesni_enc_tail(struct aegis_state *state,
+					const u8 *src, u8 *dst,
+					unsigned int len);
+
+asmlinkage void aegis128_aesni_dec_tail(struct aegis_state *state,
+					const u8 *src, u8 *dst,
+					unsigned int len);
+
+asmlinkage void aegis128_aesni_final(struct aegis_state *state,
+				     struct aegis_block *tag_xor,
+				     unsigned int assoclen,
+				     unsigned int cryptlen);
+
 static void crypto_aegis128_aesni_process_ad(
 		struct aegis_state *state, struct scatterlist *sg_src,
 		unsigned int assoclen)
@@ -75,15 +80,14 @@ static void crypto_aegis128_aesni_process_ad(
 			if (pos > 0) {
 				unsigned int fill = AEGIS128_BLOCK_SIZE - pos;
 				memcpy(buf.bytes + pos, src, fill);
-				crypto_aegis128_aesni_ad(state,
-							 AEGIS128_BLOCK_SIZE,
-							 buf.bytes);
+				aegis128_aesni_ad(state, buf.bytes,
+						  AEGIS128_BLOCK_SIZE);
 				pos = 0;
 				left -= fill;
 				src += fill;
 			}
 
-			crypto_aegis128_aesni_ad(state, left, src);
+			aegis128_aesni_ad(state, src, left);
 
 			src += left & ~(AEGIS128_BLOCK_SIZE - 1);
 			left &= AEGIS128_BLOCK_SIZE - 1;
@@ -100,7 +104,7 @@ static void crypto_aegis128_aesni_process_ad(
 
 	if (pos > 0) {
 		memset(buf.bytes + pos, 0, AEGIS128_BLOCK_SIZE - pos);
-		crypto_aegis128_aesni_ad(state, AEGIS128_BLOCK_SIZE, buf.bytes);
+		aegis128_aesni_ad(state, buf.bytes, AEGIS128_BLOCK_SIZE);
 	}
 }
 
@@ -110,31 +114,27 @@ crypto_aegis128_aesni_process_crypt(struct aegis_state *state,
 {
 	while (walk->nbytes >= AEGIS128_BLOCK_SIZE) {
 		if (enc)
-			crypto_aegis128_aesni_enc(
-					state,
-					round_down(walk->nbytes,
-						   AEGIS128_BLOCK_SIZE),
-					walk->src.virt.addr,
-					walk->dst.virt.addr);
+			aegis128_aesni_enc(state, walk->src.virt.addr,
+					   walk->dst.virt.addr,
+					   round_down(walk->nbytes,
+						      AEGIS128_BLOCK_SIZE));
 		else
-			crypto_aegis128_aesni_dec(
-					state,
-					round_down(walk->nbytes,
-						   AEGIS128_BLOCK_SIZE),
-					walk->src.virt.addr,
-					walk->dst.virt.addr);
+			aegis128_aesni_dec(state, walk->src.virt.addr,
+					   walk->dst.virt.addr,
+					   round_down(walk->nbytes,
+						      AEGIS128_BLOCK_SIZE));
 		skcipher_walk_done(walk, walk->nbytes % AEGIS128_BLOCK_SIZE);
 	}
 
 	if (walk->nbytes) {
 		if (enc)
-			crypto_aegis128_aesni_enc_tail(state, walk->nbytes,
-						       walk->src.virt.addr,
-						       walk->dst.virt.addr);
+			aegis128_aesni_enc_tail(state, walk->src.virt.addr,
+						walk->dst.virt.addr,
+						walk->nbytes);
 		else
-			crypto_aegis128_aesni_dec_tail(state, walk->nbytes,
-						       walk->src.virt.addr,
-						       walk->dst.virt.addr);
+			aegis128_aesni_dec_tail(state, walk->src.virt.addr,
+						walk->dst.virt.addr,
+						walk->nbytes);
 		skcipher_walk_done(walk, 0);
 	}
 }
@@ -186,10 +186,10 @@ crypto_aegis128_aesni_crypt(struct aead_request *req,
 
 	kernel_fpu_begin();
 
-	crypto_aegis128_aesni_init(&state, ctx->key.bytes, req->iv);
+	aegis128_aesni_init(&state, &ctx->key, req->iv);
 	crypto_aegis128_aesni_process_ad(&state, req->src, req->assoclen);
 	crypto_aegis128_aesni_process_crypt(&state, &walk, enc);
-	crypto_aegis128_aesni_final(&state, tag_xor, req->assoclen, cryptlen);
+	aegis128_aesni_final(&state, tag_xor, req->assoclen, cryptlen);
 
 	kernel_fpu_end();
 }
-- 
2.50.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 6.12.y 4/4] crypto: x86/aegis - Fix sleeping when disallowed on PREEMPT_RT
  2025-08-22  3:06 ` [PATCH 6.12.y 1/4] crypto: x86/aegis128 - eliminate some indirect calls Sasha Levin
  2025-08-22  3:06   ` [PATCH 6.12.y 2/4] crypto: x86/aegis128 - optimize length block preparation using SSE4.1 Sasha Levin
  2025-08-22  3:06   ` [PATCH 6.12.y 3/4] crypto: x86/aegis128 - improve assembly function prototypes Sasha Levin
@ 2025-08-22  3:06   ` Sasha Levin
  2025-08-22  3:23     ` Eric Biggers
  2 siblings, 1 reply; 11+ messages in thread
From: Sasha Levin @ 2025-08-22  3:06 UTC (permalink / raw)
  To: stable; +Cc: Eric Biggers, Herbert Xu, Sasha Levin

From: Eric Biggers <ebiggers@kernel.org>

[ Upstream commit c7f49dadfcdf27e1f747442e874e9baa52ab7674 ]

skcipher_walk_done() can call kfree(), which takes a spinlock, which
makes it incorrect to call while preemption is disabled on PREEMPT_RT.
Therefore, end the kernel-mode FPU section before calling
skcipher_walk_done(), and restart it afterwards.

Moreover, pass atomic=false to skcipher_walk_aead_encrypt() instead of
atomic=true.  The point of atomic=true was to make skcipher_walk_done()
safe to call while in a kernel-mode FPU section, but that does not
actually work.  So just use the usual atomic=false.

Fixes: 1d373d4e8e15 ("crypto: x86 - Add optimized AEGIS implementations")
Cc: stable@vger.kernel.org
Signed-off-by: Eric Biggers <ebiggers@kernel.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 arch/x86/crypto/aegis128-aesni-glue.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/arch/x86/crypto/aegis128-aesni-glue.c b/arch/x86/crypto/aegis128-aesni-glue.c
index e7a28ccf273b..de0aab6997d4 100644
--- a/arch/x86/crypto/aegis128-aesni-glue.c
+++ b/arch/x86/crypto/aegis128-aesni-glue.c
@@ -123,7 +123,9 @@ crypto_aegis128_aesni_process_crypt(struct aegis_state *state,
 					   walk->dst.virt.addr,
 					   round_down(walk->nbytes,
 						      AEGIS128_BLOCK_SIZE));
+		kernel_fpu_end();
 		skcipher_walk_done(walk, walk->nbytes % AEGIS128_BLOCK_SIZE);
+		kernel_fpu_begin();
 	}
 
 	if (walk->nbytes) {
@@ -135,7 +137,9 @@ crypto_aegis128_aesni_process_crypt(struct aegis_state *state,
 			aegis128_aesni_dec_tail(state, walk->src.virt.addr,
 						walk->dst.virt.addr,
 						walk->nbytes);
+		kernel_fpu_end();
 		skcipher_walk_done(walk, 0);
+		kernel_fpu_begin();
 	}
 }
 
@@ -180,9 +184,9 @@ crypto_aegis128_aesni_crypt(struct aead_request *req,
 	struct aegis_state state;
 
 	if (enc)
-		skcipher_walk_aead_encrypt(&walk, req, true);
+		skcipher_walk_aead_encrypt(&walk, req, false);
 	else
-		skcipher_walk_aead_decrypt(&walk, req, true);
+		skcipher_walk_aead_decrypt(&walk, req, false);
 
 	kernel_fpu_begin();
 
-- 
2.50.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH 6.12.y 4/4] crypto: x86/aegis - Fix sleeping when disallowed on PREEMPT_RT
  2025-08-22  3:06   ` [PATCH 6.12.y 4/4] crypto: x86/aegis - Fix sleeping when disallowed on PREEMPT_RT Sasha Levin
@ 2025-08-22  3:23     ` Eric Biggers
  2025-08-22  3:28       ` Sasha Levin
  0 siblings, 1 reply; 11+ messages in thread
From: Eric Biggers @ 2025-08-22  3:23 UTC (permalink / raw)
  To: Sasha Levin; +Cc: stable, Herbert Xu

On Thu, Aug 21, 2025 at 11:06:17PM -0400, Sasha Levin wrote:
> From: Eric Biggers <ebiggers@kernel.org>
> 
> [ Upstream commit c7f49dadfcdf27e1f747442e874e9baa52ab7674 ]
> 
> skcipher_walk_done() can call kfree(), which takes a spinlock, which
> makes it incorrect to call while preemption is disabled on PREEMPT_RT.
> Therefore, end the kernel-mode FPU section before calling
> skcipher_walk_done(), and restart it afterwards.
> 
> Moreover, pass atomic=false to skcipher_walk_aead_encrypt() instead of
> atomic=true.  The point of atomic=true was to make skcipher_walk_done()
> safe to call while in a kernel-mode FPU section, but that does not
> actually work.  So just use the usual atomic=false.
> 
> Fixes: 1d373d4e8e15 ("crypto: x86 - Add optimized AEGIS implementations")
> Cc: stable@vger.kernel.org
> Signed-off-by: Eric Biggers <ebiggers@kernel.org>
> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
> Signed-off-by: Sasha Levin <sashal@kernel.org>
> ---
>  arch/x86/crypto/aegis128-aesni-glue.c | 8 ++++++--
>  1 file changed, 6 insertions(+), 2 deletions(-)

1. Missing Cc of the relevant mailing lists
2. Missing cover letter
3. Missing base-commit, and doesn't apply to stable/linux-6.16.y
4. Two different series were sent out, both containing this patch

No reason to even take a look at the patch content until it's in a
reviewable state.

- Eric

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 6.12.y 4/4] crypto: x86/aegis - Fix sleeping when disallowed on PREEMPT_RT
  2025-08-22  3:23     ` Eric Biggers
@ 2025-08-22  3:28       ` Sasha Levin
  2025-08-22  3:39         ` Eric Biggers
  0 siblings, 1 reply; 11+ messages in thread
From: Sasha Levin @ 2025-08-22  3:28 UTC (permalink / raw)
  To: Eric Biggers; +Cc: stable, Herbert Xu

On Thu, Aug 21, 2025 at 11:23:04PM -0400, Eric Biggers wrote:
>On Thu, Aug 21, 2025 at 11:06:17PM -0400, Sasha Levin wrote:
>> From: Eric Biggers <ebiggers@kernel.org>
>>
>> [ Upstream commit c7f49dadfcdf27e1f747442e874e9baa52ab7674 ]
>>
>> skcipher_walk_done() can call kfree(), which takes a spinlock, which
>> makes it incorrect to call while preemption is disabled on PREEMPT_RT.
>> Therefore, end the kernel-mode FPU section before calling
>> skcipher_walk_done(), and restart it afterwards.
>>
>> Moreover, pass atomic=false to skcipher_walk_aead_encrypt() instead of
>> atomic=true.  The point of atomic=true was to make skcipher_walk_done()
>> safe to call while in a kernel-mode FPU section, but that does not
>> actually work.  So just use the usual atomic=false.
>>
>> Fixes: 1d373d4e8e15 ("crypto: x86 - Add optimized AEGIS implementations")
>> Cc: stable@vger.kernel.org
>> Signed-off-by: Eric Biggers <ebiggers@kernel.org>
>> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
>> Signed-off-by: Sasha Levin <sashal@kernel.org>
>> ---
>>  arch/x86/crypto/aegis128-aesni-glue.c | 8 ++++++--
>>  1 file changed, 6 insertions(+), 2 deletions(-)
>
>1. Missing Cc of the relevant mailing lists
>2. Missing cover letter

This was sent following the instructions in the FAILED: email generated by
Greg. If you feel its insufficient, take it up with him.

>3. Missing base-commit, and doesn't apply to stable/linux-6.16.y

As the subject line indicates, this applies on 6.12, not 6.16.

>4. Two different series were sent out, both containing this patch

You might have missed that they're for different trees?

>No reason to even take a look at the patch content until it's in a
>reviewable state.

Sure, appologies, please ignore the series.

-- 
Thanks,
Sasha

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 6.12.y 4/4] crypto: x86/aegis - Fix sleeping when disallowed on PREEMPT_RT
  2025-08-22  3:28       ` Sasha Levin
@ 2025-08-22  3:39         ` Eric Biggers
  2025-08-22  3:48           ` Eric Biggers
  2025-08-22  3:56           ` Sasha Levin
  0 siblings, 2 replies; 11+ messages in thread
From: Eric Biggers @ 2025-08-22  3:39 UTC (permalink / raw)
  To: Sasha Levin; +Cc: stable, Herbert Xu

On Thu, Aug 21, 2025 at 11:28:56PM -0400, Sasha Levin wrote:
> On Thu, Aug 21, 2025 at 11:23:04PM -0400, Eric Biggers wrote:
> > On Thu, Aug 21, 2025 at 11:06:17PM -0400, Sasha Levin wrote:
> > > From: Eric Biggers <ebiggers@kernel.org>
> > > 
> > > [ Upstream commit c7f49dadfcdf27e1f747442e874e9baa52ab7674 ]
> > > 
> > > skcipher_walk_done() can call kfree(), which takes a spinlock, which
> > > makes it incorrect to call while preemption is disabled on PREEMPT_RT.
> > > Therefore, end the kernel-mode FPU section before calling
> > > skcipher_walk_done(), and restart it afterwards.
> > > 
> > > Moreover, pass atomic=false to skcipher_walk_aead_encrypt() instead of
> > > atomic=true.  The point of atomic=true was to make skcipher_walk_done()
> > > safe to call while in a kernel-mode FPU section, but that does not
> > > actually work.  So just use the usual atomic=false.
> > > 
> > > Fixes: 1d373d4e8e15 ("crypto: x86 - Add optimized AEGIS implementations")
> > > Cc: stable@vger.kernel.org
> > > Signed-off-by: Eric Biggers <ebiggers@kernel.org>
> > > Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
> > > Signed-off-by: Sasha Levin <sashal@kernel.org>
> > > ---
> > >  arch/x86/crypto/aegis128-aesni-glue.c | 8 ++++++--
> > >  1 file changed, 6 insertions(+), 2 deletions(-)
> > 
> > 1. Missing Cc of the relevant mailing lists
> > 2. Missing cover letter
> 
> This was sent following the instructions in the FAILED: email generated by
> Greg. If you feel its insufficient, take it up with him.

You're one of the stable maintainers.  You can't just deflect and claim
this is not your problem.

> > 3. Missing base-commit, and doesn't apply to stable/linux-6.16.y
> 
> As the subject line indicates, this applies on 6.12, not 6.16.
> 
> > 4. Two different series were sent out, both containing this patch
> 
> You might have missed that they're for different trees?
> 

Sorry, I meant to write 6.12.  6.12 was indeed what I tried to apply it
to, and it failed.  And there are two series for 6.12, see
https://lore.kernel.org/stable/20250822030632.1053504-4-sashal@kernel.org
and
https://lore.kernel.org/stable/20250822030617.1053172-4-sashal@kernel.org/
They were sent only 14 seconds apart, so these submissions appear to be
automated.

- Eric

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 6.12.y 4/4] crypto: x86/aegis - Fix sleeping when disallowed on PREEMPT_RT
  2025-08-22  3:39         ` Eric Biggers
@ 2025-08-22  3:48           ` Eric Biggers
  2025-08-22  3:56           ` Sasha Levin
  1 sibling, 0 replies; 11+ messages in thread
From: Eric Biggers @ 2025-08-22  3:48 UTC (permalink / raw)
  To: Sasha Levin; +Cc: stable, Herbert Xu

On Thu, Aug 21, 2025 at 11:39:53PM -0400, Eric Biggers wrote:
> On Thu, Aug 21, 2025 at 11:28:56PM -0400, Sasha Levin wrote:
> > On Thu, Aug 21, 2025 at 11:23:04PM -0400, Eric Biggers wrote:
> > > On Thu, Aug 21, 2025 at 11:06:17PM -0400, Sasha Levin wrote:
> > > > From: Eric Biggers <ebiggers@kernel.org>
> > > > 
> > > > [ Upstream commit c7f49dadfcdf27e1f747442e874e9baa52ab7674 ]
> > > > 
> > > > skcipher_walk_done() can call kfree(), which takes a spinlock, which
> > > > makes it incorrect to call while preemption is disabled on PREEMPT_RT.
> > > > Therefore, end the kernel-mode FPU section before calling
> > > > skcipher_walk_done(), and restart it afterwards.
> > > > 
> > > > Moreover, pass atomic=false to skcipher_walk_aead_encrypt() instead of
> > > > atomic=true.  The point of atomic=true was to make skcipher_walk_done()
> > > > safe to call while in a kernel-mode FPU section, but that does not
> > > > actually work.  So just use the usual atomic=false.
> > > > 
> > > > Fixes: 1d373d4e8e15 ("crypto: x86 - Add optimized AEGIS implementations")
> > > > Cc: stable@vger.kernel.org
> > > > Signed-off-by: Eric Biggers <ebiggers@kernel.org>
> > > > Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
> > > > Signed-off-by: Sasha Levin <sashal@kernel.org>
> > > > ---
> > > >  arch/x86/crypto/aegis128-aesni-glue.c | 8 ++++++--
> > > >  1 file changed, 6 insertions(+), 2 deletions(-)
> > > 
> > > 1. Missing Cc of the relevant mailing lists
> > > 2. Missing cover letter
> > 
> > This was sent following the instructions in the FAILED: email generated by
> > Greg. If you feel its insufficient, take it up with him.
> 
> You're one of the stable maintainers.  You can't just deflect and claim
> this is not your problem.
> 
> > > 3. Missing base-commit, and doesn't apply to stable/linux-6.16.y
> > 
> > As the subject line indicates, this applies on 6.12, not 6.16.
> > 
> > > 4. Two different series were sent out, both containing this patch
> > 
> > You might have missed that they're for different trees?
> > 
> 
> Sorry, I meant to write 6.12.  6.12 was indeed what I tried to apply it
> to, and it failed.  And there are two series for 6.12, see
> https://lore.kernel.org/stable/20250822030632.1053504-4-sashal@kernel.org
> and
> https://lore.kernel.org/stable/20250822030617.1053172-4-sashal@kernel.org/
> They were sent only 14 seconds apart, so these submissions appear to be
> automated.
> 

Anyway, until someone can get this sent out properly, consider it:

Nacked-by: Eric Biggers <ebiggers@kernel.org>

for all trees.

- Eric

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 6.12.y 4/4] crypto: x86/aegis - Fix sleeping when disallowed on PREEMPT_RT
  2025-08-22  3:39         ` Eric Biggers
  2025-08-22  3:48           ` Eric Biggers
@ 2025-08-22  3:56           ` Sasha Levin
  2025-08-22  4:10             ` Eric Biggers
  1 sibling, 1 reply; 11+ messages in thread
From: Sasha Levin @ 2025-08-22  3:56 UTC (permalink / raw)
  To: Eric Biggers; +Cc: stable, Herbert Xu

On Thu, Aug 21, 2025 at 11:39:51PM -0400, Eric Biggers wrote:
>On Thu, Aug 21, 2025 at 11:28:56PM -0400, Sasha Levin wrote:
>> On Thu, Aug 21, 2025 at 11:23:04PM -0400, Eric Biggers wrote:
>> > On Thu, Aug 21, 2025 at 11:06:17PM -0400, Sasha Levin wrote:
>> > > From: Eric Biggers <ebiggers@kernel.org>
>> > >
>> > > [ Upstream commit c7f49dadfcdf27e1f747442e874e9baa52ab7674 ]
>> > >
>> > > skcipher_walk_done() can call kfree(), which takes a spinlock, which
>> > > makes it incorrect to call while preemption is disabled on PREEMPT_RT.
>> > > Therefore, end the kernel-mode FPU section before calling
>> > > skcipher_walk_done(), and restart it afterwards.
>> > >
>> > > Moreover, pass atomic=false to skcipher_walk_aead_encrypt() instead of
>> > > atomic=true.  The point of atomic=true was to make skcipher_walk_done()
>> > > safe to call while in a kernel-mode FPU section, but that does not
>> > > actually work.  So just use the usual atomic=false.
>> > >
>> > > Fixes: 1d373d4e8e15 ("crypto: x86 - Add optimized AEGIS implementations")
>> > > Cc: stable@vger.kernel.org
>> > > Signed-off-by: Eric Biggers <ebiggers@kernel.org>
>> > > Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
>> > > Signed-off-by: Sasha Levin <sashal@kernel.org>
>> > > ---
>> > >  arch/x86/crypto/aegis128-aesni-glue.c | 8 ++++++--
>> > >  1 file changed, 6 insertions(+), 2 deletions(-)
>> >
>> > 1. Missing Cc of the relevant mailing lists
>> > 2. Missing cover letter
>>
>> This was sent following the instructions in the FAILED: email generated by
>> Greg. If you feel its insufficient, take it up with him.
>
>You're one of the stable maintainers.  You can't just deflect and claim
>this is not your problem.

We perform different parts of the process. I don't send FAILED: mails out, I
don't have control over what Greg sends out. If you feel that the recipient
list is insufficient then Greg should be in the loop - don't take it out on me.

These mails looked the same for years (decade+?), if for some reason you think
that a cover letter or an expanded cc list would be useful to have, then you
can just suggest it - no need to berate me for not sending one.

>> > 3. Missing base-commit, and doesn't apply to stable/linux-6.16.y
>>
>> As the subject line indicates, this applies on 6.12, not 6.16.
>>
>> > 4. Two different series were sent out, both containing this patch
>>
>> You might have missed that they're for different trees?
>>
>
>Sorry, I meant to write 6.12.  6.12 was indeed what I tried to apply it
>to, and it failed.  And there are two series for 6.12, see
>https://lore.kernel.org/stable/20250822030632.1053504-4-sashal@kernel.org
>and
>https://lore.kernel.org/stable/20250822030617.1053172-4-sashal@kernel.org/

Yup, those are replies to two different FAILED emails for two different
patches that failed to backport.

Could you share the conflict you've observed? Both series applied cleanly to
stable/linux-6.12.y for me.

>They were sent only 14 seconds apart, so these submissions appear to be
>automated.

Not too automated :)

I fix up the backports, run builds, and go do something else.

When I get back to the computer, if the builds passed, I just send out the mails.

-- 
Thanks,
Sasha

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 6.12.y 4/4] crypto: x86/aegis - Fix sleeping when disallowed on PREEMPT_RT
  2025-08-22  3:56           ` Sasha Levin
@ 2025-08-22  4:10             ` Eric Biggers
  0 siblings, 0 replies; 11+ messages in thread
From: Eric Biggers @ 2025-08-22  4:10 UTC (permalink / raw)
  To: Sasha Levin; +Cc: stable, Herbert Xu

On Thu, Aug 21, 2025 at 11:56:19PM -0400, Sasha Levin wrote:
> On Thu, Aug 21, 2025 at 11:39:51PM -0400, Eric Biggers wrote:
> > On Thu, Aug 21, 2025 at 11:28:56PM -0400, Sasha Levin wrote:
> > > On Thu, Aug 21, 2025 at 11:23:04PM -0400, Eric Biggers wrote:
> > > > On Thu, Aug 21, 2025 at 11:06:17PM -0400, Sasha Levin wrote:
> > > > > From: Eric Biggers <ebiggers@kernel.org>
> > > > >
> > > > > [ Upstream commit c7f49dadfcdf27e1f747442e874e9baa52ab7674 ]
> > > > >
> > > > > skcipher_walk_done() can call kfree(), which takes a spinlock, which
> > > > > makes it incorrect to call while preemption is disabled on PREEMPT_RT.
> > > > > Therefore, end the kernel-mode FPU section before calling
> > > > > skcipher_walk_done(), and restart it afterwards.
> > > > >
> > > > > Moreover, pass atomic=false to skcipher_walk_aead_encrypt() instead of
> > > > > atomic=true.  The point of atomic=true was to make skcipher_walk_done()
> > > > > safe to call while in a kernel-mode FPU section, but that does not
> > > > > actually work.  So just use the usual atomic=false.
> > > > >
> > > > > Fixes: 1d373d4e8e15 ("crypto: x86 - Add optimized AEGIS implementations")
> > > > > Cc: stable@vger.kernel.org
> > > > > Signed-off-by: Eric Biggers <ebiggers@kernel.org>
> > > > > Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
> > > > > Signed-off-by: Sasha Levin <sashal@kernel.org>
> > > > > ---
> > > > >  arch/x86/crypto/aegis128-aesni-glue.c | 8 ++++++--
> > > > >  1 file changed, 6 insertions(+), 2 deletions(-)
> > > >
> > > > 1. Missing Cc of the relevant mailing lists
> > > > 2. Missing cover letter
> > > 
> > > This was sent following the instructions in the FAILED: email generated by
> > > Greg. If you feel its insufficient, take it up with him.
> > 
> > You're one of the stable maintainers.  You can't just deflect and claim
> > this is not your problem.
> 
> We perform different parts of the process. I don't send FAILED: mails out, I
> don't have control over what Greg sends out. If you feel that the recipient
> list is insufficient then Greg should be in the loop - don't take it out on me.
> 
> These mails looked the same for years (decade+?), if for some reason you think
> that a cover letter or an expanded cc list would be useful to have, then you
> can just suggest it - no need to berate me for not sending one.

I've given this same feedback many times already.

> > > > 3. Missing base-commit, and doesn't apply to stable/linux-6.16.y
> > > 
> > > As the subject line indicates, this applies on 6.12, not 6.16.
> > > 
> > > > 4. Two different series were sent out, both containing this patch
> > > 
> > > You might have missed that they're for different trees?
> > > 
> > 
> > Sorry, I meant to write 6.12.  6.12 was indeed what I tried to apply it
> > to, and it failed.  And there are two series for 6.12, see
> > https://lore.kernel.org/stable/20250822030632.1053504-4-sashal@kernel.org
> > and
> > https://lore.kernel.org/stable/20250822030617.1053172-4-sashal@kernel.org/
> 
> Yup, those are replies to two different FAILED emails for two different
> patches that failed to backport.

But why send a separate series for each one, with duplicate patches
across the different series?  That makes no sense.

> Could you share the conflict you've observed? Both series applied cleanly to
> stable/linux-6.12.y for me.

Try:

    b4 am https://lore.kernel.org/stable/20250822030632.1053504-1-sashal@kernel.org/

It looks like the problem may be that b4 picks up the patch from the
FAILED email as a patch in the series.

Please make sure that the way you're sending out patch series is
compatible with b4, as reviewers often rely on that to download them.

- Eric

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2025-08-22  4:10 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-08-21 12:55 FAILED: patch "[PATCH] crypto: x86/aegis - Fix sleeping when disallowed on" failed to apply to 6.12-stable tree gregkh
2025-08-22  3:06 ` [PATCH 6.12.y 1/4] crypto: x86/aegis128 - eliminate some indirect calls Sasha Levin
2025-08-22  3:06   ` [PATCH 6.12.y 2/4] crypto: x86/aegis128 - optimize length block preparation using SSE4.1 Sasha Levin
2025-08-22  3:06   ` [PATCH 6.12.y 3/4] crypto: x86/aegis128 - improve assembly function prototypes Sasha Levin
2025-08-22  3:06   ` [PATCH 6.12.y 4/4] crypto: x86/aegis - Fix sleeping when disallowed on PREEMPT_RT Sasha Levin
2025-08-22  3:23     ` Eric Biggers
2025-08-22  3:28       ` Sasha Levin
2025-08-22  3:39         ` Eric Biggers
2025-08-22  3:48           ` Eric Biggers
2025-08-22  3:56           ` Sasha Levin
2025-08-22  4:10             ` Eric Biggers

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).