Message ID | 20170605155925.7896-11-ming.lei@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Mon, 2017-06-05 at 23:59 +0800, Ming Lei wrote: > +/* > + * We do not guarantee that dispatch can be drained or blocked > + * after blk_mq_stop_hw_queue() returns. Please use > + * blk_mq_quiesce_queue() for that requirement. > + */ Hello Ming, This is comment explains what blk_mq_stop_hw_queue() should not be used for and may leave the reader wondering what it is useful for. How about mentioning first that this function is useful to pause .queue_rq() calls as long as the block driver it will have to return BUSY if .queue_rq() is called? Bart.
On Mon, Jun 05, 2017 at 11:55:20PM +0000, Bart Van Assche wrote: > On Mon, 2017-06-05 at 23:59 +0800, Ming Lei wrote: > > +/* > > + * We do not guarantee that dispatch can be drained or blocked > > + * after blk_mq_stop_hw_queue() returns. Please use > > + * blk_mq_quiesce_queue() for that requirement. > > + */ > > Hello Ming, > > This is comment explains what blk_mq_stop_hw_queue() should not be used for > and may leave the reader wondering what it is useful for. How about mentioning > first that this function is useful to pause .queue_rq() calls as long as the > block driver it will have to return BUSY if .queue_rq() is called? OK, will make that as one example. Thanks, Ming
diff --git a/block/blk-mq.c b/block/blk-mq.c index 2788cacdaa1e..d3e24d600246 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -1186,6 +1186,11 @@ static void __blk_mq_stop_hw_queue(struct blk_mq_hw_ctx *hctx, bool sync) set_bit(BLK_MQ_S_STOPPED, &hctx->state); } +/* + * We do not guarantee that dispatch can be drained or 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); @@ -1201,6 +1206,11 @@ static void __blk_mq_stop_hw_queues(struct request_queue *q, bool sync) __blk_mq_stop_hw_queue(hctx, sync); } +/* + * We do not guarantee that dispatch can be drained or 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);
BLK_MQ_S_STOPPED may not be observed in other concurrent I/O paths, we can't guarantee that dispatching won't happen after returning from the APIs of stopping queue. 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(+)