Messages in this thread Patch in this message | | | Subject | CFQ v2 high cpu load fix(?) | From | "Ronny V. Vindenes" <> | Date | Tue, 12 Oct 2004 13:16:00 +0200 |
| |
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@ii.uib.no> --- 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; } | |