crypt_alloc_req_*() is using in_interrupt() to figure out the correct
gfp_t mask for memory allocation.

The usage of in_interrupt() in non-core code is phased out. Ideally the
information of the calling context should be passed by the callers or the
functions be split as appropriate.

The top-most caller has already an `atomic' argument which is true if invoked
from an atomic context.

Use the `atomic' argument to create an allocation mask and pass it down
to crypt_alloc_req_*().

Signed-off-by: Sebastian Andrzej Siewior <[email protected]>
---
 drivers/md/dm-crypt.c | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c
index 0cdfee10d5a23..40c35efb9e929 100644
--- a/drivers/md/dm-crypt.c
+++ b/drivers/md/dm-crypt.c
@@ -1456,12 +1456,12 @@ static void kcryptd_async_done(struct 
crypto_async_request *async_req,
                               int error);
 
 static int crypt_alloc_req_skcipher(struct crypt_config *cc,
-                                    struct convert_context *ctx)
+                                   struct convert_context *ctx, gfp_t gfp)
 {
        unsigned key_index = ctx->cc_sector & (cc->tfms_count - 1);
 
        if (!ctx->r.req) {
-               ctx->r.req = mempool_alloc(&cc->req_pool, in_interrupt() ? 
GFP_ATOMIC : GFP_NOIO);
+               ctx->r.req = mempool_alloc(&cc->req_pool, gfp);
                if (!ctx->r.req)
                        return -ENOMEM;
        }
@@ -1480,10 +1480,10 @@ static int crypt_alloc_req_skcipher(struct crypt_config 
*cc,
 }
 
 static int crypt_alloc_req_aead(struct crypt_config *cc,
-                                struct convert_context *ctx)
+                               struct convert_context *ctx, gfp_t gfp)
 {
        if (!ctx->r.req_aead) {
-               ctx->r.req_aead = mempool_alloc(&cc->req_pool, in_interrupt() ? 
GFP_ATOMIC : GFP_NOIO);
+               ctx->r.req_aead = mempool_alloc(&cc->req_pool, gfp);
                if (!ctx->r.req_aead)
                        return -ENOMEM;
        }
@@ -1501,13 +1501,13 @@ static int crypt_alloc_req_aead(struct crypt_config *cc,
        return 0;
 }
 
-static int crypt_alloc_req(struct crypt_config *cc,
-                           struct convert_context *ctx)
+static int crypt_alloc_req(struct crypt_config *cc, struct convert_context 
*ctx,
+                          gfp_t gfp)
 {
        if (crypt_integrity_aead(cc))
-               return crypt_alloc_req_aead(cc, ctx);
+               return crypt_alloc_req_aead(cc, ctx, gfp);
        else
-               return crypt_alloc_req_skcipher(cc, ctx);
+               return crypt_alloc_req_skcipher(cc, ctx, gfp);
 }
 
 static void crypt_free_req_skcipher(struct crypt_config *cc,
@@ -1556,7 +1556,7 @@ static blk_status_t crypt_convert(struct crypt_config *cc,
 
        while (ctx->iter_in.bi_size && ctx->iter_out.bi_size) {
 
-               r = crypt_alloc_req(cc, ctx);
+               r = crypt_alloc_req(cc, ctx, atomic ? GFP_ATOMIC : GFP_NOIO);
                if (r) {
                        complete(&ctx->restart);
                        return BLK_STS_DEV_RESOURCE;
-- 
2.30.0


--
dm-devel mailing list
[email protected]
https://listman.redhat.com/mailman/listinfo/dm-devel

Reply via email to