Re: [PATCH] possible rq starvation on oom

From: Nick Piggin
Date: Thu Jan 13 2005 - 06:19:01 EST


Jens Axboe wrote:
Hi,

I stumbled across this the other day. The block layer only uses a single
memory pool for request allocation, so it's very possible for eg writes
to have allocated them all at any point in time. If that is the case and
the machine is low on memory, a reader attempting to allocate a request
and failing in blk_alloc_request() can get stuck for a long time since
no one is there to wake it up.


Yeah, this would do it for sure. Nice work Jens.

Actually, this could block up requests indefinitely couldn't it?

The solution is either to add the extra mempool so both reads and writes
have one, or attempt to handle the situation. I chose the latter, to
save the extra memory required for the additional mempool with
BLKDEV_MIN_RQ statically allocated requests per-queue.

If a read allocation fails and we have no readers in flight for this
queue, mark us rq-starved so that the next write being freed will wake
up the sleeping reader(s). Same situation would happen for writes as
well of course, it's just a lot more unlikely.


I wonder... could you put failed, starved readers on the writer's
waitqueue and vice versa? AFAIKS this would eliminate special casing
in the fast paths, and also hopefully preserve process ordering.

But either way, it looks like your patch should do the trick as well.

Nick

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/