public inbox for linux-crypto@vger.kernel.org
 help / color / mirror / Atom feed
From: Herbert Xu <herbert@gondor.apana.org.au>
To: Klaus Kudielka <klaus.kudielka@gmail.com>
Cc: regressions@lists.linux.dev, linux-kernel@vger.kernel.org,
	Linux Crypto Mailing List <linux-crypto@vger.kernel.org>,
	Boris Brezillon <bbrezillon@kernel.org>,
	EBALARD Arnaud <Arnaud.Ebalard@ssi.gouv.fr>,
	Romain Perier <romain.perier@gmail.com>
Subject: [PATCH] crypto: marvell/cesa - Do not chain submitted requests
Date: Wed, 7 May 2025 16:43:56 +0800	[thread overview]
Message-ID: <aBsdTJUAcQgW4ink@gondor.apana.org.au> (raw)
In-Reply-To: <aBoMSHEMYj6FbH8o@gondor.apana.org.au>

On Tue, May 06, 2025 at 09:19:04PM +0800, Herbert Xu wrote:
>
> I haven't figured out exactly what's wrong with tdma, although
> the chaining IRQ completion handling looks a bit fragile in that
> if something goes wrong it'll simply mark all queued requests as
> complete, corrupting any requests that have not yet been sent to
> the hardware.

I'm fairly confident that I've found the culprit.  Please try this
patch and see if it makes tdma work again:

---8<---
This driver tries to chain requests together before submitting them
to hardware in order to reduce completion interrupts.

However, it even extends chains that have already been submitted
to hardware.  This is dangerous because there is no way of knowing
whether the hardware has already read the DMA memory in question
or not.

Fix this by splitting the chain list into two.  One for submitted
requests and one for requests that have not yet been submitted.
Only extend the latter.

Reported-by: Klaus Kudielka <klaus.kudielka@gmail.com>
Fixes: 85030c5168f1 ("crypto: marvell - Add support for chaining crypto requests in TDMA mode")
Cc: <stable@vger.kernel.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
---
 drivers/crypto/marvell/cesa/cesa.c |  2 +-
 drivers/crypto/marvell/cesa/cesa.h |  9 +++--
 drivers/crypto/marvell/cesa/tdma.c | 54 ++++++++++++++++++------------
 3 files changed, 40 insertions(+), 25 deletions(-)

diff --git a/drivers/crypto/marvell/cesa/cesa.c b/drivers/crypto/marvell/cesa/cesa.c
index fa08f10e6f3f..9c21f5d835d2 100644
--- a/drivers/crypto/marvell/cesa/cesa.c
+++ b/drivers/crypto/marvell/cesa/cesa.c
@@ -94,7 +94,7 @@ static int mv_cesa_std_process(struct mv_cesa_engine *engine, u32 status)
 
 static int mv_cesa_int_process(struct mv_cesa_engine *engine, u32 status)
 {
-	if (engine->chain.first && engine->chain.last)
+	if (engine->chain_hw.first && engine->chain_hw.last)
 		return mv_cesa_tdma_process(engine, status);
 
 	return mv_cesa_std_process(engine, status);
diff --git a/drivers/crypto/marvell/cesa/cesa.h b/drivers/crypto/marvell/cesa/cesa.h
index d215a6bed6bc..50ca1039fdaa 100644
--- a/drivers/crypto/marvell/cesa/cesa.h
+++ b/drivers/crypto/marvell/cesa/cesa.h
@@ -440,8 +440,10 @@ struct mv_cesa_dev {
  *			SRAM
  * @queue:		fifo of the pending crypto requests
  * @load:		engine load counter, useful for load balancing
- * @chain:		list of the current tdma descriptors being processed
- *			by this engine.
+ * @chain_hw:		list of the current tdma descriptors being processed
+ *			by the hardware.
+ * @chain_sw:		list of the current tdma descriptors that will be
+ *			submitted to the hardware.
  * @complete_queue:	fifo of the processed requests by the engine
  *
  * Structure storing CESA engine information.
@@ -463,7 +465,8 @@ struct mv_cesa_engine {
 	struct gen_pool *pool;
 	struct crypto_queue queue;
 	atomic_t load;
-	struct mv_cesa_tdma_chain chain;
+	struct mv_cesa_tdma_chain chain_hw;
+	struct mv_cesa_tdma_chain chain_sw;
 	struct list_head complete_queue;
 	int irq;
 };
diff --git a/drivers/crypto/marvell/cesa/tdma.c b/drivers/crypto/marvell/cesa/tdma.c
index 388a06e180d6..40fcc852adfa 100644
--- a/drivers/crypto/marvell/cesa/tdma.c
+++ b/drivers/crypto/marvell/cesa/tdma.c
@@ -38,6 +38,15 @@ void mv_cesa_dma_step(struct mv_cesa_req *dreq)
 {
 	struct mv_cesa_engine *engine = dreq->engine;
 
+	spin_lock_bh(&engine->lock);
+	if (engine->chain_sw.first == dreq->chain.first) {
+		engine->chain_sw.first = NULL;
+		engine->chain_sw.last = NULL;
+	}
+	engine->chain_hw.first = dreq->chain.first;
+	engine->chain_hw.last = dreq->chain.last;
+	spin_unlock_bh(&engine->lock);
+
 	writel_relaxed(0, engine->regs + CESA_SA_CFG);
 
 	mv_cesa_set_int_mask(engine, CESA_SA_INT_ACC0_IDMA_DONE);
@@ -96,25 +105,28 @@ void mv_cesa_dma_prepare(struct mv_cesa_req *dreq,
 void mv_cesa_tdma_chain(struct mv_cesa_engine *engine,
 			struct mv_cesa_req *dreq)
 {
-	if (engine->chain.first == NULL && engine->chain.last == NULL) {
-		engine->chain.first = dreq->chain.first;
-		engine->chain.last  = dreq->chain.last;
+	struct mv_cesa_tdma_desc *last = engine->chain_sw.last;
+
+	/*
+	 * Break the DMA chain if the request being queued needs the IV
+	 * regs to be set before lauching the request.
+	 */
+	if (!last || dreq->chain.first->flags & CESA_TDMA_SET_STATE) {
+		engine->chain_sw.first = dreq->chain.first;
+		engine->chain_sw.last  = dreq->chain.last;
 	} else {
-		struct mv_cesa_tdma_desc *last;
-
-		last = engine->chain.last;
 		last->next = dreq->chain.first;
-		engine->chain.last = dreq->chain.last;
-
-		/*
-		 * Break the DMA chain if the CESA_TDMA_BREAK_CHAIN is set on
-		 * the last element of the current chain, or if the request
-		 * being queued needs the IV regs to be set before lauching
-		 * the request.
-		 */
-		if (!(last->flags & CESA_TDMA_BREAK_CHAIN) &&
-		    !(dreq->chain.first->flags & CESA_TDMA_SET_STATE))
-			last->next_dma = cpu_to_le32(dreq->chain.first->cur_dma);
+		last->next_dma = cpu_to_le32(dreq->chain.first->cur_dma);
+		last = dreq->chain.last;
+		engine->chain_sw.last = last;
+	}
+	/*
+	 * Break the DMA chain if the CESA_TDMA_BREAK_CHAIN is set on
+	 * the last element of the current chain.
+	 */
+	if (last->flags & CESA_TDMA_BREAK_CHAIN) {
+		engine->chain_sw.first = NULL;
+		engine->chain_sw.last = NULL;
 	}
 }
 
@@ -127,7 +139,7 @@ int mv_cesa_tdma_process(struct mv_cesa_engine *engine, u32 status)
 
 	tdma_cur = readl(engine->regs + CESA_TDMA_CUR);
 
-	for (tdma = engine->chain.first; tdma; tdma = next) {
+	for (tdma = engine->chain_hw.first; tdma; tdma = next) {
 		spin_lock_bh(&engine->lock);
 		next = tdma->next;
 		spin_unlock_bh(&engine->lock);
@@ -149,12 +161,12 @@ int mv_cesa_tdma_process(struct mv_cesa_engine *engine, u32 status)
 								 &backlog);
 
 			/* Re-chaining to the next request */
-			engine->chain.first = tdma->next;
+			engine->chain_hw.first = tdma->next;
 			tdma->next = NULL;
 
 			/* If this is the last request, clear the chain */
-			if (engine->chain.first == NULL)
-				engine->chain.last  = NULL;
+			if (engine->chain_hw.first == NULL)
+				engine->chain_hw.last  = NULL;
 			spin_unlock_bh(&engine->lock);
 
 			ctx = crypto_tfm_ctx(req->tfm);
-- 
2.39.5

-- 
Email: Herbert Xu <herbert@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt

  reply	other threads:[~2025-05-07  8:44 UTC|newest]

Thread overview: 77+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <ef7c7a96a73161e0f5061503242a8d3eddef121f.camel@gmail.com>
2024-10-06  9:11 ` [REGRESSION] alg: ahash: Several tests fail during boot on Turris Omnia Herbert Xu
2024-10-06  9:23   ` Klaus Kudielka
2024-10-07  8:27     ` Herbert Xu
2024-10-07 20:57       ` Klaus Kudielka
2024-10-09  8:34         ` Herbert Xu
2024-10-09  8:38           ` [PATCH] crypto: marvell/cesa - Disable hash algorithms Herbert Xu
2024-10-09 16:48           ` [REGRESSION] alg: ahash: Several tests fail during boot on Turris Omnia Klaus Kudielka
2024-10-10  6:05             ` Herbert Xu
2024-10-10  8:24               ` Herbert Xu
2024-10-10 17:35                 ` Klaus Kudielka
2024-10-15  4:52                   ` Herbert Xu
2024-10-15 17:38                     ` Klaus Kudielka
2024-10-16  4:27                       ` Herbert Xu
2024-10-16  5:51                         ` Klaus Kudielka
2024-10-16  9:53                           ` Herbert Xu
2024-11-12 19:33                             ` Klaus Kudielka
2024-11-13  9:57                               ` Thorsten Leemhuis
2025-05-06 13:19                         ` Herbert Xu
2025-05-07  8:43                           ` Herbert Xu [this message]
2025-05-07 15:16                             ` [PATCH] crypto: marvell/cesa - Do not chain submitted requests Corentin Labbe
2025-05-08  5:15                               ` [v2 PATCH] " Herbert Xu
2025-05-08  5:22                                 ` [v3 " Herbert Xu
2025-05-08 12:53                                   ` Corentin Labbe
2025-05-08 13:10                                     ` Herbert Xu
2025-05-08 13:43                                       ` Corentin Labbe
2025-05-09  3:13                                         ` Herbert Xu
2025-05-09  3:19                                         ` Herbert Xu
2025-05-09  8:11                                           ` Herbert Xu
2025-05-09 11:01                                             ` Corentin Labbe
2025-05-10  1:15                                               ` Herbert Xu
2025-05-10  1:37                                                 ` Herbert Xu
2025-05-10  1:44                                                   ` Herbert Xu
2025-05-10 10:41                                         ` [PATCH] crypto: marvell/cesa - Handle zero-length skcipher requests Herbert Xu
2025-05-10  8:32                                   ` [v3 PATCH] crypto: marvell/cesa - Do not chain submitted requests Klaus Kudielka
2025-05-10  9:05                                     ` Herbert Xu
2025-05-10  9:38                                       ` Klaus Kudielka
2025-05-10 10:19                                         ` Herbert Xu
2025-05-10 10:43                                         ` [PATCH] crypto: marvell/cesa - Avoid empty transfer descriptor Herbert Xu
2025-05-10 11:14                                           ` Corentin Labbe
2025-05-10 11:39                                             ` Herbert Xu
2025-05-10 13:02                                             ` Herbert Xu
2025-05-10 15:07                                           ` Klaus Kudielka
2025-05-11  3:22                                             ` Herbert Xu
2025-05-11 16:39                                               ` Klaus Kudielka
2025-05-13  9:20                                                 ` Herbert Xu
2025-05-14  5:12                                                   ` Klaus Kudielka
2025-05-14  5:14                                                     ` Herbert Xu
2025-05-15 17:53                                                       ` Klaus Kudielka
2025-05-15 18:21                                                         ` Eric Biggers
2025-05-15 18:45                                                           ` Klaus Kudielka
2025-05-15 23:25                                                             ` Herbert Xu
2025-05-16 12:41                                                               ` Corentin Labbe
2025-05-16 12:45                                                                 ` Herbert Xu
2025-05-17 11:24                                                                   ` Corentin Labbe
2025-05-18  7:58                                                                     ` Herbert Xu
2025-05-21  5:06                                                                       ` Herbert Xu
2025-05-21  9:16                                                                         ` Herbert Xu
2025-05-21  9:58                                                                           ` Arnd Bergmann
2025-05-21 10:24                                                                             ` Herbert Xu
2025-05-21 11:36                                                                               ` Arnd Bergmann
2025-05-22  3:13                                                                                 ` Herbert Xu
2025-05-22 20:08                                                                                 ` Corentin Labbe
2025-05-21 10:45                                                                           ` Corentin Labbe
2025-05-21 10:56                                                                             ` Herbert Xu
2025-05-21 13:58                                                                               ` Corentin Labbe
2025-05-22  3:01                                                                                 ` crypto: marvell/cesa - dma_alloc_coherent broken but kmalloc + dma_map_single works Herbert Xu
2025-05-22  7:38                                                                                   ` Herbert Xu
2025-05-22 20:07                                                                                     ` Corentin Labbe
2025-05-23 11:46                                                                                       ` Herbert Xu
2025-05-28  9:58                                                                                       ` Herbert Xu
2025-05-29 11:17                                                                                         ` Corentin Labbe
2025-05-22 11:13                                                                                   ` Herbert Xu
2025-05-16  4:12                                                         ` [PATCH] crypto: marvell/cesa - Avoid empty transfer descriptor Herbert Xu
2025-05-16 17:36                                                           ` Klaus Kudielka
2025-06-17  5:32                                                             ` Klaus Kudielka
2025-06-17  5:36                                                               ` Herbert Xu
2025-05-08 12:49                                 ` [v2 PATCH] crypto: marvell/cesa - Do not chain submitted requests Corentin Labbe

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=aBsdTJUAcQgW4ink@gondor.apana.org.au \
    --to=herbert@gondor.apana.org.au \
    --cc=Arnaud.Ebalard@ssi.gouv.fr \
    --cc=bbrezillon@kernel.org \
    --cc=klaus.kudielka@gmail.com \
    --cc=linux-crypto@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=regressions@lists.linux.dev \
    --cc=romain.perier@gmail.com \
    /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