On Mon, Sep 20, 2021 at 02:23:41PM -0700, Yang Shi wrote:
On Sun, Sep 19, 2021 at 7:41 AM Matthew Wilcox [off-list ref] wrote:
quoted
On Fri, Sep 17, 2021 at 05:07:03PM -0700, Yang Shi wrote:
quoted
quoted
The debugging showed the page passed to invalidatepage is a huge page
and the length is the size of huge page instead of single page due to
read only FS THP support. But block_invalidatepage() would throw BUG if
the size is greater than single page.
Things have already gone wrong before we get to this point. See
do_dentry_open(). You aren't supposed to be able to get a writable file
descriptor on a file which has had huge pages added to the page cache
without the filesystem's knowledge. That's the problem that needs to
be fixed.
I don't quite understand your point here. Do you mean do_dentry_open()
should fail for such cases instead of truncating the page cache?
No, do_dentry_open() should have truncated the page cache when it was
called and found that there were THPs in the cache. Then khugepaged
should see that someone has the file open for write and decline to create
new THPs. So it shouldn't be possible to get here with THPs in the cache.