Hi, When I read Linux Kernel source codes about how "blkio_delay_total" (delay waiting for synchronous block I/O to complete for one task) is calculated in Linux/kernel/delayacct.c file [1], I find that "blkio_delay_total" adds "task->delays->blkio_delay" to be the total delay time for one task to wait for synchronous I/O dynamically but "tsk->delays->blkio_delay" has already been calculated as the total delay time that one task is waiting for synchronous I/O [2] dynamically. I think "blkio_delay_total" should not add "task->delays->blkio_delay" since "task->delays->blkio_delay" is already the total delay time we want.
Am I missing anything? BTW, the patch in the attachment may solve this problem if I don't miss anything. Thank you. [1] http://lxr.free-electrons.com/source/kernel/delayacct.c?v=4.7#L121 [2] http://lxr.free-electrons.com/source/kernel/delayacct.c?v=4.7#L52 Thanks, Weiwei Jia
From 8c290bce66f0ef2b117c8f47a13bbf2d80c500f0 Mon Sep 17 00:00:00 2001 From: Weiwei Jia <harryxi...@gmail.com> Date: Tue, 14 Feb 2017 20:18:34 -0500 Subject: [PATCH] fix the mistake blkio_delay_total calculation way Signed-off-by: Weiwei Jia <harryxi...@gmail.com> --- kernel/delayacct.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/delayacct.c b/kernel/delayacct.c index 435c14a..0d8a6cc 100644 --- a/kernel/delayacct.c +++ b/kernel/delayacct.c @@ -118,7 +118,7 @@ int __delayacct_add_tsk(struct taskstats *d, struct task_struct *tsk) /* zero XXX_total, non-zero XXX_count implies XXX stat overflowed */ spin_lock_irqsave(&tsk->delays->lock, flags); - tmp = d->blkio_delay_total + tsk->delays->blkio_delay; + tmp = tsk->delays->blkio_delay; d->blkio_delay_total = (tmp < d->blkio_delay_total) ? 0 : tmp; tmp = d->swapin_delay_total + tsk->delays->swapin_delay; d->swapin_delay_total = (tmp < d->swapin_delay_total) ? 0 : tmp; -- 2.1.4