linux-raid.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] Fix deadlock with request based dm and some drivers
@ 2012-11-06 11:29 Jens Axboe
  2012-11-06 12:14 ` Jun'ichi Nomura
  0 siblings, 1 reply; 7+ messages in thread
From: Jens Axboe @ 2012-11-06 11:29 UTC (permalink / raw)
  To: Alasdair Kergon, linux-raid@vger.kernel.org

Hi Alasdair,

I recently fixed a deadlock for a customer we have with
the below patch. I have queued it up in my tree as not
to lose it. Can I have an ack from you, or do you want
to submit it yourself? I've marked it stable as well.


From 8ca211056519ac06bc96fb134dca1f8eb2141407 Mon Sep 17 00:00:00 2001
From: Jens Axboe <axboe@kernel.dk>
Date: Tue, 6 Nov 2012 12:24:26 +0100
Subject: [PATCH] dm: fix deadlock with request based dm and queue request_fn
 recursion

Request based dm attempts to re-run the request queue off the
request completion path. If used with a driver that potentially does
end_io from its request_fn, we could deadlock trying to recurse
back into request dispatch. Fix this by punting the request queue
run to kblockd.

Tested to fix a quickly reproducible deadlock in such a scenario.

Cc: stable@kernel.org
Signed-off-by: Jens Axboe <axboe@kernel.dk>
---
 drivers/md/dm.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/drivers/md/dm.c b/drivers/md/dm.c
index 02db918..77e6eff 100644
--- a/drivers/md/dm.c
+++ b/drivers/md/dm.c
@@ -740,8 +740,14 @@ static void rq_completed(struct mapped_device *md, int rw, int run_queue)
 	if (!md_in_flight(md))
 		wake_up(&md->wait);
 
+	/*
+	 * Run this off this callpath, as drivers could invoke end_io while
+	 * inside their request_fn (and holding the queue lock). Calling
+	 * back into ->request_fn() could deadlock attempting to grab the
+	 * queue lock again.
+	 */
 	if (run_queue)
-		blk_run_queue(md->queue);
+		blk_run_queue_async(md->queue);
 
 	/*
 	 * dm_put() must be at the end of this function. See the comment above
-- 
1.7.12.rc3


-- 
Jens Axboe


^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2012-11-07 10:59 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-11-06 11:29 [PATCH] Fix deadlock with request based dm and some drivers Jens Axboe
2012-11-06 12:14 ` Jun'ichi Nomura
2012-11-06 12:35   ` Jens Axboe
2012-11-07  0:15     ` Jun'ichi Nomura
2012-11-07  8:00       ` Jens Axboe
2012-11-07  8:35         ` Jun'ichi Nomura
2012-11-07 10:59           ` [dm-devel] " Alasdair G Kergon

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).