Re: [PATCH 3/3] mm: don't remap clean subpages when splitting isolated thp
From: Matthew Wilcox <willy@infradead.org>
Date: 2021-08-03 11:26:50
Also in:
lkml
From: Matthew Wilcox <willy@infradead.org>
Date: 2021-08-03 11:26:50
Also in:
lkml
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.