Commit ee62ce7a1d90 ("page_pool: Track DMA-mapped pages and unmap them when destroying the pool") changed PP_MAGIC_MASK from 0xFFFFFFFC to 0xc000007c on 32-bit platforms. The function page_pool_page_is_pp() uses PP_MAGIC_MASK to identify page pool pages, but the remaining bits are not sufficient to unambiguously identify such pages any longer. So page_pool_page_is_pp() now sometimes wrongly reports pages as page pool pages and as such triggers a kernel BUG as it believes it found a page pool leak. There are patches upcoming where page_pool_page_is_pp() will not depend on PP_MAGIC_MASK and instead use page flags to identify page pool pages. Until those patches are merged, the easiest temporary fix is to disable the check on 32-bit platforms. Cc: David Hildenbrand Cc: Toke Høiland-Jørgensen Cc: Linux Memory Management List Cc: Linux parisc List Cc: # v6.15+ Signed-off-by: Helge Deller Link: https://www.spinics.net/lists/kernel/msg5849623.html Fixes: ee62ce7a1d90 ("page_pool: Track DMA-mapped pages and unmap them when destroying the pool") diff --git a/include/linux/mm.h b/include/linux/mm.h index 1ae97a0b8ec7..f3822ae70a81 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -4190,7 +4190,7 @@ int arch_lock_shadow_stack_status(struct task_struct *t, unsigned long status); */ #define PP_MAGIC_MASK ~(PP_DMA_INDEX_MASK | 0x3UL) -#ifdef CONFIG_PAGE_POOL +#if defined(CONFIG_PAGE_POOL) && defined(CONFIG_64BIT) static inline bool page_pool_page_is_pp(const struct page *page) { treturn (page->pp_magic & PP_MAGIC_MASK) == PP_SIGNATURE;