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?
- ret = split_huge_page(page); unlock_page(page); put_page(page);
if (ret) {
/* split failed: leave it on the list */
iput(inode);
continue;
}
/* If split failed leave the inode on the list */
if (ret)
goto leave;
split++; drop: list_del_init(&info->shrinklist); removed++; +leave: iput(inode); } -- 2.16.1