On Fri, 12 Apr 2024, Li Lingfeng wrote: > Hi > > I'm having difficulty understanding "Workqueues and ksoftirqd may be scheduled > arbitrarily". > This is my understanding: > kcryptd_queue_crypt > tasklet_schedule > __tasklet_schedule > __tasklet_schedule_common > raise_softirq_irqoff > wakeup_softirqd > wake_up_process // ksoftirqd > > run_ksoftirqd > __do_softirq > softirq_handle_begin > __local_bh_disable_ip // Turn off preemption > <---------- [1] ----------> > tasklet_action // h->action > tasklet_action_common > tasklet_trylock > kcryptd_crypt_tasklet // t->func(t->data) > ... > queue_work(cc->io_queue, &io->work) > <---------- [2] ----------> > tasklet_unlock > > // workqueue process > kcryptd_io_bio_endio > ... > // free tasklet_struct > > Since preemption has been turned off at [1], I'm confused about how the CPU > can be scheduled out to do work first at [2]. > Would you mind explaining it to me? > > Thanks Yes, you are right that scheduling is disabled when ksoftirqd processes a softirq task. But the upstream kernel switched to bh workqueues anyway, so there is no need to submit a different solution to the stable kernels. Mikulas