On 2024-01-29 23:11:54 [-1000], Tejun Heo wrote:
> --- a/drivers/md/dm-crypt.c
> +++ b/drivers/md/dm-crypt.c
> @@ -2263,9 +2232,8 @@ static void kcryptd_queue_crypt(struct dm_crypt_io *io)

                /*
                 * in_hardirq(): Crypto API's skcipher_walk_first() refuses to 
work in hard IRQ context.
                 * irqs_disabled(): the kernel may run some IO completion from 
the idle thread, but
                 * it is being executed with irqs disabled.
                 */
>                * it is being executed with irqs disabled.
>                */
>               if (in_hardirq() || irqs_disabled()) {
> -                     io->in_tasklet = true;
> -                     tasklet_init(&io->tasklet, kcryptd_crypt_tasklet, 
> (unsigned long)&io->work);
> -                     tasklet_schedule(&io->tasklet);
> +                     INIT_WORK(&io->work, kcryptd_crypt);
> +                     queue_work(system_bh_wq, &io->work);

Why do we need the tasklet here in the first place? Couldn't we use
workqueue? As per comment, the request originates in hardirq and then it
is moved to tasklet. Couldn't it be moved to workqueue regardless?

>                       return;
>               }
>  

Sebastian

Reply via email to