summaryrefslogtreecommitdiffstats
path: root/crypto
diff options
context:
space:
mode:
authorYi Yang <yiyang13@huawei.com>2024-10-15 02:09:35 +0000
committerHerbert Xu <herbert@gondor.apana.org.au>2024-10-28 18:32:36 +0800
commit662f2f13e66d3883b9238b0b96b17886179e60e2 (patch)
tree6d18d39b65e9643f17ca497e7564577d6524ec3d /crypto
parent288e37216fff631418f26fb39b88f70809a3b6fe (diff)
downloadlinux-662f2f13e66d3883b9238b0b96b17886179e60e2.tar.gz
linux-662f2f13e66d3883b9238b0b96b17886179e60e2.tar.bz2
linux-662f2f13e66d3883b9238b0b96b17886179e60e2.zip
crypto: pcrypt - Call crypto layer directly when padata_do_parallel() return -EBUSY
Since commit 8f4f68e788c3 ("crypto: pcrypt - Fix hungtask for PADATA_RESET"), the pcrypt encryption and decryption operations return -EAGAIN when the CPU goes online or offline. In alg_test(), a WARN is generated when pcrypt_aead_decrypt() or pcrypt_aead_encrypt() returns -EAGAIN, the unnecessary panic will occur when panic_on_warn set 1. Fix this issue by calling crypto layer directly without parallelization in that case. Fixes: 8f4f68e788c3 ("crypto: pcrypt - Fix hungtask for PADATA_RESET") Signed-off-by: Yi Yang <yiyang13@huawei.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'crypto')
-rw-r--r--crypto/pcrypt.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/crypto/pcrypt.c b/crypto/pcrypt.c
index d0d954fe9d54..7fc79e7dce44 100644
--- a/crypto/pcrypt.c
+++ b/crypto/pcrypt.c
@@ -117,8 +117,10 @@ static int pcrypt_aead_encrypt(struct aead_request *req)
err = padata_do_parallel(ictx->psenc, padata, &ctx->cb_cpu);
if (!err)
return -EINPROGRESS;
- if (err == -EBUSY)
- return -EAGAIN;
+ if (err == -EBUSY) {
+ /* try non-parallel mode */
+ return crypto_aead_encrypt(creq);
+ }
return err;
}
@@ -166,8 +168,10 @@ static int pcrypt_aead_decrypt(struct aead_request *req)
err = padata_do_parallel(ictx->psdec, padata, &ctx->cb_cpu);
if (!err)
return -EINPROGRESS;
- if (err == -EBUSY)
- return -EAGAIN;
+ if (err == -EBUSY) {
+ /* try non-parallel mode */
+ return crypto_aead_decrypt(creq);
+ }
return err;
}