Re: [PATCH v1 12/36] mm: simplify folio_page() and folio_page_idx()
Wei Yang <[email protected]>
| Newsgroups | com.zx2c4.lists.wireguard,dev.linux.lists.iommu,dev.linux.lists.virtualization,org.freedesktop.lists.dri-devel,org.freedesktop.lists.intel-gfx,org.infradead.lists.linux-arm-kernel,org.infradead.lists.linux-riscv,org.kernel.vger.io-uring,org.kernel.vger.kvm,org.kernel.vger.linux-crypto,org.kernel.vger.linux-ide,org.kernel.vger.linux-kernel,org.kernel.vger.linux-kselftest,org.kernel.vger.linux-mips,org.kernel.vger.linux-mmc,org.kernel.vger.linux-s390,org.kernel.vger.linux-scsi,org.kernel.vger.netdev,org.kvack.linux-mm |
|---|---|
| Message-ID | <20250828074356.3xiuqugokg36yuxw@master> |
On Thu, Aug 28, 2025 at 12:01:16AM +0200, David Hildenbrand wrote: >Now that a single folio/compound page can no longer span memory sections >in problematic kernel configurations, we can stop using nth_page(). > >While at it, turn both macros into static inline functions and add >kernel doc for folio_page_idx(). > >Reviewed-by: Zi Yan <[email protected]> >Signed-off-by: David Hildenbrand <[email protected]> Reviewed-by: Wei Yang <[email protected]> The code looks good, while one nit below. >--- > include/linux/mm.h | 16 ++++++++++++++-- > include/linux/page-flags.h | 5 ++++- > 2 files changed, 18 insertions(+), 3 deletions(-) > >diff --git a/include/linux/mm.h b/include/linux/mm.h >index 2dee79fa2efcf..f6880e3225c5c 100644 >--- a/include/linux/mm.h >+++ b/include/linux/mm.h >@@ -210,10 +210,8 @@ extern unsigned long sysctl_admin_reserve_kbytes; > > #if defined(CONFIG_SPARSEMEM) && !defined(CONFIG_SPARSEMEM_VMEMMAP) > #define nth_page(page,n) pfn_to_page(page_to_pfn((page)) + (n)) >-#define folio_page_idx(folio, p) (page_to_pfn(p) - folio_pfn(folio)) > #else > #define nth_page(page,n) ((page) + (n)) >-#define folio_page_idx(folio, p) ((p) - &(folio)->page) > #endif > > /* to align the pointer to the (next) page boundary */ >@@ -225,6 +223,20 @@ extern unsigned long sysctl_admin_reserve_kbytes; > /* test whether an address (unsigned long or pointer) is aligned to PAGE_SIZE */ > #define PAGE_ALIGNED(addr) IS_ALIGNED((unsigned long)(addr), PAGE_SIZE) > >+/** >+ * folio_page_idx - Return the number of a page in a folio. >+ * @folio: The folio. >+ * @page: The folio page. >+ * >+ * This function expects that the page is actually part of the folio. >+ * The returned number is relative to the start of the folio. >+ */ >+static inline unsigned long folio_page_idx(const struct folio *folio, >+ const struct page *page) >+{ >+ return page - &folio->page; >+} >+ > static inline struct folio *lru_to_folio(struct list_head *head) > { > return list_entry((head)->prev, struct folio, lru); >diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h >index 5ee6ffbdbf831..faf17ca211b4f 100644 >--- a/include/linux/page-flags.h >+++ b/include/linux/page-flags.h >@@ -316,7 +316,10 @@ static __always_inline unsigned long _compound_head(const struct page *page) > * check that the page number lies within @folio; the caller is presumed > * to have a reference to the page. > */ >-#define folio_page(folio, n) nth_page(&(folio)->page, n) >+static inline struct page *folio_page(struct folio *folio, unsigned long n) >+{ >+ return &folio->page + n; >+} > Curious about why it is in page-flags.h. It seems not related to page-flags. > static __always_inline int PageTail(const struct page *page) > { >-- >2.50.1 > -- Wei Yang Help you, Help me