[PATCH] ll_rw_blk: prevent huge request allocations

Currently we cap request allocations at q->nr_requests, but we allow a
batching io context to allocate up to 32 more (default setting). This
can flood the queue with request allocations, with only a few batching
processes. The real fix would be to limit the number of batchers, but
as that isn't currently tracked, I suggest we just cap the maximum
number of allocated requests to eg 50% over the limit.

This was observed in real life, users typically see this as vmstat bo
numbers going off the wall with seconds of no queueing afterwards.
Behaviour this bursty is not beneficial.

Signed-off-by: Jens Axboe <axboe@suse.de>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by Jens Axboe and committed by Linus Torvalds 082cf69e f8b58edf

+9
+9
drivers/block/ll_rw_blk.c
··· 1912 1912 } 1913 1913 1914 1914 get_rq: 1915 + /* 1916 + * Only allow batching queuers to allocate up to 50% over the defined 1917 + * limit of requests, otherwise we could have thousands of requests 1918 + * allocated with any setting of ->nr_requests 1919 + */ 1920 + if (rl->count[rw] >= (3 * q->nr_requests / 2)) { 1921 + spin_unlock_irq(q->queue_lock); 1922 + goto out; 1923 + } 1915 1924 rl->count[rw]++; 1916 1925 rl->starved[rw] = 0; 1917 1926 if (rl->count[rw] >= queue_congestion_on_threshold(q))