RE: [PATCH -next] mm/filemap: fix that first page is not mark accessed in filemap_read()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




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 <willy@xxxxxxxxxxxxx>
收件人:yukuai (C) <yukuai3@xxxxxxxxxx>
抄 送:akpm <akpm@xxxxxxxxxxxxxxxxxxxx>;kent.overstreet <kent.overstreet@xxxxxxxxx>;axboe <axboe@xxxxxxxxx>;linux-fsdevel <linux-fsdevel@xxxxxxxxxxxxxxx>;linux-mm <linux-mm@xxxxxxxxx>;LKML <linux-kernel@xxxxxxxxxxxxxxx>;zhangyi (F) <yi.zhang@xxxxxxxxxx>
时 间: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


[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux