[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <568184E8.1080801@fb.com>
Date: Mon, 28 Dec 2015 11:52:24 -0700
From: Jens Axboe <axboe@...com>
To: Rabin Vincent <rabin@....in>
CC: <linux-kernel@...r.kernel.org>
Subject: Re: [PATCH] null_blk: don't enable irqs when in irq
On 12/25/2015 09:03 PM, Jens Axboe wrote:
> On 12/25/2015 07:26 AM, Rabin Vincent wrote:
>> When using irq_mode=NULL_IRQ_TIMER, blk_start_queue() is called from the
>> hrtimer interrupt. null_request_fn() calls spin_unlock_irq() and this
>> causes the following splat from lockdep since interrupts are being
>> enabled while we're in an interrupt handler.
>>
>> When we're in null_request_fn() we can't know the status of the flags
>> saved before blk_start_queue() was called, but we can use in_irq() to
>> conditionally enable interrupts only if we're not in a hard interrupt in
>> order to handle this case.
>
> Using in_irq() to check for this is... nasty. You have two choices here.
> Either you don't enable interrupts ever. That's safe from the
> perspective of the driver, since we don't block in handling the command.
> That means just unconditionally using spin_unlock() in the request_fn.
> Or you punt queue running to process context, by manually clearing the
> queue stopped flag and using blk_run_queue_async() instead.
Something like this should work, can you test it?
--
Jens Axboe
View attachment "null-restart.patch" of type "text/x-patch" (2364 bytes)
Powered by blists - more mailing lists