aboutsummaryrefslogtreecommitdiffstats
path: root/block/blk-timeout.c
diff options
context:
space:
mode:
authorJens Axboe <axboe@fb.com>2014-04-16 13:36:54 -0400
committerJens Axboe <axboe@fb.com>2014-04-16 16:15:25 -0400
commitf793aa53786668c9e0db5900f70f560e99d62fa0 (patch)
tree312275021f0186a58a328ff0882f03bf0cb36e1a /block/blk-timeout.c
parent12120077b2612a243d158605640cd39266906667 (diff)
block: relax when to modify the timeout timer
Since we are now, by default, applying timer slack to expiry times, the logic for when to modify a timer in the block code is suboptimal. The block layer keeps a forward rolling timer per queue for all requests, and modifies this timer if a request has a shorter timeout than what the current expiry time is. However, this breaks down when our rounded timer values get applied slack. Then each new request ends up modifying the timer, since we're still a little in front of the timer + slack. Fix this by allowing a tolerance of HZ / 2, the timeout handling doesn't need to be very precise. This drastically cuts down the number of timer modifications we have to make. Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to 'block/blk-timeout.c')
-rw-r--r--block/blk-timeout.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/block/blk-timeout.c b/block/blk-timeout.c
index d96f7061c6fd..a09e8af8186c 100644
--- a/block/blk-timeout.c
+++ b/block/blk-timeout.c
@@ -199,8 +199,19 @@ void __blk_add_timer(struct request *req, struct list_head *timeout_list)
199 expiry = round_jiffies_up(req->deadline); 199 expiry = round_jiffies_up(req->deadline);
200 200
201 if (!timer_pending(&q->timeout) || 201 if (!timer_pending(&q->timeout) ||
202 time_before(expiry, q->timeout.expires)) 202 time_before(expiry, q->timeout.expires)) {
203 mod_timer(&q->timeout, expiry); 203 unsigned long diff = q->timeout.expires - expiry;
204
205 /*
206 * Due to added timer slack to group timers, the timer
207 * will often be a little in front of what we asked for.
208 * So apply some tolerance here too, otherwise we keep
209 * modifying the timer because expires for value X
210 * will be X + something.
211 */
212 if (diff >= HZ / 2)
213 mod_timer(&q->timeout, expiry);
214 }
204 215
205} 216}
206 217