Skip to contentSkip to conversation

block: support blk-mq on blk_run_queue/blk_run_queue_async.

PATCH Applied majianpeng 2 participants 2 messages Nov 29, 2013 – Dec 23, 2013

Subsystems (2)
lore
Share & tools
lore

majianpeng

author
#0 lore raw

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
index bf44ca0..549d83e 100644
@@ -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
#1 lore raw

Hi Jianpeng,

Apologies for the long delayed response on this series.

Comments are inline.

Quoted 34 lines · majianpeng
---
 block/blk-core.c |   21 ++++++++++++++-------
 1 file changed, 14 insertions(+), 7 deletions(-)
block/blk-core.c +7 -7
index bf44ca0..549d83e 100644
@@ -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