Patch "nvme-loop: flush off pending I/O while shutting down loop controller" has been added to the 6.6-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    nvme-loop: flush off pending I/O while shutting down loop controller

to the 6.6-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     nvme-loop-flush-off-pending-i-o-while-shutting-down-.patch
and it can be found in the queue-6.6 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 17c1f21596bedadebff06f58a0969ef95c49cdd8
Author: Nilay Shroff <nilay@xxxxxxxxxxxxx>
Date:   Wed Oct 16 08:33:14 2024 +0530

    nvme-loop: flush off pending I/O while shutting down loop controller
    
    [ Upstream commit c199fac88fe7c749f88a0653e9f621b9f5a71cf1 ]
    
    While shutting down loop controller, we first quiesce the admin/IO queue,
    delete the admin/IO tag-set and then at last destroy the admin/IO queue.
    However it's quite possible that during the window between quiescing and
    destroying of the admin/IO queue, some admin/IO request might sneak in
    and if that happens then we could potentially encounter a hung task
    because shutdown operation can't forward progress until any pending I/O
    is flushed off.
    
    This commit helps ensure that before destroying the admin/IO queue, we
    unquiesce the admin/IO queue so that any outstanding requests, which are
    added after the admin/IO queue is quiesced, are now flushed to its
    completion.
    
    Reviewed-by: Christoph Hellwig <hch@xxxxxx>
    Signed-off-by: Nilay Shroff <nilay@xxxxxxxxxxxxx>
    Signed-off-by: Keith Busch <kbusch@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/nvme/target/loop.c b/drivers/nvme/target/loop.c
index 48d5df054cd02..bd61a1b82c4cd 100644
--- a/drivers/nvme/target/loop.c
+++ b/drivers/nvme/target/loop.c
@@ -265,6 +265,13 @@ static void nvme_loop_destroy_admin_queue(struct nvme_loop_ctrl *ctrl)
 {
 	if (!test_and_clear_bit(NVME_LOOP_Q_LIVE, &ctrl->queues[0].flags))
 		return;
+	/*
+	 * It's possible that some requests might have been added
+	 * after admin queue is stopped/quiesced. So now start the
+	 * queue to flush these requests to the completion.
+	 */
+	nvme_unquiesce_admin_queue(&ctrl->ctrl);
+
 	nvmet_sq_destroy(&ctrl->queues[0].nvme_sq);
 	nvme_remove_admin_tag_set(&ctrl->ctrl);
 }
@@ -297,6 +304,12 @@ static void nvme_loop_destroy_io_queues(struct nvme_loop_ctrl *ctrl)
 		nvmet_sq_destroy(&ctrl->queues[i].nvme_sq);
 	}
 	ctrl->ctrl.queue_count = 1;
+	/*
+	 * It's possible that some requests might have been added
+	 * after io queue is stopped/quiesced. So now start the
+	 * queue to flush these requests to the completion.
+	 */
+	nvme_unquiesce_io_queues(&ctrl->ctrl);
 }
 
 static int nvme_loop_init_io_queues(struct nvme_loop_ctrl *ctrl)




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux