Messages in this thread | | | Date | Fri, 16 Mar 2018 15:25:08 +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: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.
-- Kirill A. Shutemov
| |