On Tue, Jul 07, 2020 at 08:00:11PM +0800, Alex Shi wrote: > > > 在 2020/7/7 下午7:46, Alex Shi 写道: > > > > +static void lru_add_page_tail(struct page *page, struct page *page_tail, > > + struct lruvec *lruvec, struct list_head *list) > > +{ > > + VM_BUG_ON_PAGE(!PageHead(page), page); > > + VM_BUG_ON_PAGE(PageCompound(page_tail), page); > > + VM_BUG_ON_PAGE(PageLRU(page_tail), page); > > + lockdep_assert_held(&lruvec_pgdat(lruvec)->lru_lock); > > + > > + if (!list) > > + SetPageLRU(page_tail); > > + > > + if (likely(PageLRU(page))) > > + list_add_tail(&page_tail->lru, &page->lru); > > + else if (list) { > > + /* page reclaim is reclaiming a huge page */ > > + get_page(page_tail); > > + list_add_tail(&page_tail->lru, list); > > + } else { > > + /* > > + * Head page has not yet been counted, as an hpage, > > + * so we must account for each subpage individually. > > + * > > + * Put page_tail on the list at the correct position > > + * so they all end up in order. > > + */ > > + add_page_to_lru_list_tail(page_tail, lruvec, > > + page_lru(page_tail)); > > > I missed some points for this function, since in the call chain: > split_huge_page() to lru_add_page_tail, the head page's lru won't be > set when !PageLRU(head). But the other page_tail are add to lru list here > Is it ok for this situation? It doesn't differ from the situation when some pages are isolated from LRU. Tail page has become completely on its own after __split_huge_page_tail() has completed, it's not tied to the head page. -- Kirill A. Shutemov