CFQ v2 high cpu load fix(?)

From: Ronny V. Vindenes
Date: Tue Oct 12 2004 - 06:17:29 EST


CFQ v2 is much better in a lot of cases, but certain situations trigger
a cpu load so high it starves the rest of the system thus completely
ruining the interactive experience. While casually looking at the
problem, I stumbled upon a patch by Arjan van de Ven sent to lkml on
sept. 1 (Subject: block fixes). Part of it is already included in the
CFQ v2 patches and after applying the rest[1] I'm no longer able to
trigger the problem.

[1] Patch attached against 2.6.9-rc4-ck1 but applies to rc4-mm1 with
some minor fuzz.

--
Ronny V. Vindenes <s864@xxxxxxxxx>
--- patches/linux-2.6.9-rc4-ck1/drivers/block/ll_rw_blk.c 2004-10-12 12:25:09.798003278 +0200
+++ linux-2.6.9-rc4-ck1/drivers/block/ll_rw_blk.c 2004-10-12 12:25:42.959479479 +0200
@@ -100,7 +100,7 @@
nr = q->nr_requests;
q->nr_congestion_on = nr;

- nr = q->nr_requests - (q->nr_requests / 8) - 1;
+ nr = q->nr_requests - (q->nr_requests / 8) - (q->nr_requests/16)- 1;
if (nr < 1)
nr = 1;
q->nr_congestion_off = nr;
@@ -1758,8 +1758,10 @@
{
DEFINE_WAIT(wait);
struct request *rq;
+ struct io_context *ioc;

generic_unplug_device(q);
+ ioc = get_io_context(GFP_NOIO);
do {
struct request_list *rl = &q->rq;

@@ -1769,7 +1771,6 @@
rq = get_request(q, rw, GFP_NOIO);

if (!rq) {
- struct io_context *ioc;

io_schedule();

@@ -1779,12 +1780,11 @@
* up to a big batch of them for a small period time.
* See ioc_batching, ioc_set_batching
*/
- ioc = get_io_context(GFP_NOIO);
ioc_set_batching(q, ioc);
- put_io_context(ioc);
}
finish_wait(&rl->wait[rw], &wait);
} while (!rq);
+ put_io_context(ioc);

return rq;
}