aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSagi Grimberg <sagi@grimberg.me>2017-07-04 03:00:41 -0400
committerSagi Grimberg <sagi@grimberg.me>2017-07-06 02:49:18 -0400
commit436c15ab6596b12cfee7618ecaa69a4341ac3c51 (patch)
tree7069612726981086d6b2caaa5db671a236d9faef
parentb52c2e92546ee794a5bbab4d8ea435c1de85a8cb (diff)
mtip32xx: quiesce request queues to make sure no submissions are inflight
Unlike blk_mq_stop_hw_queues, blk_mq_quiesce_queue respects the submission path rcu grace. quiesce the queue before iterating on live tags, or performing device io quiescing. While were at it, verify that the request started in mtip_abort_cmd amd mtip_queue_cmd tag iteration calls. Reviewed-by: Ming Lei <ming.lei@redhat.com> Signed-off-by: Sagi Grimberg <sagi@grimberg.me>
-rw-r--r--drivers/block/mtip32xx/mtip32xx.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/drivers/block/mtip32xx/mtip32xx.c b/drivers/block/mtip32xx/mtip32xx.c
index 61b046f256ca..87717a1a5c89 100644
--- a/drivers/block/mtip32xx/mtip32xx.c
+++ b/drivers/block/mtip32xx/mtip32xx.c
@@ -950,7 +950,7 @@ static int mtip_quiesce_io(struct mtip_port *port, unsigned long timeout)
950 unsigned long to; 950 unsigned long to;
951 bool active = true; 951 bool active = true;
952 952
953 blk_mq_stop_hw_queues(port->dd->queue); 953 blk_mq_quiesce_queue(port->dd->queue);
954 954
955 to = jiffies + msecs_to_jiffies(timeout); 955 to = jiffies + msecs_to_jiffies(timeout);
956 do { 956 do {
@@ -970,10 +970,10 @@ static int mtip_quiesce_io(struct mtip_port *port, unsigned long timeout)
970 break; 970 break;
971 } while (time_before(jiffies, to)); 971 } while (time_before(jiffies, to));
972 972
973 blk_mq_start_stopped_hw_queues(port->dd->queue, true); 973 blk_mq_unquiesce_queue(port->dd->queue);
974 return active ? -EBUSY : 0; 974 return active ? -EBUSY : 0;
975err_fault: 975err_fault:
976 blk_mq_start_stopped_hw_queues(port->dd->queue, true); 976 blk_mq_unquiesce_queue(port->dd->queue);
977 return -EFAULT; 977 return -EFAULT;
978} 978}
979 979
@@ -2737,6 +2737,9 @@ static void mtip_abort_cmd(struct request *req, void *data,
2737 struct mtip_cmd *cmd = blk_mq_rq_to_pdu(req); 2737 struct mtip_cmd *cmd = blk_mq_rq_to_pdu(req);
2738 struct driver_data *dd = data; 2738 struct driver_data *dd = data;
2739 2739
2740 if (!blk_mq_request_started(req))
2741 return;
2742
2740 dbg_printk(MTIP_DRV_NAME " Aborting request, tag = %d\n", req->tag); 2743 dbg_printk(MTIP_DRV_NAME " Aborting request, tag = %d\n", req->tag);
2741 2744
2742 clear_bit(req->tag, dd->port->cmds_to_issue); 2745 clear_bit(req->tag, dd->port->cmds_to_issue);
@@ -2749,6 +2752,9 @@ static void mtip_queue_cmd(struct request *req, void *data,
2749{ 2752{
2750 struct driver_data *dd = data; 2753 struct driver_data *dd = data;
2751 2754
2755 if (!blk_mq_request_started(req))
2756 return;
2757
2752 set_bit(req->tag, dd->port->cmds_to_issue); 2758 set_bit(req->tag, dd->port->cmds_to_issue);
2753 blk_abort_request(req); 2759 blk_abort_request(req);
2754} 2760}
@@ -2814,6 +2820,8 @@ restart_eh:
2814 dev_warn(&dd->pdev->dev, 2820 dev_warn(&dd->pdev->dev,
2815 "Completion workers still active!"); 2821 "Completion workers still active!");
2816 2822
2823 blk_mq_quiesce_queue(dd->queue);
2824
2817 spin_lock(dd->queue->queue_lock); 2825 spin_lock(dd->queue->queue_lock);
2818 blk_mq_tagset_busy_iter(&dd->tags, 2826 blk_mq_tagset_busy_iter(&dd->tags,
2819 mtip_queue_cmd, dd); 2827 mtip_queue_cmd, dd);
@@ -2826,6 +2834,8 @@ restart_eh:
2826 mtip_abort_cmd, dd); 2834 mtip_abort_cmd, dd);
2827 2835
2828 clear_bit(MTIP_PF_TO_ACTIVE_BIT, &dd->port->flags); 2836 clear_bit(MTIP_PF_TO_ACTIVE_BIT, &dd->port->flags);
2837
2838 blk_mq_unquiesce_queue(dd->queue);
2829 } 2839 }
2830 2840
2831 if (test_bit(MTIP_PF_ISSUE_CMDS_BIT, &port->flags)) { 2841 if (test_bit(MTIP_PF_ISSUE_CMDS_BIT, &port->flags)) {
@@ -3995,8 +4005,9 @@ static int mtip_block_remove(struct driver_data *dd)
3995 dd->disk->disk_name); 4005 dd->disk->disk_name);
3996 4006
3997 blk_freeze_queue_start(dd->queue); 4007 blk_freeze_queue_start(dd->queue);
3998 blk_mq_stop_hw_queues(dd->queue); 4008 blk_mq_quiesce_queue(dd->queue);
3999 blk_mq_tagset_busy_iter(&dd->tags, mtip_no_dev_cleanup, dd); 4009 blk_mq_tagset_busy_iter(&dd->tags, mtip_no_dev_cleanup, dd);
4010 blk_mq_unquiesce_queue(dd->queue);
4000 4011
4001 /* 4012 /*
4002 * Delete our gendisk structure. This also removes the device 4013 * Delete our gendisk structure. This also removes the device