On Mon, Jan 18, 2021 at 10:44 PM Pavel Machek pavel@denx.de wrote:
Fix this by allocating crypto requests with GFP_ATOMIC mask in interrupt context.
...
This one is wrong.
+++ b/drivers/md/dm-crypt.c @@ -1454,13 +1454,16 @@ static int crypt_convert_block_skcipher(
if (!ctx->r.req)
ctx->r.req = mempool_alloc(&cc->req_pool, GFP_NOIO);
if (!ctx->r.req) {
ctx->r.req = mempool_alloc(&cc->req_pool, in_interrupt() ? GFP_ATOMIC : GFP_NOIO);
Good so far. Ugly but good.
-static void crypt_alloc_req_aead(struct crypt_config *cc, +static int crypt_alloc_req_aead(struct crypt_config *cc, struct convert_context *ctx) {
if (!ctx->r.req_aead)
ctx->r.req_aead = mempool_alloc(&cc->req_pool, GFP_NOIO);
if (!ctx->r.req) {
ctx->r.req = mempool_alloc(&cc->req_pool, in_interrupt() ? GFP_ATOMIC : GFP_NOIO);
if (!ctx->r.req)
return -ENOMEM;
}
But this one can't be good. We are now allocating different field in the structure!
Good catch! Sorry for the copy-paste. It is actually not a big deal, because this is not a structure, but a union: as long as the mempool was initialized with the correct size, it should be no different.
Nevertheless, I'll send the patch to fix the typo.
Regards, Ignat
Pavel
-- DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany