[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]
Re: [dm-devel] DM-CRYPT: Scale to multiple CPUs v3
- From: Milan Broz <mbroz redhat com>
- To: Andi Kleen <andi firstfloor org>
- Cc: pedrib gmail com, device-mapper development <dm-devel redhat com>, Andi Kleen <ak linux intel com>, linux-kernel vger kernel org, Mike Snitzer <snitzer redhat com>
- Subject: Re: [dm-devel] DM-CRYPT: Scale to multiple CPUs v3
- Date: Sun, 10 Oct 2010 21:31:30 +0200
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
[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]