On 7/22/21 1:38 AM, Jane Chu wrote: > > On 7/15/2021 5:52 AM, Joao Martins wrote: >>>> + __init_zone_device_page(page + i, pfn + i, zone_idx, >>>> + nid, pgmap); >>>> + prep_compound_tail(page, i); >>>> + >>>> + /* >>>> + * The first and second tail pages need to >>>> + * initialized first, hence the head page is >>>> + * prepared last. >>> I'd change this comment to say why rather than restate what can be >>> gleaned from the code. It's actually not clear to me why this order is >>> necessary. >>> >> So the first tail page stores mapcount_ptr and compound order, and the >> second tail page stores pincount_ptr. prep_compound_head() does this: >> >> set_compound_order(page, order); >> atomic_set(compound_mapcount_ptr(page), -1); >> if (hpage_pincount_available(page)) >> atomic_set(compound_pincount_ptr(page), 0); >> >> So we need those tail pages initialized first prior to initializing the head. >> >> I can expand the comment above to make it clear why we need first and second tail pages. >> > > Perhaps just say > The reason prep_compound_head() is called after the 1st and 2nd tail > pages have been initialized is: so it overwrites some of the tail page > fields setup by __init_zone_device_page(), rather than the other way > around. > ? Yeap, something along those lines is what I was thinking. Perhaps explicitly mentioning the struct page fields that 1st and 2nd tail pages store to avoid the reader thinking it's arbitrarily picked. Joao