From ddd0855fa3c3f1de020ab3aeddce15fe38e116f7 Mon Sep 17 00:00:00 2001 From: Herbert Xu Date: Tue, 15 Apr 2025 17:23:19 +0800 Subject: [PATCH] crypto: deflate - Make the acomp walk atomic Add an atomic flag to the acomp walk and use that in deflate. Due to the use of a per-cpu context, it is impossible to sleep during the walk in deflate. Reported-by: kernel test robot Closes: https://lore.kernel.org/oe-lkp/202504151654.4c3b6393-lkp@intel.com Fixes: 08cabc7d3c86 ("crypto: deflate - Convert to acomp") Signed-off-by: Herbert Xu --- crypto/acompress.c | 4 ++-- crypto/deflate.c | 4 ++-- include/crypto/internal/acompress.h | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/crypto/acompress.c b/crypto/acompress.c index 606d09a7fbfd..b0f9192f6b2e 100644 --- a/crypto/acompress.c +++ b/crypto/acompress.c @@ -536,7 +536,7 @@ int acomp_walk_next_dst(struct acomp_walk *walk) EXPORT_SYMBOL_GPL(acomp_walk_next_dst); int acomp_walk_virt(struct acomp_walk *__restrict walk, - struct acomp_req *__restrict req) + struct acomp_req *__restrict req, bool atomic) { struct scatterlist *src = req->src; struct scatterlist *dst = req->dst; @@ -548,7 +548,7 @@ int acomp_walk_virt(struct acomp_walk *__restrict walk, return -EINVAL; walk->flags = 0; - if ((req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP)) + if ((req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) && !atomic) walk->flags |= ACOMP_WALK_SLEEP; if ((req->base.flags & CRYPTO_ACOMP_REQ_SRC_VIRT)) walk->flags |= ACOMP_WALK_SRC_LINEAR; diff --git a/crypto/deflate.c b/crypto/deflate.c index 57d7af4dfdfb..0d2b64d96d6e 100644 --- a/crypto/deflate.c +++ b/crypto/deflate.c @@ -60,7 +60,7 @@ static int deflate_compress_one(struct acomp_req *req, struct acomp_walk walk; int ret; - ret = acomp_walk_virt(&walk, req); + ret = acomp_walk_virt(&walk, req, true); if (ret) return ret; @@ -140,7 +140,7 @@ static int deflate_decompress_one(struct acomp_req *req, struct acomp_walk walk; int ret; - ret = acomp_walk_virt(&walk, req); + ret = acomp_walk_virt(&walk, req, true); if (ret) return ret; diff --git a/include/crypto/internal/acompress.h b/include/crypto/internal/acompress.h index 0f3ad65be2d9..7eda32619024 100644 --- a/include/crypto/internal/acompress.h +++ b/include/crypto/internal/acompress.h @@ -208,7 +208,7 @@ void acomp_walk_done_dst(struct acomp_walk *walk, int used); int acomp_walk_next_src(struct acomp_walk *walk); int acomp_walk_next_dst(struct acomp_walk *walk); int acomp_walk_virt(struct acomp_walk *__restrict walk, - struct acomp_req *__restrict req); + struct acomp_req *__restrict req, bool atomic); static inline bool acomp_walk_more_src(const struct acomp_walk *walk, int cur) { -- 2.50.1