All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/6] blk-mq: fix & improve queue quiescing
@ 2017-05-26  3:07 ` Ming Lei
  0 siblings, 0 replies; 22+ messages in thread
From: Ming Lei @ 2017-05-26  3:07 UTC (permalink / raw)
  To: Jens Axboe, linux-block, Christoph Hellwig
  Cc: Bart Van Assche, linux-nvme, linux-scsi, dm-devel

Hi,

There are some issues in current blk_mq_quiesce_queue():
    - in case of direct issue or BLK_MQ_S_START_ON_RUN, dispatch won't
    can't be prevented after blk_mq_quiesce_queue() is returned.
    - in theory, new RCU read-side critical sections may begin while
    synchronize_rcu() was waiting, and end after returning of
    synchronize_rcu(), then dispatch still may be run after
    synchronize_rcu() returns..

It is observed that request double-free/use-after-free
can be triggered easily when canceling NVMe requests via
blk_mq_tagset_busy_iter(...nvme_cancel_request) in nvme_dev_disable().
The reason is that blk_mq_quiesce_queue() can't prevent
dispatching from being run during the period.

Actually we have to quiesce queue for canceling dispatched
requests via blk_mq_tagset_busy_iter(), otherwise use-after-free
can be made easily. This way of canceling dispatched requests
has been used in several drivers, only NVMe uses blk_mq_quiesce_queue()
to avoid the issue, and others need to be fixed too. And it
is a common case for recovering dead controller.

blk_mq_quiesce_queue() is implemented via stopping queue, which
limits its uses, and easy to casue race, any start queue is other
paths may break blk_mq_quiesce_queue(). For example, we sometimes
stops queue when hw can't handle so many ongoing requests and restart
queues after srequests are completed. Meantime when we want to cancel
requests if hardware is dead, quiescing is run first, then the restarting
in complete path can break the quiescing. This patch improves this
interface via removing stopping queue, then it can be easier to use.
 
Thanks,
Ming

Ming Lei (6):
  blk-mq: introduce blk_mq_unquiesce_queue
  blk-mq: use the introduced blk_mq_unquiesce_queue()
  blk-mq: fix blk_mq_quiesce_queue
  blk-mq: update comments on blk_mq_quiesce_queue()
  blk-mq: don't stop queue for quiescing
  blk-mq: clarify dispatching won't be blocked by stopping queue

 block/blk-mq.c           | 67 +++++++++++++++++++++++++++++++++++++++++-------
 drivers/md/dm-rq.c       |  2 +-
 drivers/nvme/host/core.c |  2 +-
 drivers/scsi/scsi_lib.c  |  5 +++-
 include/linux/blkdev.h   |  3 +++
 5 files changed, 67 insertions(+), 12 deletions(-)

-- 
2.9.4

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [PATCH 0/6] blk-mq: fix & improve queue quiescing
@ 2017-05-26  3:07 ` Ming Lei
  0 siblings, 0 replies; 22+ messages in thread
From: Ming Lei @ 2017-05-26  3:07 UTC (permalink / raw)


Hi,

There are some issues in current blk_mq_quiesce_queue():
    - in case of direct issue or BLK_MQ_S_START_ON_RUN, dispatch won't
    can't be prevented after blk_mq_quiesce_queue() is returned.
    - in theory, new RCU read-side critical sections may begin while
    synchronize_rcu() was waiting, and end after returning of
    synchronize_rcu(), then dispatch still may be run after
    synchronize_rcu() returns..

It is observed that request double-free/use-after-free
can be triggered easily when canceling NVMe requests via
blk_mq_tagset_busy_iter(...nvme_cancel_request) in nvme_dev_disable().
The reason is that blk_mq_quiesce_queue() can't prevent
dispatching from being run during the period.

Actually we have to quiesce queue for canceling dispatched
requests via blk_mq_tagset_busy_iter(), otherwise use-after-free
can be made easily. This way of canceling dispatched requests
has been used in several drivers, only NVMe uses blk_mq_quiesce_queue()
to avoid the issue, and others need to be fixed too. And it
is a common case for recovering dead controller.

blk_mq_quiesce_queue() is implemented via stopping queue, which
limits its uses, and easy to casue race, any start queue is other
paths may break blk_mq_quiesce_queue(). For example, we sometimes
stops queue when hw can't handle so many ongoing requests and restart
queues after srequests are completed. Meantime when we want to cancel
requests if hardware is dead, quiescing is run first, then the restarting
in complete path can break the quiescing. This patch improves this
interface via removing stopping queue, then it can be easier to use.
 
Thanks,
Ming

Ming Lei (6):
  blk-mq: introduce blk_mq_unquiesce_queue
  blk-mq: use the introduced blk_mq_unquiesce_queue()
  blk-mq: fix blk_mq_quiesce_queue
  blk-mq: update comments on blk_mq_quiesce_queue()
  blk-mq: don't stop queue for quiescing
  blk-mq: clarify dispatching won't be blocked by stopping queue

 block/blk-mq.c           | 67 +++++++++++++++++++++++++++++++++++++++++-------
 drivers/md/dm-rq.c       |  2 +-
 drivers/nvme/host/core.c |  2 +-
 drivers/scsi/scsi_lib.c  |  5 +++-
 include/linux/blkdev.h   |  3 +++
 5 files changed, 67 insertions(+), 12 deletions(-)

-- 
2.9.4

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [PATCH 1/6] blk-mq: introduce blk_mq_unquiesce_queue
  2017-05-26  3:07 ` Ming Lei
@ 2017-05-26  3:07   ` Ming Lei
  -1 siblings, 0 replies; 22+ messages in thread
From: Ming Lei @ 2017-05-26  3:07 UTC (permalink / raw)
  To: Jens Axboe, linux-block, Christoph Hellwig
  Cc: Bart Van Assche, linux-nvme, linux-scsi, dm-devel

Now we use blk_mq_start_stopped_hw_queues() implictely
as pair of blk_mq_quiesce_queue(), now we introduce
blk_mq_unquiesce_queue() explictely.

Also this function is introduced for fixing
current quiescing mechanism, which will be done
in the following patches.

Signed-off-by: Ming Lei <ming.lei@redhat.com>
---
 block/blk-mq.c         | 13 +++++++++++++
 include/linux/blkdev.h |  1 +
 2 files changed, 14 insertions(+)

diff --git a/block/blk-mq.c b/block/blk-mq.c
index f2224ffd225d..a26fee3fb389 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -181,6 +181,19 @@ void blk_mq_quiesce_queue(struct request_queue *q)
 }
 EXPORT_SYMBOL_GPL(blk_mq_quiesce_queue);
 
+/**
+ * blk_mq_unquiesce_queue() - pair of blk_mq_quiesce_queue()
+ * @q: request queue.
+ *
+ * This function recovers queue into the state before quiescing
+ * done by blk_mq_quiesce_queue
+ */
+void blk_mq_unquiesce_queue(struct request_queue *q)
+{
+	blk_mq_start_stopped_hw_queues(q, true);
+}
+EXPORT_SYMBOL_GPL(blk_mq_unquiesce_queue);
+
 void blk_mq_wake_waiters(struct request_queue *q)
 {
 	struct blk_mq_hw_ctx *hctx;
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
index ab92c4ea138b..41291be82ac4 100644
--- a/include/linux/blkdev.h
+++ b/include/linux/blkdev.h
@@ -964,6 +964,7 @@ extern void __blk_run_queue_uncond(struct request_queue *q);
 extern void blk_run_queue(struct request_queue *);
 extern void blk_run_queue_async(struct request_queue *q);
 extern void blk_mq_quiesce_queue(struct request_queue *q);
+extern void blk_mq_unquiesce_queue(struct request_queue *q);
 extern int blk_rq_map_user(struct request_queue *, struct request *,
 			   struct rq_map_data *, void __user *, unsigned long,
 			   gfp_t);
-- 
2.9.4

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 1/6] blk-mq: introduce blk_mq_unquiesce_queue
@ 2017-05-26  3:07   ` Ming Lei
  0 siblings, 0 replies; 22+ messages in thread
From: Ming Lei @ 2017-05-26  3:07 UTC (permalink / raw)


Now we use blk_mq_start_stopped_hw_queues() implictely
as pair of blk_mq_quiesce_queue(), now we introduce
blk_mq_unquiesce_queue() explictely.

Also this function is introduced for fixing
current quiescing mechanism, which will be done
in the following patches.

Signed-off-by: Ming Lei <ming.lei at redhat.com>
---
 block/blk-mq.c         | 13 +++++++++++++
 include/linux/blkdev.h |  1 +
 2 files changed, 14 insertions(+)

diff --git a/block/blk-mq.c b/block/blk-mq.c
index f2224ffd225d..a26fee3fb389 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -181,6 +181,19 @@ void blk_mq_quiesce_queue(struct request_queue *q)
 }
 EXPORT_SYMBOL_GPL(blk_mq_quiesce_queue);
 
+/**
+ * blk_mq_unquiesce_queue() - pair of blk_mq_quiesce_queue()
+ * @q: request queue.
+ *
+ * This function recovers queue into the state before quiescing
+ * done by blk_mq_quiesce_queue
+ */
+void blk_mq_unquiesce_queue(struct request_queue *q)
+{
+	blk_mq_start_stopped_hw_queues(q, true);
+}
+EXPORT_SYMBOL_GPL(blk_mq_unquiesce_queue);
+
 void blk_mq_wake_waiters(struct request_queue *q)
 {
 	struct blk_mq_hw_ctx *hctx;
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
index ab92c4ea138b..41291be82ac4 100644
--- a/include/linux/blkdev.h
+++ b/include/linux/blkdev.h
@@ -964,6 +964,7 @@ extern void __blk_run_queue_uncond(struct request_queue *q);
 extern void blk_run_queue(struct request_queue *);
 extern void blk_run_queue_async(struct request_queue *q);
 extern void blk_mq_quiesce_queue(struct request_queue *q);
+extern void blk_mq_unquiesce_queue(struct request_queue *q);
 extern int blk_rq_map_user(struct request_queue *, struct request *,
 			   struct rq_map_data *, void __user *, unsigned long,
 			   gfp_t);
-- 
2.9.4

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 2/6] blk-mq: use the introduced blk_mq_unquiesce_queue()
  2017-05-26  3:07 ` Ming Lei
@ 2017-05-26  3:07   ` Ming Lei
  -1 siblings, 0 replies; 22+ messages in thread
From: Ming Lei @ 2017-05-26  3:07 UTC (permalink / raw)
  To: Jens Axboe, linux-block, Christoph Hellwig
  Cc: Bart Van Assche, linux-nvme, linux-scsi, dm-devel

blk_mq_unquiesce_queue() is used for unquiescing the queue.

Signed-off-by: Ming Lei <ming.lei@redhat.com>
---
 drivers/md/dm-rq.c       | 2 +-
 drivers/nvme/host/core.c | 2 +-
 drivers/scsi/scsi_lib.c  | 5 ++++-
 3 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/drivers/md/dm-rq.c b/drivers/md/dm-rq.c
index 2af27026aa2e..673fcf075077 100644
--- a/drivers/md/dm-rq.c
+++ b/drivers/md/dm-rq.c
@@ -71,7 +71,7 @@ static void dm_old_start_queue(struct request_queue *q)
 
 static void dm_mq_start_queue(struct request_queue *q)
 {
-	blk_mq_start_stopped_hw_queues(q, true);
+	blk_mq_unquiesce_queue(q);
 	blk_mq_kick_requeue_list(q);
 }
 
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index 04e115834702..231d36028afc 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -2514,7 +2514,7 @@ void nvme_start_queues(struct nvme_ctrl *ctrl)
 
 	mutex_lock(&ctrl->namespaces_mutex);
 	list_for_each_entry(ns, &ctrl->namespaces, list) {
-		blk_mq_start_stopped_hw_queues(ns->queue, true);
+		blk_mq_unquiesce_queue(ns->queue);
 		blk_mq_kick_requeue_list(ns->queue);
 	}
 	mutex_unlock(&ctrl->namespaces_mutex);
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 814a4bd8405d..72b11f75719c 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -3030,7 +3030,10 @@ scsi_internal_device_unblock(struct scsi_device *sdev,
 		return -EINVAL;
 
 	if (q->mq_ops) {
-		blk_mq_start_stopped_hw_queues(q, false);
+		if (blk_queue_quiesced(q))
+			blk_mq_unquiesce_queue(q);
+		else
+			blk_mq_start_stopped_hw_queues(q, false);
 	} else {
 		spin_lock_irqsave(q->queue_lock, flags);
 		blk_start_queue(q);
-- 
2.9.4

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 2/6] blk-mq: use the introduced blk_mq_unquiesce_queue()
@ 2017-05-26  3:07   ` Ming Lei
  0 siblings, 0 replies; 22+ messages in thread
From: Ming Lei @ 2017-05-26  3:07 UTC (permalink / raw)


blk_mq_unquiesce_queue() is used for unquiescing the queue.

Signed-off-by: Ming Lei <ming.lei at redhat.com>
---
 drivers/md/dm-rq.c       | 2 +-
 drivers/nvme/host/core.c | 2 +-
 drivers/scsi/scsi_lib.c  | 5 ++++-
 3 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/drivers/md/dm-rq.c b/drivers/md/dm-rq.c
index 2af27026aa2e..673fcf075077 100644
--- a/drivers/md/dm-rq.c
+++ b/drivers/md/dm-rq.c
@@ -71,7 +71,7 @@ static void dm_old_start_queue(struct request_queue *q)
 
 static void dm_mq_start_queue(struct request_queue *q)
 {
-	blk_mq_start_stopped_hw_queues(q, true);
+	blk_mq_unquiesce_queue(q);
 	blk_mq_kick_requeue_list(q);
 }
 
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index 04e115834702..231d36028afc 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -2514,7 +2514,7 @@ void nvme_start_queues(struct nvme_ctrl *ctrl)
 
 	mutex_lock(&ctrl->namespaces_mutex);
 	list_for_each_entry(ns, &ctrl->namespaces, list) {
-		blk_mq_start_stopped_hw_queues(ns->queue, true);
+		blk_mq_unquiesce_queue(ns->queue);
 		blk_mq_kick_requeue_list(ns->queue);
 	}
 	mutex_unlock(&ctrl->namespaces_mutex);
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 814a4bd8405d..72b11f75719c 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -3030,7 +3030,10 @@ scsi_internal_device_unblock(struct scsi_device *sdev,
 		return -EINVAL;
 
 	if (q->mq_ops) {
-		blk_mq_start_stopped_hw_queues(q, false);
+		if (blk_queue_quiesced(q))
+			blk_mq_unquiesce_queue(q);
+		else
+			blk_mq_start_stopped_hw_queues(q, false);
 	} else {
 		spin_lock_irqsave(q->queue_lock, flags);
 		blk_start_queue(q);
-- 
2.9.4

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 3/6] blk-mq: fix blk_mq_quiesce_queue
  2017-05-26  3:07 ` Ming Lei
@ 2017-05-26  3:07   ` Ming Lei
  -1 siblings, 0 replies; 22+ messages in thread
From: Ming Lei @ 2017-05-26  3:07 UTC (permalink / raw)
  To: Jens Axboe, linux-block, Christoph Hellwig
  Cc: Bart Van Assche, linux-nvme, linux-scsi, dm-devel

blk_mq_quiesce_queue() can not block dispatch in the following
two cases:

- direct issue or BLK_MQ_S_START_ON_RUN
- in theory, new RCU read-side critical sections may begin while
synchronize_rcu() was waiting, and end after returning of
synchronize_rcu().

so a new flag of QUEUE_FLAG_QUIESCED is introduced and evaluated
inside RCU read-side critical sections for fixing the above issues.

This patch fixes request use-after-free during canceling requets
of NVMe in nvme_dev_disable().

Signed-off-by: Ming Lei <ming.lei@redhat.com>
---
 block/blk-mq.c         | 33 ++++++++++++++++++++++++++++-----
 include/linux/blkdev.h |  2 ++
 2 files changed, 30 insertions(+), 5 deletions(-)

diff --git a/block/blk-mq.c b/block/blk-mq.c
index a26fee3fb389..864709453c90 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -170,6 +170,10 @@ void blk_mq_quiesce_queue(struct request_queue *q)
 
 	__blk_mq_stop_hw_queues(q, true);
 
+	spin_lock_irq(q->queue_lock);
+	queue_flag_set(QUEUE_FLAG_QUIESCED, q);
+	spin_unlock_irq(q->queue_lock);
+
 	queue_for_each_hw_ctx(q, hctx, i) {
 		if (hctx->flags & BLK_MQ_F_BLOCKING)
 			synchronize_srcu(&hctx->queue_rq_srcu);
@@ -190,6 +194,10 @@ EXPORT_SYMBOL_GPL(blk_mq_quiesce_queue);
  */
 void blk_mq_unquiesce_queue(struct request_queue *q)
 {
+	spin_lock_irq(q->queue_lock);
+	queue_flag_clear(QUEUE_FLAG_QUIESCED, q);
+	spin_unlock_irq(q->queue_lock);
+
 	blk_mq_start_stopped_hw_queues(q, true);
 }
 EXPORT_SYMBOL_GPL(blk_mq_unquiesce_queue);
@@ -209,6 +217,9 @@ void blk_mq_wake_waiters(struct request_queue *q)
 	 * the queue are notified as well.
 	 */
 	wake_up_all(&q->mq_freeze_wq);
+
+	/* Forcibly unquiesce the queue to avoid having stuck requests */
+	blk_mq_unquiesce_queue(q);
 }
 
 bool blk_mq_can_queue(struct blk_mq_hw_ctx *hctx)
@@ -1108,13 +1119,15 @@ static void __blk_mq_run_hw_queue(struct blk_mq_hw_ctx *hctx)
 
 	if (!(hctx->flags & BLK_MQ_F_BLOCKING)) {
 		rcu_read_lock();
-		blk_mq_sched_dispatch_requests(hctx);
+		if (!blk_queue_quiesced(hctx->queue))
+			blk_mq_sched_dispatch_requests(hctx);
 		rcu_read_unlock();
 	} else {
 		might_sleep();
 
 		srcu_idx = srcu_read_lock(&hctx->queue_rq_srcu);
-		blk_mq_sched_dispatch_requests(hctx);
+		if (!blk_queue_quiesced(hctx->queue))
+			blk_mq_sched_dispatch_requests(hctx);
 		srcu_read_unlock(&hctx->queue_rq_srcu, srcu_idx);
 	}
 }
@@ -1519,9 +1532,14 @@ static void __blk_mq_try_issue_directly(struct request *rq, blk_qc_t *cookie,
 static void blk_mq_try_issue_directly(struct blk_mq_hw_ctx *hctx,
 		struct request *rq, blk_qc_t *cookie)
 {
-	if (!(hctx->flags & BLK_MQ_F_BLOCKING)) {
+	bool blocking = hctx->flags & BLK_MQ_F_BLOCKING;
+	bool quiesced;
+
+	if (!blocking) {
 		rcu_read_lock();
-		__blk_mq_try_issue_directly(rq, cookie, false);
+		quiesced = blk_queue_quiesced(rq->q);
+		if (!quiesced)
+			__blk_mq_try_issue_directly(rq, cookie, false);
 		rcu_read_unlock();
 	} else {
 		unsigned int srcu_idx;
@@ -1529,9 +1547,14 @@ static void blk_mq_try_issue_directly(struct blk_mq_hw_ctx *hctx,
 		might_sleep();
 
 		srcu_idx = srcu_read_lock(&hctx->queue_rq_srcu);
-		__blk_mq_try_issue_directly(rq, cookie, true);
+		quiesced = blk_queue_quiesced(rq->q);
+		if (!quiesced)
+			__blk_mq_try_issue_directly(rq, cookie, true);
 		srcu_read_unlock(&hctx->queue_rq_srcu, srcu_idx);
 	}
+
+	if (quiesced)
+		blk_mq_sched_insert_request(rq, false, false, false, blocking);
 }
 
 static blk_qc_t blk_mq_make_request(struct request_queue *q, struct bio *bio)
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
index 41291be82ac4..60967797f4f6 100644
--- a/include/linux/blkdev.h
+++ b/include/linux/blkdev.h
@@ -618,6 +618,7 @@ struct request_queue {
 #define QUEUE_FLAG_STATS       27	/* track rq completion times */
 #define QUEUE_FLAG_POLL_STATS  28	/* collecting stats for hybrid polling */
 #define QUEUE_FLAG_REGISTERED  29	/* queue has been registered to a disk */
+#define QUEUE_FLAG_QUIESCED    30	/* queue has been quiesced */
 
 #define QUEUE_FLAG_DEFAULT	((1 << QUEUE_FLAG_IO_STAT) |		\
 				 (1 << QUEUE_FLAG_STACKABLE)	|	\
@@ -712,6 +713,7 @@ static inline void queue_flag_clear(unsigned int flag, struct request_queue *q)
 #define blk_noretry_request(rq) \
 	((rq)->cmd_flags & (REQ_FAILFAST_DEV|REQ_FAILFAST_TRANSPORT| \
 			     REQ_FAILFAST_DRIVER))
+#define blk_queue_quiesced(q)	test_bit(QUEUE_FLAG_QUIESCED, &(q)->queue_flags)
 
 static inline bool blk_account_rq(struct request *rq)
 {
-- 
2.9.4

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 3/6] blk-mq: fix blk_mq_quiesce_queue
@ 2017-05-26  3:07   ` Ming Lei
  0 siblings, 0 replies; 22+ messages in thread
From: Ming Lei @ 2017-05-26  3:07 UTC (permalink / raw)


blk_mq_quiesce_queue() can not block dispatch in the following
two cases:

- direct issue or BLK_MQ_S_START_ON_RUN
- in theory, new RCU read-side critical sections may begin while
synchronize_rcu() was waiting, and end after returning of
synchronize_rcu().

so a new flag of QUEUE_FLAG_QUIESCED is introduced and evaluated
inside RCU read-side critical sections for fixing the above issues.

This patch fixes request use-after-free during canceling requets
of NVMe in nvme_dev_disable().

Signed-off-by: Ming Lei <ming.lei at redhat.com>
---
 block/blk-mq.c         | 33 ++++++++++++++++++++++++++++-----
 include/linux/blkdev.h |  2 ++
 2 files changed, 30 insertions(+), 5 deletions(-)

diff --git a/block/blk-mq.c b/block/blk-mq.c
index a26fee3fb389..864709453c90 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -170,6 +170,10 @@ void blk_mq_quiesce_queue(struct request_queue *q)
 
 	__blk_mq_stop_hw_queues(q, true);
 
+	spin_lock_irq(q->queue_lock);
+	queue_flag_set(QUEUE_FLAG_QUIESCED, q);
+	spin_unlock_irq(q->queue_lock);
+
 	queue_for_each_hw_ctx(q, hctx, i) {
 		if (hctx->flags & BLK_MQ_F_BLOCKING)
 			synchronize_srcu(&hctx->queue_rq_srcu);
@@ -190,6 +194,10 @@ EXPORT_SYMBOL_GPL(blk_mq_quiesce_queue);
  */
 void blk_mq_unquiesce_queue(struct request_queue *q)
 {
+	spin_lock_irq(q->queue_lock);
+	queue_flag_clear(QUEUE_FLAG_QUIESCED, q);
+	spin_unlock_irq(q->queue_lock);
+
 	blk_mq_start_stopped_hw_queues(q, true);
 }
 EXPORT_SYMBOL_GPL(blk_mq_unquiesce_queue);
@@ -209,6 +217,9 @@ void blk_mq_wake_waiters(struct request_queue *q)
 	 * the queue are notified as well.
 	 */
 	wake_up_all(&q->mq_freeze_wq);
+
+	/* Forcibly unquiesce the queue to avoid having stuck requests */
+	blk_mq_unquiesce_queue(q);
 }
 
 bool blk_mq_can_queue(struct blk_mq_hw_ctx *hctx)
@@ -1108,13 +1119,15 @@ static void __blk_mq_run_hw_queue(struct blk_mq_hw_ctx *hctx)
 
 	if (!(hctx->flags & BLK_MQ_F_BLOCKING)) {
 		rcu_read_lock();
-		blk_mq_sched_dispatch_requests(hctx);
+		if (!blk_queue_quiesced(hctx->queue))
+			blk_mq_sched_dispatch_requests(hctx);
 		rcu_read_unlock();
 	} else {
 		might_sleep();
 
 		srcu_idx = srcu_read_lock(&hctx->queue_rq_srcu);
-		blk_mq_sched_dispatch_requests(hctx);
+		if (!blk_queue_quiesced(hctx->queue))
+			blk_mq_sched_dispatch_requests(hctx);
 		srcu_read_unlock(&hctx->queue_rq_srcu, srcu_idx);
 	}
 }
@@ -1519,9 +1532,14 @@ static void __blk_mq_try_issue_directly(struct request *rq, blk_qc_t *cookie,
 static void blk_mq_try_issue_directly(struct blk_mq_hw_ctx *hctx,
 		struct request *rq, blk_qc_t *cookie)
 {
-	if (!(hctx->flags & BLK_MQ_F_BLOCKING)) {
+	bool blocking = hctx->flags & BLK_MQ_F_BLOCKING;
+	bool quiesced;
+
+	if (!blocking) {
 		rcu_read_lock();
-		__blk_mq_try_issue_directly(rq, cookie, false);
+		quiesced = blk_queue_quiesced(rq->q);
+		if (!quiesced)
+			__blk_mq_try_issue_directly(rq, cookie, false);
 		rcu_read_unlock();
 	} else {
 		unsigned int srcu_idx;
@@ -1529,9 +1547,14 @@ static void blk_mq_try_issue_directly(struct blk_mq_hw_ctx *hctx,
 		might_sleep();
 
 		srcu_idx = srcu_read_lock(&hctx->queue_rq_srcu);
-		__blk_mq_try_issue_directly(rq, cookie, true);
+		quiesced = blk_queue_quiesced(rq->q);
+		if (!quiesced)
+			__blk_mq_try_issue_directly(rq, cookie, true);
 		srcu_read_unlock(&hctx->queue_rq_srcu, srcu_idx);
 	}
+
+	if (quiesced)
+		blk_mq_sched_insert_request(rq, false, false, false, blocking);
 }
 
 static blk_qc_t blk_mq_make_request(struct request_queue *q, struct bio *bio)
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
index 41291be82ac4..60967797f4f6 100644
--- a/include/linux/blkdev.h
+++ b/include/linux/blkdev.h
@@ -618,6 +618,7 @@ struct request_queue {
 #define QUEUE_FLAG_STATS       27	/* track rq completion times */
 #define QUEUE_FLAG_POLL_STATS  28	/* collecting stats for hybrid polling */
 #define QUEUE_FLAG_REGISTERED  29	/* queue has been registered to a disk */
+#define QUEUE_FLAG_QUIESCED    30	/* queue has been quiesced */
 
 #define QUEUE_FLAG_DEFAULT	((1 << QUEUE_FLAG_IO_STAT) |		\
 				 (1 << QUEUE_FLAG_STACKABLE)	|	\
@@ -712,6 +713,7 @@ static inline void queue_flag_clear(unsigned int flag, struct request_queue *q)
 #define blk_noretry_request(rq) \
 	((rq)->cmd_flags & (REQ_FAILFAST_DEV|REQ_FAILFAST_TRANSPORT| \
 			     REQ_FAILFAST_DRIVER))
+#define blk_queue_quiesced(q)	test_bit(QUEUE_FLAG_QUIESCED, &(q)->queue_flags)
 
 static inline bool blk_account_rq(struct request *rq)
 {
-- 
2.9.4

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 4/6] blk-mq: update comments on blk_mq_quiesce_queue()
  2017-05-26  3:07 ` Ming Lei
@ 2017-05-26  3:07   ` Ming Lei
  -1 siblings, 0 replies; 22+ messages in thread
From: Ming Lei @ 2017-05-26  3:07 UTC (permalink / raw)
  To: Jens Axboe, linux-block, Christoph Hellwig
  Cc: Bart Van Assche, linux-nvme, linux-scsi, dm-devel

Actually what we want to get from blk_mq_quiesce_queue()
isn't only to wait for completion of all ongooing .queue_rq().

In the typical context of canceling requests, we need to
make sure that the following is done in the dispatch path
before starting to cancel requests:
	- failed dispatched request is freeed
	- busy dispatched request is requeued, and the STARTED
	flag is cleared

Signed-off-by: Ming Lei <ming.lei@redhat.com>
---
 block/blk-mq.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/block/blk-mq.c b/block/blk-mq.c
index 864709453c90..e1fc9ab50c87 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -155,12 +155,12 @@ void blk_mq_unfreeze_queue(struct request_queue *q)
 EXPORT_SYMBOL_GPL(blk_mq_unfreeze_queue);
 
 /**
- * blk_mq_quiesce_queue() - wait until all ongoing queue_rq calls have finished
+ * blk_mq_quiesce_queue() - wait until all ongoing dispatching have finished
  * @q: request queue.
  *
  * Note: this function does not prevent that the struct request end_io()
- * callback function is invoked. Additionally, it is not prevented that
- * new queue_rq() calls occur unless the queue has been stopped first.
+ * callback function is invoked. Once this function is returned, we make
+ * sure no dispatching can happen.
  */
 void blk_mq_quiesce_queue(struct request_queue *q)
 {
-- 
2.9.4

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 4/6] blk-mq: update comments on blk_mq_quiesce_queue()
@ 2017-05-26  3:07   ` Ming Lei
  0 siblings, 0 replies; 22+ messages in thread
From: Ming Lei @ 2017-05-26  3:07 UTC (permalink / raw)


Actually what we want to get from blk_mq_quiesce_queue()
isn't only to wait for completion of all ongooing .queue_rq().

In the typical context of canceling requests, we need to
make sure that the following is done in the dispatch path
before starting to cancel requests:
	- failed dispatched request is freeed
	- busy dispatched request is requeued, and the STARTED
	flag is cleared

Signed-off-by: Ming Lei <ming.lei at redhat.com>
---
 block/blk-mq.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/block/blk-mq.c b/block/blk-mq.c
index 864709453c90..e1fc9ab50c87 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -155,12 +155,12 @@ void blk_mq_unfreeze_queue(struct request_queue *q)
 EXPORT_SYMBOL_GPL(blk_mq_unfreeze_queue);
 
 /**
- * blk_mq_quiesce_queue() - wait until all ongoing queue_rq calls have finished
+ * blk_mq_quiesce_queue() - wait until all ongoing dispatching have finished
  * @q: request queue.
  *
  * Note: this function does not prevent that the struct request end_io()
- * callback function is invoked. Additionally, it is not prevented that
- * new queue_rq() calls occur unless the queue has been stopped first.
+ * callback function is invoked. Once this function is returned, we make
+ * sure no dispatching can happen.
  */
 void blk_mq_quiesce_queue(struct request_queue *q)
 {
-- 
2.9.4

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 5/6] blk-mq: don't stop queue for quiescing
  2017-05-26  3:07 ` Ming Lei
@ 2017-05-26  3:07   ` Ming Lei
  -1 siblings, 0 replies; 22+ messages in thread
From: Ming Lei @ 2017-05-26  3:07 UTC (permalink / raw)
  To: Jens Axboe, linux-block, Christoph Hellwig
  Cc: Bart Van Assche, linux-nvme, linux-scsi, dm-devel

Now we use the QUIESCED flag to drain & block dispatching,
not necessary to stop queue any more.

Also queue can be started by other blk-mq APIs, this limits
uses of blk_mq_quiesce_queue().

Now blk_mq_quiesce_queue() can be used safely and users won't
worry about queue restart during quiescing.

Signed-off-by: Ming Lei <ming.lei@redhat.com>
---
 block/blk-mq.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/block/blk-mq.c b/block/blk-mq.c
index e1fc9ab50c87..900eb91e0ece 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -168,8 +168,6 @@ void blk_mq_quiesce_queue(struct request_queue *q)
 	unsigned int i;
 	bool rcu = false;
 
-	__blk_mq_stop_hw_queues(q, true);
-
 	spin_lock_irq(q->queue_lock);
 	queue_flag_set(QUEUE_FLAG_QUIESCED, q);
 	spin_unlock_irq(q->queue_lock);
@@ -198,7 +196,12 @@ void blk_mq_unquiesce_queue(struct request_queue *q)
 	queue_flag_clear(QUEUE_FLAG_QUIESCED, q);
 	spin_unlock_irq(q->queue_lock);
 
-	blk_mq_start_stopped_hw_queues(q, true);
+	/*
+	 * During quiescing, requests can be inserted
+	 * to scheduler queue or sw queue, so we run
+	 * queues for dispatching these requests.
+	 */
+	blk_mq_start_hw_queues(q);
 }
 EXPORT_SYMBOL_GPL(blk_mq_unquiesce_queue);
 
-- 
2.9.4

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 5/6] blk-mq: don't stop queue for quiescing
@ 2017-05-26  3:07   ` Ming Lei
  0 siblings, 0 replies; 22+ messages in thread
From: Ming Lei @ 2017-05-26  3:07 UTC (permalink / raw)


Now we use the QUIESCED flag to drain & block dispatching,
not necessary to stop queue any more.

Also queue can be started by other blk-mq APIs, this limits
uses of blk_mq_quiesce_queue().

Now blk_mq_quiesce_queue() can be used safely and users won't
worry about queue restart during quiescing.

Signed-off-by: Ming Lei <ming.lei at redhat.com>
---
 block/blk-mq.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/block/blk-mq.c b/block/blk-mq.c
index e1fc9ab50c87..900eb91e0ece 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -168,8 +168,6 @@ void blk_mq_quiesce_queue(struct request_queue *q)
 	unsigned int i;
 	bool rcu = false;
 
-	__blk_mq_stop_hw_queues(q, true);
-
 	spin_lock_irq(q->queue_lock);
 	queue_flag_set(QUEUE_FLAG_QUIESCED, q);
 	spin_unlock_irq(q->queue_lock);
@@ -198,7 +196,12 @@ void blk_mq_unquiesce_queue(struct request_queue *q)
 	queue_flag_clear(QUEUE_FLAG_QUIESCED, q);
 	spin_unlock_irq(q->queue_lock);
 
-	blk_mq_start_stopped_hw_queues(q, true);
+	/*
+	 * During quiescing, requests can be inserted
+	 * to scheduler queue or sw queue, so we run
+	 * queues for dispatching these requests.
+	 */
+	blk_mq_start_hw_queues(q);
 }
 EXPORT_SYMBOL_GPL(blk_mq_unquiesce_queue);
 
-- 
2.9.4

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 6/6] blk-mq: clarify dispatching may not be drained/blocked by stopping queue
  2017-05-26  3:07 ` Ming Lei
@ 2017-05-26  3:07   ` Ming Lei
  -1 siblings, 0 replies; 22+ messages in thread
From: Ming Lei @ 2017-05-26  3:07 UTC (permalink / raw)
  To: Jens Axboe, linux-block, Christoph Hellwig
  Cc: Bart Van Assche, linux-nvme, linux-scsi, dm-devel

BLK_MQ_S_STOPPED may be not observed in other concurrent I/O paths,
we can't guarantee that dispatching won't happen after queue
is stopped.

So clarify the fact and avoid potential misuse.

Signed-off-by: Ming Lei <ming.lei@redhat.com>
---
 block/blk-mq.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/block/blk-mq.c b/block/blk-mq.c
index 900eb91e0ece..32bed5bac7da 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -1240,6 +1240,11 @@ static void __blk_mq_stop_hw_queue(struct blk_mq_hw_ctx *hctx, bool sync)
 	set_bit(BLK_MQ_S_STOPPED, &hctx->state);
 }
 
+/*
+ * Do not expect that dispatching or .queue_rq() can be blocked
+ * after blk_mq_stop_hw_queue() returns. Please use
+ * blk_mq_quiesce_queue() for that requirement.
+ */
 void blk_mq_stop_hw_queue(struct blk_mq_hw_ctx *hctx)
 {
 	__blk_mq_stop_hw_queue(hctx, false);
@@ -1255,6 +1260,11 @@ static void __blk_mq_stop_hw_queues(struct request_queue *q, bool sync)
 		__blk_mq_stop_hw_queue(hctx, sync);
 }
 
+/*
+ * Do not expect that dispatching or .queue_rq() can be blocked
+ * after blk_mq_stop_hw_queues() returns. Please use
+ * blk_mq_quiesce_queue() for that requirement.
+ */
 void blk_mq_stop_hw_queues(struct request_queue *q)
 {
 	__blk_mq_stop_hw_queues(q, false);
-- 
2.9.4

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 6/6] blk-mq: clarify dispatching may not be drained/blocked by stopping queue
@ 2017-05-26  3:07   ` Ming Lei
  0 siblings, 0 replies; 22+ messages in thread
From: Ming Lei @ 2017-05-26  3:07 UTC (permalink / raw)


BLK_MQ_S_STOPPED may be not observed in other concurrent I/O paths,
we can't guarantee that dispatching won't happen after queue
is stopped.

So clarify the fact and avoid potential misuse.

Signed-off-by: Ming Lei <ming.lei at redhat.com>
---
 block/blk-mq.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/block/blk-mq.c b/block/blk-mq.c
index 900eb91e0ece..32bed5bac7da 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -1240,6 +1240,11 @@ static void __blk_mq_stop_hw_queue(struct blk_mq_hw_ctx *hctx, bool sync)
 	set_bit(BLK_MQ_S_STOPPED, &hctx->state);
 }
 
+/*
+ * Do not expect that dispatching or .queue_rq() can be blocked
+ * after blk_mq_stop_hw_queue() returns. Please use
+ * blk_mq_quiesce_queue() for that requirement.
+ */
 void blk_mq_stop_hw_queue(struct blk_mq_hw_ctx *hctx)
 {
 	__blk_mq_stop_hw_queue(hctx, false);
@@ -1255,6 +1260,11 @@ static void __blk_mq_stop_hw_queues(struct request_queue *q, bool sync)
 		__blk_mq_stop_hw_queue(hctx, sync);
 }
 
+/*
+ * Do not expect that dispatching or .queue_rq() can be blocked
+ * after blk_mq_stop_hw_queues() returns. Please use
+ * blk_mq_quiesce_queue() for that requirement.
+ */
 void blk_mq_stop_hw_queues(struct request_queue *q)
 {
 	__blk_mq_stop_hw_queues(q, false);
-- 
2.9.4

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 6/6] blk-mq: clarify dispatching won't be blocked by stopping queue
  2017-05-26  3:07 ` Ming Lei
@ 2017-05-26  3:07   ` Ming Lei
  -1 siblings, 0 replies; 22+ messages in thread
From: Ming Lei @ 2017-05-26  3:07 UTC (permalink / raw)
  To: Jens Axboe, linux-block, Christoph Hellwig
  Cc: Bart Van Assche, linux-nvme, linux-scsi, dm-devel

BLK_MQ_S_STOPPED may be not observed in other concurrent I/O paths,
we can't guarantee that dispatching won't happen after queue
is stopped.

So clarify the fact and avoid potential misuse.

Signed-off-by: Ming Lei <ming.lei@redhat.com>
---
 block/blk-mq.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/block/blk-mq.c b/block/blk-mq.c
index 900eb91e0ece..32bed5bac7da 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -1240,6 +1240,11 @@ static void __blk_mq_stop_hw_queue(struct blk_mq_hw_ctx *hctx, bool sync)
 	set_bit(BLK_MQ_S_STOPPED, &hctx->state);
 }
 
+/*
+ * Do not expect that dispatching or .queue_rq() can be blocked
+ * after blk_mq_stop_hw_queue() returns. Please use
+ * blk_mq_quiesce_queue() for that requirement.
+ */
 void blk_mq_stop_hw_queue(struct blk_mq_hw_ctx *hctx)
 {
 	__blk_mq_stop_hw_queue(hctx, false);
@@ -1255,6 +1260,11 @@ static void __blk_mq_stop_hw_queues(struct request_queue *q, bool sync)
 		__blk_mq_stop_hw_queue(hctx, sync);
 }
 
+/*
+ * Do not expect that dispatching or .queue_rq() can be blocked
+ * after blk_mq_stop_hw_queues() returns. Please use
+ * blk_mq_quiesce_queue() for that requirement.
+ */
 void blk_mq_stop_hw_queues(struct request_queue *q)
 {
 	__blk_mq_stop_hw_queues(q, false);
-- 
2.9.4

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 6/6] blk-mq: clarify dispatching won't be blocked by stopping queue
@ 2017-05-26  3:07   ` Ming Lei
  0 siblings, 0 replies; 22+ messages in thread
From: Ming Lei @ 2017-05-26  3:07 UTC (permalink / raw)


BLK_MQ_S_STOPPED may be not observed in other concurrent I/O paths,
we can't guarantee that dispatching won't happen after queue
is stopped.

So clarify the fact and avoid potential misuse.

Signed-off-by: Ming Lei <ming.lei at redhat.com>
---
 block/blk-mq.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/block/blk-mq.c b/block/blk-mq.c
index 900eb91e0ece..32bed5bac7da 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -1240,6 +1240,11 @@ static void __blk_mq_stop_hw_queue(struct blk_mq_hw_ctx *hctx, bool sync)
 	set_bit(BLK_MQ_S_STOPPED, &hctx->state);
 }
 
+/*
+ * Do not expect that dispatching or .queue_rq() can be blocked
+ * after blk_mq_stop_hw_queue() returns. Please use
+ * blk_mq_quiesce_queue() for that requirement.
+ */
 void blk_mq_stop_hw_queue(struct blk_mq_hw_ctx *hctx)
 {
 	__blk_mq_stop_hw_queue(hctx, false);
@@ -1255,6 +1260,11 @@ static void __blk_mq_stop_hw_queues(struct request_queue *q, bool sync)
 		__blk_mq_stop_hw_queue(hctx, sync);
 }
 
+/*
+ * Do not expect that dispatching or .queue_rq() can be blocked
+ * after blk_mq_stop_hw_queues() returns. Please use
+ * blk_mq_quiesce_queue() for that requirement.
+ */
 void blk_mq_stop_hw_queues(struct request_queue *q)
 {
 	__blk_mq_stop_hw_queues(q, false);
-- 
2.9.4

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* Re: [PATCH 2/6] blk-mq: use the introduced blk_mq_unquiesce_queue()
  2017-05-26  3:07   ` Ming Lei
  (?)
@ 2017-05-26  7:46     ` kbuild test robot
  -1 siblings, 0 replies; 22+ messages in thread
From: kbuild test robot @ 2017-05-26  7:46 UTC (permalink / raw)
  To: Ming Lei
  Cc: linux-block, linux-scsi, Christoph Hellwig, linux-nvme,
	Jens Axboe, dm-devel, kbuild-all, Bart Van Assche

[-- Attachment #1: Type: text/plain, Size: 8463 bytes --]

Hi Ming,

[auto build test ERROR on block/for-next]
[also build test ERROR on v4.12-rc2 next-20170525]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Ming-Lei/blk-mq-introduce-blk_mq_unquiesce_queue/20170526-140138
base:   https://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git for-next
config: x86_64-randconfig-x019-201721 (attached as .config)
compiler: gcc-6 (Debian 6.2.0-3) 6.2.0 20160901
reproduce:
        # save the attached .config to linux build tree
        make ARCH=x86_64 

Note: the linux-review/Ming-Lei/blk-mq-introduce-blk_mq_unquiesce_queue/20170526-140138 HEAD 470e70e5203ed8f76bb7c1a86db58023098bfc21 builds fine.
      It only hurts bisectibility.

All errors (new ones prefixed by >>):

   drivers/scsi/scsi_lib.c: In function 'scsi_internal_device_unblock':
>> drivers/scsi/scsi_lib.c:3033:7: error: implicit declaration of function 'blk_queue_quiesced' [-Werror=implicit-function-declaration]
      if (blk_queue_quiesced(q))
          ^~~~~~~~~~~~~~~~~~
   Cyclomatic Complexity 5 include/linux/compiler.h:__read_once_size
   Cyclomatic Complexity 5 include/linux/compiler.h:__write_once_size
   Cyclomatic Complexity 1 arch/x86/include/asm/bitops.h:test_and_clear_bit
   Cyclomatic Complexity 1 arch/x86/include/asm/bitops.h:constant_test_bit
   Cyclomatic Complexity 1 arch/x86/include/asm/bitops.h:variable_test_bit
   Cyclomatic Complexity 1 arch/x86/include/asm/bitops.h:fls64
   Cyclomatic Complexity 1 include/uapi/linux/swab.h:__swab16p
   Cyclomatic Complexity 1 include/uapi/linux/byteorder/little_endian.h:__be16_to_cpup
   Cyclomatic Complexity 1 include/linux/log2.h:__ilog2_u64
   Cyclomatic Complexity 1 include/linux/list.h:INIT_LIST_HEAD
   Cyclomatic Complexity 1 include/linux/list.h:__list_add_valid
   Cyclomatic Complexity 1 include/linux/list.h:__list_del_entry_valid
   Cyclomatic Complexity 2 include/linux/list.h:__list_add
   Cyclomatic Complexity 1 include/linux/list.h:list_add_tail
   Cyclomatic Complexity 1 include/linux/list.h:__list_del
   Cyclomatic Complexity 2 include/linux/list.h:__list_del_entry
   Cyclomatic Complexity 1 include/linux/list.h:list_del
   Cyclomatic Complexity 1 include/linux/list.h:list_del_init
   Cyclomatic Complexity 1 include/linux/list.h:list_move_tail
   Cyclomatic Complexity 1 include/linux/list.h:list_empty
   Cyclomatic Complexity 1 include/linux/list.h:__list_splice
   Cyclomatic Complexity 2 include/linux/list.h:list_splice
   Cyclomatic Complexity 2 include/linux/list.h:list_splice_init
   Cyclomatic Complexity 1 arch/x86/include/asm/current.h:get_current
   Cyclomatic Complexity 1 include/asm-generic/getorder.h:__get_order
   Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:atomic_read
   Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:atomic_set
   Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:atomic_inc
   Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:atomic_dec
   Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:atomic_add_return
   Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:atomic_sub_return
   Cyclomatic Complexity 1 include/linux/jump_label.h:static_key_count
   Cyclomatic Complexity 2 include/linux/jump_label.h:static_key_false
   Cyclomatic Complexity 1 arch/x86/include/asm/paravirt.h:arch_local_save_flags
   Cyclomatic Complexity 1 arch/x86/include/asm/irqflags.h:arch_irqs_disabled_flags
   Cyclomatic Complexity 5 arch/x86/include/asm/preempt.h:__preempt_count_add
   Cyclomatic Complexity 1 arch/x86/include/asm/preempt.h:__preempt_count_dec_and_test
   Cyclomatic Complexity 1 include/linux/spinlock.h:spinlock_check
   Cyclomatic Complexity 1 include/linux/spinlock.h:spin_lock_irq
   Cyclomatic Complexity 1 include/linux/spinlock.h:spin_unlock_irq
   Cyclomatic Complexity 1 include/linux/spinlock.h:spin_unlock_irqrestore
   Cyclomatic Complexity 1 include/linux/rcupdate.h:rcu_read_lock_sched_notrace
   Cyclomatic Complexity 1 include/linux/mm.h:lowmem_page_address
   Cyclomatic Complexity 1 include/linux/uaccess.h:pagefault_disabled_inc
   Cyclomatic Complexity 1 include/linux/uaccess.h:pagefault_disabled_dec
   Cyclomatic Complexity 1 include/linux/uaccess.h:pagefault_disable
   Cyclomatic Complexity 1 include/linux/uaccess.h:pagefault_enable
   Cyclomatic Complexity 1 include/linux/highmem.h:kmap_atomic
   Cyclomatic Complexity 1 include/linux/blk_types.h:op_is_write
   Cyclomatic Complexity 1 include/linux/slab.h:kmem_cache_alloc_node
   Cyclomatic Complexity 68 include/linux/slab.h:kmalloc_large
   Cyclomatic Complexity 3 include/linux/slab.h:kmalloc
   Cyclomatic Complexity 1 include/linux/slab.h:kzalloc
   Cyclomatic Complexity 1 include/linux/blkdev.h:blk_rq_is_scsi
   Cyclomatic Complexity 1 include/linux/blkdev.h:blk_rq_is_private
   Cyclomatic Complexity 3 include/linux/blkdev.h:blk_rq_is_passthrough
   Cyclomatic Complexity 1 include/linux/blkdev.h:blk_rq_bytes
   Cyclomatic Complexity 2 include/linux/blkdev.h:blk_rq_payload_bytes
   Cyclomatic Complexity 2 include/linux/blkdev.h:blk_rq_nr_phys_segments
   Cyclomatic Complexity 1 include/linux/blkdev.h:blk_integrity_rq
   Cyclomatic Complexity 1 include/linux/blkdev.h:blk_rq_count_integrity_sg
   Cyclomatic Complexity 1 include/linux/blkdev.h:blk_rq_map_integrity_sg
   Cyclomatic Complexity 1 include/linux/blkdev.h:blk_queue_max_integrity_segments
   Cyclomatic Complexity 1 include/linux/blkdev.h:queue_max_integrity_segments
   Cyclomatic Complexity 3 include/linux/dma-mapping.h:dma_get_max_seg_size
   Cyclomatic Complexity 2 include/linux/dma-mapping.h:dma_set_seg_boundary
   Cyclomatic Complexity 1 include/linux/dma-mapping.h:dma_max_pfn
   Cyclomatic Complexity 1 include/linux/blk-mq.h:blk_mq_rq_to_pdu
   Cyclomatic Complexity 1 include/linux/unaligned/access_ok.h:get_unaligned_be16
   Cyclomatic Complexity 1 include/scsi/scsi_common.h:scsi_varlen_cdb_length
   Cyclomatic Complexity 2 include/scsi/scsi_common.h:scsi_command_size
   Cyclomatic Complexity 2 include/scsi/scsi_common.h:scsi_sense_valid
   Cyclomatic Complexity 3 include/scsi/scsi.h:scsi_status_is_good
   Cyclomatic Complexity 1 include/scsi/scsi_device.h:scsi_target
   Cyclomatic Complexity 1 include/scsi/scsi_device.h:scsi_device_online
   Cyclomatic Complexity 1 include/scsi/scsi_device.h:scsi_device_blocked
   Cyclomatic Complexity 1 include/scsi/scsi_request.h:scsi_req
   Cyclomatic Complexity 1 include/scsi/scsi_cmnd.h:scsi_cmd_to_driver
   Cyclomatic Complexity 1 include/scsi/scsi_cmnd.h:scsi_set_resid
   Cyclomatic Complexity 1 include/scsi/scsi_cmnd.h:scsi_get_resid
   Cyclomatic Complexity 3 include/scsi/scsi_cmnd.h:scsi_bidi_cmnd
   Cyclomatic Complexity 2 include/scsi/scsi_cmnd.h:scsi_in
   Cyclomatic Complexity 2 include/scsi/scsi_cmnd.h:scsi_prot_sg_count
   Cyclomatic Complexity 1 include/scsi/scsi_cmnd.h:set_host_byte
   Cyclomatic Complexity 3 include/scsi/scsi_eh.h:scsi_sense_is_deferred
   Cyclomatic Complexity 3 include/scsi/scsi_host.h:scsi_host_in_recovery
   Cyclomatic Complexity 1 include/scsi/scsi_host.h:scsi_get_device
   Cyclomatic Complexity 1 include/scsi/scsi_host.h:scsi_host_get_prot
   Cyclomatic Complexity 1 include/scsi/scsi_host.h:scsi_host_prot_dma
   Cyclomatic Complexity 1 drivers/scsi/scsi_priv.h:scsi_log_send
   Cyclomatic Complexity 1 drivers/scsi/scsi_priv.h:scsi_log_completion
   Cyclomatic Complexity 2 drivers/scsi/scsi_lib.c:scsi_select_sense_cache
   Cyclomatic Complexity 1 drivers/scsi/scsi_lib.c:scsi_alloc_sense_buffer
   Cyclomatic Complexity 4 drivers/scsi/scsi_lib.c:scsi_set_blocked
   Cyclomatic Complexity 3 drivers/scsi/scsi_lib.c:scsi_device_is_busy
   Cyclomatic Complexity 4 drivers/scsi/scsi_lib.c:scsi_target_is_busy
   Cyclomatic Complexity 5 drivers/scsi/scsi_lib.c:scsi_host_is_busy
   Cyclomatic Complexity 3 drivers/scsi/scsi_lib.c:scsi_uninit_cmd

vim +/blk_queue_quiesced +3033 drivers/scsi/scsi_lib.c

  3027				sdev->sdev_state = SDEV_CREATED;
  3028		} else if (sdev->sdev_state != SDEV_CANCEL &&
  3029			 sdev->sdev_state != SDEV_OFFLINE)
  3030			return -EINVAL;
  3031	
  3032		if (q->mq_ops) {
> 3033			if (blk_queue_quiesced(q))
  3034				blk_mq_unquiesce_queue(q);
  3035			else
  3036				blk_mq_start_stopped_hw_queues(q, false);

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 28792 bytes --]

[-- Attachment #3: Type: text/plain, Size: 158 bytes --]

_______________________________________________
Linux-nvme mailing list
Linux-nvme@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-nvme

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 2/6] blk-mq: use the introduced blk_mq_unquiesce_queue()
@ 2017-05-26  7:46     ` kbuild test robot
  0 siblings, 0 replies; 22+ messages in thread
From: kbuild test robot @ 2017-05-26  7:46 UTC (permalink / raw)
  To: Ming Lei
  Cc: linux-block, linux-scsi, Christoph Hellwig, linux-nvme,
	Jens Axboe, dm-devel, kbuild-all, Bart Van Assche

[-- Attachment #1: Type: text/plain, Size: 8463 bytes --]

Hi Ming,

[auto build test ERROR on block/for-next]
[also build test ERROR on v4.12-rc2 next-20170525]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Ming-Lei/blk-mq-introduce-blk_mq_unquiesce_queue/20170526-140138
base:   https://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git for-next
config: x86_64-randconfig-x019-201721 (attached as .config)
compiler: gcc-6 (Debian 6.2.0-3) 6.2.0 20160901
reproduce:
        # save the attached .config to linux build tree
        make ARCH=x86_64 

Note: the linux-review/Ming-Lei/blk-mq-introduce-blk_mq_unquiesce_queue/20170526-140138 HEAD 470e70e5203ed8f76bb7c1a86db58023098bfc21 builds fine.
      It only hurts bisectibility.

All errors (new ones prefixed by >>):

   drivers/scsi/scsi_lib.c: In function 'scsi_internal_device_unblock':
>> drivers/scsi/scsi_lib.c:3033:7: error: implicit declaration of function 'blk_queue_quiesced' [-Werror=implicit-function-declaration]
      if (blk_queue_quiesced(q))
          ^~~~~~~~~~~~~~~~~~
   Cyclomatic Complexity 5 include/linux/compiler.h:__read_once_size
   Cyclomatic Complexity 5 include/linux/compiler.h:__write_once_size
   Cyclomatic Complexity 1 arch/x86/include/asm/bitops.h:test_and_clear_bit
   Cyclomatic Complexity 1 arch/x86/include/asm/bitops.h:constant_test_bit
   Cyclomatic Complexity 1 arch/x86/include/asm/bitops.h:variable_test_bit
   Cyclomatic Complexity 1 arch/x86/include/asm/bitops.h:fls64
   Cyclomatic Complexity 1 include/uapi/linux/swab.h:__swab16p
   Cyclomatic Complexity 1 include/uapi/linux/byteorder/little_endian.h:__be16_to_cpup
   Cyclomatic Complexity 1 include/linux/log2.h:__ilog2_u64
   Cyclomatic Complexity 1 include/linux/list.h:INIT_LIST_HEAD
   Cyclomatic Complexity 1 include/linux/list.h:__list_add_valid
   Cyclomatic Complexity 1 include/linux/list.h:__list_del_entry_valid
   Cyclomatic Complexity 2 include/linux/list.h:__list_add
   Cyclomatic Complexity 1 include/linux/list.h:list_add_tail
   Cyclomatic Complexity 1 include/linux/list.h:__list_del
   Cyclomatic Complexity 2 include/linux/list.h:__list_del_entry
   Cyclomatic Complexity 1 include/linux/list.h:list_del
   Cyclomatic Complexity 1 include/linux/list.h:list_del_init
   Cyclomatic Complexity 1 include/linux/list.h:list_move_tail
   Cyclomatic Complexity 1 include/linux/list.h:list_empty
   Cyclomatic Complexity 1 include/linux/list.h:__list_splice
   Cyclomatic Complexity 2 include/linux/list.h:list_splice
   Cyclomatic Complexity 2 include/linux/list.h:list_splice_init
   Cyclomatic Complexity 1 arch/x86/include/asm/current.h:get_current
   Cyclomatic Complexity 1 include/asm-generic/getorder.h:__get_order
   Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:atomic_read
   Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:atomic_set
   Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:atomic_inc
   Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:atomic_dec
   Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:atomic_add_return
   Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:atomic_sub_return
   Cyclomatic Complexity 1 include/linux/jump_label.h:static_key_count
   Cyclomatic Complexity 2 include/linux/jump_label.h:static_key_false
   Cyclomatic Complexity 1 arch/x86/include/asm/paravirt.h:arch_local_save_flags
   Cyclomatic Complexity 1 arch/x86/include/asm/irqflags.h:arch_irqs_disabled_flags
   Cyclomatic Complexity 5 arch/x86/include/asm/preempt.h:__preempt_count_add
   Cyclomatic Complexity 1 arch/x86/include/asm/preempt.h:__preempt_count_dec_and_test
   Cyclomatic Complexity 1 include/linux/spinlock.h:spinlock_check
   Cyclomatic Complexity 1 include/linux/spinlock.h:spin_lock_irq
   Cyclomatic Complexity 1 include/linux/spinlock.h:spin_unlock_irq
   Cyclomatic Complexity 1 include/linux/spinlock.h:spin_unlock_irqrestore
   Cyclomatic Complexity 1 include/linux/rcupdate.h:rcu_read_lock_sched_notrace
   Cyclomatic Complexity 1 include/linux/mm.h:lowmem_page_address
   Cyclomatic Complexity 1 include/linux/uaccess.h:pagefault_disabled_inc
   Cyclomatic Complexity 1 include/linux/uaccess.h:pagefault_disabled_dec
   Cyclomatic Complexity 1 include/linux/uaccess.h:pagefault_disable
   Cyclomatic Complexity 1 include/linux/uaccess.h:pagefault_enable
   Cyclomatic Complexity 1 include/linux/highmem.h:kmap_atomic
   Cyclomatic Complexity 1 include/linux/blk_types.h:op_is_write
   Cyclomatic Complexity 1 include/linux/slab.h:kmem_cache_alloc_node
   Cyclomatic Complexity 68 include/linux/slab.h:kmalloc_large
   Cyclomatic Complexity 3 include/linux/slab.h:kmalloc
   Cyclomatic Complexity 1 include/linux/slab.h:kzalloc
   Cyclomatic Complexity 1 include/linux/blkdev.h:blk_rq_is_scsi
   Cyclomatic Complexity 1 include/linux/blkdev.h:blk_rq_is_private
   Cyclomatic Complexity 3 include/linux/blkdev.h:blk_rq_is_passthrough
   Cyclomatic Complexity 1 include/linux/blkdev.h:blk_rq_bytes
   Cyclomatic Complexity 2 include/linux/blkdev.h:blk_rq_payload_bytes
   Cyclomatic Complexity 2 include/linux/blkdev.h:blk_rq_nr_phys_segments
   Cyclomatic Complexity 1 include/linux/blkdev.h:blk_integrity_rq
   Cyclomatic Complexity 1 include/linux/blkdev.h:blk_rq_count_integrity_sg
   Cyclomatic Complexity 1 include/linux/blkdev.h:blk_rq_map_integrity_sg
   Cyclomatic Complexity 1 include/linux/blkdev.h:blk_queue_max_integrity_segments
   Cyclomatic Complexity 1 include/linux/blkdev.h:queue_max_integrity_segments
   Cyclomatic Complexity 3 include/linux/dma-mapping.h:dma_get_max_seg_size
   Cyclomatic Complexity 2 include/linux/dma-mapping.h:dma_set_seg_boundary
   Cyclomatic Complexity 1 include/linux/dma-mapping.h:dma_max_pfn
   Cyclomatic Complexity 1 include/linux/blk-mq.h:blk_mq_rq_to_pdu
   Cyclomatic Complexity 1 include/linux/unaligned/access_ok.h:get_unaligned_be16
   Cyclomatic Complexity 1 include/scsi/scsi_common.h:scsi_varlen_cdb_length
   Cyclomatic Complexity 2 include/scsi/scsi_common.h:scsi_command_size
   Cyclomatic Complexity 2 include/scsi/scsi_common.h:scsi_sense_valid
   Cyclomatic Complexity 3 include/scsi/scsi.h:scsi_status_is_good
   Cyclomatic Complexity 1 include/scsi/scsi_device.h:scsi_target
   Cyclomatic Complexity 1 include/scsi/scsi_device.h:scsi_device_online
   Cyclomatic Complexity 1 include/scsi/scsi_device.h:scsi_device_blocked
   Cyclomatic Complexity 1 include/scsi/scsi_request.h:scsi_req
   Cyclomatic Complexity 1 include/scsi/scsi_cmnd.h:scsi_cmd_to_driver
   Cyclomatic Complexity 1 include/scsi/scsi_cmnd.h:scsi_set_resid
   Cyclomatic Complexity 1 include/scsi/scsi_cmnd.h:scsi_get_resid
   Cyclomatic Complexity 3 include/scsi/scsi_cmnd.h:scsi_bidi_cmnd
   Cyclomatic Complexity 2 include/scsi/scsi_cmnd.h:scsi_in
   Cyclomatic Complexity 2 include/scsi/scsi_cmnd.h:scsi_prot_sg_count
   Cyclomatic Complexity 1 include/scsi/scsi_cmnd.h:set_host_byte
   Cyclomatic Complexity 3 include/scsi/scsi_eh.h:scsi_sense_is_deferred
   Cyclomatic Complexity 3 include/scsi/scsi_host.h:scsi_host_in_recovery
   Cyclomatic Complexity 1 include/scsi/scsi_host.h:scsi_get_device
   Cyclomatic Complexity 1 include/scsi/scsi_host.h:scsi_host_get_prot
   Cyclomatic Complexity 1 include/scsi/scsi_host.h:scsi_host_prot_dma
   Cyclomatic Complexity 1 drivers/scsi/scsi_priv.h:scsi_log_send
   Cyclomatic Complexity 1 drivers/scsi/scsi_priv.h:scsi_log_completion
   Cyclomatic Complexity 2 drivers/scsi/scsi_lib.c:scsi_select_sense_cache
   Cyclomatic Complexity 1 drivers/scsi/scsi_lib.c:scsi_alloc_sense_buffer
   Cyclomatic Complexity 4 drivers/scsi/scsi_lib.c:scsi_set_blocked
   Cyclomatic Complexity 3 drivers/scsi/scsi_lib.c:scsi_device_is_busy
   Cyclomatic Complexity 4 drivers/scsi/scsi_lib.c:scsi_target_is_busy
   Cyclomatic Complexity 5 drivers/scsi/scsi_lib.c:scsi_host_is_busy
   Cyclomatic Complexity 3 drivers/scsi/scsi_lib.c:scsi_uninit_cmd

vim +/blk_queue_quiesced +3033 drivers/scsi/scsi_lib.c

  3027				sdev->sdev_state = SDEV_CREATED;
  3028		} else if (sdev->sdev_state != SDEV_CANCEL &&
  3029			 sdev->sdev_state != SDEV_OFFLINE)
  3030			return -EINVAL;
  3031	
  3032		if (q->mq_ops) {
> 3033			if (blk_queue_quiesced(q))
  3034				blk_mq_unquiesce_queue(q);
  3035			else
  3036				blk_mq_start_stopped_hw_queues(q, false);

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 28792 bytes --]

[-- Attachment #3: Type: text/plain, Size: 0 bytes --]



^ permalink raw reply	[flat|nested] 22+ messages in thread

* [PATCH 2/6] blk-mq: use the introduced blk_mq_unquiesce_queue()
@ 2017-05-26  7:46     ` kbuild test robot
  0 siblings, 0 replies; 22+ messages in thread
From: kbuild test robot @ 2017-05-26  7:46 UTC (permalink / raw)


Hi Ming,

[auto build test ERROR on block/for-next]
[also build test ERROR on v4.12-rc2 next-20170525]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Ming-Lei/blk-mq-introduce-blk_mq_unquiesce_queue/20170526-140138
base:   https://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git for-next
config: x86_64-randconfig-x019-201721 (attached as .config)
compiler: gcc-6 (Debian 6.2.0-3) 6.2.0 20160901
reproduce:
        # save the attached .config to linux build tree
        make ARCH=x86_64 

Note: the linux-review/Ming-Lei/blk-mq-introduce-blk_mq_unquiesce_queue/20170526-140138 HEAD 470e70e5203ed8f76bb7c1a86db58023098bfc21 builds fine.
      It only hurts bisectibility.

All errors (new ones prefixed by >>):

   drivers/scsi/scsi_lib.c: In function 'scsi_internal_device_unblock':
>> drivers/scsi/scsi_lib.c:3033:7: error: implicit declaration of function 'blk_queue_quiesced' [-Werror=implicit-function-declaration]
      if (blk_queue_quiesced(q))
          ^~~~~~~~~~~~~~~~~~
   Cyclomatic Complexity 5 include/linux/compiler.h:__read_once_size
   Cyclomatic Complexity 5 include/linux/compiler.h:__write_once_size
   Cyclomatic Complexity 1 arch/x86/include/asm/bitops.h:test_and_clear_bit
   Cyclomatic Complexity 1 arch/x86/include/asm/bitops.h:constant_test_bit
   Cyclomatic Complexity 1 arch/x86/include/asm/bitops.h:variable_test_bit
   Cyclomatic Complexity 1 arch/x86/include/asm/bitops.h:fls64
   Cyclomatic Complexity 1 include/uapi/linux/swab.h:__swab16p
   Cyclomatic Complexity 1 include/uapi/linux/byteorder/little_endian.h:__be16_to_cpup
   Cyclomatic Complexity 1 include/linux/log2.h:__ilog2_u64
   Cyclomatic Complexity 1 include/linux/list.h:INIT_LIST_HEAD
   Cyclomatic Complexity 1 include/linux/list.h:__list_add_valid
   Cyclomatic Complexity 1 include/linux/list.h:__list_del_entry_valid
   Cyclomatic Complexity 2 include/linux/list.h:__list_add
   Cyclomatic Complexity 1 include/linux/list.h:list_add_tail
   Cyclomatic Complexity 1 include/linux/list.h:__list_del
   Cyclomatic Complexity 2 include/linux/list.h:__list_del_entry
   Cyclomatic Complexity 1 include/linux/list.h:list_del
   Cyclomatic Complexity 1 include/linux/list.h:list_del_init
   Cyclomatic Complexity 1 include/linux/list.h:list_move_tail
   Cyclomatic Complexity 1 include/linux/list.h:list_empty
   Cyclomatic Complexity 1 include/linux/list.h:__list_splice
   Cyclomatic Complexity 2 include/linux/list.h:list_splice
   Cyclomatic Complexity 2 include/linux/list.h:list_splice_init
   Cyclomatic Complexity 1 arch/x86/include/asm/current.h:get_current
   Cyclomatic Complexity 1 include/asm-generic/getorder.h:__get_order
   Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:atomic_read
   Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:atomic_set
   Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:atomic_inc
   Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:atomic_dec
   Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:atomic_add_return
   Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:atomic_sub_return
   Cyclomatic Complexity 1 include/linux/jump_label.h:static_key_count
   Cyclomatic Complexity 2 include/linux/jump_label.h:static_key_false
   Cyclomatic Complexity 1 arch/x86/include/asm/paravirt.h:arch_local_save_flags
   Cyclomatic Complexity 1 arch/x86/include/asm/irqflags.h:arch_irqs_disabled_flags
   Cyclomatic Complexity 5 arch/x86/include/asm/preempt.h:__preempt_count_add
   Cyclomatic Complexity 1 arch/x86/include/asm/preempt.h:__preempt_count_dec_and_test
   Cyclomatic Complexity 1 include/linux/spinlock.h:spinlock_check
   Cyclomatic Complexity 1 include/linux/spinlock.h:spin_lock_irq
   Cyclomatic Complexity 1 include/linux/spinlock.h:spin_unlock_irq
   Cyclomatic Complexity 1 include/linux/spinlock.h:spin_unlock_irqrestore
   Cyclomatic Complexity 1 include/linux/rcupdate.h:rcu_read_lock_sched_notrace
   Cyclomatic Complexity 1 include/linux/mm.h:lowmem_page_address
   Cyclomatic Complexity 1 include/linux/uaccess.h:pagefault_disabled_inc
   Cyclomatic Complexity 1 include/linux/uaccess.h:pagefault_disabled_dec
   Cyclomatic Complexity 1 include/linux/uaccess.h:pagefault_disable
   Cyclomatic Complexity 1 include/linux/uaccess.h:pagefault_enable
   Cyclomatic Complexity 1 include/linux/highmem.h:kmap_atomic
   Cyclomatic Complexity 1 include/linux/blk_types.h:op_is_write
   Cyclomatic Complexity 1 include/linux/slab.h:kmem_cache_alloc_node
   Cyclomatic Complexity 68 include/linux/slab.h:kmalloc_large
   Cyclomatic Complexity 3 include/linux/slab.h:kmalloc
   Cyclomatic Complexity 1 include/linux/slab.h:kzalloc
   Cyclomatic Complexity 1 include/linux/blkdev.h:blk_rq_is_scsi
   Cyclomatic Complexity 1 include/linux/blkdev.h:blk_rq_is_private
   Cyclomatic Complexity 3 include/linux/blkdev.h:blk_rq_is_passthrough
   Cyclomatic Complexity 1 include/linux/blkdev.h:blk_rq_bytes
   Cyclomatic Complexity 2 include/linux/blkdev.h:blk_rq_payload_bytes
   Cyclomatic Complexity 2 include/linux/blkdev.h:blk_rq_nr_phys_segments
   Cyclomatic Complexity 1 include/linux/blkdev.h:blk_integrity_rq
   Cyclomatic Complexity 1 include/linux/blkdev.h:blk_rq_count_integrity_sg
   Cyclomatic Complexity 1 include/linux/blkdev.h:blk_rq_map_integrity_sg
   Cyclomatic Complexity 1 include/linux/blkdev.h:blk_queue_max_integrity_segments
   Cyclomatic Complexity 1 include/linux/blkdev.h:queue_max_integrity_segments
   Cyclomatic Complexity 3 include/linux/dma-mapping.h:dma_get_max_seg_size
   Cyclomatic Complexity 2 include/linux/dma-mapping.h:dma_set_seg_boundary
   Cyclomatic Complexity 1 include/linux/dma-mapping.h:dma_max_pfn
   Cyclomatic Complexity 1 include/linux/blk-mq.h:blk_mq_rq_to_pdu
   Cyclomatic Complexity 1 include/linux/unaligned/access_ok.h:get_unaligned_be16
   Cyclomatic Complexity 1 include/scsi/scsi_common.h:scsi_varlen_cdb_length
   Cyclomatic Complexity 2 include/scsi/scsi_common.h:scsi_command_size
   Cyclomatic Complexity 2 include/scsi/scsi_common.h:scsi_sense_valid
   Cyclomatic Complexity 3 include/scsi/scsi.h:scsi_status_is_good
   Cyclomatic Complexity 1 include/scsi/scsi_device.h:scsi_target
   Cyclomatic Complexity 1 include/scsi/scsi_device.h:scsi_device_online
   Cyclomatic Complexity 1 include/scsi/scsi_device.h:scsi_device_blocked
   Cyclomatic Complexity 1 include/scsi/scsi_request.h:scsi_req
   Cyclomatic Complexity 1 include/scsi/scsi_cmnd.h:scsi_cmd_to_driver
   Cyclomatic Complexity 1 include/scsi/scsi_cmnd.h:scsi_set_resid
   Cyclomatic Complexity 1 include/scsi/scsi_cmnd.h:scsi_get_resid
   Cyclomatic Complexity 3 include/scsi/scsi_cmnd.h:scsi_bidi_cmnd
   Cyclomatic Complexity 2 include/scsi/scsi_cmnd.h:scsi_in
   Cyclomatic Complexity 2 include/scsi/scsi_cmnd.h:scsi_prot_sg_count
   Cyclomatic Complexity 1 include/scsi/scsi_cmnd.h:set_host_byte
   Cyclomatic Complexity 3 include/scsi/scsi_eh.h:scsi_sense_is_deferred
   Cyclomatic Complexity 3 include/scsi/scsi_host.h:scsi_host_in_recovery
   Cyclomatic Complexity 1 include/scsi/scsi_host.h:scsi_get_device
   Cyclomatic Complexity 1 include/scsi/scsi_host.h:scsi_host_get_prot
   Cyclomatic Complexity 1 include/scsi/scsi_host.h:scsi_host_prot_dma
   Cyclomatic Complexity 1 drivers/scsi/scsi_priv.h:scsi_log_send
   Cyclomatic Complexity 1 drivers/scsi/scsi_priv.h:scsi_log_completion
   Cyclomatic Complexity 2 drivers/scsi/scsi_lib.c:scsi_select_sense_cache
   Cyclomatic Complexity 1 drivers/scsi/scsi_lib.c:scsi_alloc_sense_buffer
   Cyclomatic Complexity 4 drivers/scsi/scsi_lib.c:scsi_set_blocked
   Cyclomatic Complexity 3 drivers/scsi/scsi_lib.c:scsi_device_is_busy
   Cyclomatic Complexity 4 drivers/scsi/scsi_lib.c:scsi_target_is_busy
   Cyclomatic Complexity 5 drivers/scsi/scsi_lib.c:scsi_host_is_busy
   Cyclomatic Complexity 3 drivers/scsi/scsi_lib.c:scsi_uninit_cmd

vim +/blk_queue_quiesced +3033 drivers/scsi/scsi_lib.c

  3027				sdev->sdev_state = SDEV_CREATED;
  3028		} else if (sdev->sdev_state != SDEV_CANCEL &&
  3029			 sdev->sdev_state != SDEV_OFFLINE)
  3030			return -EINVAL;
  3031	
  3032		if (q->mq_ops) {
> 3033			if (blk_queue_quiesced(q))
  3034				blk_mq_unquiesce_queue(q);
  3035			else
  3036				blk_mq_start_stopped_hw_queues(q, false);

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
-------------- next part --------------
A non-text attachment was scrubbed...
Name: .config.gz
Type: application/gzip
Size: 28792 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-nvme/attachments/20170526/ccb26664/attachment-0001.gz>

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 2/6] blk-mq: use the introduced blk_mq_unquiesce_queue()
  2017-05-26  7:46     ` kbuild test robot
  (?)
@ 2017-05-26  8:24       ` Ming Lei
  -1 siblings, 0 replies; 22+ messages in thread
From: Ming Lei @ 2017-05-26  8:24 UTC (permalink / raw)
  To: kbuild test robot
  Cc: linux-block, linux-scsi, Christoph Hellwig, linux-nvme,
	Jens Axboe, dm-devel, kbuild-all, Bart Van Assche

On Fri, May 26, 2017 at 03:46:51PM +0800, kbuild test robot wrote:
> Hi Ming,
> 
> [auto build test ERROR on block/for-next]
> [also build test ERROR on v4.12-rc2 next-20170525]
> [if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
> 
> url:    https://github.com/0day-ci/linux/commits/Ming-Lei/blk-mq-introduce-blk_mq_unquiesce_queue/20170526-140138
> base:   https://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git for-next
> config: x86_64-randconfig-x019-201721 (attached as .config)
> compiler: gcc-6 (Debian 6.2.0-3) 6.2.0 20160901
> reproduce:
>         # save the attached .config to linux build tree
>         make ARCH=x86_64 
> 
> Note: the linux-review/Ming-Lei/blk-mq-introduce-blk_mq_unquiesce_queue/20170526-140138 HEAD 470e70e5203ed8f76bb7c1a86db58023098bfc21 builds fine.
>       It only hurts bisectibility.
> 
> All errors (new ones prefixed by >>):
> 
>    drivers/scsi/scsi_lib.c: In function 'scsi_internal_device_unblock':
> >> drivers/scsi/scsi_lib.c:3033:7: error: implicit declaration of function 'blk_queue_quiesced' [-Werror=implicit-function-declaration]
>       if (blk_queue_quiesced(q))
>           ^~~~~~~~~~~~~~~~~~
>    Cyclomatic Complexity 5 include/linux/compiler.h:__read_once_size
>    Cyclomatic Complexity 5 include/linux/compiler.h:__write_once_size
>    Cyclomatic Complexity 1 arch/x86/include/asm/bitops.h:test_and_clear_bit
>    Cyclomatic Complexity 1 arch/x86/include/asm/bitops.h:constant_test_bit
>    Cyclomatic Complexity 1 arch/x86/include/asm/bitops.h:variable_test_bit
>    Cyclomatic Complexity 1 arch/x86/include/asm/bitops.h:fls64
>    Cyclomatic Complexity 1 include/uapi/linux/swab.h:__swab16p
>    Cyclomatic Complexity 1 include/uapi/linux/byteorder/little_endian.h:__be16_to_cpup
>    Cyclomatic Complexity 1 include/linux/log2.h:__ilog2_u64
>    Cyclomatic Complexity 1 include/linux/list.h:INIT_LIST_HEAD
>    Cyclomatic Complexity 1 include/linux/list.h:__list_add_valid
>    Cyclomatic Complexity 1 include/linux/list.h:__list_del_entry_valid
>    Cyclomatic Complexity 2 include/linux/list.h:__list_add
>    Cyclomatic Complexity 1 include/linux/list.h:list_add_tail
>    Cyclomatic Complexity 1 include/linux/list.h:__list_del
>    Cyclomatic Complexity 2 include/linux/list.h:__list_del_entry
>    Cyclomatic Complexity 1 include/linux/list.h:list_del
>    Cyclomatic Complexity 1 include/linux/list.h:list_del_init
>    Cyclomatic Complexity 1 include/linux/list.h:list_move_tail
>    Cyclomatic Complexity 1 include/linux/list.h:list_empty
>    Cyclomatic Complexity 1 include/linux/list.h:__list_splice
>    Cyclomatic Complexity 2 include/linux/list.h:list_splice
>    Cyclomatic Complexity 2 include/linux/list.h:list_splice_init
>    Cyclomatic Complexity 1 arch/x86/include/asm/current.h:get_current
>    Cyclomatic Complexity 1 include/asm-generic/getorder.h:__get_order
>    Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:atomic_read
>    Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:atomic_set
>    Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:atomic_inc
>    Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:atomic_dec
>    Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:atomic_add_return
>    Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:atomic_sub_return
>    Cyclomatic Complexity 1 include/linux/jump_label.h:static_key_count
>    Cyclomatic Complexity 2 include/linux/jump_label.h:static_key_false
>    Cyclomatic Complexity 1 arch/x86/include/asm/paravirt.h:arch_local_save_flags
>    Cyclomatic Complexity 1 arch/x86/include/asm/irqflags.h:arch_irqs_disabled_flags
>    Cyclomatic Complexity 5 arch/x86/include/asm/preempt.h:__preempt_count_add
>    Cyclomatic Complexity 1 arch/x86/include/asm/preempt.h:__preempt_count_dec_and_test
>    Cyclomatic Complexity 1 include/linux/spinlock.h:spinlock_check
>    Cyclomatic Complexity 1 include/linux/spinlock.h:spin_lock_irq
>    Cyclomatic Complexity 1 include/linux/spinlock.h:spin_unlock_irq
>    Cyclomatic Complexity 1 include/linux/spinlock.h:spin_unlock_irqrestore
>    Cyclomatic Complexity 1 include/linux/rcupdate.h:rcu_read_lock_sched_notrace
>    Cyclomatic Complexity 1 include/linux/mm.h:lowmem_page_address
>    Cyclomatic Complexity 1 include/linux/uaccess.h:pagefault_disabled_inc
>    Cyclomatic Complexity 1 include/linux/uaccess.h:pagefault_disabled_dec
>    Cyclomatic Complexity 1 include/linux/uaccess.h:pagefault_disable
>    Cyclomatic Complexity 1 include/linux/uaccess.h:pagefault_enable
>    Cyclomatic Complexity 1 include/linux/highmem.h:kmap_atomic
>    Cyclomatic Complexity 1 include/linux/blk_types.h:op_is_write
>    Cyclomatic Complexity 1 include/linux/slab.h:kmem_cache_alloc_node
>    Cyclomatic Complexity 68 include/linux/slab.h:kmalloc_large
>    Cyclomatic Complexity 3 include/linux/slab.h:kmalloc
>    Cyclomatic Complexity 1 include/linux/slab.h:kzalloc
>    Cyclomatic Complexity 1 include/linux/blkdev.h:blk_rq_is_scsi
>    Cyclomatic Complexity 1 include/linux/blkdev.h:blk_rq_is_private
>    Cyclomatic Complexity 3 include/linux/blkdev.h:blk_rq_is_passthrough
>    Cyclomatic Complexity 1 include/linux/blkdev.h:blk_rq_bytes
>    Cyclomatic Complexity 2 include/linux/blkdev.h:blk_rq_payload_bytes
>    Cyclomatic Complexity 2 include/linux/blkdev.h:blk_rq_nr_phys_segments
>    Cyclomatic Complexity 1 include/linux/blkdev.h:blk_integrity_rq
>    Cyclomatic Complexity 1 include/linux/blkdev.h:blk_rq_count_integrity_sg
>    Cyclomatic Complexity 1 include/linux/blkdev.h:blk_rq_map_integrity_sg
>    Cyclomatic Complexity 1 include/linux/blkdev.h:blk_queue_max_integrity_segments
>    Cyclomatic Complexity 1 include/linux/blkdev.h:queue_max_integrity_segments
>    Cyclomatic Complexity 3 include/linux/dma-mapping.h:dma_get_max_seg_size
>    Cyclomatic Complexity 2 include/linux/dma-mapping.h:dma_set_seg_boundary
>    Cyclomatic Complexity 1 include/linux/dma-mapping.h:dma_max_pfn
>    Cyclomatic Complexity 1 include/linux/blk-mq.h:blk_mq_rq_to_pdu
>    Cyclomatic Complexity 1 include/linux/unaligned/access_ok.h:get_unaligned_be16
>    Cyclomatic Complexity 1 include/scsi/scsi_common.h:scsi_varlen_cdb_length
>    Cyclomatic Complexity 2 include/scsi/scsi_common.h:scsi_command_size
>    Cyclomatic Complexity 2 include/scsi/scsi_common.h:scsi_sense_valid
>    Cyclomatic Complexity 3 include/scsi/scsi.h:scsi_status_is_good
>    Cyclomatic Complexity 1 include/scsi/scsi_device.h:scsi_target
>    Cyclomatic Complexity 1 include/scsi/scsi_device.h:scsi_device_online
>    Cyclomatic Complexity 1 include/scsi/scsi_device.h:scsi_device_blocked
>    Cyclomatic Complexity 1 include/scsi/scsi_request.h:scsi_req
>    Cyclomatic Complexity 1 include/scsi/scsi_cmnd.h:scsi_cmd_to_driver
>    Cyclomatic Complexity 1 include/scsi/scsi_cmnd.h:scsi_set_resid
>    Cyclomatic Complexity 1 include/scsi/scsi_cmnd.h:scsi_get_resid
>    Cyclomatic Complexity 3 include/scsi/scsi_cmnd.h:scsi_bidi_cmnd
>    Cyclomatic Complexity 2 include/scsi/scsi_cmnd.h:scsi_in
>    Cyclomatic Complexity 2 include/scsi/scsi_cmnd.h:scsi_prot_sg_count
>    Cyclomatic Complexity 1 include/scsi/scsi_cmnd.h:set_host_byte
>    Cyclomatic Complexity 3 include/scsi/scsi_eh.h:scsi_sense_is_deferred
>    Cyclomatic Complexity 3 include/scsi/scsi_host.h:scsi_host_in_recovery
>    Cyclomatic Complexity 1 include/scsi/scsi_host.h:scsi_get_device
>    Cyclomatic Complexity 1 include/scsi/scsi_host.h:scsi_host_get_prot
>    Cyclomatic Complexity 1 include/scsi/scsi_host.h:scsi_host_prot_dma
>    Cyclomatic Complexity 1 drivers/scsi/scsi_priv.h:scsi_log_send
>    Cyclomatic Complexity 1 drivers/scsi/scsi_priv.h:scsi_log_completion
>    Cyclomatic Complexity 2 drivers/scsi/scsi_lib.c:scsi_select_sense_cache
>    Cyclomatic Complexity 1 drivers/scsi/scsi_lib.c:scsi_alloc_sense_buffer
>    Cyclomatic Complexity 4 drivers/scsi/scsi_lib.c:scsi_set_blocked
>    Cyclomatic Complexity 3 drivers/scsi/scsi_lib.c:scsi_device_is_busy
>    Cyclomatic Complexity 4 drivers/scsi/scsi_lib.c:scsi_target_is_busy
>    Cyclomatic Complexity 5 drivers/scsi/scsi_lib.c:scsi_host_is_busy
>    Cyclomatic Complexity 3 drivers/scsi/scsi_lib.c:scsi_uninit_cmd
> 
> vim +/blk_queue_quiesced +3033 drivers/scsi/scsi_lib.c
> 
>   3027				sdev->sdev_state = SDEV_CREATED;
>   3028		} else if (sdev->sdev_state != SDEV_CANCEL &&
>   3029			 sdev->sdev_state != SDEV_OFFLINE)
>   3030			return -EINVAL;
>   3031	
>   3032		if (q->mq_ops) {
> > 3033			if (blk_queue_quiesced(q))
>   3034				blk_mq_unquiesce_queue(q);
>   3035			else
>   3036				blk_mq_start_stopped_hw_queues(q, false);

My fault, I shouldn't have merged blk_queue_quiesced()
into patch 03, will fix it in V2.

Thanks,
Ming

_______________________________________________
Linux-nvme mailing list
Linux-nvme@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-nvme

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 2/6] blk-mq: use the introduced blk_mq_unquiesce_queue()
@ 2017-05-26  8:24       ` Ming Lei
  0 siblings, 0 replies; 22+ messages in thread
From: Ming Lei @ 2017-05-26  8:24 UTC (permalink / raw)
  To: kbuild test robot
  Cc: kbuild-all, Jens Axboe, linux-block, Christoph Hellwig,
	Bart Van Assche, linux-nvme, linux-scsi, dm-devel

On Fri, May 26, 2017 at 03:46:51PM +0800, kbuild test robot wrote:
> Hi Ming,
> 
> [auto build test ERROR on block/for-next]
> [also build test ERROR on v4.12-rc2 next-20170525]
> [if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
> 
> url:    https://github.com/0day-ci/linux/commits/Ming-Lei/blk-mq-introduce-blk_mq_unquiesce_queue/20170526-140138
> base:   https://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git for-next
> config: x86_64-randconfig-x019-201721 (attached as .config)
> compiler: gcc-6 (Debian 6.2.0-3) 6.2.0 20160901
> reproduce:
>         # save the attached .config to linux build tree
>         make ARCH=x86_64 
> 
> Note: the linux-review/Ming-Lei/blk-mq-introduce-blk_mq_unquiesce_queue/20170526-140138 HEAD 470e70e5203ed8f76bb7c1a86db58023098bfc21 builds fine.
>       It only hurts bisectibility.
> 
> All errors (new ones prefixed by >>):
> 
>    drivers/scsi/scsi_lib.c: In function 'scsi_internal_device_unblock':
> >> drivers/scsi/scsi_lib.c:3033:7: error: implicit declaration of function 'blk_queue_quiesced' [-Werror=implicit-function-declaration]
>       if (blk_queue_quiesced(q))
>           ^~~~~~~~~~~~~~~~~~
>    Cyclomatic Complexity 5 include/linux/compiler.h:__read_once_size
>    Cyclomatic Complexity 5 include/linux/compiler.h:__write_once_size
>    Cyclomatic Complexity 1 arch/x86/include/asm/bitops.h:test_and_clear_bit
>    Cyclomatic Complexity 1 arch/x86/include/asm/bitops.h:constant_test_bit
>    Cyclomatic Complexity 1 arch/x86/include/asm/bitops.h:variable_test_bit
>    Cyclomatic Complexity 1 arch/x86/include/asm/bitops.h:fls64
>    Cyclomatic Complexity 1 include/uapi/linux/swab.h:__swab16p
>    Cyclomatic Complexity 1 include/uapi/linux/byteorder/little_endian.h:__be16_to_cpup
>    Cyclomatic Complexity 1 include/linux/log2.h:__ilog2_u64
>    Cyclomatic Complexity 1 include/linux/list.h:INIT_LIST_HEAD
>    Cyclomatic Complexity 1 include/linux/list.h:__list_add_valid
>    Cyclomatic Complexity 1 include/linux/list.h:__list_del_entry_valid
>    Cyclomatic Complexity 2 include/linux/list.h:__list_add
>    Cyclomatic Complexity 1 include/linux/list.h:list_add_tail
>    Cyclomatic Complexity 1 include/linux/list.h:__list_del
>    Cyclomatic Complexity 2 include/linux/list.h:__list_del_entry
>    Cyclomatic Complexity 1 include/linux/list.h:list_del
>    Cyclomatic Complexity 1 include/linux/list.h:list_del_init
>    Cyclomatic Complexity 1 include/linux/list.h:list_move_tail
>    Cyclomatic Complexity 1 include/linux/list.h:list_empty
>    Cyclomatic Complexity 1 include/linux/list.h:__list_splice
>    Cyclomatic Complexity 2 include/linux/list.h:list_splice
>    Cyclomatic Complexity 2 include/linux/list.h:list_splice_init
>    Cyclomatic Complexity 1 arch/x86/include/asm/current.h:get_current
>    Cyclomatic Complexity 1 include/asm-generic/getorder.h:__get_order
>    Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:atomic_read
>    Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:atomic_set
>    Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:atomic_inc
>    Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:atomic_dec
>    Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:atomic_add_return
>    Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:atomic_sub_return
>    Cyclomatic Complexity 1 include/linux/jump_label.h:static_key_count
>    Cyclomatic Complexity 2 include/linux/jump_label.h:static_key_false
>    Cyclomatic Complexity 1 arch/x86/include/asm/paravirt.h:arch_local_save_flags
>    Cyclomatic Complexity 1 arch/x86/include/asm/irqflags.h:arch_irqs_disabled_flags
>    Cyclomatic Complexity 5 arch/x86/include/asm/preempt.h:__preempt_count_add
>    Cyclomatic Complexity 1 arch/x86/include/asm/preempt.h:__preempt_count_dec_and_test
>    Cyclomatic Complexity 1 include/linux/spinlock.h:spinlock_check
>    Cyclomatic Complexity 1 include/linux/spinlock.h:spin_lock_irq
>    Cyclomatic Complexity 1 include/linux/spinlock.h:spin_unlock_irq
>    Cyclomatic Complexity 1 include/linux/spinlock.h:spin_unlock_irqrestore
>    Cyclomatic Complexity 1 include/linux/rcupdate.h:rcu_read_lock_sched_notrace
>    Cyclomatic Complexity 1 include/linux/mm.h:lowmem_page_address
>    Cyclomatic Complexity 1 include/linux/uaccess.h:pagefault_disabled_inc
>    Cyclomatic Complexity 1 include/linux/uaccess.h:pagefault_disabled_dec
>    Cyclomatic Complexity 1 include/linux/uaccess.h:pagefault_disable
>    Cyclomatic Complexity 1 include/linux/uaccess.h:pagefault_enable
>    Cyclomatic Complexity 1 include/linux/highmem.h:kmap_atomic
>    Cyclomatic Complexity 1 include/linux/blk_types.h:op_is_write
>    Cyclomatic Complexity 1 include/linux/slab.h:kmem_cache_alloc_node
>    Cyclomatic Complexity 68 include/linux/slab.h:kmalloc_large
>    Cyclomatic Complexity 3 include/linux/slab.h:kmalloc
>    Cyclomatic Complexity 1 include/linux/slab.h:kzalloc
>    Cyclomatic Complexity 1 include/linux/blkdev.h:blk_rq_is_scsi
>    Cyclomatic Complexity 1 include/linux/blkdev.h:blk_rq_is_private
>    Cyclomatic Complexity 3 include/linux/blkdev.h:blk_rq_is_passthrough
>    Cyclomatic Complexity 1 include/linux/blkdev.h:blk_rq_bytes
>    Cyclomatic Complexity 2 include/linux/blkdev.h:blk_rq_payload_bytes
>    Cyclomatic Complexity 2 include/linux/blkdev.h:blk_rq_nr_phys_segments
>    Cyclomatic Complexity 1 include/linux/blkdev.h:blk_integrity_rq
>    Cyclomatic Complexity 1 include/linux/blkdev.h:blk_rq_count_integrity_sg
>    Cyclomatic Complexity 1 include/linux/blkdev.h:blk_rq_map_integrity_sg
>    Cyclomatic Complexity 1 include/linux/blkdev.h:blk_queue_max_integrity_segments
>    Cyclomatic Complexity 1 include/linux/blkdev.h:queue_max_integrity_segments
>    Cyclomatic Complexity 3 include/linux/dma-mapping.h:dma_get_max_seg_size
>    Cyclomatic Complexity 2 include/linux/dma-mapping.h:dma_set_seg_boundary
>    Cyclomatic Complexity 1 include/linux/dma-mapping.h:dma_max_pfn
>    Cyclomatic Complexity 1 include/linux/blk-mq.h:blk_mq_rq_to_pdu
>    Cyclomatic Complexity 1 include/linux/unaligned/access_ok.h:get_unaligned_be16
>    Cyclomatic Complexity 1 include/scsi/scsi_common.h:scsi_varlen_cdb_length
>    Cyclomatic Complexity 2 include/scsi/scsi_common.h:scsi_command_size
>    Cyclomatic Complexity 2 include/scsi/scsi_common.h:scsi_sense_valid
>    Cyclomatic Complexity 3 include/scsi/scsi.h:scsi_status_is_good
>    Cyclomatic Complexity 1 include/scsi/scsi_device.h:scsi_target
>    Cyclomatic Complexity 1 include/scsi/scsi_device.h:scsi_device_online
>    Cyclomatic Complexity 1 include/scsi/scsi_device.h:scsi_device_blocked
>    Cyclomatic Complexity 1 include/scsi/scsi_request.h:scsi_req
>    Cyclomatic Complexity 1 include/scsi/scsi_cmnd.h:scsi_cmd_to_driver
>    Cyclomatic Complexity 1 include/scsi/scsi_cmnd.h:scsi_set_resid
>    Cyclomatic Complexity 1 include/scsi/scsi_cmnd.h:scsi_get_resid
>    Cyclomatic Complexity 3 include/scsi/scsi_cmnd.h:scsi_bidi_cmnd
>    Cyclomatic Complexity 2 include/scsi/scsi_cmnd.h:scsi_in
>    Cyclomatic Complexity 2 include/scsi/scsi_cmnd.h:scsi_prot_sg_count
>    Cyclomatic Complexity 1 include/scsi/scsi_cmnd.h:set_host_byte
>    Cyclomatic Complexity 3 include/scsi/scsi_eh.h:scsi_sense_is_deferred
>    Cyclomatic Complexity 3 include/scsi/scsi_host.h:scsi_host_in_recovery
>    Cyclomatic Complexity 1 include/scsi/scsi_host.h:scsi_get_device
>    Cyclomatic Complexity 1 include/scsi/scsi_host.h:scsi_host_get_prot
>    Cyclomatic Complexity 1 include/scsi/scsi_host.h:scsi_host_prot_dma
>    Cyclomatic Complexity 1 drivers/scsi/scsi_priv.h:scsi_log_send
>    Cyclomatic Complexity 1 drivers/scsi/scsi_priv.h:scsi_log_completion
>    Cyclomatic Complexity 2 drivers/scsi/scsi_lib.c:scsi_select_sense_cache
>    Cyclomatic Complexity 1 drivers/scsi/scsi_lib.c:scsi_alloc_sense_buffer
>    Cyclomatic Complexity 4 drivers/scsi/scsi_lib.c:scsi_set_blocked
>    Cyclomatic Complexity 3 drivers/scsi/scsi_lib.c:scsi_device_is_busy
>    Cyclomatic Complexity 4 drivers/scsi/scsi_lib.c:scsi_target_is_busy
>    Cyclomatic Complexity 5 drivers/scsi/scsi_lib.c:scsi_host_is_busy
>    Cyclomatic Complexity 3 drivers/scsi/scsi_lib.c:scsi_uninit_cmd
> 
> vim +/blk_queue_quiesced +3033 drivers/scsi/scsi_lib.c
> 
>   3027				sdev->sdev_state = SDEV_CREATED;
>   3028		} else if (sdev->sdev_state != SDEV_CANCEL &&
>   3029			 sdev->sdev_state != SDEV_OFFLINE)
>   3030			return -EINVAL;
>   3031	
>   3032		if (q->mq_ops) {
> > 3033			if (blk_queue_quiesced(q))
>   3034				blk_mq_unquiesce_queue(q);
>   3035			else
>   3036				blk_mq_start_stopped_hw_queues(q, false);

My fault, I shouldn't have merged blk_queue_quiesced()
into patch 03, will fix it in V2.

Thanks,
Ming

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [PATCH 2/6] blk-mq: use the introduced blk_mq_unquiesce_queue()
@ 2017-05-26  8:24       ` Ming Lei
  0 siblings, 0 replies; 22+ messages in thread
From: Ming Lei @ 2017-05-26  8:24 UTC (permalink / raw)


On Fri, May 26, 2017@03:46:51PM +0800, kbuild test robot wrote:
> Hi Ming,
> 
> [auto build test ERROR on block/for-next]
> [also build test ERROR on v4.12-rc2 next-20170525]
> [if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
> 
> url:    https://github.com/0day-ci/linux/commits/Ming-Lei/blk-mq-introduce-blk_mq_unquiesce_queue/20170526-140138
> base:   https://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git for-next
> config: x86_64-randconfig-x019-201721 (attached as .config)
> compiler: gcc-6 (Debian 6.2.0-3) 6.2.0 20160901
> reproduce:
>         # save the attached .config to linux build tree
>         make ARCH=x86_64 
> 
> Note: the linux-review/Ming-Lei/blk-mq-introduce-blk_mq_unquiesce_queue/20170526-140138 HEAD 470e70e5203ed8f76bb7c1a86db58023098bfc21 builds fine.
>       It only hurts bisectibility.
> 
> All errors (new ones prefixed by >>):
> 
>    drivers/scsi/scsi_lib.c: In function 'scsi_internal_device_unblock':
> >> drivers/scsi/scsi_lib.c:3033:7: error: implicit declaration of function 'blk_queue_quiesced' [-Werror=implicit-function-declaration]
>       if (blk_queue_quiesced(q))
>           ^~~~~~~~~~~~~~~~~~
>    Cyclomatic Complexity 5 include/linux/compiler.h:__read_once_size
>    Cyclomatic Complexity 5 include/linux/compiler.h:__write_once_size
>    Cyclomatic Complexity 1 arch/x86/include/asm/bitops.h:test_and_clear_bit
>    Cyclomatic Complexity 1 arch/x86/include/asm/bitops.h:constant_test_bit
>    Cyclomatic Complexity 1 arch/x86/include/asm/bitops.h:variable_test_bit
>    Cyclomatic Complexity 1 arch/x86/include/asm/bitops.h:fls64
>    Cyclomatic Complexity 1 include/uapi/linux/swab.h:__swab16p
>    Cyclomatic Complexity 1 include/uapi/linux/byteorder/little_endian.h:__be16_to_cpup
>    Cyclomatic Complexity 1 include/linux/log2.h:__ilog2_u64
>    Cyclomatic Complexity 1 include/linux/list.h:INIT_LIST_HEAD
>    Cyclomatic Complexity 1 include/linux/list.h:__list_add_valid
>    Cyclomatic Complexity 1 include/linux/list.h:__list_del_entry_valid
>    Cyclomatic Complexity 2 include/linux/list.h:__list_add
>    Cyclomatic Complexity 1 include/linux/list.h:list_add_tail
>    Cyclomatic Complexity 1 include/linux/list.h:__list_del
>    Cyclomatic Complexity 2 include/linux/list.h:__list_del_entry
>    Cyclomatic Complexity 1 include/linux/list.h:list_del
>    Cyclomatic Complexity 1 include/linux/list.h:list_del_init
>    Cyclomatic Complexity 1 include/linux/list.h:list_move_tail
>    Cyclomatic Complexity 1 include/linux/list.h:list_empty
>    Cyclomatic Complexity 1 include/linux/list.h:__list_splice
>    Cyclomatic Complexity 2 include/linux/list.h:list_splice
>    Cyclomatic Complexity 2 include/linux/list.h:list_splice_init
>    Cyclomatic Complexity 1 arch/x86/include/asm/current.h:get_current
>    Cyclomatic Complexity 1 include/asm-generic/getorder.h:__get_order
>    Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:atomic_read
>    Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:atomic_set
>    Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:atomic_inc
>    Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:atomic_dec
>    Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:atomic_add_return
>    Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:atomic_sub_return
>    Cyclomatic Complexity 1 include/linux/jump_label.h:static_key_count
>    Cyclomatic Complexity 2 include/linux/jump_label.h:static_key_false
>    Cyclomatic Complexity 1 arch/x86/include/asm/paravirt.h:arch_local_save_flags
>    Cyclomatic Complexity 1 arch/x86/include/asm/irqflags.h:arch_irqs_disabled_flags
>    Cyclomatic Complexity 5 arch/x86/include/asm/preempt.h:__preempt_count_add
>    Cyclomatic Complexity 1 arch/x86/include/asm/preempt.h:__preempt_count_dec_and_test
>    Cyclomatic Complexity 1 include/linux/spinlock.h:spinlock_check
>    Cyclomatic Complexity 1 include/linux/spinlock.h:spin_lock_irq
>    Cyclomatic Complexity 1 include/linux/spinlock.h:spin_unlock_irq
>    Cyclomatic Complexity 1 include/linux/spinlock.h:spin_unlock_irqrestore
>    Cyclomatic Complexity 1 include/linux/rcupdate.h:rcu_read_lock_sched_notrace
>    Cyclomatic Complexity 1 include/linux/mm.h:lowmem_page_address
>    Cyclomatic Complexity 1 include/linux/uaccess.h:pagefault_disabled_inc
>    Cyclomatic Complexity 1 include/linux/uaccess.h:pagefault_disabled_dec
>    Cyclomatic Complexity 1 include/linux/uaccess.h:pagefault_disable
>    Cyclomatic Complexity 1 include/linux/uaccess.h:pagefault_enable
>    Cyclomatic Complexity 1 include/linux/highmem.h:kmap_atomic
>    Cyclomatic Complexity 1 include/linux/blk_types.h:op_is_write
>    Cyclomatic Complexity 1 include/linux/slab.h:kmem_cache_alloc_node
>    Cyclomatic Complexity 68 include/linux/slab.h:kmalloc_large
>    Cyclomatic Complexity 3 include/linux/slab.h:kmalloc
>    Cyclomatic Complexity 1 include/linux/slab.h:kzalloc
>    Cyclomatic Complexity 1 include/linux/blkdev.h:blk_rq_is_scsi
>    Cyclomatic Complexity 1 include/linux/blkdev.h:blk_rq_is_private
>    Cyclomatic Complexity 3 include/linux/blkdev.h:blk_rq_is_passthrough
>    Cyclomatic Complexity 1 include/linux/blkdev.h:blk_rq_bytes
>    Cyclomatic Complexity 2 include/linux/blkdev.h:blk_rq_payload_bytes
>    Cyclomatic Complexity 2 include/linux/blkdev.h:blk_rq_nr_phys_segments
>    Cyclomatic Complexity 1 include/linux/blkdev.h:blk_integrity_rq
>    Cyclomatic Complexity 1 include/linux/blkdev.h:blk_rq_count_integrity_sg
>    Cyclomatic Complexity 1 include/linux/blkdev.h:blk_rq_map_integrity_sg
>    Cyclomatic Complexity 1 include/linux/blkdev.h:blk_queue_max_integrity_segments
>    Cyclomatic Complexity 1 include/linux/blkdev.h:queue_max_integrity_segments
>    Cyclomatic Complexity 3 include/linux/dma-mapping.h:dma_get_max_seg_size
>    Cyclomatic Complexity 2 include/linux/dma-mapping.h:dma_set_seg_boundary
>    Cyclomatic Complexity 1 include/linux/dma-mapping.h:dma_max_pfn
>    Cyclomatic Complexity 1 include/linux/blk-mq.h:blk_mq_rq_to_pdu
>    Cyclomatic Complexity 1 include/linux/unaligned/access_ok.h:get_unaligned_be16
>    Cyclomatic Complexity 1 include/scsi/scsi_common.h:scsi_varlen_cdb_length
>    Cyclomatic Complexity 2 include/scsi/scsi_common.h:scsi_command_size
>    Cyclomatic Complexity 2 include/scsi/scsi_common.h:scsi_sense_valid
>    Cyclomatic Complexity 3 include/scsi/scsi.h:scsi_status_is_good
>    Cyclomatic Complexity 1 include/scsi/scsi_device.h:scsi_target
>    Cyclomatic Complexity 1 include/scsi/scsi_device.h:scsi_device_online
>    Cyclomatic Complexity 1 include/scsi/scsi_device.h:scsi_device_blocked
>    Cyclomatic Complexity 1 include/scsi/scsi_request.h:scsi_req
>    Cyclomatic Complexity 1 include/scsi/scsi_cmnd.h:scsi_cmd_to_driver
>    Cyclomatic Complexity 1 include/scsi/scsi_cmnd.h:scsi_set_resid
>    Cyclomatic Complexity 1 include/scsi/scsi_cmnd.h:scsi_get_resid
>    Cyclomatic Complexity 3 include/scsi/scsi_cmnd.h:scsi_bidi_cmnd
>    Cyclomatic Complexity 2 include/scsi/scsi_cmnd.h:scsi_in
>    Cyclomatic Complexity 2 include/scsi/scsi_cmnd.h:scsi_prot_sg_count
>    Cyclomatic Complexity 1 include/scsi/scsi_cmnd.h:set_host_byte
>    Cyclomatic Complexity 3 include/scsi/scsi_eh.h:scsi_sense_is_deferred
>    Cyclomatic Complexity 3 include/scsi/scsi_host.h:scsi_host_in_recovery
>    Cyclomatic Complexity 1 include/scsi/scsi_host.h:scsi_get_device
>    Cyclomatic Complexity 1 include/scsi/scsi_host.h:scsi_host_get_prot
>    Cyclomatic Complexity 1 include/scsi/scsi_host.h:scsi_host_prot_dma
>    Cyclomatic Complexity 1 drivers/scsi/scsi_priv.h:scsi_log_send
>    Cyclomatic Complexity 1 drivers/scsi/scsi_priv.h:scsi_log_completion
>    Cyclomatic Complexity 2 drivers/scsi/scsi_lib.c:scsi_select_sense_cache
>    Cyclomatic Complexity 1 drivers/scsi/scsi_lib.c:scsi_alloc_sense_buffer
>    Cyclomatic Complexity 4 drivers/scsi/scsi_lib.c:scsi_set_blocked
>    Cyclomatic Complexity 3 drivers/scsi/scsi_lib.c:scsi_device_is_busy
>    Cyclomatic Complexity 4 drivers/scsi/scsi_lib.c:scsi_target_is_busy
>    Cyclomatic Complexity 5 drivers/scsi/scsi_lib.c:scsi_host_is_busy
>    Cyclomatic Complexity 3 drivers/scsi/scsi_lib.c:scsi_uninit_cmd
> 
> vim +/blk_queue_quiesced +3033 drivers/scsi/scsi_lib.c
> 
>   3027				sdev->sdev_state = SDEV_CREATED;
>   3028		} else if (sdev->sdev_state != SDEV_CANCEL &&
>   3029			 sdev->sdev_state != SDEV_OFFLINE)
>   3030			return -EINVAL;
>   3031	
>   3032		if (q->mq_ops) {
> > 3033			if (blk_queue_quiesced(q))
>   3034				blk_mq_unquiesce_queue(q);
>   3035			else
>   3036				blk_mq_start_stopped_hw_queues(q, false);

My fault, I shouldn't have merged blk_queue_quiesced()
into patch 03, will fix it in V2.

Thanks,
Ming

^ permalink raw reply	[flat|nested] 22+ messages in thread

end of thread, other threads:[~2017-05-26  8:24 UTC | newest]

Thread overview: 22+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-05-26  3:07 [PATCH 0/6] blk-mq: fix & improve queue quiescing Ming Lei
2017-05-26  3:07 ` Ming Lei
2017-05-26  3:07 ` [PATCH 1/6] blk-mq: introduce blk_mq_unquiesce_queue Ming Lei
2017-05-26  3:07   ` Ming Lei
2017-05-26  3:07 ` [PATCH 2/6] blk-mq: use the introduced blk_mq_unquiesce_queue() Ming Lei
2017-05-26  3:07   ` Ming Lei
2017-05-26  7:46   ` kbuild test robot
2017-05-26  7:46     ` kbuild test robot
2017-05-26  7:46     ` kbuild test robot
2017-05-26  8:24     ` Ming Lei
2017-05-26  8:24       ` Ming Lei
2017-05-26  8:24       ` Ming Lei
2017-05-26  3:07 ` [PATCH 3/6] blk-mq: fix blk_mq_quiesce_queue Ming Lei
2017-05-26  3:07   ` Ming Lei
2017-05-26  3:07 ` [PATCH 4/6] blk-mq: update comments on blk_mq_quiesce_queue() Ming Lei
2017-05-26  3:07   ` Ming Lei
2017-05-26  3:07 ` [PATCH 5/6] blk-mq: don't stop queue for quiescing Ming Lei
2017-05-26  3:07   ` Ming Lei
2017-05-26  3:07 ` [PATCH 6/6] blk-mq: clarify dispatching may not be drained/blocked by stopping queue Ming Lei
2017-05-26  3:07   ` Ming Lei
2017-05-26  3:07 ` [PATCH 6/6] blk-mq: clarify dispatching won't be blocked " Ming Lei
2017-05-26  3:07   ` Ming Lei

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.