On Fri, Mar 16, 2018 at 01:58:27PM +0100, Michal Hocko wrote: > 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> Thanks. > 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. Good point. Andrew, do you want me repost with tags integrated? -- Kirill A. Shutemov