X-Git-Url: https://git.karo-electronics.de/?a=blobdiff_plain;f=drivers%2Fnvme%2Fhost%2Fcore.c;fp=drivers%2Fnvme%2Fhost%2Fcore.c;h=27130056136b6addf0ecd8ca5b52f245c2120ecd;hb=363c9aacb6c59bb63148dd115632880a4aed4d88;hp=1437ff36e91cf479b6ab15741ed1d87501de6562;hpb=c89e5b80245899fc51fb1d83880e2f5762fcf350;p=karo-tx-linux.git diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index 1437ff36e91c..27130056136b 100644 --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c @@ -1328,6 +1328,34 @@ out: return ret; } +void nvme_freeze_queues(struct nvme_ctrl *ctrl) +{ + struct nvme_ns *ns; + + list_for_each_entry(ns, &ctrl->namespaces, list) { + blk_mq_freeze_queue_start(ns->queue); + + spin_lock_irq(ns->queue->queue_lock); + queue_flag_set(QUEUE_FLAG_STOPPED, ns->queue); + spin_unlock_irq(ns->queue->queue_lock); + + blk_mq_cancel_requeue_work(ns->queue); + blk_mq_stop_hw_queues(ns->queue); + } +} + +void nvme_unfreeze_queues(struct nvme_ctrl *ctrl) +{ + struct nvme_ns *ns; + + list_for_each_entry(ns, &ctrl->namespaces, list) { + queue_flag_clear_unlocked(QUEUE_FLAG_STOPPED, ns->queue); + blk_mq_unfreeze_queue(ns->queue); + blk_mq_start_stopped_hw_queues(ns->queue, true); + blk_mq_kick_requeue_list(ns->queue); + } +} + int __init nvme_core_init(void) { int result;