On Fri, Mar 16, 2018 at 01:13:03PM +0100, Michal Hocko wrote:
On Fri 16-03-18 13:59:08, Kirill A. Shutemov wrote: [..]
@@ -498,31 +498,42 @@ static unsigned long shmem_unused_huge_shrink(struct shmem_sb_info *sbinfo, continue; }
page = find_lock_page(inode->i_mapping,
if (!page) goto drop;page = find_get_page(inode->i_mapping, (inode->i_size & HPAGE_PMD_MASK) >> PAGE_SHIFT);
if (!PageTransHuge(page)) {/* No huge page at the end of the file: nothing to split */
}unlock_page(page); put_page(page); goto drop;
/*
* Leave the inode on the list if we failed to lock
* the page at this time.
*
* Waiting for the lock may lead to deadlock in the
* reclaim path.
*/
if (!trylock_page(page)) {
put_page(page);
goto leave;
}
Can somebody split the huge page after the PageTransHuge check and before we lock it?
Nope. Pin on the page is enough to prevent split.