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