From: Chunguang Xu <brookxu@xxxxxxxxxxx> Before the wraparound occurs, the value of io_ticks should be monotonically increasing, but we sometimes find that io_ticks will become smaller, which leads to abnormal values in monitoring tools. On the IO submission path, blk_account_io_start() may interrupt the system interruption. When the interruption returns, the value of part->stamp may have been updated by other cores, so the time value now collected before the interruption may be less than part->stamp, and then make the calculated value of io_ticks become smaller. Therefore, when now is less than part->stamp, we should do nothing. Signed-off-by: Chunguang Xu <brookxu@xxxxxxxxxxx> --- block/blk-core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/block/blk-core.c b/block/blk-core.c index 514838c..a5d1cc2 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -1243,7 +1243,7 @@ static void update_io_ticks(struct block_device *part, unsigned long now, unsigned long stamp; again: stamp = READ_ONCE(part->bd_stamp); - if (unlikely(stamp != now)) { + if (unlikely(time_after(now, stamp)) { if (likely(cmpxchg(&part->bd_stamp, stamp, now) == stamp)) __part_stat_add(part, io_ticks, end ? now - stamp : 1); } -- 1.8.3.1