summaryrefslogtreecommitdiffstats
path: root/block
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2020-09-18 02:44:54 +0200
committerJens Axboe <axboe@kernel.dk>2020-09-25 16:35:02 +0200
commitd95178410b7706844491efb77fb0a37a69f7a5e6 (patch)
tree7798e50745e783b2ab79ecd91f52c3fe74a8f2de /block
parentiocost: replace nr_shortages cond in ioc_forgive_debts() with busy_level one (diff)
downloadlinux-d95178410b7706844491efb77fb0a37a69f7a5e6.tar.xz
linux-d95178410b7706844491efb77fb0a37a69f7a5e6.zip
iocost: recalculate delay after debt reduction
Debt sets the initial delay duration which is decayed over time. The current debt reduction halved the debt but didn't change the delay. It prevented future debts from increasing delay but didn't do anything to lower the existing delay, limiting the mechanism's ability to reduce unnecessary idling. Reset iocg->delay to 0 after debt reduction so that iocg_kick_waitq() recalculates new delay value based on the reduced debt amount. Signed-off-by: Tejun Heo <tj@kernel.org> Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'block')
-rw-r--r--block/blk-iocost.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/block/blk-iocost.c b/block/blk-iocost.c
index c0499c294da9..ffcb78126ab7 100644
--- a/block/blk-iocost.c
+++ b/block/blk-iocost.c
@@ -1984,7 +1984,8 @@ static void transfer_surpluses(struct list_head *surpluses, struct ioc_now *now)
* up blocked paying its debt while the IO device is idle.
*
* The following protects against such cases. If the device has been
- * sufficiently idle for a while, the debts are halved.
+ * sufficiently idle for a while, the debts are halved and delays are
+ * recalculated.
*/
static void ioc_forgive_debts(struct ioc *ioc, u64 usage_us_sum, int nr_debtors,
struct ioc_now *now)
@@ -2002,6 +2003,7 @@ static void ioc_forgive_debts(struct ioc *ioc, u64 usage_us_sum, int nr_debtors,
if (iocg->abs_vdebt) {
spin_lock(&iocg->waitq.lock);
iocg->abs_vdebt /= 2;
+ iocg->delay = 0; /* kick_waitq will recalc */
iocg_kick_waitq(iocg, true, now);
spin_unlock(&iocg->waitq.lock);
}