On 10/10/2010 09:16 PM, Andi Kleen wrote: >> Not if in_interrupt is set though? >> + if (per_cpu(io_wq_cpu, cpu) == current && !in_interrupt()) { >> >> What I am missing here? > > The interrupt doesn't block on the task. > > Actually most likely that check isn't needed anyways because > that should not happen, was just pure paranoia from my side. I don't think so. If you run crypto in async mode, you get asynchronous callback (kcryptd_asynnc_done() here). AFAIK this callback is called in interrupt context. This callback decreases pending counter and if it reach zero it calls kcryptd_crypt_write_io_submit() -> kcryptd_queue_io(). You cannot call direct encryption if it is called from async callback, so the IO must be always queued to IO workqueue for later. So the in_interrupt() is IMHO equivalent of async flag and it is properly placed there. But previously, there were threads per device, so if one IO thread blocks, others stacked mappings can continue Now I see possibility for deadlock there because we have one io thread now (assuming that 1 CPU situation Alasdair mentioned). Or is there a mistake in my analysis? > >> >> (And assume there is only 1 CPU too for worst case behaviour, presumably.) > > One per process, previously it was always one per CPU. Nope, one singlethread per crypt device (resp. two: io + crypt). Milan -- dm-devel mailing list dm-devel@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel