summaryrefslogtreecommitdiffstats
path: root/block/blk-mq.c
diff options
context:
space:
mode:
authorJens Axboe <axboe@kernel.dk>2017-08-01 17:28:24 +0200
committerJens Axboe <axboe@kernel.dk>2017-08-01 17:28:24 +0200
commitb7a71e66d4d274d627cabc17c5e41330bcf47c2d (patch)
tree66ba97dff24987245a77aa02570c2dfc08c21340 /block/blk-mq.c
parentblk-mq: blk_mq_requeue_work() doesn't need to save IRQ flags (diff)
downloadlinux-b7a71e66d4d274d627cabc17c5e41330bcf47c2d.tar.xz
linux-b7a71e66d4d274d627cabc17c5e41330bcf47c2d.zip
blk-mq: add warning to __blk_mq_run_hw_queue() for ints disabled
We recently had a bug in the IPR SCSI driver, where it would end up making the SCSI mid layer run the mq hardware queue with interrupts disabled. This isn't legal, since the software queue locking relies on never being grabbed from interrupt context. Additionally, drivers that set BLK_MQ_F_BLOCKING may schedule from this context. Add a WARN_ON_ONCE() to catch bad users up front. Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'block/blk-mq.c')
-rw-r--r--block/blk-mq.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/block/blk-mq.c b/block/blk-mq.c
index b70a4ad78b63..a5d369dc7622 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -1097,9 +1097,19 @@ static void __blk_mq_run_hw_queue(struct blk_mq_hw_ctx *hctx)
{
int srcu_idx;
+ /*
+ * We should be running this queue from one of the CPUs that
+ * are mapped to it.
+ */
WARN_ON(!cpumask_test_cpu(raw_smp_processor_id(), hctx->cpumask) &&
cpu_online(hctx->next_cpu));
+ /*
+ * We can't run the queue inline with ints disabled. Ensure that
+ * we catch bad users of this early.
+ */
+ WARN_ON_ONCE(in_interrupt());
+
if (!(hctx->flags & BLK_MQ_F_BLOCKING)) {
rcu_read_lock();
blk_mq_sched_dispatch_requests(hctx);