Patch "virtio-blk: don't keep queue frozen during system suspend" 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

    virtio-blk: don't keep queue frozen during system suspend

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:
     virtio-blk-don-t-keep-queue-frozen-during-system-sus.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 c8491114f84b7a6436266b025c0d5c3aec53e034
Author: Ming Lei <ming.lei@xxxxxxxxxx>
Date:   Tue Nov 12 20:58:21 2024 +0800

    virtio-blk: don't keep queue frozen during system suspend
    
    [ Upstream commit 7678abee0867e6b7fb89aa40f6e9f575f755fb37 ]
    
    Commit 4ce6e2db00de ("virtio-blk: Ensure no requests in virtqueues before
    deleting vqs.") replaces queue quiesce with queue freeze in virtio-blk's
    PM callbacks. And the motivation is to drain inflight IOs before suspending.
    
    block layer's queue freeze looks very handy, but it is also easy to cause
    deadlock, such as, any attempt to call into bio_queue_enter() may run into
    deadlock if the queue is frozen in current context. There are all kinds
    of ->suspend() called in suspend context, so keeping queue frozen in the
    whole suspend context isn't one good idea. And Marek reported lockdep
    warning[1] caused by virtio-blk's freeze queue in virtblk_freeze().
    
    [1] https://lore.kernel.org/linux-block/ca16370e-d646-4eee-b9cc-87277c89c43c@xxxxxxxxxxx/
    
    Given the motivation is to drain in-flight IOs, it can be done by calling
    freeze & unfreeze, meantime restore to previous behavior by keeping queue
    quiesced during suspend.
    
    Cc: Yi Sun <yi.sun@xxxxxxxxxx>
    Cc: Michael S. Tsirkin <mst@xxxxxxxxxx>
    Cc: Jason Wang <jasowang@xxxxxxxxxx>
    Cc: Stefan Hajnoczi <stefanha@xxxxxxxxxx>
    Cc: virtualization@xxxxxxxxxxxxxxx
    Reported-by: Marek Szyprowski <m.szyprowski@xxxxxxxxxxx>
    Signed-off-by: Ming Lei <ming.lei@xxxxxxxxxx>
    Acked-by: Stefan Hajnoczi <stefanha@xxxxxxxxxx>
    Link: https://lore.kernel.org/r/20241112125821.1475793-1-ming.lei@xxxxxxxxxx
    Signed-off-by: Jens Axboe <axboe@xxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c
index 997106fe73e4..65a1f1576e55 100644
--- a/drivers/block/virtio_blk.c
+++ b/drivers/block/virtio_blk.c
@@ -1624,9 +1624,12 @@ static void virtblk_remove(struct virtio_device *vdev)
 static int virtblk_freeze(struct virtio_device *vdev)
 {
 	struct virtio_blk *vblk = vdev->priv;
+	struct request_queue *q = vblk->disk->queue;
 
 	/* Ensure no requests in virtqueues before deleting vqs. */
-	blk_mq_freeze_queue(vblk->disk->queue);
+	blk_mq_freeze_queue(q);
+	blk_mq_quiesce_queue_nowait(q);
+	blk_mq_unfreeze_queue(q);
 
 	/* Ensure we don't receive any more interrupts */
 	virtio_reset_device(vdev);
@@ -1650,8 +1653,8 @@ static int virtblk_restore(struct virtio_device *vdev)
 		return ret;
 
 	virtio_device_ready(vdev);
+	blk_mq_unquiesce_queue(vblk->disk->queue);
 
-	blk_mq_unfreeze_queue(vblk->disk->queue);
 	return 0;
 }
 #endif




[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