On Sat, Jul 31, 2021 at 12:39:38AM -0600, Yu Zhao wrote: > +++ b/mm/migrate.c > @@ -168,14 +168,53 @@ void putback_movable_pages(struct list_head *l) > } > } > > +static bool try_to_unmap_clean(struct page_vma_mapped_walk *pvmw, struct page *page) > +{ > + void *addr; > + bool dirty; > + > + VM_BUG_ON_PAGE(PageLRU(page), page); > + VM_BUG_ON_PAGE(PageCompound(page), page); > + VM_BUG_ON_PAGE(!PageAnon(page), page); > + VM_BUG_ON_PAGE(!PageLocked(page), page); > + VM_BUG_ON_PAGE(pte_present(*pvmw->pte), page); > + > + if (PageMlocked(page) || (pvmw->vma->vm_flags & VM_LOCKED)) > + return false; > + > + /* > + * The pmd entry mapping the old thp was flushed and the pte mapping > + * this subpage has been non present. Therefore, this subpage is > + * inaccessible. We don't need to remap it if it contains only zeros. > + */ > + addr = kmap_atomic(page); > + dirty = !!memchr_inv(addr, 0, PAGE_SIZE); > + kunmap_atomic(addr); kmap_local() is preferred now. Also, Linus has a particular hatred for the !! idiom; just compare against NULL.