My apologize for the weird email format, I'm using my cellphone to reply emails, and I'm not able to use my PC now... ________________________________ 发件人:Matthew Wilcox 收件人:yukuai (C) 抄 送:akpm ;kent.overstreet ;axboe ;linux-fsdevel ;linux-mm ;LKML ;zhangyi (F) 时 间:2022-06-03 02:31:08 主 题:Re: [PATCH -next] mm/filemap: fix that first page is not mark accessed in filemap_read() On Thu, Jun 02, 2022 at 04:21:29PM +0800, Yu Kuai wrote: > In filemap_read(), 'ra->prev_pos' is set to 'iocb->ki_pos + copied', > while it should be 'iocb->ki_ops'. Can you walk me through your reasoning which leads you to believe that it should be ki_pos instead of ki_pos + copied? As I understand it, prev_pos is the end of the previous read, not the beginning of the previous read. For consequence, > folio_mark_accessed() will not be called for 'fbatch.folios[0]' since > 'iocb->ki_pos' is always equal to 'ra->prev_pos'. I don't follow this, but maybe I'm just being slow. ----------------------------------------------------------- Hi, This is because we found that the behavior of small io sequential read is different from v4.19 to v5.10. At first, when mark_page_accessed() is called the second time, the page will be moved to active list, thus when reading same file the second time, performance will drop a little. However, in v5.10 we found that when reading the file by 4k, performance is always good, and when reading by 1m, performance will drop at second read like v4.19. The root cause is the following judgement: ki_pos >> PAGE_SHIFT != pre_pos >> PAGE_SHIFT The former should represent current page, while the latter should represent previous page. For example, ki_pos = 0, after reading page 0, pre_pos will set to 4k. Thus in the next read of page 1, current page and previous page will both be 1, and page 1 won't mark accessed. Set pre_pos to the end of previous read is ok, however I think it should be ki_pos + copied - 1. Thanks, Kuai