On 28 Sep 2020, at 15:34, Matthew Wilcox wrote: > On Mon, Sep 28, 2020 at 01:54:01PM -0400, Zi Yan wrote: >> struct { /* Page table pages */ >> - unsigned long _pt_pad_1; /* compound_head */ >> - pgtable_t pmd_huge_pte; /* protected by page->ptl */ >> + struct llist_head deposit_head; /* pgtable deposit list head */ >> + struct llist_node deposit_node; /* pgtable deposit list node */ > > If you're going to use two pointers anyway, you might as well use a > list_head. But I don't think you need to; you could either use a union > of these or you could use the page_address() of the page to store as > much information as you like! This is intended for depositing pgtable pages hierarchically. PUD THP pgtable page deposit uses it. For a PUD THP, we need to deposit 1 PMD pgtable page and 512 PTE pgtable pages, totally 513 pages. One way is to deposit all of them on a list, but when we split the PUD THP, we need to pull them all out and use one for PMD pgtable page and deposit the rest 512 PTE pgtable pages to PMD page’s pmd_huge_pte. But this mixes PMD pgtable pages and PTE pgtable pages in one list, which can be error prone and also requires extra pgtable page deposit operations during page split. This approach, at the high level, makes a pgtable page’s deposit_head point to a list of lower level pgtable pages, which are linked using deposit_node. For example, we link all 512 PTE pgtable pages using deposit_node and use PMD pgtable page’s deposit_head to point to the PTE page list. In addition, when we deposit the PMD pgtable page, we just point a struct_llist_head to the PMD pgtable page’s deposit_node. When it comes to PUD THP split, we can simply withdraw and use the PMD pgtable page without additional operations, since PTE pgtable pages have already been deposited at the beginning. Let me know if it makes sense to you. I will add the paragraphs above to the commit message. Swapping patch 4 and 5 might also make the change easier to understand since patch 5 use this patch. — Best Regards, Yan Zi