RDMA/ib_srp: Fix a deadlock
authorBart Van Assche <bvanassche@acm.org>
Tue, 15 Feb 2022 21:05:11 +0000 (13:05 -0800)
committerJason Gunthorpe <jgg@nvidia.com>
Wed, 23 Feb 2022 19:03:58 +0000 (15:03 -0400)
Remove the flush_workqueue(system_long_wq) call since flushing
system_long_wq is deadlock-prone and since that call is redundant with a
preceding cancel_work_sync()

Link: https://lore.kernel.org/r/20220215210511.28303-3-bvanassche@acm.org
Fixes: ef6c49d87c34 ("IB/srp: Eliminate state SRP_TARGET_DEAD")
Reported-by: syzbot+831661966588c802aae9@syzkaller.appspotmail.com
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Reviewed-by: Leon Romanovsky <leonro@nvidia.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/infiniband/ulp/srp/ib_srp.c

index e174e853f8a40cb9fa10ae71632dac50d663ae18..285b766e4e7049b11b776909c0ca470c5ad18cc8 100644 (file)
@@ -4047,9 +4047,11 @@ static void srp_remove_one(struct ib_device *device, void *client_data)
                spin_unlock(&host->target_lock);
 
                /*
-                * Wait for tl_err and target port removal tasks.
+                * srp_queue_remove_work() queues a call to
+                * srp_remove_target(). The latter function cancels
+                * target->tl_err_work so waiting for the remove works to
+                * finish is sufficient.
                 */
-               flush_workqueue(system_long_wq);
                flush_workqueue(srp_remove_wq);
 
                kfree(host);