![]() | |||||||||||||
Messages in this thread |
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/ | ||||||||||||
| Last update: 2006-10-31 07:11 [W:0.172 / U:0.160 seconds] ©2003-2008 Jasper Spaans | |||||||||||||