Messages in this thread |  | | Date | Fri, 1 Jul 2022 16:00:59 +0800 | Subject | Re: [RFC PATCH v3 1/3] mm: Factor out the pagetable pages account into new helper function | From | Baolin Wang <> |
| |
On 6/30/2022 10:11 PM, Mike Rapoport wrote: > On Thu, Jun 30, 2022 at 07:11:14PM +0800, Baolin Wang wrote: >> Factor out the pagetable pages account into new helper functions to avoid >> duplicated code. Meanwhile these helper functions also will be used to >> account pagetable pages which do not need split pagetale lock. >> >> Meanwhile convert to use mod_lruvec_page_state() in case of non-order-0 >> page table allocation. > > These are *very* rare. I think only parisc may have non-order-0 pmd and pud > tables.
s390 also has non-order-0 page table allocation, but they both do not use the generic page table allocation now.
> With that, I'd suggest making use of compound_nr() build time opt-in.
After more thinking, I'd prefer to change back to use inc_lruvec_page_state()/dec_lruvec_page_state(), since now no architecures will need non-order-0 page table allocation.
After this patchset, I plan to convert parisc and s390 to use generic pagetable allocation, then I will add non-order-0 page table allocation support. Like Matthew suggested, maybe I need change the API to pass the number of pages.
>> Signed-off-by: Baolin Wang <baolin.wang@linux.alibaba.com> >> --- >> include/linux/mm.h | 24 ++++++++++++++++-------- >> 1 file changed, 16 insertions(+), 8 deletions(-) >> >> diff --git a/include/linux/mm.h b/include/linux/mm.h >> index a2270e3..3be6d2c 100644 >> --- a/include/linux/mm.h >> +++ b/include/linux/mm.h >> @@ -2353,20 +2353,30 @@ static inline void pgtable_init(void) >> pgtable_cache_init(); >> } >> >> +static inline void pgtable_page_inc(struct page *page) >> +{ >> + __SetPageTable(page); >> + mod_lruvec_page_state(page, NR_PAGETABLE, compound_nr(page)); >> +} >> + >> +static inline void pgtable_page_dec(struct page *page) >> +{ >> + __ClearPageTable(page); >> + mod_lruvec_page_state(page, NR_PAGETABLE, -compound_nr(page)); >> +} >> + >> static inline bool pgtable_pte_page_ctor(struct page *page) >> { >> if (!ptlock_init(page)) >> return false; >> - __SetPageTable(page); >> - inc_lruvec_page_state(page, NR_PAGETABLE); >> + pgtable_page_inc(page); >> return true; >> } >> >> static inline void pgtable_pte_page_dtor(struct page *page) >> { >> ptlock_free(page); >> - __ClearPageTable(page); >> - dec_lruvec_page_state(page, NR_PAGETABLE); >> + pgtable_page_dec(page); >> } >> >> #define pte_offset_map_lock(mm, pmd, address, ptlp) \ >> @@ -2452,16 +2462,14 @@ static inline bool pgtable_pmd_page_ctor(struct page *page) >> { >> if (!pmd_ptlock_init(page)) >> return false; >> - __SetPageTable(page); >> - inc_lruvec_page_state(page, NR_PAGETABLE); >> + pgtable_page_inc(page); >> return true; >> } >> >> static inline void pgtable_pmd_page_dtor(struct page *page) >> { >> pmd_ptlock_free(page); >> - __ClearPageTable(page); >> - dec_lruvec_page_state(page, NR_PAGETABLE); >> + pgtable_page_dec(page); >> } >> >> /* >> -- >> 1.8.3.1 >> >
|  |