From b20b789d09797257fed6df6c306b9fd50fca16fa Mon Sep 17 00:00:00 2001 From: Vivek Goyal Date: Tue, 22 Mar 2011 21:54:29 +0100 Subject: [PATCH] --- yaml --- r: 242301 b: refs/heads/master c: 04521db04e9a11e74b0252d222051cb194487f4d h: refs/heads/master i: 242299: f0ea02f03acec642819bfa3bce580beb65d14330 v: v3 --- [refs] | 2 +- trunk/block/blk-throttle.c | 25 ++++++++++++++++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 2c5c30540bef..11fbf09e1e9e 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 9026e521c0da0731eb31f9f9022dd00cc3cd8885 +refs/heads/master: 04521db04e9a11e74b0252d222051cb194487f4d diff --git a/trunk/block/blk-throttle.c b/trunk/block/blk-throttle.c index 37abbfc68590..5352bdafbcf0 100644 --- a/trunk/block/blk-throttle.c +++ b/trunk/block/blk-throttle.c @@ -756,6 +756,15 @@ static void throtl_process_limit_change(struct throtl_data *td) " riops=%u wiops=%u", tg->bps[READ], tg->bps[WRITE], tg->iops[READ], tg->iops[WRITE]); + /* + * Restart the slices for both READ and WRITES. It + * might happen that a group's limit are dropped + * suddenly and we don't want to account recently + * dispatched IO with new low rate + */ + throtl_start_new_slice(td, tg, 0); + throtl_start_new_slice(td, tg, 1); + if (throtl_tg_on_rr(tg)) tg_update_disptime(td, tg); } @@ -821,7 +830,8 @@ throtl_schedule_delayed_work(struct throtl_data *td, unsigned long delay) struct delayed_work *dwork = &td->throtl_work; - if (total_nr_queued(td) > 0) { + /* schedule work if limits changed even if no bio is queued */ + if (total_nr_queued(td) > 0 || td->limits_changed) { /* * We might have a work scheduled to be executed in future. * Cancel that and schedule a new one. @@ -1002,6 +1012,19 @@ int blk_throtl_bio(struct request_queue *q, struct bio **biop) /* Bio is with-in rate limit of group */ if (tg_may_dispatch(td, tg, bio, NULL)) { throtl_charge_bio(tg, bio); + + /* + * We need to trim slice even when bios are not being queued + * otherwise it might happen that a bio is not queued for + * a long time and slice keeps on extending and trim is not + * called for a long time. Now if limits are reduced suddenly + * we take into account all the IO dispatched so far at new + * low rate and * newly queued IO gets a really long dispatch + * time. + * + * So keep on trimming slice even if bio is not queued. + */ + throtl_trim_slice(td, tg, rw); goto out; }