Messages in this thread | | | Date | Tue, 31 Oct 2006 08:10:40 +0100 | From | Jens Axboe <> | Subject | Re: Block driver freezes when using CFQ |
| |
On Tue, Oct 31 2006, Ravi Krishnamurthy wrote: > Jens Axboe wrote: > >On Sat, Oct 28 2006, Ravi Krishnamurthy wrote: > >>Hi all, > >> > >> I have written a block driver that registers a virtual device and > >>routes requests to appropriate real devices after some re-mapping of > >>the requests. I am testing the driver by creating a filesystem on the > >>virtual device and copying a large number of files on to it. The test > >>causes the device to become unresponsive after some time. After some > >>debugging, I noticed that this happens only if the I/O scheduler being > >>used is CFQ. I have not had any trouble if the scheduler is noop, > >>anticipatory or deadline. The problem occurs on all the kernels I have > >>tested - 2.6.18-rc2, 2.6.18-rc4, 2.6.19-rc3. > >> > > > > > >The io scheduler is not obligated to recall your request handling > >function, _unless_ you have no pending io at the point where > >elv_next_request() returns NULL but there are things pending. > >IOW, when you complete your requests you want to just recall your request > >handling > >function. Just insert something ala: > > > > if (elv_next_request(q)) > > q->request_fn(q); > > > >when you are done completing requests. > > > >Does that fix it? > > I haven't had a chance to test this fix. A workaround I had tried was to > insert these lines at the end of the request function: > if (! elv_queue_empty(q)) > blk_plug_device(q); > > This worked for me. So I assume the fix you have suggested will surely > work.
You don't want to do that. It is the duty of the plugger to unplug the device again, and in your case that is probably deferred to the timer auto-unplug. So don't involve plugging, it's a seperate thing. Just leave the request function when elv_next_request(), and always recall it when you are done completing requests.
> I am curious to know why the problem does not occur when I am using the > anticipatory scheduler. Also, in the suggested fix, is it guaranteed that > elv_next_request() will not return NULL as long as the elevator queue is > not empty?
Perhaps it recalls ->request_fn() more often than it should. If you call
-- Jens Axboe
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |