| Date | Tue, 19 May 2015 15:54:44 +0200 | From | Vlastimil Babka <> | Subject | Re: [PATCHv5 26/28] thp: introduce deferred_split_huge_page() |
| |
On 04/23/2015 11:04 PM, Kirill A. Shutemov wrote: > Currently we don't split huge page on partial unmap. It's not an ideal > situation. It can lead to memory overhead. > > Furtunately, we can detect partial unmap on page_remove_rmap(). But we > cannot call split_huge_page() from there due to locking context. > > It's also counterproductive to do directly from munmap() codepath: in > many cases we will hit this from exit(2) and splitting the huge page > just to free it up in small pages is not what we really want. > > The patch introduce deferred_split_huge_page() which put the huge page > into queue for splitting. The splitting itself will happen when we get > memory pressure via shrinker interface. The page will be dropped from > list on freeing through compound page destructor. > > Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> > Tested-by: Sasha Levin <sasha.levin@oracle.com>
Acked-by: Vlastimil Babka <vbabka@suse.cz>
> @@ -715,6 +726,12 @@ static inline pmd_t mk_huge_pmd(struct page *page, pgprot_t prot) > return entry; > } > > +void prep_transhuge_page(struct page *page) > +{ > + INIT_LIST_HEAD(&page[2].lru);
Wouldn't hurt to mention that you use page[2] because lru in page 1 would collide with the dtor (right?).
> + set_compound_page_dtor(page, free_transhuge_page); > +} > + > static int __do_huge_pmd_anonymous_page(struct mm_struct *mm, > struct vm_area_struct *vma, > unsigned long haddr, pmd_t *pmd,
|