From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Date: Thu, 22 Jun 2017 18:32:00 +0800 From: Ming Lei To: Bart Van Assche Cc: Jens Axboe , linux-block@vger.kernel.org, Christoph Hellwig , Hannes Reinecke , "Martin K . Petersen" Subject: Re: [PATCH 3/3] blk-mq: Make it safe to quiesce and unquiesce from an interrupt handler Message-ID: <20170622103159.GA28529@ming.t460p> References: <20170621175547.21692-1-bart.vanassche@wdc.com> <20170621175547.21692-4-bart.vanassche@wdc.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii In-Reply-To: <20170621175547.21692-4-bart.vanassche@wdc.com> List-ID: On Wed, Jun 21, 2017 at 10:55:47AM -0700, Bart Van Assche wrote: > Since blk_mq_quiesce_queue_nowait() can be called from interrupt > context, make this safe. Since this function is not in the hot > path, uninline it. > > Fixes: commit f4560ffe8cec ("blk-mq: use QUEUE_FLAG_QUIESCED to quiesce queue") > Signed-off-by: Bart Van Assche > Cc: Ming Lei > Cc: Hannes Reinecke > Cc: Martin K. Petersen > --- > block/blk-mq.c | 20 ++++++++++++++++++-- > include/linux/blk-mq.h | 10 +--------- > 2 files changed, 19 insertions(+), 11 deletions(-) > > diff --git a/block/blk-mq.c b/block/blk-mq.c > index 1c4f1f4978c6..2caac30e128a 100644 > --- a/block/blk-mq.c > +++ b/block/blk-mq.c > @@ -153,6 +153,20 @@ void blk_mq_unfreeze_queue(struct request_queue *q) > } > EXPORT_SYMBOL_GPL(blk_mq_unfreeze_queue); > > +/* > + * FIXME: replace the scsi_internal_device_*block_nowait() calls in the > + * mpt3sas driver such that this function can be removed. > + */ > +void blk_mq_quiesce_queue_nowait(struct request_queue *q) > +{ > + unsigned long flags; > + > + spin_lock_irqsave(q->queue_lock, flags); > + queue_flag_set(QUEUE_FLAG_QUIESCED, q); > + spin_unlock_irqrestore(q->queue_lock, flags); > +} > +EXPORT_SYMBOL_GPL(blk_mq_quiesce_queue_nowait); > + > /** > * blk_mq_quiesce_queue() - wait until all ongoing dispatches have finished > * @q: request queue. > @@ -190,9 +204,11 @@ EXPORT_SYMBOL_GPL(blk_mq_quiesce_queue); > */ > void blk_mq_unquiesce_queue(struct request_queue *q) > { > - spin_lock_irq(q->queue_lock); > + unsigned long flags; > + > + spin_lock_irqsave(q->queue_lock, flags); > queue_flag_clear(QUEUE_FLAG_QUIESCED, q); > - spin_unlock_irq(q->queue_lock); > + spin_unlock_irqrestore(q->queue_lock, flags); > > /* dispatch requests which are inserted during quiescing */ > blk_mq_run_hw_queues(q, true); > diff --git a/include/linux/blk-mq.h b/include/linux/blk-mq.h > index 366b83cee955..23d32ff0b462 100644 > --- a/include/linux/blk-mq.h > +++ b/include/linux/blk-mq.h > @@ -266,15 +266,7 @@ int blk_mq_reinit_tagset(struct blk_mq_tag_set *set); > int blk_mq_map_queues(struct blk_mq_tag_set *set); > void blk_mq_update_nr_hw_queues(struct blk_mq_tag_set *set, int nr_hw_queues); > > -/* > - * FIXME: this helper is just for working around mpt3sas. > - */ > -static inline void blk_mq_quiesce_queue_nowait(struct request_queue *q) > -{ > - spin_lock_irq(q->queue_lock); > - queue_flag_set(QUEUE_FLAG_QUIESCED, q); > - spin_unlock_irq(q->queue_lock); > -} > +void blk_mq_quiesce_queue_nowait(struct request_queue *q); > > /* > * Driver command data is immediately after the request. So subtract request > -- > 2.13.1 > Reviewed-by: Ming Lei Thanks, Ming