On Fri 16-03-18 15:25:08, Kirill A. Shutemov wrote: > 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, > > > + page = find_get_page(inode->i_mapping, > > > (inode->i_size & HPAGE_PMD_MASK) >> PAGE_SHIFT); > > > if (!page) > > > goto drop; > > > > > > + /* No huge page at the end of the file: nothing to split */ > > > if (!PageTransHuge(page)) { > > > - 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. Good, I thought so but wasn't really 100% sure. Thanks for the clarification and feel free to add Acked-by: Michal Hocko <mhocko@xxxxxxxx> Maybe you should stick Reported-by: Eric Wheeler <linux-mm@xxxxxxxxxxxxxxxxxx> and point to http://lkml.kernel.org/r/alpine.LRH.2.11.1801242349220.30642@xxxxxxxxxxxxxxxxx because that smells like a bug that this patch would be fixing. -- Michal Hocko SUSE Labs