[dm-devel] rqdm: bad usage of dm_get/dm_put (Was: Re: dm mpath: fix stall when requeueing io)
Kiyoshi Ueda
k-ueda at ct.jp.nec.com
Thu Feb 25 07:04:35 UTC 2010
Hi Mikulas,
On 02/25/2010 07:33 AM +0900, Mikulas Patocka wrote:
>> Indeed, we shouldn't use the current dm_put() in any interrupt-context.
>> But the "mapped_device" can disappear in request-based dm while there
>> is a request after all bios complete, so I used dm_get()/dm_put() there.
>> I'll consider another way to prevent the problem without dm_get()/dm_put().
>> E.g. wait for request completion in dm_put() instead.
>
> How can a request-in-progress exists when all the bios complete and the
> device is closed?
In the current request-based dm, the device opener can remove
the mapped_device while the last request is still completing,
because bios in the last request complete first and then the device
opener can remove the mapped_device before the last request completes:
CPU0 CPU1
======================================================================
<<INTERRUPT>>
blk_end_request_all(clone_rq)
blk_update_request(clone_rq)
bio_endio(clone_bio) == end_clone_bio
blk_update_request(orig_rq)
bio_endio(orig_bio)
<<I/O completed>>
dm_blk_close()
dev_remove()
dm_put(md)
<<Free md>>
blk_finish_request(clone_rq)
....
dm_end_request(clone_rq)
free_rq_clone(clone_rq)
blk_end_request_all(orig_rq)
rq_completed(md)
So we need a mechanism to defer the md deletion until the last request
completes.
Thanks,
Kiyoshi Ueda
More information about the dm-devel
mailing list