mirror of https://github.com/torvalds/linux.git
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 <oliver.sang@intel.com>
Closes: https://lore.kernel.org/oe-lkp/202504151654.4c3b6393-lkp@intel.com
Fixes: 08cabc7d3c ("crypto: deflate - Convert to acomp")
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
parent
2f5f3cd003
commit
ddd0855fa3
|
|
@ -536,7 +536,7 @@ int acomp_walk_next_dst(struct acomp_walk *walk)
|
||||||
EXPORT_SYMBOL_GPL(acomp_walk_next_dst);
|
EXPORT_SYMBOL_GPL(acomp_walk_next_dst);
|
||||||
|
|
||||||
int acomp_walk_virt(struct acomp_walk *__restrict walk,
|
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 *src = req->src;
|
||||||
struct scatterlist *dst = req->dst;
|
struct scatterlist *dst = req->dst;
|
||||||
|
|
@ -548,7 +548,7 @@ int acomp_walk_virt(struct acomp_walk *__restrict walk,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
walk->flags = 0;
|
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;
|
walk->flags |= ACOMP_WALK_SLEEP;
|
||||||
if ((req->base.flags & CRYPTO_ACOMP_REQ_SRC_VIRT))
|
if ((req->base.flags & CRYPTO_ACOMP_REQ_SRC_VIRT))
|
||||||
walk->flags |= ACOMP_WALK_SRC_LINEAR;
|
walk->flags |= ACOMP_WALK_SRC_LINEAR;
|
||||||
|
|
|
||||||
|
|
@ -60,7 +60,7 @@ static int deflate_compress_one(struct acomp_req *req,
|
||||||
struct acomp_walk walk;
|
struct acomp_walk walk;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = acomp_walk_virt(&walk, req);
|
ret = acomp_walk_virt(&walk, req, true);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
|
@ -140,7 +140,7 @@ static int deflate_decompress_one(struct acomp_req *req,
|
||||||
struct acomp_walk walk;
|
struct acomp_walk walk;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = acomp_walk_virt(&walk, req);
|
ret = acomp_walk_virt(&walk, req, true);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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_src(struct acomp_walk *walk);
|
||||||
int acomp_walk_next_dst(struct acomp_walk *walk);
|
int acomp_walk_next_dst(struct acomp_walk *walk);
|
||||||
int acomp_walk_virt(struct acomp_walk *__restrict 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)
|
static inline bool acomp_walk_more_src(const struct acomp_walk *walk, int cur)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue