Re: [PATCH v2 01/34] mm: Add PAGE_TYPE_OP folio functions
On Thu, May 25, 2023 at 01:38:54PM -0700, Vishal Moola wrote: > On Thu, May 25, 2023 at 1:20 PM Mike Rapoport wrote: > > > > On Thu, May 25, 2023 at 10:00:23AM -0700, Vishal Moola wrote: > > > On Thu, May 25, 2023 at 1:56 AM Mike Rapoport wrote: > > > > > > > > Hi, > > > > > > > > On Mon, May 01, 2023 at 12:27:56PM -0700, Vishal Moola (Oracle) wrote: > > > > > No folio equivalents for page type operations have been defined, so > > > > > define them for later folio conversions. > > > > > > > > Can you please elaborate why would we need folios for page table > > > > descriptors? > > > > > > Thanks for the review! > > > > > > These macros are for callers that care about the page type, i.e. Table and > > > Buddy. Aside from accounting for those cases, the page tables don't use > > > folios. > > > These are more for the cleanliness of those callers. > > > > But why using folio APIs for PageType will be cleaner than using page APIs? > > Do you have an example? > > Ah, for example in mm/memory-failure.c there are a couple uses of PageTable. > Like the line : > if (folio_test_slab(folio) || PageTable(>page) || > folio_test_reserved(folio)) > where that PageTable(>page) can now be written as > folio_test_table(folio) > instead. > > Also there are numerous uses of PageBuddy in mm/compaction.c that will > likely need to be converted to folios as well. ... and you can currently call PageTable() on the second/third/... page of an allocation and it will return false, regardless of what the first page is typed as. For most architectures, this doesn't matter, but /proc/kpageflags will underreport the amount of memory allocated as page tables on architectures which use multi-page allocations for their page tables as there's currently absolutely nothing to indicate the size of the allocation. To fix this, we need to use __GFP_COMP. ___ linux-um mailing list linux-um@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-um
Re: [PATCH v2 01/34] mm: Add PAGE_TYPE_OP folio functions
On Thu, May 25, 2023 at 1:20 PM Mike Rapoport wrote: > > On Thu, May 25, 2023 at 10:00:23AM -0700, Vishal Moola wrote: > > On Thu, May 25, 2023 at 1:56 AM Mike Rapoport wrote: > > > > > > Hi, > > > > > > On Mon, May 01, 2023 at 12:27:56PM -0700, Vishal Moola (Oracle) wrote: > > > > No folio equivalents for page type operations have been defined, so > > > > define them for later folio conversions. > > > > > > Can you please elaborate why would we need folios for page table > > > descriptors? > > > > Thanks for the review! > > > > These macros are for callers that care about the page type, i.e. Table and > > Buddy. Aside from accounting for those cases, the page tables don't use > > folios. > > These are more for the cleanliness of those callers. > > But why using folio APIs for PageType will be cleaner than using page APIs? > Do you have an example? Ah, for example in mm/memory-failure.c there are a couple uses of PageTable. Like the line : if (folio_test_slab(folio) || PageTable(>page) || folio_test_reserved(folio)) where that PageTable(>page) can now be written as folio_test_table(folio) instead. Also there are numerous uses of PageBuddy in mm/compaction.c that will likely need to be converted to folios as well. ___ linux-um mailing list linux-um@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-um
Re: [PATCH v2 01/34] mm: Add PAGE_TYPE_OP folio functions
On Thu, May 25, 2023 at 10:00:23AM -0700, Vishal Moola wrote: > On Thu, May 25, 2023 at 1:56 AM Mike Rapoport wrote: > > > > Hi, > > > > On Mon, May 01, 2023 at 12:27:56PM -0700, Vishal Moola (Oracle) wrote: > > > No folio equivalents for page type operations have been defined, so > > > define them for later folio conversions. > > > > Can you please elaborate why would we need folios for page table > > descriptors? > > Thanks for the review! > > These macros are for callers that care about the page type, i.e. Table and > Buddy. Aside from accounting for those cases, the page tables don't use > folios. > These are more for the cleanliness of those callers. But why using folio APIs for PageType will be cleaner than using page APIs? Do you have an example? -- Sincerely yours, Mike. ___ linux-um mailing list linux-um@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-um
Re: [PATCH v2 01/34] mm: Add PAGE_TYPE_OP folio functions
On Thu, May 25, 2023 at 1:56 AM Mike Rapoport wrote: > > Hi, > > On Mon, May 01, 2023 at 12:27:56PM -0700, Vishal Moola (Oracle) wrote: > > No folio equivalents for page type operations have been defined, so > > define them for later folio conversions. > > Can you please elaborate why would we need folios for page table descriptors? Thanks for the review! These macros are for callers that care about the page type, i.e. Table and Buddy. Aside from accounting for those cases, the page tables don't use folios. These are more for the cleanliness of those callers. ___ linux-um mailing list linux-um@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-um
Re: [PATCH v2 01/34] mm: Add PAGE_TYPE_OP folio functions
Hi, On Mon, May 01, 2023 at 12:27:56PM -0700, Vishal Moola (Oracle) wrote: > No folio equivalents for page type operations have been defined, so > define them for later folio conversions. Can you please elaborate why would we need folios for page table descriptors? > Also changes the Page##uname macros to take in const struct page* since > we only read the memory here. > > Signed-off-by: Vishal Moola (Oracle) > --- > include/linux/page-flags.h | 20 ++-- > 1 file changed, 18 insertions(+), 2 deletions(-) > > diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h > index 1c68d67b832f..607b495d1b57 100644 > --- a/include/linux/page-flags.h > +++ b/include/linux/page-flags.h > @@ -902,6 +902,8 @@ static inline bool is_page_hwpoison(struct page *page) > > #define PageType(page, flag) \ > ((page->page_type & (PAGE_TYPE_BASE | flag)) == PAGE_TYPE_BASE) > +#define folio_test_type(folio, flag) \ > + ((folio->page.page_type & (PAGE_TYPE_BASE | flag)) == PAGE_TYPE_BASE) > > static inline int page_type_has_type(unsigned int page_type) > { > @@ -914,20 +916,34 @@ static inline int page_has_type(struct page *page) > } > > #define PAGE_TYPE_OPS(uname, lname) \ > -static __always_inline int Page##uname(struct page *page)\ > +static __always_inline int Page##uname(const struct page *page) > \ > {\ > return PageType(page, PG_##lname); \ > }\ > +static __always_inline int folio_test_##lname(const struct folio *folio)\ > +{\ > + return folio_test_type(folio, PG_##lname); \ > +}\ > static __always_inline void __SetPage##uname(struct page *page) > \ > {\ > VM_BUG_ON_PAGE(!PageType(page, 0), page); \ > page->page_type &= ~PG_##lname; \ > }\ > +static __always_inline void __folio_set_##lname(struct folio *folio) \ > +{\ > + VM_BUG_ON_FOLIO(!folio_test_type(folio, 0), folio); \ > + folio->page.page_type &= ~PG_##lname; \ > +}\ > static __always_inline void __ClearPage##uname(struct page *page)\ > {\ > VM_BUG_ON_PAGE(!Page##uname(page), page); \ > page->page_type |= PG_##lname; \ > -} > +}\ > +static __always_inline void __folio_clear_##lname(struct folio *folio) > \ > +{\ > + VM_BUG_ON_FOLIO(!folio_test_##lname(folio), folio); \ > + folio->page.page_type |= PG_##lname;\ > +}\ > > /* > * PageBuddy() indicates that the page is free and in the buddy system > -- > 2.39.2 > > -- Sincerely yours, Mike. ___ linux-um mailing list linux-um@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-um
[PATCH v2 01/34] mm: Add PAGE_TYPE_OP folio functions
No folio equivalents for page type operations have been defined, so define them for later folio conversions. Also changes the Page##uname macros to take in const struct page* since we only read the memory here. Signed-off-by: Vishal Moola (Oracle) --- include/linux/page-flags.h | 20 ++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h index 1c68d67b832f..607b495d1b57 100644 --- a/include/linux/page-flags.h +++ b/include/linux/page-flags.h @@ -902,6 +902,8 @@ static inline bool is_page_hwpoison(struct page *page) #define PageType(page, flag) \ ((page->page_type & (PAGE_TYPE_BASE | flag)) == PAGE_TYPE_BASE) +#define folio_test_type(folio, flag) \ + ((folio->page.page_type & (PAGE_TYPE_BASE | flag)) == PAGE_TYPE_BASE) static inline int page_type_has_type(unsigned int page_type) { @@ -914,20 +916,34 @@ static inline int page_has_type(struct page *page) } #define PAGE_TYPE_OPS(uname, lname)\ -static __always_inline int Page##uname(struct page *page) \ +static __always_inline int Page##uname(const struct page *page) \ { \ return PageType(page, PG_##lname); \ } \ +static __always_inline int folio_test_##lname(const struct folio *folio)\ +{ \ + return folio_test_type(folio, PG_##lname); \ +} \ static __always_inline void __SetPage##uname(struct page *page) \ { \ VM_BUG_ON_PAGE(!PageType(page, 0), page); \ page->page_type &= ~PG_##lname; \ } \ +static __always_inline void __folio_set_##lname(struct folio *folio) \ +{ \ + VM_BUG_ON_FOLIO(!folio_test_type(folio, 0), folio); \ + folio->page.page_type &= ~PG_##lname; \ +} \ static __always_inline void __ClearPage##uname(struct page *page) \ { \ VM_BUG_ON_PAGE(!Page##uname(page), page); \ page->page_type |= PG_##lname; \ -} +} \ +static __always_inline void __folio_clear_##lname(struct folio *folio) \ +{ \ + VM_BUG_ON_FOLIO(!folio_test_##lname(folio), folio); \ + folio->page.page_type |= PG_##lname;\ +} \ /* * PageBuddy() indicates that the page is free and in the buddy system -- 2.39.2 ___ linux-um mailing list linux-um@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-um