We only need to flush wait and indebt stat deltas when the iocg is in these status. Signed-off-by: Chengming Zhou <zhouchengming@xxxxxxxxxxxxx> --- block/blk-iocost.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/block/blk-iocost.c b/block/blk-iocost.c index b1f2305e8032..502425b44475 100644 --- a/block/blk-iocost.c +++ b/block/blk-iocost.c @@ -2174,28 +2174,28 @@ static int ioc_check_iocgs(struct ioc *ioc, struct ioc_now *now) spin_lock(&iocg->waitq.lock); - /* flush wait and indebt stat deltas */ - if (iocg->wait_since) { - iocg->stat.wait_us += now->now - iocg->wait_since; - iocg->wait_since = now->now; - } - if (iocg->indebt_since) { - iocg->stat.indebt_us += - now->now - iocg->indebt_since; - iocg->indebt_since = now->now; - } - if (iocg->indelay_since) { - iocg->stat.indelay_us += - now->now - iocg->indelay_since; - iocg->indelay_since = now->now; - } - if (waitqueue_active(&iocg->waitq) || iocg->abs_vdebt || iocg->delay) { /* might be oversleeping vtime / hweight changes, kick */ iocg_kick_waitq(iocg, true, now); if (iocg->abs_vdebt || iocg->delay) nr_debtors++; + + /* flush wait and indebt stat deltas */ + if (iocg->wait_since) { + iocg->stat.wait_us += now->now - iocg->wait_since; + iocg->wait_since = now->now; + } + if (iocg->indebt_since) { + iocg->stat.indebt_us += + now->now - iocg->indebt_since; + iocg->indebt_since = now->now; + } + if (iocg->indelay_since) { + iocg->stat.indelay_us += + now->now - iocg->indelay_since; + iocg->indelay_since = now->now; + } } else if (iocg_is_idle(iocg)) iocg_deactivate(iocg, now); -- 2.36.1