• Jens Axboe's avatar
    [PATCH] possible rq starvation on oom · 80ce63d3
    Jens Axboe authored
    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.
    
    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.
    Signed-off-by: default avatarJens Axboe <axboe@suse.de>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    80ce63d3
ll_rw_blk.c 85.9 KB