mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-28 06:34:12 +08:00
block: keep q_usage_counter in atomic mode after del_gendisk
Don't switch back to percpu mode to avoid the double RCU grace period when tearing down SCSI devices. After removing the disk only passthrough commands can be send anyway. Suggested-by: Ming Lei <ming.lei@redhat.com> Signed-off-by: Christoph Hellwig <hch@lst.de> Tested-by: Darrick J. Wong <djwong@kernel.org> Link: https://lore.kernel.org/r/20210929071241.934472-6-hch@lst.de Tested-by: Yi Zhang <yi.zhang@redhat.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
8e141f9eb8
commit
aec89dc5d4
@ -188,9 +188,11 @@ void blk_mq_freeze_queue(struct request_queue *q)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(blk_mq_freeze_queue);
|
EXPORT_SYMBOL_GPL(blk_mq_freeze_queue);
|
||||||
|
|
||||||
void blk_mq_unfreeze_queue(struct request_queue *q)
|
void __blk_mq_unfreeze_queue(struct request_queue *q, bool force_atomic)
|
||||||
{
|
{
|
||||||
mutex_lock(&q->mq_freeze_lock);
|
mutex_lock(&q->mq_freeze_lock);
|
||||||
|
if (force_atomic)
|
||||||
|
q->q_usage_counter.data->force_atomic = true;
|
||||||
q->mq_freeze_depth--;
|
q->mq_freeze_depth--;
|
||||||
WARN_ON_ONCE(q->mq_freeze_depth < 0);
|
WARN_ON_ONCE(q->mq_freeze_depth < 0);
|
||||||
if (!q->mq_freeze_depth) {
|
if (!q->mq_freeze_depth) {
|
||||||
@ -199,6 +201,11 @@ void blk_mq_unfreeze_queue(struct request_queue *q)
|
|||||||
}
|
}
|
||||||
mutex_unlock(&q->mq_freeze_lock);
|
mutex_unlock(&q->mq_freeze_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void blk_mq_unfreeze_queue(struct request_queue *q)
|
||||||
|
{
|
||||||
|
__blk_mq_unfreeze_queue(q, false);
|
||||||
|
}
|
||||||
EXPORT_SYMBOL_GPL(blk_mq_unfreeze_queue);
|
EXPORT_SYMBOL_GPL(blk_mq_unfreeze_queue);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -51,6 +51,7 @@ struct blk_flush_queue *blk_alloc_flush_queue(int node, int cmd_size,
|
|||||||
void blk_free_flush_queue(struct blk_flush_queue *q);
|
void blk_free_flush_queue(struct blk_flush_queue *q);
|
||||||
|
|
||||||
void blk_freeze_queue(struct request_queue *q);
|
void blk_freeze_queue(struct request_queue *q);
|
||||||
|
void __blk_mq_unfreeze_queue(struct request_queue *q, bool force_atomic);
|
||||||
void blk_queue_start_drain(struct request_queue *q);
|
void blk_queue_start_drain(struct request_queue *q);
|
||||||
|
|
||||||
#define BIO_INLINE_VECS 4
|
#define BIO_INLINE_VECS 4
|
||||||
|
@ -596,7 +596,8 @@ void del_gendisk(struct gendisk *disk)
|
|||||||
/*
|
/*
|
||||||
* Allow using passthrough request again after the queue is torn down.
|
* Allow using passthrough request again after the queue is torn down.
|
||||||
*/
|
*/
|
||||||
blk_mq_unfreeze_queue(q);
|
blk_queue_flag_clear(QUEUE_FLAG_INIT_DONE, q);
|
||||||
|
__blk_mq_unfreeze_queue(q, true);
|
||||||
|
|
||||||
if (!(disk->flags & GENHD_FL_HIDDEN)) {
|
if (!(disk->flags & GENHD_FL_HIDDEN)) {
|
||||||
sysfs_remove_link(&disk_to_dev(disk)->kobj, "bdi");
|
sysfs_remove_link(&disk_to_dev(disk)->kobj, "bdi");
|
||||||
|
Loading…
Reference in New Issue
Block a user