linux-crypto.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Robert Elliott <elliott@hpe.com>
To: herbert@gondor.apana.org.au, davem@davemloft.net,
	Jason@zx2c4.com, ardb@kernel.org, ap420073@gmail.com,
	David.Laight@ACULAB.COM, ebiggers@kernel.org,
	tim.c.chen@linux.intel.com, peter@n8pjl.ca, tglx@linutronix.de,
	mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com
Cc: linux-crypto@vger.kernel.org, x86@kernel.org,
	linux-kernel@vger.kernel.org, Robert Elliott <elliott@hpe.com>
Subject: [PATCH 08/13] crypto: x86/ghash - yield FPU context during long loops
Date: Mon, 19 Dec 2022 16:02:18 -0600	[thread overview]
Message-ID: <20221219220223.3982176-9-elliott@hpe.com> (raw)
In-Reply-To: <20221219220223.3982176-1-elliott@hpe.com>

The x86 assembly language implementations using SIMD process data
between kernel_fpu_begin() and kernel_fpu_end() calls. That
disables scheduler preemption, so prevents the CPU core from being
used by other threads.

The update() and finup() functions might be called to process
large quantities of data, which can result in RCU stalls and
soft lockups.

Periodically check if the kernel scheduler wants to run something
else on the CPU. If so, yield the kernel FPU context and let the
scheduler intervene.

Fixes: 0e1227d356e9 ("crypto: ghash - Add PCLMULQDQ accelerated implementation")
Suggested-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Robert Elliott <elliott@hpe.com>
---
 arch/x86/crypto/ghash-clmulni-intel_glue.c | 26 ++++++++++++++++------
 1 file changed, 19 insertions(+), 7 deletions(-)

diff --git a/arch/x86/crypto/ghash-clmulni-intel_glue.c b/arch/x86/crypto/ghash-clmulni-intel_glue.c
index 1bfde099de0f..cd44339abdbb 100644
--- a/arch/x86/crypto/ghash-clmulni-intel_glue.c
+++ b/arch/x86/crypto/ghash-clmulni-intel_glue.c
@@ -82,7 +82,7 @@ static int ghash_update(struct shash_desc *desc,
 
 	if (dctx->bytes) {
 		int n = min(srclen, dctx->bytes);
-		u8 *pos = dst + (GHASH_BLOCK_SIZE - dctx->bytes);
+		u8 *pos = dst + GHASH_BLOCK_SIZE - dctx->bytes;
 
 		dctx->bytes -= n;
 		srclen -= n;
@@ -97,13 +97,25 @@ static int ghash_update(struct shash_desc *desc,
 		}
 	}
 
-	kernel_fpu_begin();
-	clmul_ghash_update(dst, src, srclen, &ctx->shash);
-	kernel_fpu_end();
+	if (srclen >= GHASH_BLOCK_SIZE) {
+		kernel_fpu_begin();
+		for (;;) {
+			const unsigned int chunk = min(srclen, 4096U);
+
+			clmul_ghash_update(dst, src, chunk, &ctx->shash);
+
+			srclen -= chunk & ~(GHASH_BLOCK_SIZE - 1);
+			src += chunk & ~(GHASH_BLOCK_SIZE - 1);
+
+			if (srclen < GHASH_BLOCK_SIZE)
+				break;
+
+			kernel_fpu_yield();
+		}
+		kernel_fpu_end();
+	}
 
-	if (srclen & 0xf) {
-		src += srclen - (srclen & 0xf);
-		srclen &= 0xf;
+	if (srclen) {
 		dctx->bytes = GHASH_BLOCK_SIZE - srclen;
 		while (srclen--)
 			*dst++ ^= *src++;
-- 
2.38.1


  parent reply	other threads:[~2022-12-19 22:03 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-12-19 22:02 [PATCH 00/13] crypto: x86 - yield FPU context during long loops Robert Elliott
2022-12-19 22:02 ` [PATCH 01/13] x86: protect simd.h header file Robert Elliott
2022-12-19 22:02 ` [PATCH 02/13] x86: add yield FPU context utility function Robert Elliott
2022-12-19 22:02 ` [PATCH 03/13] crypto: x86/sha - yield FPU context during long loops Robert Elliott
2022-12-20  3:57   ` Herbert Xu
2022-12-30  9:08   ` Herbert Xu
2023-01-12  8:05   ` Herbert Xu
2023-01-12 18:46     ` Eric Biggers
2023-01-13  2:36       ` Herbert Xu
2023-01-13  2:37         ` Herbert Xu
2023-01-13 19:35           ` Elliott, Robert (Servers)
2023-01-16  3:33             ` Herbert Xu
2022-12-19 22:02 ` [PATCH 04/13] crypto: x86/crc " Robert Elliott
2022-12-19 22:02 ` [PATCH 05/13] crypto: x86/sm3 " Robert Elliott
2022-12-19 22:02 ` [PATCH 06/13] crypto: x86/ghash - use u8 rather than char Robert Elliott
2022-12-19 22:02 ` [PATCH 07/13] crypto: x86/ghash - restructure FPU context saving Robert Elliott
2022-12-30  9:04   ` Herbert Xu
2022-12-19 22:02 ` Robert Elliott [this message]
2022-12-19 22:02 ` [PATCH 09/13] crypto: x86/poly - yield FPU context only when needed Robert Elliott
2022-12-19 22:02 ` [PATCH 10/13] crypto: x86/aegis - yield FPU context during long loops Robert Elliott
2022-12-19 22:02 ` [PATCH 11/13] crypto: x86/blake - yield FPU context only when needed Robert Elliott
2022-12-19 22:02 ` [PATCH 12/13] crypto: x86/chacha " Robert Elliott
2022-12-19 22:02 ` [PATCH 13/13] crypto: x86/aria " Robert Elliott
2022-12-20 20:02 ` [PATCH 00/13] crypto: x86 - yield FPU context during long loops Eric Biggers

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20221219220223.3982176-9-elliott@hpe.com \
    --to=elliott@hpe.com \
    --cc=David.Laight@ACULAB.COM \
    --cc=Jason@zx2c4.com \
    --cc=ap420073@gmail.com \
    --cc=ardb@kernel.org \
    --cc=bp@alien8.de \
    --cc=dave.hansen@linux.intel.com \
    --cc=davem@davemloft.net \
    --cc=ebiggers@kernel.org \
    --cc=herbert@gondor.apana.org.au \
    --cc=linux-crypto@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=peter@n8pjl.ca \
    --cc=tglx@linutronix.de \
    --cc=tim.c.chen@linux.intel.com \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).