In order to improve the IO performance of the dm-crypt implementation, the commit 39d42fa96ba1 ("dm crypt: add flags to optionally bypass kcryptd workqueues") adds tasklet to do the crypto operations. The tasklet callback function kcryptd_crypt_tasklet() calls kcryptd_crypt() which is an original workqueue callback function that may sleep. As a result, the sleep-in-atomic-context bug may happen. The process is shown below. (atomic context) kcryptd_crypt_tasklet() kcryptd_crypt() kcryptd_crypt_write_convert() wait_for_completion() //may sleep The wait_for_completion() is a function that may sleep. In order to mitigate the bug, this patch changes wait_for_completion() to try_wait_for_completion(). Fixes: 39d42fa96ba1 ("dm crypt: add flags to optionally bypass kcryptd workqueues") Signed-off-by: Duoming Zhou <duoming@xxxxxxxxxx> --- drivers/md/dm-crypt.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c index 8b47b913ee8..5e2b2463d87 100644 --- a/drivers/md/dm-crypt.c +++ b/drivers/md/dm-crypt.c @@ -2085,7 +2085,8 @@ static void kcryptd_crypt_write_convert(struct dm_crypt_io *io) crypt_finished = atomic_dec_and_test(&ctx->cc_pending); if (!crypt_finished && kcryptd_crypt_write_inline(cc, ctx)) { /* Wait for completion signaled by kcryptd_async_done() */ - wait_for_completion(&ctx->restart); + while (!try_wait_for_completion(&ctx->restart)) + ; crypt_finished = 1; } -- 2.17.1 -- dm-devel mailing list dm-devel@xxxxxxxxxx https://listman.redhat.com/mailman/listinfo/dm-devel