Commit 6b6f6c41 authored by Ming Lei's avatar Ming Lei Committed by Jens Axboe
Browse files

nvme: core: switch to non_owner variant of start_freeze/unfreeze queue



nvme_start_freeze() and nvme_unfreeze() may be called from same context,
so switch them to call non_owner variant of start_freeze/unfreeze queue.

Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarMing Lei <ming.lei@redhat.com>
Link: https://lore.kernel.org/r/20241025003722.3630252-3-ming.lei@redhat.com


Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 8acdd0e7
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -4864,7 +4864,7 @@ void nvme_unfreeze(struct nvme_ctrl *ctrl)

	srcu_idx = srcu_read_lock(&ctrl->srcu);
	list_for_each_entry_rcu(ns, &ctrl->namespaces, list)
		blk_mq_unfreeze_queue(ns->queue);
		blk_mq_unfreeze_queue_non_owner(ns->queue);
	srcu_read_unlock(&ctrl->srcu, srcu_idx);
	clear_bit(NVME_CTRL_FROZEN, &ctrl->flags);
}
@@ -4906,7 +4906,12 @@ void nvme_start_freeze(struct nvme_ctrl *ctrl)
	set_bit(NVME_CTRL_FROZEN, &ctrl->flags);
	srcu_idx = srcu_read_lock(&ctrl->srcu);
	list_for_each_entry_rcu(ns, &ctrl->namespaces, list)
		blk_freeze_queue_start(ns->queue);
		/*
		 * Typical non_owner use case is from pci driver, in which
		 * start_freeze is called from timeout work function, but
		 * unfreeze is done in reset work context
		 */
		blk_freeze_queue_start_non_owner(ns->queue);
	srcu_read_unlock(&ctrl->srcu, srcu_idx);
}
EXPORT_SYMBOL_GPL(nvme_start_freeze);