Message ID | 20210714193542.21857-3-joao.m.martins@oracle.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | mm, sparse-vmemmap: Introduce compound pagemaps | expand |
On Wed, Jul 14, 2021 at 12:36 PM Joao Martins <joao.m.martins@oracle.com> wrote: > > Split the utility function prep_compound_page() into head and tail > counterparts, and use them accordingly. > > This is in preparation for sharing the storage for / deduplicating > compound page metadata. > > Signed-off-by: Joao Martins <joao.m.martins@oracle.com> > Acked-by: Mike Kravetz <mike.kravetz@oracle.com> Looks good, Reviewed-by: Dan Williams <dan.j.williams@intel.com>
On Thu, Jul 15, 2021 at 3:36 AM Joao Martins <joao.m.martins@oracle.com> wrote: > > Split the utility function prep_compound_page() into head and tail > counterparts, and use them accordingly. > > This is in preparation for sharing the storage for / deduplicating > compound page metadata. > > Signed-off-by: Joao Martins <joao.m.martins@oracle.com> > Acked-by: Mike Kravetz <mike.kravetz@oracle.com> Reviewed-by: Muchun Song <songmuchun@bytedance.com>
On 7/15/21 3:53 AM, Muchun Song wrote: > On Thu, Jul 15, 2021 at 3:36 AM Joao Martins <joao.m.martins@oracle.com> wrote: >> >> Split the utility function prep_compound_page() into head and tail >> counterparts, and use them accordingly. >> >> This is in preparation for sharing the storage for / deduplicating >> compound page metadata. >> >> Signed-off-by: Joao Martins <joao.m.martins@oracle.com> >> Acked-by: Mike Kravetz <mike.kravetz@oracle.com> > > Reviewed-by: Muchun Song <songmuchun@bytedance.com> > Thanks!
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 3b97e17806be..68b5591a69fe 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -730,23 +730,33 @@ void free_compound_page(struct page *page) free_the_page(page, compound_order(page)); } +static void prep_compound_head(struct page *page, unsigned int order) +{ + set_compound_page_dtor(page, COMPOUND_PAGE_DTOR); + set_compound_order(page, order); + atomic_set(compound_mapcount_ptr(page), -1); + if (hpage_pincount_available(page)) + atomic_set(compound_pincount_ptr(page), 0); +} + +static void prep_compound_tail(struct page *head, int tail_idx) +{ + struct page *p = head + tail_idx; + + p->mapping = TAIL_MAPPING; + set_compound_head(p, head); +} + void prep_compound_page(struct page *page, unsigned int order) { int i; int nr_pages = 1 << order; __SetPageHead(page); - for (i = 1; i < nr_pages; i++) { - struct page *p = page + i; - p->mapping = TAIL_MAPPING; - set_compound_head(p, page); - } + for (i = 1; i < nr_pages; i++) + prep_compound_tail(page, i); - set_compound_page_dtor(page, COMPOUND_PAGE_DTOR); - set_compound_order(page, order); - atomic_set(compound_mapcount_ptr(page), -1); - if (hpage_pincount_available(page)) - atomic_set(compound_pincount_ptr(page), 0); + prep_compound_head(page, order); } #ifdef CONFIG_DEBUG_PAGEALLOC