On 10.7.2020 7.51, Alex Shi wrote: > > 在 2020/7/10 上午12:07, Kirill A. Shutemov 写道: >> On Thu, Jul 09, 2020 at 04:50:02PM +0100, Matthew Wilcox wrote: >>> On Thu, Jul 09, 2020 at 11:11:11PM +0800, Alex Shi wrote: >>>> Hi Kirill & Matthew, >>>> >>>> In the func call chain, from split_huge_page() to lru_add_page_tail(), >>>> Seems tail pages are added to lru list at line 963, but in this scenario >>>> the head page has no lru bit and isn't set the bit later. Why we do this? >>>> or do I miss sth? >>> I don't understand how we get to split_huge_page() with a page that's >>> not on an LRU list. Both anonymous and page cache pages should be on >>> an LRU list. What am I missing?> > > Thanks a lot for quick reply! > What I am confusing is the call chain: __iommu_dma_alloc_pages() > to split_huge_page(), in the func, splited page, > page = alloc_pages_node(nid, alloc_flags, order); > And if the pages were added into lru, they maybe reclaimed and lost, > that would be a panic bug. But in fact, this never happened for long time. > Also I put a BUG() at the line, it's nevre triggered in ltp, and run_vmtests In __iommu_dma_alloc_pages, after split_huge_page(), who is taking a reference on tail pages? Seems tail pages are freed and the function errornously returns them in pages[] array for use? > in kselftest. > >> Right, and it's never got removed from LRU during the split. The tail >> pages have to be added to LRU because they now separate from the tail >> page. >> > According to the explaination, looks like we could remove the code path, > since it's never got into. (base on my v15 patchset). Any comments? > > Thanks > Alex > > diff --git a/mm/huge_memory.c b/mm/huge_memory.c > index 7c52c5228aab..c28409509ad3 100644 > --- a/mm/huge_memory.c > +++ b/mm/huge_memory.c > @@ -2357,17 +2357,6 @@ static void lru_add_page_tail(struct page *head, struct page *page_tail, > if (!list) > SetPageLRU(page_tail); > > if (likely(PageLRU(head))) > list_add_tail(&page_tail->lru, &head->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. > - */ > - VM_BUG_ON_PAGE(1, head); > - add_page_to_lru_list_tail(page_tail, lruvec, > - page_lru(page_tail)); > } > }
Attachment:
pEpkey.asc
Description: application/pgp-keys