Patch "ublk: fix AB-BA lockdep warning" has been added to the 6.3-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

    ublk: fix AB-BA lockdep warning

to the 6.3-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:
     ublk-fix-ab-ba-lockdep-warning.patch
and it can be found in the queue-6.3 subdirectory.

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



commit dcc47fe3523c85cc9e828f15f987a3e9dafbec2a
Author: Ming Lei <ming.lei@xxxxxxxxxx>
Date:   Wed May 17 21:34:08 2023 +0800

    ublk: fix AB-BA lockdep warning
    
    [ Upstream commit ac5902f84bb546c64aea02c439c2579cbf40318f ]
    
    When handling UBLK_IO_FETCH_REQ, ctx->uring_lock is grabbed first, then
    ub->mutex is acquired.
    
    When handling UBLK_CMD_STOP_DEV or UBLK_CMD_DEL_DEV, ub->mutex is
    grabbed first, then calling io_uring_cmd_done() for canceling uring
    command, in which ctx->uring_lock may be required.
    
    Real deadlock only happens when all the above commands are issued from
    same uring context, and in reality different uring contexts are often used
    for handing control command and IO command.
    
    Fix the issue by using io_uring_cmd_complete_in_task() to cancel command
    in ublk_cancel_dev(ublk_cancel_queue).
    
    Reported-by: Shinichiro Kawasaki <shinichiro.kawasaki@xxxxxxx>
    Closes: https://lore.kernel.org/linux-block/becol2g7sawl4rsjq2dztsbc7mqypfqko6wzsyoyazqydoasml@rcxarzwidrhk
    Cc: Ziyang Zhang <ZiyangZhang@xxxxxxxxxxxxxxxxx>
    Signed-off-by: Ming Lei <ming.lei@xxxxxxxxxx>
    Tested-by: Shinichiro Kawasaki <shinichiro.kawasaki@xxxxxxx>
    Link: https://lore.kernel.org/r/20230517133408.210944-1-ming.lei@xxxxxxxxxx
    Signed-off-by: Jens Axboe <axboe@xxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c
index 41c35ab2c25a1..4db5f1bcac44a 100644
--- a/drivers/block/ublk_drv.c
+++ b/drivers/block/ublk_drv.c
@@ -1122,6 +1122,11 @@ static inline bool ublk_queue_ready(struct ublk_queue *ubq)
 	return ubq->nr_io_ready == ubq->q_depth;
 }
 
+static void ublk_cmd_cancel_cb(struct io_uring_cmd *cmd, unsigned issue_flags)
+{
+	io_uring_cmd_done(cmd, UBLK_IO_RES_ABORT, 0, issue_flags);
+}
+
 static void ublk_cancel_queue(struct ublk_queue *ubq)
 {
 	int i;
@@ -1133,8 +1138,8 @@ static void ublk_cancel_queue(struct ublk_queue *ubq)
 		struct ublk_io *io = &ubq->ios[i];
 
 		if (io->flags & UBLK_IO_FLAG_ACTIVE)
-			io_uring_cmd_done(io->cmd, UBLK_IO_RES_ABORT, 0,
-						IO_URING_F_UNLOCKED);
+			io_uring_cmd_complete_in_task(io->cmd,
+						      ublk_cmd_cancel_cb);
 	}
 
 	/* all io commands are canceled */



[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