Messages in this thread | | | Date | Fri, 16 Mar 2018 16:02:00 +0300 | From | "Kirill A. Shutemov" <> | Subject | Re: [PATCH] mm/shmem: Do not wait for lock_page() in shmem_unused_huge_shrink() |
| |
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@suse.com>
Thanks.
> Maybe you should stick > Reported-by: Eric Wheeler <linux-mm@lists.ewheeler.net> > and point to http://lkml.kernel.org/r/alpine.LRH.2.11.1801242349220.30642@mail.ewheeler.net > 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
| |