]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
crypto: marvell/cesa - Fix engine load inaccuracy
authorHerbert Xu <herbert@gondor.apana.org.au>
Thu, 22 May 2025 12:41:28 +0000 (20:41 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 13 Jun 2025 09:26:16 +0000 (17:26 +0800)
If an error occurs during queueing the engine load will never be
decremented.  Fix this by moving the engine load adjustment into
the cleanup function.

Fixes: bf8f91e71192 ("crypto: marvell - Add load balancing between engines")
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/marvell/cesa/cipher.c
drivers/crypto/marvell/cesa/hash.c

index 48c5c8ea8c43ec00f255edee9dcb724b3958bbed..3fe0fd9226cf7928cceca0b95e8a7969e34f0235 100644 (file)
@@ -75,9 +75,12 @@ mv_cesa_skcipher_dma_cleanup(struct skcipher_request *req)
 static inline void mv_cesa_skcipher_cleanup(struct skcipher_request *req)
 {
        struct mv_cesa_skcipher_req *creq = skcipher_request_ctx(req);
+       struct mv_cesa_engine *engine = creq->base.engine;
 
        if (mv_cesa_req_get_type(&creq->base) == CESA_DMA_REQ)
                mv_cesa_skcipher_dma_cleanup(req);
+
+       atomic_sub(req->cryptlen, &engine->load);
 }
 
 static void mv_cesa_skcipher_std_step(struct skcipher_request *req)
@@ -212,7 +215,6 @@ mv_cesa_skcipher_complete(struct crypto_async_request *req)
        struct mv_cesa_engine *engine = creq->base.engine;
        unsigned int ivsize;
 
-       atomic_sub(skreq->cryptlen, &engine->load);
        ivsize = crypto_skcipher_ivsize(crypto_skcipher_reqtfm(skreq));
 
        if (mv_cesa_req_get_type(&creq->base) == CESA_DMA_REQ) {
index 8b4a3f291926cc9a3ee16d2ad3edc7578e6afa16..5103d36cdfdb1a0c79e332abb06c13426820a80a 100644 (file)
@@ -110,9 +110,12 @@ static inline void mv_cesa_ahash_dma_cleanup(struct ahash_request *req)
 static inline void mv_cesa_ahash_cleanup(struct ahash_request *req)
 {
        struct mv_cesa_ahash_req *creq = ahash_request_ctx(req);
+       struct mv_cesa_engine *engine = creq->base.engine;
 
        if (mv_cesa_req_get_type(&creq->base) == CESA_DMA_REQ)
                mv_cesa_ahash_dma_cleanup(req);
+
+       atomic_sub(req->nbytes, &engine->load);
 }
 
 static void mv_cesa_ahash_last_cleanup(struct ahash_request *req)
@@ -392,8 +395,6 @@ static void mv_cesa_ahash_complete(struct crypto_async_request *req)
                        }
                }
        }
-
-       atomic_sub(ahashreq->nbytes, &engine->load);
 }
 
 static void mv_cesa_ahash_prepare(struct crypto_async_request *req,