Commit d9517841 authored by Tejun Heo's avatar Tejun Heo Committed by Jens Axboe
Browse files

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: default avatarTejun Heo <tj@kernel.org>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 33a1fe6d
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -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);
			}