block: support blk-mq on blk_run_queue/blk_run_queue_async.
Subsystems (2)
PATCH 1/6 block: support blk-mq on blk_run_queue/blk_run_queue_async.
--- block/blk-core.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-)
block/blk-core.c +14 -7
@@ -304,8 +304,12 @@ EXPORT_SYMBOL(__blk_run_queue);*/ void blk_run_queue_async (struct request_queue *q) { -if (likely (!blk_queue_stopped (q) && !blk_queue_dead (q))) -mod_delayed_work (kblockd_workqueue, &q->delay_work,0 ); +if (likely (!blk_queue_stopped (q) && !blk_queue_dead (q))) { +if (q->mq_ops) +blk_mq_run_queues (q,1 ); +else +mod_delayed_work (kblockd_workqueue, &q->delay_work,0 ); + } }EXPORT_SYMBOL (blk_run_queue_async);
@@ -319,11 +323,14 @@ EXPORT_SYMBOL(blk_run_queue_async);*/ void blk_run_queue (struct request_queue *q) { -unsigned long flags; - -spin_lock_irqsave (q->queue_lock, flags); -__blk_run_queue (q); -spin_unlock_irqrestore (q->queue_lock, flags); +if (q->mq_ops) +blk_mq_run_queues (q,0 ); +else { +unsigned long flags; +spin_lock_irqsave (q->queue_lock, flags); +__blk_run_queue (q); +spin_unlock_irqrestore (q->queue_lock, flags); + } }EXPORT_SYMBOL (blk_run_queue);
Signature · 1 line
1.7.10.4
Hi Jianpeng,
Apologies for the long delayed response on this series.
Comments are inline.
Quoted 34 lines · majianpeng
Signed-off-by Jianpeng Ma <[email protected]>--- block/blk-core.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-)block/blk-core.c +7
-7@@ -304,8 +304,12 @@ EXPORT_SYMBOL(__blk_run_queue);*/ void blk_run_queue_async (struct request_queue *q) { -if (likely (!blk_queue_stopped (q) && !blk_queue_dead (q))) -mod_delayed_work (kblockd_workqueue, &q->delay_work,0 ); +if (likely (!blk_queue_stopped (q) && !blk_queue_dead (q))) { +if (q->mq_ops) +blk_mq_run_queues (q,1 ); +else +mod_delayed_work (kblockd_workqueue, &q->delay_work,0 ); + } }EXPORT_SYMBOL (blk_run_queue_async);@@ -319,11 +323,14 @@ EXPORT_SYMBOL(blk_run_queue_async);*/ void blk_run_queue (struct request_queue *q) { -unsigned long flags; - -spin_lock_irqsave (q->queue_lock, flags); -__blk_run_queue (q); -spin_unlock_irqrestore (q->queue_lock, flags); +if (q->mq_ops)
block/blk-core.c EXPORT_SYMBOL(blk_run_queue_async); · line 336
Quoted 10 lines
block/blk-core.c +7
-0+blk_mq_run_queues (q,0 ); + else { +unsigned long flags; +spin_lock_irqsave (q->queue_lock, flags); +__blk_run_queue (q); +spin_unlock_irqrestore (q->queue_lock, flags); + } }EXPORT_SYMBOL (blk_run_queue);
OK, after playing with QEMU AHCI + TYPE_ROM emulation recently to test your series I can now RO mount an ISO image with a subset of the patches. That, plus some minor QEMU atapi.c hacks make cdrom.c do it's thing.
Btw, I've encountered a QEMU ahci emulation CHECK_CONDITION exception hangswith scsi-mq, which are due to the current lack of scsi-eh support which libata depends upon to complete these failed commands. (Currently avoiding this bug with QEMU atapi hacks..)
AFAICT this particular patch doesn't seem to be required to make basic QEMU AHCI emulation work with GOOD or CHECK_CONDITION status. Just curious, do you have a particular case with hw AHCI + TYPE_ROM where this is strictly required..?
Thank you,
--nab