Messages in this thread | | | Date | Tue, 31 Oct 2006 10:27:02 +0530 | From | Ravi Krishnamurthy <> | Subject | Re: Block driver freezes when using CFQ |
| |
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.
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?
Thanks, Ravi. - 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/
| |