Christoph Hellwig wrote on 2021/7/6 13:25: > On Tue, Jul 06, 2021 at 05:47:26AM +0800, brookxu wrote: >> From: Chunguang Xu <brookxu@xxxxxxxxxxx> >> >> 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 collected before the interruption may be less than part-> >> stamp. So when this happens, we should do nothing to make io_ticks >> more accurate? For kernels less than 5.0, this may cause io_ticks >> to become smaller, which in turn may cause abnormal ioutil values. >> >> v3: update the commit log >> v2: sorry, fix compile error due to the missed ')' >> >> Signed-off-by: Chunguang Xu <brookxu@xxxxxxxxxxx> > > The change looks good: > > Reviewed-by: Christoph Hellwig <hch@xxxxxx> > > Although I still have trouble understanding the commit log, especially > the last sentence. Thanks for your time,5b18b5a73760 ("block: delete part_round_stats and switch to less precise counting") Merged in 5.0-rc1. Before that, we relied on in_flight to count the disk's io_ticks,as follows: static void part_round_stats_single(struct request_queue *q, struct hd_struct *part, unsigned long now, unsigned int inflight) { if (inflight) { __part_stat_add(part, time_in_queue, inflight * (now - part->stamp)); __part_stat_add(part, io_ticks, (now - part->stamp)); } part->stamp = now; } The value of io_ticks should increase monotonically before the count wraps around. However, due to the reasons mentioned above, the interrupt on the IO submission path may cause the time obtained before the interrupt to be less than part->stamp after the interrupt returns, resulting in the value of io_ticks becoming smaller than the previous value. If the user task periodically samples /proc/diskstats and calculates ioutil, since io_ticks increases non-monotonously, the difference between adjacent times may be negative, which in turn makes ioutil abnormal.Fortunately, this problem can be easily circumvented.