linux-um.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/3] mm, arch: add generic implementation of pfn_valid() for FLATMEM
@ 2023-01-25 19:07 Mike Rapoport
  2023-01-25 19:07 ` [PATCH 1/3] m68k: use asm-generic/memory_model.h for both MMU and !MMU Mike Rapoport
                   ` (2 more replies)
  0 siblings, 3 replies; 10+ messages in thread
From: Mike Rapoport @ 2023-01-25 19:07 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Arnd Bergmann, Brian Cain, David S. Miller, Dinh Nguyen,
	Geert Uytterhoeven, Greg Ungerer, Guo Ren, Helge Deller,
	Huacai Chen, Matt Turner, Max Filippov, Michael Ellerman,
	Michal Simek, Palmer Dabbelt, Rich Felker, Richard Weinberger,
	Stafford Horne, Thomas Bogendoerfer, Vineet Gupta, WANG Xuerui,
	Yoshinori Sato, linux-alpha, linux-arch, linux--csky,
	linux-hexagon, linux-ia64, linux-kernel, linux-m68k, linux-mips,
	linux-parisc, linux-riscv, linux-sh, linux-snps-arc, linux-um,
	linux-xtensa, linuxppc-dev, loongarch, openrisc, sparclinux, x86,
	Mike Rapoport (IBM)

From: "Mike Rapoport (IBM)" <rppt@kernel.org>

Hi,

Every architecture that supports FLATMEM memory model defines its own
version of pfn_valid() that essentially compares a pfn to max_mapnr.

Use mips/powerpc version implemented as static inline as a generic
implementation of pfn_valid() and drop its per-architecture definitions

Mike Rapoport (IBM) (3):
  m68k: use asm-generic/memory_model.h for both MMU and !MMU
  mips: drop definition of pfn_valid() for DISCONTIGMEM
  mm, arch: add generic implementation of pfn_valid() for FLATMEM

 arch/alpha/include/asm/page.h      |  4 ----
 arch/arc/include/asm/page.h        |  1 -
 arch/csky/include/asm/page.h       |  1 -
 arch/hexagon/include/asm/page.h    |  1 -
 arch/ia64/include/asm/page.h       |  4 ----
 arch/loongarch/include/asm/page.h  | 13 -------------
 arch/m68k/include/asm/page.h       |  6 +-----
 arch/m68k/include/asm/page_mm.h    |  1 -
 arch/m68k/include/asm/page_no.h    |  4 ----
 arch/microblaze/include/asm/page.h |  1 -
 arch/mips/include/asm/page.h       | 28 ----------------------------
 arch/nios2/include/asm/page.h      |  9 ---------
 arch/openrisc/include/asm/page.h   |  2 --
 arch/parisc/include/asm/page.h     |  4 ----
 arch/powerpc/include/asm/page.h    |  9 ---------
 arch/riscv/include/asm/page.h      |  5 -----
 arch/sh/include/asm/page.h         |  3 ---
 arch/sparc/include/asm/page_32.h   |  1 -
 arch/um/include/asm/page.h         |  1 -
 arch/x86/include/asm/page_32.h     |  4 ----
 arch/x86/include/asm/page_64.h     |  4 ----
 arch/xtensa/include/asm/page.h     |  2 --
 include/asm-generic/memory_model.h | 12 ++++++++++++
 include/asm-generic/page.h         |  2 --
 24 files changed, 13 insertions(+), 109 deletions(-)


base-commit: 2241ab53cbb5cdb08a6b2d4688feb13971058f65
-- 
2.35.1


_______________________________________________
linux-um mailing list
linux-um@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-um

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH 1/3] m68k: use asm-generic/memory_model.h for both MMU and !MMU
  2023-01-25 19:07 [PATCH 0/3] mm, arch: add generic implementation of pfn_valid() for FLATMEM Mike Rapoport
@ 2023-01-25 19:07 ` Mike Rapoport
  2023-01-26  8:20   ` Geert Uytterhoeven
  2023-01-25 19:07 ` [PATCH 2/3] mips: drop definition of pfn_valid() for DISCONTIGMEM Mike Rapoport
  2023-01-25 19:07 ` [PATCH 3/3] mm, arch: add generic implementation of pfn_valid() for FLATMEM Mike Rapoport
  2 siblings, 1 reply; 10+ messages in thread
From: Mike Rapoport @ 2023-01-25 19:07 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Arnd Bergmann, Brian Cain, David S. Miller, Dinh Nguyen,
	Geert Uytterhoeven, Greg Ungerer, Guo Ren, Helge Deller,
	Huacai Chen, Matt Turner, Max Filippov, Michael Ellerman,
	Michal Simek, Palmer Dabbelt, Rich Felker, Richard Weinberger,
	Stafford Horne, Thomas Bogendoerfer, Vineet Gupta, WANG Xuerui,
	Yoshinori Sato, linux-alpha, linux-arch, linux--csky,
	linux-hexagon, linux-ia64, linux-kernel, linux-m68k, linux-mips,
	linux-parisc, linux-riscv, linux-sh, linux-snps-arc, linux-um,
	linux-xtensa, linuxppc-dev, loongarch, openrisc, sparclinux, x86,
	Mike Rapoport (IBM)

From: "Mike Rapoport (IBM)" <rppt@kernel.org>

The MMU variant uses generic definitions of page_to_pfn() and
pfn_to_page(), but !MMU defines them in include/asm/page_no.h for no
good reason.

Include asm-generic/memory_model.h in the common include/asm/page.h and
drop redundant definitions.

Signed-off-by: Mike Rapoport (IBM) <rppt@kernel.org>
---
 arch/m68k/include/asm/page.h    | 6 +-----
 arch/m68k/include/asm/page_mm.h | 1 -
 arch/m68k/include/asm/page_no.h | 2 --
 3 files changed, 1 insertion(+), 8 deletions(-)

diff --git a/arch/m68k/include/asm/page.h b/arch/m68k/include/asm/page.h
index 2f1c54e4725d..a5993ad83ed8 100644
--- a/arch/m68k/include/asm/page.h
+++ b/arch/m68k/include/asm/page.h
@@ -62,11 +62,7 @@ extern unsigned long _ramend;
 #include <asm/page_no.h>
 #endif
 
-#ifndef CONFIG_MMU
-#define __phys_to_pfn(paddr)	((unsigned long)((paddr) >> PAGE_SHIFT))
-#define __pfn_to_phys(pfn)	PFN_PHYS(pfn)
-#endif
-
 #include <asm-generic/getorder.h>
+#include <asm-generic/memory_model.h>
 
 #endif /* _M68K_PAGE_H */
diff --git a/arch/m68k/include/asm/page_mm.h b/arch/m68k/include/asm/page_mm.h
index a5b459bcb7d8..3903db2e8da7 100644
--- a/arch/m68k/include/asm/page_mm.h
+++ b/arch/m68k/include/asm/page_mm.h
@@ -134,7 +134,6 @@ extern int m68k_virt_to_node_shift;
 })
 
 #define ARCH_PFN_OFFSET (m68k_memory[0].addr >> PAGE_SHIFT)
-#include <asm-generic/memory_model.h>
 
 #define virt_addr_valid(kaddr)	((unsigned long)(kaddr) >= PAGE_OFFSET && (unsigned long)(kaddr) < (unsigned long)high_memory)
 #define pfn_valid(pfn)		virt_addr_valid(pfn_to_virt(pfn))
diff --git a/arch/m68k/include/asm/page_no.h b/arch/m68k/include/asm/page_no.h
index c9d0d84158a4..0a8ccef777fd 100644
--- a/arch/m68k/include/asm/page_no.h
+++ b/arch/m68k/include/asm/page_no.h
@@ -26,8 +26,6 @@ extern unsigned long memory_end;
 #define virt_to_page(addr)	(mem_map + (((unsigned long)(addr)-PAGE_OFFSET) >> PAGE_SHIFT))
 #define page_to_virt(page)	__va(((((page) - mem_map) << PAGE_SHIFT) + PAGE_OFFSET))
 
-#define pfn_to_page(pfn)	virt_to_page(pfn_to_virt(pfn))
-#define page_to_pfn(page)	virt_to_pfn(page_to_virt(page))
 #define pfn_valid(pfn)	        ((pfn) < max_mapnr)
 
 #define	virt_addr_valid(kaddr)	(((unsigned long)(kaddr) >= PAGE_OFFSET) && \
-- 
2.35.1


_______________________________________________
linux-um mailing list
linux-um@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-um

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 2/3] mips: drop definition of pfn_valid() for DISCONTIGMEM
  2023-01-25 19:07 [PATCH 0/3] mm, arch: add generic implementation of pfn_valid() for FLATMEM Mike Rapoport
  2023-01-25 19:07 ` [PATCH 1/3] m68k: use asm-generic/memory_model.h for both MMU and !MMU Mike Rapoport
@ 2023-01-25 19:07 ` Mike Rapoport
  2023-01-25 19:07 ` [PATCH 3/3] mm, arch: add generic implementation of pfn_valid() for FLATMEM Mike Rapoport
  2 siblings, 0 replies; 10+ messages in thread
From: Mike Rapoport @ 2023-01-25 19:07 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Arnd Bergmann, Brian Cain, David S. Miller, Dinh Nguyen,
	Geert Uytterhoeven, Greg Ungerer, Guo Ren, Helge Deller,
	Huacai Chen, Matt Turner, Max Filippov, Michael Ellerman,
	Michal Simek, Palmer Dabbelt, Rich Felker, Richard Weinberger,
	Stafford Horne, Thomas Bogendoerfer, Vineet Gupta, WANG Xuerui,
	Yoshinori Sato, linux-alpha, linux-arch, linux--csky,
	linux-hexagon, linux-ia64, linux-kernel, linux-m68k, linux-mips,
	linux-parisc, linux-riscv, linux-sh, linux-snps-arc, linux-um,
	linux-xtensa, linuxppc-dev, loongarch, openrisc, sparclinux, x86,
	Mike Rapoport (IBM)

From: "Mike Rapoport (IBM)" <rppt@kernel.org>

There is stale definition of pfn_valid() for DISCONTINGMEM memory model
guarded !FLATMEM && !SPARSEMEM && NUMA ifdefery.

Remove everything but definition of pfn_valid() for FLATMEM.

Signed-off-by: Mike Rapoport (IBM) <rppt@kernel.org>
---
 arch/mips/include/asm/page.h | 15 ---------------
 1 file changed, 15 deletions(-)

diff --git a/arch/mips/include/asm/page.h b/arch/mips/include/asm/page.h
index 96bc798c1ec1..9286f11ff6ad 100644
--- a/arch/mips/include/asm/page.h
+++ b/arch/mips/include/asm/page.h
@@ -235,21 +235,6 @@ static inline int pfn_valid(unsigned long pfn)
 	return pfn >= pfn_offset && pfn < max_mapnr;
 }
 
-#elif defined(CONFIG_SPARSEMEM)
-
-/* pfn_valid is defined in linux/mmzone.h */
-
-#elif defined(CONFIG_NUMA)
-
-#define pfn_valid(pfn)							\
-({									\
-	unsigned long __pfn = (pfn);					\
-	int __n = pfn_to_nid(__pfn);					\
-	((__n >= 0) ? (__pfn < NODE_DATA(__n)->node_start_pfn +		\
-			       NODE_DATA(__n)->node_spanned_pages)	\
-		    : 0);						\
-})
-
 #endif
 
 #define virt_to_pfn(kaddr)   	PFN_DOWN(virt_to_phys((void *)(kaddr)))
-- 
2.35.1


_______________________________________________
linux-um mailing list
linux-um@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-um

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 3/3] mm, arch: add generic implementation of pfn_valid() for FLATMEM
  2023-01-25 19:07 [PATCH 0/3] mm, arch: add generic implementation of pfn_valid() for FLATMEM Mike Rapoport
  2023-01-25 19:07 ` [PATCH 1/3] m68k: use asm-generic/memory_model.h for both MMU and !MMU Mike Rapoport
  2023-01-25 19:07 ` [PATCH 2/3] mips: drop definition of pfn_valid() for DISCONTIGMEM Mike Rapoport
@ 2023-01-25 19:07 ` Mike Rapoport
  2023-01-26  1:45   ` Andrew Morton
                     ` (3 more replies)
  2 siblings, 4 replies; 10+ messages in thread
From: Mike Rapoport @ 2023-01-25 19:07 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Arnd Bergmann, Brian Cain, David S. Miller, Dinh Nguyen,
	Geert Uytterhoeven, Greg Ungerer, Guo Ren, Helge Deller,
	Huacai Chen, Matt Turner, Max Filippov, Michael Ellerman,
	Michal Simek, Palmer Dabbelt, Rich Felker, Richard Weinberger,
	Stafford Horne, Thomas Bogendoerfer, Vineet Gupta, WANG Xuerui,
	Yoshinori Sato, linux-alpha, linux-arch, linux--csky,
	linux-hexagon, linux-ia64, linux-kernel, linux-m68k, linux-mips,
	linux-parisc, linux-riscv, linux-sh, linux-snps-arc, linux-um,
	linux-xtensa, linuxppc-dev, loongarch, openrisc, sparclinux, x86,
	Mike Rapoport (IBM)

From: "Mike Rapoport (IBM)" <rppt@kernel.org>

Every architecture that supports FLATMEM memory model defines its own
version of pfn_valid() that essentially compares a pfn to max_mapnr.

Use mips/powerpc version implemented as static inline as a generic
implementation of pfn_valid() and drop its per-architecture definitions

Signed-off-by: Mike Rapoport (IBM) <rppt@kernel.org>
---
 arch/alpha/include/asm/page.h      |  4 ----
 arch/arc/include/asm/page.h        |  1 -
 arch/csky/include/asm/page.h       |  1 -
 arch/hexagon/include/asm/page.h    |  1 -
 arch/ia64/include/asm/page.h       |  4 ----
 arch/loongarch/include/asm/page.h  | 13 -------------
 arch/m68k/include/asm/page_no.h    |  2 --
 arch/microblaze/include/asm/page.h |  1 -
 arch/mips/include/asm/page.h       | 13 -------------
 arch/nios2/include/asm/page.h      |  9 ---------
 arch/openrisc/include/asm/page.h   |  2 --
 arch/parisc/include/asm/page.h     |  4 ----
 arch/powerpc/include/asm/page.h    |  9 ---------
 arch/riscv/include/asm/page.h      |  5 -----
 arch/sh/include/asm/page.h         |  3 ---
 arch/sparc/include/asm/page_32.h   |  1 -
 arch/um/include/asm/page.h         |  1 -
 arch/x86/include/asm/page_32.h     |  4 ----
 arch/x86/include/asm/page_64.h     |  4 ----
 arch/xtensa/include/asm/page.h     |  2 --
 include/asm-generic/memory_model.h | 12 ++++++++++++
 include/asm-generic/page.h         |  2 --
 22 files changed, 12 insertions(+), 86 deletions(-)

diff --git a/arch/alpha/include/asm/page.h b/arch/alpha/include/asm/page.h
index 8f3f5eecba28..227d32b6b75f 100644
--- a/arch/alpha/include/asm/page.h
+++ b/arch/alpha/include/asm/page.h
@@ -87,10 +87,6 @@ typedef struct page *pgtable_t;
 #define virt_to_page(kaddr)	pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
 #define virt_addr_valid(kaddr)	pfn_valid((__pa(kaddr) >> PAGE_SHIFT))
 
-#ifdef CONFIG_FLATMEM
-#define pfn_valid(pfn)		((pfn) < max_mapnr)
-#endif /* CONFIG_FLATMEM */
-
 #include <asm-generic/memory_model.h>
 #include <asm-generic/getorder.h>
 
diff --git a/arch/arc/include/asm/page.h b/arch/arc/include/asm/page.h
index 9a62e1d87967..e43fe27ec54d 100644
--- a/arch/arc/include/asm/page.h
+++ b/arch/arc/include/asm/page.h
@@ -109,7 +109,6 @@ extern int pfn_valid(unsigned long pfn);
 #else /* CONFIG_HIGHMEM */
 
 #define ARCH_PFN_OFFSET		virt_to_pfn(CONFIG_LINUX_RAM_BASE)
-#define pfn_valid(pfn)		(((pfn) - ARCH_PFN_OFFSET) < max_mapnr)
 
 #endif /* CONFIG_HIGHMEM */
 
diff --git a/arch/csky/include/asm/page.h b/arch/csky/include/asm/page.h
index ed7451478b1b..b23e3006a9e0 100644
--- a/arch/csky/include/asm/page.h
+++ b/arch/csky/include/asm/page.h
@@ -39,7 +39,6 @@
 
 #define virt_addr_valid(kaddr)  ((void *)(kaddr) >= (void *)PAGE_OFFSET && \
 			(void *)(kaddr) < high_memory)
-#define pfn_valid(pfn)		((pfn) >= ARCH_PFN_OFFSET && ((pfn) - ARCH_PFN_OFFSET) < max_mapnr)
 
 extern void *memset(void *dest, int c, size_t l);
 extern void *memcpy(void *to, const void *from, size_t l);
diff --git a/arch/hexagon/include/asm/page.h b/arch/hexagon/include/asm/page.h
index d7d4f9fca327..9c03b9965f07 100644
--- a/arch/hexagon/include/asm/page.h
+++ b/arch/hexagon/include/asm/page.h
@@ -95,7 +95,6 @@ struct page;
 /* Default vm area behavior is non-executable.  */
 #define VM_DATA_DEFAULT_FLAGS	VM_DATA_FLAGS_NON_EXEC
 
-#define pfn_valid(pfn) ((pfn) < max_mapnr)
 #define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
 
 /*  Need to not use a define for linesize; may move this to another file.  */
diff --git a/arch/ia64/include/asm/page.h b/arch/ia64/include/asm/page.h
index 1b990466d540..783eceab5df3 100644
--- a/arch/ia64/include/asm/page.h
+++ b/arch/ia64/include/asm/page.h
@@ -97,10 +97,6 @@ do {						\
 
 #include <asm-generic/memory_model.h>
 
-#ifdef CONFIG_FLATMEM
-# define pfn_valid(pfn)		((pfn) < max_mapnr)
-#endif
-
 #define page_to_phys(page)	(page_to_pfn(page) << PAGE_SHIFT)
 #define virt_to_page(kaddr)	pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
 #define pfn_to_kaddr(pfn)	__va((pfn) << PAGE_SHIFT)
diff --git a/arch/loongarch/include/asm/page.h b/arch/loongarch/include/asm/page.h
index 53f284a96182..fb5338b352e6 100644
--- a/arch/loongarch/include/asm/page.h
+++ b/arch/loongarch/include/asm/page.h
@@ -82,19 +82,6 @@ typedef struct { unsigned long pgprot; } pgprot_t;
 
 #define pfn_to_kaddr(pfn)	__va((pfn) << PAGE_SHIFT)
 
-#ifdef CONFIG_FLATMEM
-
-static inline int pfn_valid(unsigned long pfn)
-{
-	/* avoid <linux/mm.h> include hell */
-	extern unsigned long max_mapnr;
-	unsigned long pfn_offset = ARCH_PFN_OFFSET;
-
-	return pfn >= pfn_offset && pfn < max_mapnr;
-}
-
-#endif
-
 #define virt_to_pfn(kaddr)	PFN_DOWN(PHYSADDR(kaddr))
 #define virt_to_page(kaddr)	pfn_to_page(virt_to_pfn(kaddr))
 
diff --git a/arch/m68k/include/asm/page_no.h b/arch/m68k/include/asm/page_no.h
index 0a8ccef777fd..2555ec57149d 100644
--- a/arch/m68k/include/asm/page_no.h
+++ b/arch/m68k/include/asm/page_no.h
@@ -26,8 +26,6 @@ extern unsigned long memory_end;
 #define virt_to_page(addr)	(mem_map + (((unsigned long)(addr)-PAGE_OFFSET) >> PAGE_SHIFT))
 #define page_to_virt(page)	__va(((((page) - mem_map) << PAGE_SHIFT) + PAGE_OFFSET))
 
-#define pfn_valid(pfn)	        ((pfn) < max_mapnr)
-
 #define	virt_addr_valid(kaddr)	(((unsigned long)(kaddr) >= PAGE_OFFSET) && \
 				((unsigned long)(kaddr) < memory_end))
 
diff --git a/arch/microblaze/include/asm/page.h b/arch/microblaze/include/asm/page.h
index 4b8b2fa78fc5..7b9861bcd458 100644
--- a/arch/microblaze/include/asm/page.h
+++ b/arch/microblaze/include/asm/page.h
@@ -112,7 +112,6 @@ extern int page_is_ram(unsigned long pfn);
 #  define page_to_phys(page)     (page_to_pfn(page) << PAGE_SHIFT)
 
 #  define ARCH_PFN_OFFSET	(memory_start >> PAGE_SHIFT)
-#  define pfn_valid(pfn)	((pfn) >= ARCH_PFN_OFFSET && (pfn) < (max_mapnr + ARCH_PFN_OFFSET))
 # endif /* __ASSEMBLY__ */
 
 #define	virt_addr_valid(vaddr)	(pfn_valid(virt_to_pfn(vaddr)))
diff --git a/arch/mips/include/asm/page.h b/arch/mips/include/asm/page.h
index 9286f11ff6ad..5978a8dfb917 100644
--- a/arch/mips/include/asm/page.h
+++ b/arch/mips/include/asm/page.h
@@ -224,19 +224,6 @@ extern phys_addr_t __phys_addr_symbol(unsigned long x);
 
 #define pfn_to_kaddr(pfn)	__va((pfn) << PAGE_SHIFT)
 
-#ifdef CONFIG_FLATMEM
-
-static inline int pfn_valid(unsigned long pfn)
-{
-	/* avoid <linux/mm.h> include hell */
-	extern unsigned long max_mapnr;
-	unsigned long pfn_offset = ARCH_PFN_OFFSET;
-
-	return pfn >= pfn_offset && pfn < max_mapnr;
-}
-
-#endif
-
 #define virt_to_pfn(kaddr)   	PFN_DOWN(virt_to_phys((void *)(kaddr)))
 #define virt_to_page(kaddr)	pfn_to_page(virt_to_pfn(kaddr))
 
diff --git a/arch/nios2/include/asm/page.h b/arch/nios2/include/asm/page.h
index 6a989819a7c1..0ae7d9ce369b 100644
--- a/arch/nios2/include/asm/page.h
+++ b/arch/nios2/include/asm/page.h
@@ -86,15 +86,6 @@ extern struct page *mem_map;
 
 # define pfn_to_kaddr(pfn)	__va((pfn) << PAGE_SHIFT)
 
-static inline bool pfn_valid(unsigned long pfn)
-{
-	/* avoid <linux/mm.h> include hell */
-	extern unsigned long max_mapnr;
-	unsigned long pfn_offset = ARCH_PFN_OFFSET;
-
-	return pfn >= pfn_offset && pfn < max_mapnr;
-}
-
 # define virt_to_page(vaddr)	pfn_to_page(PFN_DOWN(virt_to_phys(vaddr)))
 # define virt_addr_valid(vaddr)	pfn_valid(PFN_DOWN(virt_to_phys(vaddr)))
 
diff --git a/arch/openrisc/include/asm/page.h b/arch/openrisc/include/asm/page.h
index aab6e64d6db4..52b0d7e76446 100644
--- a/arch/openrisc/include/asm/page.h
+++ b/arch/openrisc/include/asm/page.h
@@ -80,8 +80,6 @@ typedef struct page *pgtable_t;
 
 #define page_to_phys(page)      ((dma_addr_t)page_to_pfn(page) << PAGE_SHIFT)
 
-#define pfn_valid(pfn)          ((pfn) < max_mapnr)
-
 #define virt_addr_valid(kaddr)	(pfn_valid(virt_to_pfn(kaddr)))
 
 #endif /* __ASSEMBLY__ */
diff --git a/arch/parisc/include/asm/page.h b/arch/parisc/include/asm/page.h
index 6faaaa3ebe9b..667e703c0e8f 100644
--- a/arch/parisc/include/asm/page.h
+++ b/arch/parisc/include/asm/page.h
@@ -155,10 +155,6 @@ extern int npmem_ranges;
 #define __pa(x)			((unsigned long)(x)-PAGE_OFFSET)
 #define __va(x)			((void *)((unsigned long)(x)+PAGE_OFFSET))
 
-#ifndef CONFIG_SPARSEMEM
-#define pfn_valid(pfn)		((pfn) < max_mapnr)
-#endif
-
 #ifdef CONFIG_HUGETLB_PAGE
 #define HPAGE_SHIFT		PMD_SHIFT /* fixed for transparent huge pages */
 #define HPAGE_SIZE      	((1UL) << HPAGE_SHIFT)
diff --git a/arch/powerpc/include/asm/page.h b/arch/powerpc/include/asm/page.h
index edf1dd1b0ca9..f2b6bf5687d0 100644
--- a/arch/powerpc/include/asm/page.h
+++ b/arch/powerpc/include/asm/page.h
@@ -117,15 +117,6 @@ extern long long virt_phys_offset;
 
 #ifdef CONFIG_FLATMEM
 #define ARCH_PFN_OFFSET		((unsigned long)(MEMORY_START >> PAGE_SHIFT))
-#ifndef __ASSEMBLY__
-extern unsigned long max_mapnr;
-static inline bool pfn_valid(unsigned long pfn)
-{
-	unsigned long min_pfn = ARCH_PFN_OFFSET;
-
-	return pfn >= min_pfn && pfn < max_mapnr;
-}
-#endif
 #endif
 
 #define virt_to_pfn(kaddr)	(__pa(kaddr) >> PAGE_SHIFT)
diff --git a/arch/riscv/include/asm/page.h b/arch/riscv/include/asm/page.h
index 9f432c1b5289..7fed7c431928 100644
--- a/arch/riscv/include/asm/page.h
+++ b/arch/riscv/include/asm/page.h
@@ -171,11 +171,6 @@ extern phys_addr_t __phys_addr_symbol(unsigned long x);
 
 #define sym_to_pfn(x)           __phys_to_pfn(__pa_symbol(x))
 
-#ifdef CONFIG_FLATMEM
-#define pfn_valid(pfn) \
-	(((pfn) >= ARCH_PFN_OFFSET) && (((pfn) - ARCH_PFN_OFFSET) < max_mapnr))
-#endif
-
 #endif /* __ASSEMBLY__ */
 
 #define virt_addr_valid(vaddr)	({						\
diff --git a/arch/sh/include/asm/page.h b/arch/sh/include/asm/page.h
index eca5daa43b93..09ac6c7faee0 100644
--- a/arch/sh/include/asm/page.h
+++ b/arch/sh/include/asm/page.h
@@ -169,9 +169,6 @@ typedef struct page *pgtable_t;
 #define PFN_START		(__MEMORY_START >> PAGE_SHIFT)
 #define ARCH_PFN_OFFSET		(PFN_START)
 #define virt_to_page(kaddr)	pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
-#ifdef CONFIG_FLATMEM
-#define pfn_valid(pfn)		((pfn) >= min_low_pfn && (pfn) < max_low_pfn)
-#endif
 #define virt_addr_valid(kaddr)	pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
 
 #include <asm-generic/memory_model.h>
diff --git a/arch/sparc/include/asm/page_32.h b/arch/sparc/include/asm/page_32.h
index fff8861df107..6be6f683f98f 100644
--- a/arch/sparc/include/asm/page_32.h
+++ b/arch/sparc/include/asm/page_32.h
@@ -130,7 +130,6 @@ extern unsigned long pfn_base;
 #define ARCH_PFN_OFFSET		(pfn_base)
 #define virt_to_page(kaddr)	pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
 
-#define pfn_valid(pfn)		(((pfn) >= (pfn_base)) && (((pfn)-(pfn_base)) < max_mapnr))
 #define virt_addr_valid(kaddr)	((((unsigned long)(kaddr)-PAGE_OFFSET)>>PAGE_SHIFT) < max_mapnr)
 
 #include <asm-generic/memory_model.h>
diff --git a/arch/um/include/asm/page.h b/arch/um/include/asm/page.h
index cdbd9653aa14..84866127d074 100644
--- a/arch/um/include/asm/page.h
+++ b/arch/um/include/asm/page.h
@@ -108,7 +108,6 @@ extern unsigned long uml_physmem;
 #define phys_to_pfn(p) ((p) >> PAGE_SHIFT)
 #define pfn_to_phys(pfn) PFN_PHYS(pfn)
 
-#define pfn_valid(pfn) ((pfn) < max_mapnr)
 #define virt_addr_valid(v) pfn_valid(phys_to_pfn(__pa(v)))
 
 #include <asm-generic/memory_model.h>
diff --git a/arch/x86/include/asm/page_32.h b/arch/x86/include/asm/page_32.h
index df42f8aa99e4..580d71aca65a 100644
--- a/arch/x86/include/asm/page_32.h
+++ b/arch/x86/include/asm/page_32.h
@@ -15,10 +15,6 @@ extern unsigned long __phys_addr(unsigned long);
 #define __phys_addr_symbol(x)	__phys_addr(x)
 #define __phys_reloc_hide(x)	RELOC_HIDE((x), 0)
 
-#ifdef CONFIG_FLATMEM
-#define pfn_valid(pfn)		((pfn) < max_mapnr)
-#endif /* CONFIG_FLATMEM */
-
 #include <linux/string.h>
 
 static inline void clear_page(void *page)
diff --git a/arch/x86/include/asm/page_64.h b/arch/x86/include/asm/page_64.h
index 198e03e59ca1..cc6b8e087192 100644
--- a/arch/x86/include/asm/page_64.h
+++ b/arch/x86/include/asm/page_64.h
@@ -39,10 +39,6 @@ extern unsigned long __phys_addr_symbol(unsigned long);
 
 #define __phys_reloc_hide(x)	(x)
 
-#ifdef CONFIG_FLATMEM
-#define pfn_valid(pfn)          ((pfn) < max_pfn)
-#endif
-
 void clear_page_orig(void *page);
 void clear_page_rep(void *page);
 void clear_page_erms(void *page);
diff --git a/arch/xtensa/include/asm/page.h b/arch/xtensa/include/asm/page.h
index 493eb7083b1a..3267c672cd11 100644
--- a/arch/xtensa/include/asm/page.h
+++ b/arch/xtensa/include/asm/page.h
@@ -189,8 +189,6 @@ static inline unsigned long ___pa(unsigned long va)
 #endif
 #define __va(x)	\
 	((void *)((unsigned long) (x) - PHYS_OFFSET + PAGE_OFFSET))
-#define pfn_valid(pfn) \
-	((pfn) >= ARCH_PFN_OFFSET && ((pfn) - ARCH_PFN_OFFSET) < max_mapnr)
 
 #define virt_to_page(kaddr)	pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
 #define page_to_virt(page)	__va(page_to_pfn(page) << PAGE_SHIFT)
diff --git a/include/asm-generic/memory_model.h b/include/asm-generic/memory_model.h
index a2c8ed60233a..13d2a844d928 100644
--- a/include/asm-generic/memory_model.h
+++ b/include/asm-generic/memory_model.h
@@ -19,6 +19,18 @@
 #define __page_to_pfn(page)	((unsigned long)((page) - mem_map) + \
 				 ARCH_PFN_OFFSET)
 
+#ifndef pfn_valid
+static inline int pfn_valid(unsigned long pfn)
+{
+	/* avoid <linux/mm.h> include hell */
+	extern unsigned long max_mapnr;
+	unsigned long pfn_offset = ARCH_PFN_OFFSET;
+
+	return pfn >= pfn_offset && pfn < max_mapnr;
+}
+#define pfn_valid pfn_valid
+#endif
+
 #elif defined(CONFIG_SPARSEMEM_VMEMMAP)
 
 /* memmap is virtually contiguous.  */
diff --git a/include/asm-generic/page.h b/include/asm-generic/page.h
index 6fc47561814c..c0be2edeb484 100644
--- a/include/asm-generic/page.h
+++ b/include/asm-generic/page.h
@@ -84,8 +84,6 @@ extern unsigned long memory_end;
 #define page_to_phys(page)      ((dma_addr_t)page_to_pfn(page) << PAGE_SHIFT)
 #endif
 
-#define pfn_valid(pfn)		((pfn) >= ARCH_PFN_OFFSET && ((pfn) - ARCH_PFN_OFFSET) < max_mapnr)
-
 #define	virt_addr_valid(kaddr)	(((void *)(kaddr) >= (void *)PAGE_OFFSET) && \
 				((void *)(kaddr) < (void *)memory_end))
 
-- 
2.35.1


_______________________________________________
linux-um mailing list
linux-um@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-um

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH 3/3] mm, arch: add generic implementation of pfn_valid() for FLATMEM
  2023-01-25 19:07 ` [PATCH 3/3] mm, arch: add generic implementation of pfn_valid() for FLATMEM Mike Rapoport
@ 2023-01-26  1:45   ` Andrew Morton
  2023-01-26  7:22   ` Arnd Bergmann
                     ` (2 subsequent siblings)
  3 siblings, 0 replies; 10+ messages in thread
From: Andrew Morton @ 2023-01-26  1:45 UTC (permalink / raw)
  To: Mike Rapoport
  Cc: Arnd Bergmann, Brian Cain, David S. Miller, Dinh Nguyen,
	Geert Uytterhoeven, Greg Ungerer, Guo Ren, Helge Deller,
	Huacai Chen, Matt Turner, Max Filippov, Michael Ellerman,
	Michal Simek, Palmer Dabbelt, Rich Felker, Richard Weinberger,
	Stafford Horne, Thomas Bogendoerfer, Vineet Gupta, WANG Xuerui,
	Yoshinori Sato, linux-alpha, linux-arch, linux--csky,
	linux-hexagon, linux-ia64, linux-kernel, linux-m68k, linux-mips,
	linux-parisc, linux-riscv, linux-sh, linux-snps-arc, linux-um,
	linux-xtensa, linuxppc-dev, loongarch, openrisc, sparclinux, x86

On Wed, 25 Jan 2023 21:07:57 +0200 Mike Rapoport <rppt@kernel.org> wrote:

> Every architecture that supports FLATMEM memory model defines its own
> version of pfn_valid() that essentially compares a pfn to max_mapnr.
> 
> Use mips/powerpc version implemented as static inline as a generic
> implementation of pfn_valid() and drop its per-architecture definitions

arm allnoconfig:

./include/asm-generic/memory_model.h:23:19: error: static declaration of 'pfn_valid' follows non-static declaration
   23 | static inline int pfn_valid(unsigned long pfn)
      |                   ^~~~~~~~~
./arch/arm/include/asm/page.h:160:12: note: previous declaration of 'pfn_valid' with type 'int(long unsigned int)'
  160 | extern int pfn_valid(unsigned long);
      |            ^~~~~~~~~


I thought of doing

--- a/arch/arm/include/asm/page.h~mm-arch-add-generic-implementation-of-pfn_valid-for-flatmem-fix
+++ a/arch/arm/include/asm/page.h
@@ -156,10 +156,6 @@ extern void copy_page(void *to, const vo
 
 typedef struct page *pgtable_t;
 
-#ifdef CONFIG_HAVE_ARCH_PFN_VALID
-extern int pfn_valid(unsigned long);
-#endif
-
 #include <asm/memory.h>
 
 #endif /* !__ASSEMBLY__ */
_

but I'm seeing a pfn_valid declaration in arch/arc/include/asm/page.h
which might be a problem.

v2, please ;)

_______________________________________________
linux-um mailing list
linux-um@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-um

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 3/3] mm, arch: add generic implementation of pfn_valid() for FLATMEM
  2023-01-25 19:07 ` [PATCH 3/3] mm, arch: add generic implementation of pfn_valid() for FLATMEM Mike Rapoport
  2023-01-26  1:45   ` Andrew Morton
@ 2023-01-26  7:22   ` Arnd Bergmann
  2023-01-27  1:58   ` Guo Ren
  2023-01-28  9:02   ` Stafford Horne
  3 siblings, 0 replies; 10+ messages in thread
From: Arnd Bergmann @ 2023-01-26  7:22 UTC (permalink / raw)
  To: Mike Rapoport, Andrew Morton
  Cc: Brian Cain, David S . Miller, Dinh Nguyen, Geert Uytterhoeven,
	Greg Ungerer, guoren, Helge Deller, Huacai Chen, Matt Turner,
	Max Filippov, Michael Ellerman, Michal Simek, Palmer Dabbelt,
	Rich Felker, Richard Weinberger, Stafford Horne,
	Thomas Bogendoerfer, Vineet Gupta, WANG Xuerui, Yoshinori Sato,
	linux-alpha, Linux-Arch, linux--csky, linux-hexagon, linux-ia64,
	linux-kernel, linux-m68k, linux-mips, linux-parisc, linux-riscv,
	linux-sh, linux-snps-arc, linux-um, linux-xtensa, linuxppc-dev,
	loongarch, openrisc, sparclinux, x86

On Wed, Jan 25, 2023, at 20:07, Mike Rapoport wrote:
> From: "Mike Rapoport (IBM)" <rppt@kernel.org>
>
> Every architecture that supports FLATMEM memory model defines its own
> version of pfn_valid() that essentially compares a pfn to max_mapnr.
>
> Use mips/powerpc version implemented as static inline as a generic
> implementation of pfn_valid() and drop its per-architecture definitions
>
> Signed-off-by: Mike Rapoport (IBM) <rppt@kernel.org>

Acked-by: Arnd Bergmann <arnd@arndb.de>

I assume this can best go through the mm tree, let me know if I should
pick it up in the asm-generic tree instead.

     Arnd

_______________________________________________
linux-um mailing list
linux-um@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-um

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 1/3] m68k: use asm-generic/memory_model.h for both MMU and !MMU
  2023-01-25 19:07 ` [PATCH 1/3] m68k: use asm-generic/memory_model.h for both MMU and !MMU Mike Rapoport
@ 2023-01-26  8:20   ` Geert Uytterhoeven
  0 siblings, 0 replies; 10+ messages in thread
From: Geert Uytterhoeven @ 2023-01-26  8:20 UTC (permalink / raw)
  To: Mike Rapoport
  Cc: Andrew Morton, Arnd Bergmann, Brian Cain, David S. Miller,
	Dinh Nguyen, Greg Ungerer, Guo Ren, Helge Deller, Huacai Chen,
	Matt Turner, Max Filippov, Michael Ellerman, Michal Simek,
	Palmer Dabbelt, Rich Felker, Richard Weinberger, Stafford Horne,
	Thomas Bogendoerfer, Vineet Gupta, WANG Xuerui, Yoshinori Sato,
	linux-alpha, linux-arch, linux--csky, linux-hexagon, linux-ia64,
	linux-kernel, linux-m68k, linux-mips, linux-parisc, linux-riscv,
	linux-sh, linux-snps-arc, linux-um, linux-xtensa, linuxppc-dev,
	loongarch, openrisc, sparclinux, x86

On Wed, Jan 25, 2023 at 8:08 PM Mike Rapoport <rppt@kernel.org> wrote:
> From: "Mike Rapoport (IBM)" <rppt@kernel.org>
>
> The MMU variant uses generic definitions of page_to_pfn() and
> pfn_to_page(), but !MMU defines them in include/asm/page_no.h for no
> good reason.
>
> Include asm-generic/memory_model.h in the common include/asm/page.h and
> drop redundant definitions.
>
> Signed-off-by: Mike Rapoport (IBM) <rppt@kernel.org>

Reviewed-by: Geert Uytterhoeven <geert@linux-m68k.org>
Acked-by: Geert Uytterhoeven <geert@linux-m68k.org>

Gr{oetje,eeting}s,

                        Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds

_______________________________________________
linux-um mailing list
linux-um@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-um

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 3/3] mm, arch: add generic implementation of pfn_valid() for FLATMEM
  2023-01-25 19:07 ` [PATCH 3/3] mm, arch: add generic implementation of pfn_valid() for FLATMEM Mike Rapoport
  2023-01-26  1:45   ` Andrew Morton
  2023-01-26  7:22   ` Arnd Bergmann
@ 2023-01-27  1:58   ` Guo Ren
  2023-01-28  5:07     ` Huacai Chen
  2023-01-28  9:02   ` Stafford Horne
  3 siblings, 1 reply; 10+ messages in thread
From: Guo Ren @ 2023-01-27  1:58 UTC (permalink / raw)
  To: Mike Rapoport
  Cc: Andrew Morton, Arnd Bergmann, Brian Cain, David S. Miller,
	Dinh Nguyen, Geert Uytterhoeven, Greg Ungerer, Helge Deller,
	Huacai Chen, Matt Turner, Max Filippov, Michael Ellerman,
	Michal Simek, Palmer Dabbelt, Rich Felker, Richard Weinberger,
	Stafford Horne, Thomas Bogendoerfer, Vineet Gupta, WANG Xuerui,
	Yoshinori Sato, linux-alpha, linux-arch, linux--csky,
	linux-hexagon, linux-ia64, linux-kernel, linux-m68k, linux-mips,
	linux-parisc, linux-riscv, linux-sh, linux-snps-arc, linux-um,
	linux-xtensa, linuxppc-dev, loongarch, openrisc, sparclinux, x86

On Thu, Jan 26, 2023 at 3:08 AM Mike Rapoport <rppt@kernel.org> wrote:
>
> From: "Mike Rapoport (IBM)" <rppt@kernel.org>
>
> Every architecture that supports FLATMEM memory model defines its own
> version of pfn_valid() that essentially compares a pfn to max_mapnr.
>
> Use mips/powerpc version implemented as static inline as a generic
> implementation of pfn_valid() and drop its per-architecture definitions
>
> Signed-off-by: Mike Rapoport (IBM) <rppt@kernel.org>
> ---
>  arch/alpha/include/asm/page.h      |  4 ----
>  arch/arc/include/asm/page.h        |  1 -
>  arch/csky/include/asm/page.h       |  1 -
>  arch/hexagon/include/asm/page.h    |  1 -
>  arch/ia64/include/asm/page.h       |  4 ----
>  arch/loongarch/include/asm/page.h  | 13 -------------
>  arch/m68k/include/asm/page_no.h    |  2 --
>  arch/microblaze/include/asm/page.h |  1 -
>  arch/mips/include/asm/page.h       | 13 -------------
>  arch/nios2/include/asm/page.h      |  9 ---------
>  arch/openrisc/include/asm/page.h   |  2 --
>  arch/parisc/include/asm/page.h     |  4 ----
>  arch/powerpc/include/asm/page.h    |  9 ---------
>  arch/riscv/include/asm/page.h      |  5 -----
>  arch/sh/include/asm/page.h         |  3 ---
>  arch/sparc/include/asm/page_32.h   |  1 -
>  arch/um/include/asm/page.h         |  1 -
>  arch/x86/include/asm/page_32.h     |  4 ----
>  arch/x86/include/asm/page_64.h     |  4 ----
>  arch/xtensa/include/asm/page.h     |  2 --
>  include/asm-generic/memory_model.h | 12 ++++++++++++
>  include/asm-generic/page.h         |  2 --
>  22 files changed, 12 insertions(+), 86 deletions(-)
>
> diff --git a/arch/alpha/include/asm/page.h b/arch/alpha/include/asm/page.h
> index 8f3f5eecba28..227d32b6b75f 100644
> --- a/arch/alpha/include/asm/page.h
> +++ b/arch/alpha/include/asm/page.h
> @@ -87,10 +87,6 @@ typedef struct page *pgtable_t;
>  #define virt_to_page(kaddr)    pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
>  #define virt_addr_valid(kaddr) pfn_valid((__pa(kaddr) >> PAGE_SHIFT))
>
> -#ifdef CONFIG_FLATMEM
> -#define pfn_valid(pfn)         ((pfn) < max_mapnr)
> -#endif /* CONFIG_FLATMEM */
> -
>  #include <asm-generic/memory_model.h>
>  #include <asm-generic/getorder.h>
>
> diff --git a/arch/arc/include/asm/page.h b/arch/arc/include/asm/page.h
> index 9a62e1d87967..e43fe27ec54d 100644
> --- a/arch/arc/include/asm/page.h
> +++ b/arch/arc/include/asm/page.h
> @@ -109,7 +109,6 @@ extern int pfn_valid(unsigned long pfn);
>  #else /* CONFIG_HIGHMEM */
>
>  #define ARCH_PFN_OFFSET                virt_to_pfn(CONFIG_LINUX_RAM_BASE)
> -#define pfn_valid(pfn)         (((pfn) - ARCH_PFN_OFFSET) < max_mapnr)
>
>  #endif /* CONFIG_HIGHMEM */
>
> diff --git a/arch/csky/include/asm/page.h b/arch/csky/include/asm/page.h
> index ed7451478b1b..b23e3006a9e0 100644
> --- a/arch/csky/include/asm/page.h
> +++ b/arch/csky/include/asm/page.h
> @@ -39,7 +39,6 @@
>
>  #define virt_addr_valid(kaddr)  ((void *)(kaddr) >= (void *)PAGE_OFFSET && \
>                         (void *)(kaddr) < high_memory)
> -#define pfn_valid(pfn)         ((pfn) >= ARCH_PFN_OFFSET && ((pfn) - ARCH_PFN_OFFSET) < max_mapnr)
For csky part:
Acked-by: Guo Ren <guoren@kernel.org>

>
>  extern void *memset(void *dest, int c, size_t l);
>  extern void *memcpy(void *to, const void *from, size_t l);
> diff --git a/arch/hexagon/include/asm/page.h b/arch/hexagon/include/asm/page.h
> index d7d4f9fca327..9c03b9965f07 100644
> --- a/arch/hexagon/include/asm/page.h
> +++ b/arch/hexagon/include/asm/page.h
> @@ -95,7 +95,6 @@ struct page;
>  /* Default vm area behavior is non-executable.  */
>  #define VM_DATA_DEFAULT_FLAGS  VM_DATA_FLAGS_NON_EXEC
>
> -#define pfn_valid(pfn) ((pfn) < max_mapnr)
>  #define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
>
>  /*  Need to not use a define for linesize; may move this to another file.  */
> diff --git a/arch/ia64/include/asm/page.h b/arch/ia64/include/asm/page.h
> index 1b990466d540..783eceab5df3 100644
> --- a/arch/ia64/include/asm/page.h
> +++ b/arch/ia64/include/asm/page.h
> @@ -97,10 +97,6 @@ do {                                         \
>
>  #include <asm-generic/memory_model.h>
>
> -#ifdef CONFIG_FLATMEM
> -# define pfn_valid(pfn)                ((pfn) < max_mapnr)
> -#endif
> -
>  #define page_to_phys(page)     (page_to_pfn(page) << PAGE_SHIFT)
>  #define virt_to_page(kaddr)    pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
>  #define pfn_to_kaddr(pfn)      __va((pfn) << PAGE_SHIFT)
> diff --git a/arch/loongarch/include/asm/page.h b/arch/loongarch/include/asm/page.h
> index 53f284a96182..fb5338b352e6 100644
> --- a/arch/loongarch/include/asm/page.h
> +++ b/arch/loongarch/include/asm/page.h
> @@ -82,19 +82,6 @@ typedef struct { unsigned long pgprot; } pgprot_t;
>
>  #define pfn_to_kaddr(pfn)      __va((pfn) << PAGE_SHIFT)
>
> -#ifdef CONFIG_FLATMEM
> -
> -static inline int pfn_valid(unsigned long pfn)
> -{
> -       /* avoid <linux/mm.h> include hell */
> -       extern unsigned long max_mapnr;
> -       unsigned long pfn_offset = ARCH_PFN_OFFSET;
> -
> -       return pfn >= pfn_offset && pfn < max_mapnr;
> -}
> -
> -#endif
> -
>  #define virt_to_pfn(kaddr)     PFN_DOWN(PHYSADDR(kaddr))
>  #define virt_to_page(kaddr)    pfn_to_page(virt_to_pfn(kaddr))
>
> diff --git a/arch/m68k/include/asm/page_no.h b/arch/m68k/include/asm/page_no.h
> index 0a8ccef777fd..2555ec57149d 100644
> --- a/arch/m68k/include/asm/page_no.h
> +++ b/arch/m68k/include/asm/page_no.h
> @@ -26,8 +26,6 @@ extern unsigned long memory_end;
>  #define virt_to_page(addr)     (mem_map + (((unsigned long)(addr)-PAGE_OFFSET) >> PAGE_SHIFT))
>  #define page_to_virt(page)     __va(((((page) - mem_map) << PAGE_SHIFT) + PAGE_OFFSET))
>
> -#define pfn_valid(pfn)         ((pfn) < max_mapnr)
> -
>  #define        virt_addr_valid(kaddr)  (((unsigned long)(kaddr) >= PAGE_OFFSET) && \
>                                 ((unsigned long)(kaddr) < memory_end))
>
> diff --git a/arch/microblaze/include/asm/page.h b/arch/microblaze/include/asm/page.h
> index 4b8b2fa78fc5..7b9861bcd458 100644
> --- a/arch/microblaze/include/asm/page.h
> +++ b/arch/microblaze/include/asm/page.h
> @@ -112,7 +112,6 @@ extern int page_is_ram(unsigned long pfn);
>  #  define page_to_phys(page)     (page_to_pfn(page) << PAGE_SHIFT)
>
>  #  define ARCH_PFN_OFFSET      (memory_start >> PAGE_SHIFT)
> -#  define pfn_valid(pfn)       ((pfn) >= ARCH_PFN_OFFSET && (pfn) < (max_mapnr + ARCH_PFN_OFFSET))
>  # endif /* __ASSEMBLY__ */
>
>  #define        virt_addr_valid(vaddr)  (pfn_valid(virt_to_pfn(vaddr)))
> diff --git a/arch/mips/include/asm/page.h b/arch/mips/include/asm/page.h
> index 9286f11ff6ad..5978a8dfb917 100644
> --- a/arch/mips/include/asm/page.h
> +++ b/arch/mips/include/asm/page.h
> @@ -224,19 +224,6 @@ extern phys_addr_t __phys_addr_symbol(unsigned long x);
>
>  #define pfn_to_kaddr(pfn)      __va((pfn) << PAGE_SHIFT)
>
> -#ifdef CONFIG_FLATMEM
> -
> -static inline int pfn_valid(unsigned long pfn)
> -{
> -       /* avoid <linux/mm.h> include hell */
> -       extern unsigned long max_mapnr;
> -       unsigned long pfn_offset = ARCH_PFN_OFFSET;
> -
> -       return pfn >= pfn_offset && pfn < max_mapnr;
> -}
> -
> -#endif
> -
>  #define virt_to_pfn(kaddr)     PFN_DOWN(virt_to_phys((void *)(kaddr)))
>  #define virt_to_page(kaddr)    pfn_to_page(virt_to_pfn(kaddr))
>
> diff --git a/arch/nios2/include/asm/page.h b/arch/nios2/include/asm/page.h
> index 6a989819a7c1..0ae7d9ce369b 100644
> --- a/arch/nios2/include/asm/page.h
> +++ b/arch/nios2/include/asm/page.h
> @@ -86,15 +86,6 @@ extern struct page *mem_map;
>
>  # define pfn_to_kaddr(pfn)     __va((pfn) << PAGE_SHIFT)
>
> -static inline bool pfn_valid(unsigned long pfn)
> -{
> -       /* avoid <linux/mm.h> include hell */
> -       extern unsigned long max_mapnr;
> -       unsigned long pfn_offset = ARCH_PFN_OFFSET;
> -
> -       return pfn >= pfn_offset && pfn < max_mapnr;
> -}
> -
>  # define virt_to_page(vaddr)   pfn_to_page(PFN_DOWN(virt_to_phys(vaddr)))
>  # define virt_addr_valid(vaddr)        pfn_valid(PFN_DOWN(virt_to_phys(vaddr)))
>
> diff --git a/arch/openrisc/include/asm/page.h b/arch/openrisc/include/asm/page.h
> index aab6e64d6db4..52b0d7e76446 100644
> --- a/arch/openrisc/include/asm/page.h
> +++ b/arch/openrisc/include/asm/page.h
> @@ -80,8 +80,6 @@ typedef struct page *pgtable_t;
>
>  #define page_to_phys(page)      ((dma_addr_t)page_to_pfn(page) << PAGE_SHIFT)
>
> -#define pfn_valid(pfn)          ((pfn) < max_mapnr)
> -
>  #define virt_addr_valid(kaddr) (pfn_valid(virt_to_pfn(kaddr)))
>
>  #endif /* __ASSEMBLY__ */
> diff --git a/arch/parisc/include/asm/page.h b/arch/parisc/include/asm/page.h
> index 6faaaa3ebe9b..667e703c0e8f 100644
> --- a/arch/parisc/include/asm/page.h
> +++ b/arch/parisc/include/asm/page.h
> @@ -155,10 +155,6 @@ extern int npmem_ranges;
>  #define __pa(x)                        ((unsigned long)(x)-PAGE_OFFSET)
>  #define __va(x)                        ((void *)((unsigned long)(x)+PAGE_OFFSET))
>
> -#ifndef CONFIG_SPARSEMEM
> -#define pfn_valid(pfn)         ((pfn) < max_mapnr)
> -#endif
> -
>  #ifdef CONFIG_HUGETLB_PAGE
>  #define HPAGE_SHIFT            PMD_SHIFT /* fixed for transparent huge pages */
>  #define HPAGE_SIZE             ((1UL) << HPAGE_SHIFT)
> diff --git a/arch/powerpc/include/asm/page.h b/arch/powerpc/include/asm/page.h
> index edf1dd1b0ca9..f2b6bf5687d0 100644
> --- a/arch/powerpc/include/asm/page.h
> +++ b/arch/powerpc/include/asm/page.h
> @@ -117,15 +117,6 @@ extern long long virt_phys_offset;
>
>  #ifdef CONFIG_FLATMEM
>  #define ARCH_PFN_OFFSET                ((unsigned long)(MEMORY_START >> PAGE_SHIFT))
> -#ifndef __ASSEMBLY__
> -extern unsigned long max_mapnr;
> -static inline bool pfn_valid(unsigned long pfn)
> -{
> -       unsigned long min_pfn = ARCH_PFN_OFFSET;
> -
> -       return pfn >= min_pfn && pfn < max_mapnr;
> -}
> -#endif
>  #endif
>
>  #define virt_to_pfn(kaddr)     (__pa(kaddr) >> PAGE_SHIFT)
> diff --git a/arch/riscv/include/asm/page.h b/arch/riscv/include/asm/page.h
> index 9f432c1b5289..7fed7c431928 100644
> --- a/arch/riscv/include/asm/page.h
> +++ b/arch/riscv/include/asm/page.h
> @@ -171,11 +171,6 @@ extern phys_addr_t __phys_addr_symbol(unsigned long x);
>
>  #define sym_to_pfn(x)           __phys_to_pfn(__pa_symbol(x))
>
> -#ifdef CONFIG_FLATMEM
> -#define pfn_valid(pfn) \
> -       (((pfn) >= ARCH_PFN_OFFSET) && (((pfn) - ARCH_PFN_OFFSET) < max_mapnr))
> -#endif
> -
>  #endif /* __ASSEMBLY__ */
>
>  #define virt_addr_valid(vaddr) ({                                              \
> diff --git a/arch/sh/include/asm/page.h b/arch/sh/include/asm/page.h
> index eca5daa43b93..09ac6c7faee0 100644
> --- a/arch/sh/include/asm/page.h
> +++ b/arch/sh/include/asm/page.h
> @@ -169,9 +169,6 @@ typedef struct page *pgtable_t;
>  #define PFN_START              (__MEMORY_START >> PAGE_SHIFT)
>  #define ARCH_PFN_OFFSET                (PFN_START)
>  #define virt_to_page(kaddr)    pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
> -#ifdef CONFIG_FLATMEM
> -#define pfn_valid(pfn)         ((pfn) >= min_low_pfn && (pfn) < max_low_pfn)
> -#endif
>  #define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
>
>  #include <asm-generic/memory_model.h>
> diff --git a/arch/sparc/include/asm/page_32.h b/arch/sparc/include/asm/page_32.h
> index fff8861df107..6be6f683f98f 100644
> --- a/arch/sparc/include/asm/page_32.h
> +++ b/arch/sparc/include/asm/page_32.h
> @@ -130,7 +130,6 @@ extern unsigned long pfn_base;
>  #define ARCH_PFN_OFFSET                (pfn_base)
>  #define virt_to_page(kaddr)    pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
>
> -#define pfn_valid(pfn)         (((pfn) >= (pfn_base)) && (((pfn)-(pfn_base)) < max_mapnr))
>  #define virt_addr_valid(kaddr) ((((unsigned long)(kaddr)-PAGE_OFFSET)>>PAGE_SHIFT) < max_mapnr)
>
>  #include <asm-generic/memory_model.h>
> diff --git a/arch/um/include/asm/page.h b/arch/um/include/asm/page.h
> index cdbd9653aa14..84866127d074 100644
> --- a/arch/um/include/asm/page.h
> +++ b/arch/um/include/asm/page.h
> @@ -108,7 +108,6 @@ extern unsigned long uml_physmem;
>  #define phys_to_pfn(p) ((p) >> PAGE_SHIFT)
>  #define pfn_to_phys(pfn) PFN_PHYS(pfn)
>
> -#define pfn_valid(pfn) ((pfn) < max_mapnr)
>  #define virt_addr_valid(v) pfn_valid(phys_to_pfn(__pa(v)))
>
>  #include <asm-generic/memory_model.h>
> diff --git a/arch/x86/include/asm/page_32.h b/arch/x86/include/asm/page_32.h
> index df42f8aa99e4..580d71aca65a 100644
> --- a/arch/x86/include/asm/page_32.h
> +++ b/arch/x86/include/asm/page_32.h
> @@ -15,10 +15,6 @@ extern unsigned long __phys_addr(unsigned long);
>  #define __phys_addr_symbol(x)  __phys_addr(x)
>  #define __phys_reloc_hide(x)   RELOC_HIDE((x), 0)
>
> -#ifdef CONFIG_FLATMEM
> -#define pfn_valid(pfn)         ((pfn) < max_mapnr)
> -#endif /* CONFIG_FLATMEM */
> -
>  #include <linux/string.h>
>
>  static inline void clear_page(void *page)
> diff --git a/arch/x86/include/asm/page_64.h b/arch/x86/include/asm/page_64.h
> index 198e03e59ca1..cc6b8e087192 100644
> --- a/arch/x86/include/asm/page_64.h
> +++ b/arch/x86/include/asm/page_64.h
> @@ -39,10 +39,6 @@ extern unsigned long __phys_addr_symbol(unsigned long);
>
>  #define __phys_reloc_hide(x)   (x)
>
> -#ifdef CONFIG_FLATMEM
> -#define pfn_valid(pfn)          ((pfn) < max_pfn)
> -#endif
> -
>  void clear_page_orig(void *page);
>  void clear_page_rep(void *page);
>  void clear_page_erms(void *page);
> diff --git a/arch/xtensa/include/asm/page.h b/arch/xtensa/include/asm/page.h
> index 493eb7083b1a..3267c672cd11 100644
> --- a/arch/xtensa/include/asm/page.h
> +++ b/arch/xtensa/include/asm/page.h
> @@ -189,8 +189,6 @@ static inline unsigned long ___pa(unsigned long va)
>  #endif
>  #define __va(x)        \
>         ((void *)((unsigned long) (x) - PHYS_OFFSET + PAGE_OFFSET))
> -#define pfn_valid(pfn) \
> -       ((pfn) >= ARCH_PFN_OFFSET && ((pfn) - ARCH_PFN_OFFSET) < max_mapnr)
>
>  #define virt_to_page(kaddr)    pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
>  #define page_to_virt(page)     __va(page_to_pfn(page) << PAGE_SHIFT)
> diff --git a/include/asm-generic/memory_model.h b/include/asm-generic/memory_model.h
> index a2c8ed60233a..13d2a844d928 100644
> --- a/include/asm-generic/memory_model.h
> +++ b/include/asm-generic/memory_model.h
> @@ -19,6 +19,18 @@
>  #define __page_to_pfn(page)    ((unsigned long)((page) - mem_map) + \
>                                  ARCH_PFN_OFFSET)
>
> +#ifndef pfn_valid
> +static inline int pfn_valid(unsigned long pfn)
> +{
> +       /* avoid <linux/mm.h> include hell */
> +       extern unsigned long max_mapnr;
> +       unsigned long pfn_offset = ARCH_PFN_OFFSET;
> +
> +       return pfn >= pfn_offset && pfn < max_mapnr;
> +}
> +#define pfn_valid pfn_valid
> +#endif
> +
>  #elif defined(CONFIG_SPARSEMEM_VMEMMAP)
>
>  /* memmap is virtually contiguous.  */
> diff --git a/include/asm-generic/page.h b/include/asm-generic/page.h
> index 6fc47561814c..c0be2edeb484 100644
> --- a/include/asm-generic/page.h
> +++ b/include/asm-generic/page.h
> @@ -84,8 +84,6 @@ extern unsigned long memory_end;
>  #define page_to_phys(page)      ((dma_addr_t)page_to_pfn(page) << PAGE_SHIFT)
>  #endif
>
> -#define pfn_valid(pfn)         ((pfn) >= ARCH_PFN_OFFSET && ((pfn) - ARCH_PFN_OFFSET) < max_mapnr)
> -
>  #define        virt_addr_valid(kaddr)  (((void *)(kaddr) >= (void *)PAGE_OFFSET) && \
>                                 ((void *)(kaddr) < (void *)memory_end))
>
> --
> 2.35.1
>


-- 
Best Regards
 Guo Ren

_______________________________________________
linux-um mailing list
linux-um@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-um

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 3/3] mm, arch: add generic implementation of pfn_valid() for FLATMEM
  2023-01-27  1:58   ` Guo Ren
@ 2023-01-28  5:07     ` Huacai Chen
  0 siblings, 0 replies; 10+ messages in thread
From: Huacai Chen @ 2023-01-28  5:07 UTC (permalink / raw)
  To: Guo Ren
  Cc: Mike Rapoport, Andrew Morton, Arnd Bergmann, Brian Cain,
	David S. Miller, Dinh Nguyen, Geert Uytterhoeven, Greg Ungerer,
	Helge Deller, Matt Turner, Max Filippov, Michael Ellerman,
	Michal Simek, Palmer Dabbelt, Rich Felker, Richard Weinberger,
	Stafford Horne, Thomas Bogendoerfer, Vineet Gupta, WANG Xuerui,
	Yoshinori Sato, linux-alpha, linux-arch, linux--csky,
	linux-hexagon, linux-ia64, linux-kernel, linux-m68k, linux-mips,
	linux-parisc, linux-riscv, linux-sh, linux-snps-arc, linux-um,
	linux-xtensa, linuxppc-dev, loongarch, openrisc, sparclinux, x86

For LoongArch part:
Acked-by: Huacai Chen <chenhuacai@loongson.cn>

On Fri, Jan 27, 2023 at 9:58 AM Guo Ren <guoren@kernel.org> wrote:
>
> On Thu, Jan 26, 2023 at 3:08 AM Mike Rapoport <rppt@kernel.org> wrote:
> >
> > From: "Mike Rapoport (IBM)" <rppt@kernel.org>
> >
> > Every architecture that supports FLATMEM memory model defines its own
> > version of pfn_valid() that essentially compares a pfn to max_mapnr.
> >
> > Use mips/powerpc version implemented as static inline as a generic
> > implementation of pfn_valid() and drop its per-architecture definitions
> >
> > Signed-off-by: Mike Rapoport (IBM) <rppt@kernel.org>
> > ---
> >  arch/alpha/include/asm/page.h      |  4 ----
> >  arch/arc/include/asm/page.h        |  1 -
> >  arch/csky/include/asm/page.h       |  1 -
> >  arch/hexagon/include/asm/page.h    |  1 -
> >  arch/ia64/include/asm/page.h       |  4 ----
> >  arch/loongarch/include/asm/page.h  | 13 -------------
> >  arch/m68k/include/asm/page_no.h    |  2 --
> >  arch/microblaze/include/asm/page.h |  1 -
> >  arch/mips/include/asm/page.h       | 13 -------------
> >  arch/nios2/include/asm/page.h      |  9 ---------
> >  arch/openrisc/include/asm/page.h   |  2 --
> >  arch/parisc/include/asm/page.h     |  4 ----
> >  arch/powerpc/include/asm/page.h    |  9 ---------
> >  arch/riscv/include/asm/page.h      |  5 -----
> >  arch/sh/include/asm/page.h         |  3 ---
> >  arch/sparc/include/asm/page_32.h   |  1 -
> >  arch/um/include/asm/page.h         |  1 -
> >  arch/x86/include/asm/page_32.h     |  4 ----
> >  arch/x86/include/asm/page_64.h     |  4 ----
> >  arch/xtensa/include/asm/page.h     |  2 --
> >  include/asm-generic/memory_model.h | 12 ++++++++++++
> >  include/asm-generic/page.h         |  2 --
> >  22 files changed, 12 insertions(+), 86 deletions(-)
> >
> > diff --git a/arch/alpha/include/asm/page.h b/arch/alpha/include/asm/page.h
> > index 8f3f5eecba28..227d32b6b75f 100644
> > --- a/arch/alpha/include/asm/page.h
> > +++ b/arch/alpha/include/asm/page.h
> > @@ -87,10 +87,6 @@ typedef struct page *pgtable_t;
> >  #define virt_to_page(kaddr)    pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
> >  #define virt_addr_valid(kaddr) pfn_valid((__pa(kaddr) >> PAGE_SHIFT))
> >
> > -#ifdef CONFIG_FLATMEM
> > -#define pfn_valid(pfn)         ((pfn) < max_mapnr)
> > -#endif /* CONFIG_FLATMEM */
> > -
> >  #include <asm-generic/memory_model.h>
> >  #include <asm-generic/getorder.h>
> >
> > diff --git a/arch/arc/include/asm/page.h b/arch/arc/include/asm/page.h
> > index 9a62e1d87967..e43fe27ec54d 100644
> > --- a/arch/arc/include/asm/page.h
> > +++ b/arch/arc/include/asm/page.h
> > @@ -109,7 +109,6 @@ extern int pfn_valid(unsigned long pfn);
> >  #else /* CONFIG_HIGHMEM */
> >
> >  #define ARCH_PFN_OFFSET                virt_to_pfn(CONFIG_LINUX_RAM_BASE)
> > -#define pfn_valid(pfn)         (((pfn) - ARCH_PFN_OFFSET) < max_mapnr)
> >
> >  #endif /* CONFIG_HIGHMEM */
> >
> > diff --git a/arch/csky/include/asm/page.h b/arch/csky/include/asm/page.h
> > index ed7451478b1b..b23e3006a9e0 100644
> > --- a/arch/csky/include/asm/page.h
> > +++ b/arch/csky/include/asm/page.h
> > @@ -39,7 +39,6 @@
> >
> >  #define virt_addr_valid(kaddr)  ((void *)(kaddr) >= (void *)PAGE_OFFSET && \
> >                         (void *)(kaddr) < high_memory)
> > -#define pfn_valid(pfn)         ((pfn) >= ARCH_PFN_OFFSET && ((pfn) - ARCH_PFN_OFFSET) < max_mapnr)
> For csky part:
> Acked-by: Guo Ren <guoren@kernel.org>
>
> >
> >  extern void *memset(void *dest, int c, size_t l);
> >  extern void *memcpy(void *to, const void *from, size_t l);
> > diff --git a/arch/hexagon/include/asm/page.h b/arch/hexagon/include/asm/page.h
> > index d7d4f9fca327..9c03b9965f07 100644
> > --- a/arch/hexagon/include/asm/page.h
> > +++ b/arch/hexagon/include/asm/page.h
> > @@ -95,7 +95,6 @@ struct page;
> >  /* Default vm area behavior is non-executable.  */
> >  #define VM_DATA_DEFAULT_FLAGS  VM_DATA_FLAGS_NON_EXEC
> >
> > -#define pfn_valid(pfn) ((pfn) < max_mapnr)
> >  #define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
> >
> >  /*  Need to not use a define for linesize; may move this to another file.  */
> > diff --git a/arch/ia64/include/asm/page.h b/arch/ia64/include/asm/page.h
> > index 1b990466d540..783eceab5df3 100644
> > --- a/arch/ia64/include/asm/page.h
> > +++ b/arch/ia64/include/asm/page.h
> > @@ -97,10 +97,6 @@ do {                                         \
> >
> >  #include <asm-generic/memory_model.h>
> >
> > -#ifdef CONFIG_FLATMEM
> > -# define pfn_valid(pfn)                ((pfn) < max_mapnr)
> > -#endif
> > -
> >  #define page_to_phys(page)     (page_to_pfn(page) << PAGE_SHIFT)
> >  #define virt_to_page(kaddr)    pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
> >  #define pfn_to_kaddr(pfn)      __va((pfn) << PAGE_SHIFT)
> > diff --git a/arch/loongarch/include/asm/page.h b/arch/loongarch/include/asm/page.h
> > index 53f284a96182..fb5338b352e6 100644
> > --- a/arch/loongarch/include/asm/page.h
> > +++ b/arch/loongarch/include/asm/page.h
> > @@ -82,19 +82,6 @@ typedef struct { unsigned long pgprot; } pgprot_t;
> >
> >  #define pfn_to_kaddr(pfn)      __va((pfn) << PAGE_SHIFT)
> >
> > -#ifdef CONFIG_FLATMEM
> > -
> > -static inline int pfn_valid(unsigned long pfn)
> > -{
> > -       /* avoid <linux/mm.h> include hell */
> > -       extern unsigned long max_mapnr;
> > -       unsigned long pfn_offset = ARCH_PFN_OFFSET;
> > -
> > -       return pfn >= pfn_offset && pfn < max_mapnr;
> > -}
> > -
> > -#endif
> > -
> >  #define virt_to_pfn(kaddr)     PFN_DOWN(PHYSADDR(kaddr))
> >  #define virt_to_page(kaddr)    pfn_to_page(virt_to_pfn(kaddr))
> >
> > diff --git a/arch/m68k/include/asm/page_no.h b/arch/m68k/include/asm/page_no.h
> > index 0a8ccef777fd..2555ec57149d 100644
> > --- a/arch/m68k/include/asm/page_no.h
> > +++ b/arch/m68k/include/asm/page_no.h
> > @@ -26,8 +26,6 @@ extern unsigned long memory_end;
> >  #define virt_to_page(addr)     (mem_map + (((unsigned long)(addr)-PAGE_OFFSET) >> PAGE_SHIFT))
> >  #define page_to_virt(page)     __va(((((page) - mem_map) << PAGE_SHIFT) + PAGE_OFFSET))
> >
> > -#define pfn_valid(pfn)         ((pfn) < max_mapnr)
> > -
> >  #define        virt_addr_valid(kaddr)  (((unsigned long)(kaddr) >= PAGE_OFFSET) && \
> >                                 ((unsigned long)(kaddr) < memory_end))
> >
> > diff --git a/arch/microblaze/include/asm/page.h b/arch/microblaze/include/asm/page.h
> > index 4b8b2fa78fc5..7b9861bcd458 100644
> > --- a/arch/microblaze/include/asm/page.h
> > +++ b/arch/microblaze/include/asm/page.h
> > @@ -112,7 +112,6 @@ extern int page_is_ram(unsigned long pfn);
> >  #  define page_to_phys(page)     (page_to_pfn(page) << PAGE_SHIFT)
> >
> >  #  define ARCH_PFN_OFFSET      (memory_start >> PAGE_SHIFT)
> > -#  define pfn_valid(pfn)       ((pfn) >= ARCH_PFN_OFFSET && (pfn) < (max_mapnr + ARCH_PFN_OFFSET))
> >  # endif /* __ASSEMBLY__ */
> >
> >  #define        virt_addr_valid(vaddr)  (pfn_valid(virt_to_pfn(vaddr)))
> > diff --git a/arch/mips/include/asm/page.h b/arch/mips/include/asm/page.h
> > index 9286f11ff6ad..5978a8dfb917 100644
> > --- a/arch/mips/include/asm/page.h
> > +++ b/arch/mips/include/asm/page.h
> > @@ -224,19 +224,6 @@ extern phys_addr_t __phys_addr_symbol(unsigned long x);
> >
> >  #define pfn_to_kaddr(pfn)      __va((pfn) << PAGE_SHIFT)
> >
> > -#ifdef CONFIG_FLATMEM
> > -
> > -static inline int pfn_valid(unsigned long pfn)
> > -{
> > -       /* avoid <linux/mm.h> include hell */
> > -       extern unsigned long max_mapnr;
> > -       unsigned long pfn_offset = ARCH_PFN_OFFSET;
> > -
> > -       return pfn >= pfn_offset && pfn < max_mapnr;
> > -}
> > -
> > -#endif
> > -
> >  #define virt_to_pfn(kaddr)     PFN_DOWN(virt_to_phys((void *)(kaddr)))
> >  #define virt_to_page(kaddr)    pfn_to_page(virt_to_pfn(kaddr))
> >
> > diff --git a/arch/nios2/include/asm/page.h b/arch/nios2/include/asm/page.h
> > index 6a989819a7c1..0ae7d9ce369b 100644
> > --- a/arch/nios2/include/asm/page.h
> > +++ b/arch/nios2/include/asm/page.h
> > @@ -86,15 +86,6 @@ extern struct page *mem_map;
> >
> >  # define pfn_to_kaddr(pfn)     __va((pfn) << PAGE_SHIFT)
> >
> > -static inline bool pfn_valid(unsigned long pfn)
> > -{
> > -       /* avoid <linux/mm.h> include hell */
> > -       extern unsigned long max_mapnr;
> > -       unsigned long pfn_offset = ARCH_PFN_OFFSET;
> > -
> > -       return pfn >= pfn_offset && pfn < max_mapnr;
> > -}
> > -
> >  # define virt_to_page(vaddr)   pfn_to_page(PFN_DOWN(virt_to_phys(vaddr)))
> >  # define virt_addr_valid(vaddr)        pfn_valid(PFN_DOWN(virt_to_phys(vaddr)))
> >
> > diff --git a/arch/openrisc/include/asm/page.h b/arch/openrisc/include/asm/page.h
> > index aab6e64d6db4..52b0d7e76446 100644
> > --- a/arch/openrisc/include/asm/page.h
> > +++ b/arch/openrisc/include/asm/page.h
> > @@ -80,8 +80,6 @@ typedef struct page *pgtable_t;
> >
> >  #define page_to_phys(page)      ((dma_addr_t)page_to_pfn(page) << PAGE_SHIFT)
> >
> > -#define pfn_valid(pfn)          ((pfn) < max_mapnr)
> > -
> >  #define virt_addr_valid(kaddr) (pfn_valid(virt_to_pfn(kaddr)))
> >
> >  #endif /* __ASSEMBLY__ */
> > diff --git a/arch/parisc/include/asm/page.h b/arch/parisc/include/asm/page.h
> > index 6faaaa3ebe9b..667e703c0e8f 100644
> > --- a/arch/parisc/include/asm/page.h
> > +++ b/arch/parisc/include/asm/page.h
> > @@ -155,10 +155,6 @@ extern int npmem_ranges;
> >  #define __pa(x)                        ((unsigned long)(x)-PAGE_OFFSET)
> >  #define __va(x)                        ((void *)((unsigned long)(x)+PAGE_OFFSET))
> >
> > -#ifndef CONFIG_SPARSEMEM
> > -#define pfn_valid(pfn)         ((pfn) < max_mapnr)
> > -#endif
> > -
> >  #ifdef CONFIG_HUGETLB_PAGE
> >  #define HPAGE_SHIFT            PMD_SHIFT /* fixed for transparent huge pages */
> >  #define HPAGE_SIZE             ((1UL) << HPAGE_SHIFT)
> > diff --git a/arch/powerpc/include/asm/page.h b/arch/powerpc/include/asm/page.h
> > index edf1dd1b0ca9..f2b6bf5687d0 100644
> > --- a/arch/powerpc/include/asm/page.h
> > +++ b/arch/powerpc/include/asm/page.h
> > @@ -117,15 +117,6 @@ extern long long virt_phys_offset;
> >
> >  #ifdef CONFIG_FLATMEM
> >  #define ARCH_PFN_OFFSET                ((unsigned long)(MEMORY_START >> PAGE_SHIFT))
> > -#ifndef __ASSEMBLY__
> > -extern unsigned long max_mapnr;
> > -static inline bool pfn_valid(unsigned long pfn)
> > -{
> > -       unsigned long min_pfn = ARCH_PFN_OFFSET;
> > -
> > -       return pfn >= min_pfn && pfn < max_mapnr;
> > -}
> > -#endif
> >  #endif
> >
> >  #define virt_to_pfn(kaddr)     (__pa(kaddr) >> PAGE_SHIFT)
> > diff --git a/arch/riscv/include/asm/page.h b/arch/riscv/include/asm/page.h
> > index 9f432c1b5289..7fed7c431928 100644
> > --- a/arch/riscv/include/asm/page.h
> > +++ b/arch/riscv/include/asm/page.h
> > @@ -171,11 +171,6 @@ extern phys_addr_t __phys_addr_symbol(unsigned long x);
> >
> >  #define sym_to_pfn(x)           __phys_to_pfn(__pa_symbol(x))
> >
> > -#ifdef CONFIG_FLATMEM
> > -#define pfn_valid(pfn) \
> > -       (((pfn) >= ARCH_PFN_OFFSET) && (((pfn) - ARCH_PFN_OFFSET) < max_mapnr))
> > -#endif
> > -
> >  #endif /* __ASSEMBLY__ */
> >
> >  #define virt_addr_valid(vaddr) ({                                              \
> > diff --git a/arch/sh/include/asm/page.h b/arch/sh/include/asm/page.h
> > index eca5daa43b93..09ac6c7faee0 100644
> > --- a/arch/sh/include/asm/page.h
> > +++ b/arch/sh/include/asm/page.h
> > @@ -169,9 +169,6 @@ typedef struct page *pgtable_t;
> >  #define PFN_START              (__MEMORY_START >> PAGE_SHIFT)
> >  #define ARCH_PFN_OFFSET                (PFN_START)
> >  #define virt_to_page(kaddr)    pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
> > -#ifdef CONFIG_FLATMEM
> > -#define pfn_valid(pfn)         ((pfn) >= min_low_pfn && (pfn) < max_low_pfn)
> > -#endif
> >  #define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
> >
> >  #include <asm-generic/memory_model.h>
> > diff --git a/arch/sparc/include/asm/page_32.h b/arch/sparc/include/asm/page_32.h
> > index fff8861df107..6be6f683f98f 100644
> > --- a/arch/sparc/include/asm/page_32.h
> > +++ b/arch/sparc/include/asm/page_32.h
> > @@ -130,7 +130,6 @@ extern unsigned long pfn_base;
> >  #define ARCH_PFN_OFFSET                (pfn_base)
> >  #define virt_to_page(kaddr)    pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
> >
> > -#define pfn_valid(pfn)         (((pfn) >= (pfn_base)) && (((pfn)-(pfn_base)) < max_mapnr))
> >  #define virt_addr_valid(kaddr) ((((unsigned long)(kaddr)-PAGE_OFFSET)>>PAGE_SHIFT) < max_mapnr)
> >
> >  #include <asm-generic/memory_model.h>
> > diff --git a/arch/um/include/asm/page.h b/arch/um/include/asm/page.h
> > index cdbd9653aa14..84866127d074 100644
> > --- a/arch/um/include/asm/page.h
> > +++ b/arch/um/include/asm/page.h
> > @@ -108,7 +108,6 @@ extern unsigned long uml_physmem;
> >  #define phys_to_pfn(p) ((p) >> PAGE_SHIFT)
> >  #define pfn_to_phys(pfn) PFN_PHYS(pfn)
> >
> > -#define pfn_valid(pfn) ((pfn) < max_mapnr)
> >  #define virt_addr_valid(v) pfn_valid(phys_to_pfn(__pa(v)))
> >
> >  #include <asm-generic/memory_model.h>
> > diff --git a/arch/x86/include/asm/page_32.h b/arch/x86/include/asm/page_32.h
> > index df42f8aa99e4..580d71aca65a 100644
> > --- a/arch/x86/include/asm/page_32.h
> > +++ b/arch/x86/include/asm/page_32.h
> > @@ -15,10 +15,6 @@ extern unsigned long __phys_addr(unsigned long);
> >  #define __phys_addr_symbol(x)  __phys_addr(x)
> >  #define __phys_reloc_hide(x)   RELOC_HIDE((x), 0)
> >
> > -#ifdef CONFIG_FLATMEM
> > -#define pfn_valid(pfn)         ((pfn) < max_mapnr)
> > -#endif /* CONFIG_FLATMEM */
> > -
> >  #include <linux/string.h>
> >
> >  static inline void clear_page(void *page)
> > diff --git a/arch/x86/include/asm/page_64.h b/arch/x86/include/asm/page_64.h
> > index 198e03e59ca1..cc6b8e087192 100644
> > --- a/arch/x86/include/asm/page_64.h
> > +++ b/arch/x86/include/asm/page_64.h
> > @@ -39,10 +39,6 @@ extern unsigned long __phys_addr_symbol(unsigned long);
> >
> >  #define __phys_reloc_hide(x)   (x)
> >
> > -#ifdef CONFIG_FLATMEM
> > -#define pfn_valid(pfn)          ((pfn) < max_pfn)
> > -#endif
> > -
> >  void clear_page_orig(void *page);
> >  void clear_page_rep(void *page);
> >  void clear_page_erms(void *page);
> > diff --git a/arch/xtensa/include/asm/page.h b/arch/xtensa/include/asm/page.h
> > index 493eb7083b1a..3267c672cd11 100644
> > --- a/arch/xtensa/include/asm/page.h
> > +++ b/arch/xtensa/include/asm/page.h
> > @@ -189,8 +189,6 @@ static inline unsigned long ___pa(unsigned long va)
> >  #endif
> >  #define __va(x)        \
> >         ((void *)((unsigned long) (x) - PHYS_OFFSET + PAGE_OFFSET))
> > -#define pfn_valid(pfn) \
> > -       ((pfn) >= ARCH_PFN_OFFSET && ((pfn) - ARCH_PFN_OFFSET) < max_mapnr)
> >
> >  #define virt_to_page(kaddr)    pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
> >  #define page_to_virt(page)     __va(page_to_pfn(page) << PAGE_SHIFT)
> > diff --git a/include/asm-generic/memory_model.h b/include/asm-generic/memory_model.h
> > index a2c8ed60233a..13d2a844d928 100644
> > --- a/include/asm-generic/memory_model.h
> > +++ b/include/asm-generic/memory_model.h
> > @@ -19,6 +19,18 @@
> >  #define __page_to_pfn(page)    ((unsigned long)((page) - mem_map) + \
> >                                  ARCH_PFN_OFFSET)
> >
> > +#ifndef pfn_valid
> > +static inline int pfn_valid(unsigned long pfn)
> > +{
> > +       /* avoid <linux/mm.h> include hell */
> > +       extern unsigned long max_mapnr;
> > +       unsigned long pfn_offset = ARCH_PFN_OFFSET;
> > +
> > +       return pfn >= pfn_offset && pfn < max_mapnr;
> > +}
> > +#define pfn_valid pfn_valid
> > +#endif
> > +
> >  #elif defined(CONFIG_SPARSEMEM_VMEMMAP)
> >
> >  /* memmap is virtually contiguous.  */
> > diff --git a/include/asm-generic/page.h b/include/asm-generic/page.h
> > index 6fc47561814c..c0be2edeb484 100644
> > --- a/include/asm-generic/page.h
> > +++ b/include/asm-generic/page.h
> > @@ -84,8 +84,6 @@ extern unsigned long memory_end;
> >  #define page_to_phys(page)      ((dma_addr_t)page_to_pfn(page) << PAGE_SHIFT)
> >  #endif
> >
> > -#define pfn_valid(pfn)         ((pfn) >= ARCH_PFN_OFFSET && ((pfn) - ARCH_PFN_OFFSET) < max_mapnr)
> > -
> >  #define        virt_addr_valid(kaddr)  (((void *)(kaddr) >= (void *)PAGE_OFFSET) && \
> >                                 ((void *)(kaddr) < (void *)memory_end))
> >
> > --
> > 2.35.1
> >
>
>
> --
> Best Regards
>  Guo Ren

_______________________________________________
linux-um mailing list
linux-um@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-um

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 3/3] mm, arch: add generic implementation of pfn_valid() for FLATMEM
  2023-01-25 19:07 ` [PATCH 3/3] mm, arch: add generic implementation of pfn_valid() for FLATMEM Mike Rapoport
                     ` (2 preceding siblings ...)
  2023-01-27  1:58   ` Guo Ren
@ 2023-01-28  9:02   ` Stafford Horne
  3 siblings, 0 replies; 10+ messages in thread
From: Stafford Horne @ 2023-01-28  9:02 UTC (permalink / raw)
  To: Mike Rapoport
  Cc: Andrew Morton, Arnd Bergmann, Brian Cain, David S. Miller,
	Dinh Nguyen, Geert Uytterhoeven, Greg Ungerer, Guo Ren,
	Helge Deller, Huacai Chen, Matt Turner, Max Filippov,
	Michael Ellerman, Michal Simek, Palmer Dabbelt, Rich Felker,
	Richard Weinberger, Thomas Bogendoerfer, Vineet Gupta,
	WANG Xuerui, Yoshinori Sato, linux-alpha, linux-arch,
	linux--csky, linux-hexagon, linux-ia64, linux-kernel, linux-m68k,
	linux-mips, linux-parisc, linux-riscv, linux-sh, linux-snps-arc,
	linux-um, linux-xtensa, linuxppc-dev, loongarch, sparclinux, x86

On Wed, Jan 25, 2023 at 09:07:57PM +0200, Mike Rapoport wrote:
> From: "Mike Rapoport (IBM)" <rppt@kernel.org>
> 
> Every architecture that supports FLATMEM memory model defines its own
> version of pfn_valid() that essentially compares a pfn to max_mapnr.
> 
> Use mips/powerpc version implemented as static inline as a generic
> implementation of pfn_valid() and drop its per-architecture definitions
> 
> Signed-off-by: Mike Rapoport (IBM) <rppt@kernel.org>
> ---
>  arch/alpha/include/asm/page.h      |  4 ----
>  arch/arc/include/asm/page.h        |  1 -
>  arch/csky/include/asm/page.h       |  1 -
>  arch/hexagon/include/asm/page.h    |  1 -
>  arch/ia64/include/asm/page.h       |  4 ----
>  arch/loongarch/include/asm/page.h  | 13 -------------
>  arch/m68k/include/asm/page_no.h    |  2 --
>  arch/microblaze/include/asm/page.h |  1 -
>  arch/mips/include/asm/page.h       | 13 -------------
>  arch/nios2/include/asm/page.h      |  9 ---------
>  arch/openrisc/include/asm/page.h   |  2 --
>  arch/parisc/include/asm/page.h     |  4 ----
>  arch/powerpc/include/asm/page.h    |  9 ---------
>  arch/riscv/include/asm/page.h      |  5 -----
>  arch/sh/include/asm/page.h         |  3 ---
>  arch/sparc/include/asm/page_32.h   |  1 -
>  arch/um/include/asm/page.h         |  1 -
>  arch/x86/include/asm/page_32.h     |  4 ----
>  arch/x86/include/asm/page_64.h     |  4 ----
>  arch/xtensa/include/asm/page.h     |  2 --
>  include/asm-generic/memory_model.h | 12 ++++++++++++
>  include/asm-generic/page.h         |  2 --
>  22 files changed, 12 insertions(+), 86 deletions(-)
> 
[...] 
> diff --git a/arch/openrisc/include/asm/page.h b/arch/openrisc/include/asm/page.h
> index aab6e64d6db4..52b0d7e76446 100644
> --- a/arch/openrisc/include/asm/page.h
> +++ b/arch/openrisc/include/asm/page.h
> @@ -80,8 +80,6 @@ typedef struct page *pgtable_t;
>  
>  #define page_to_phys(page)      ((dma_addr_t)page_to_pfn(page) << PAGE_SHIFT)
>  
> -#define pfn_valid(pfn)          ((pfn) < max_mapnr)
> -
>  #define virt_addr_valid(kaddr)	(pfn_valid(virt_to_pfn(kaddr)))
>  
>  #endif /* __ASSEMBLY__ */

For OpenRISC

Acked-by: Stafford Horne <shorne@gmail.com>

_______________________________________________
linux-um mailing list
linux-um@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-um

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2023-01-28  9:02 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-01-25 19:07 [PATCH 0/3] mm, arch: add generic implementation of pfn_valid() for FLATMEM Mike Rapoport
2023-01-25 19:07 ` [PATCH 1/3] m68k: use asm-generic/memory_model.h for both MMU and !MMU Mike Rapoport
2023-01-26  8:20   ` Geert Uytterhoeven
2023-01-25 19:07 ` [PATCH 2/3] mips: drop definition of pfn_valid() for DISCONTIGMEM Mike Rapoport
2023-01-25 19:07 ` [PATCH 3/3] mm, arch: add generic implementation of pfn_valid() for FLATMEM Mike Rapoport
2023-01-26  1:45   ` Andrew Morton
2023-01-26  7:22   ` Arnd Bergmann
2023-01-27  1:58   ` Guo Ren
2023-01-28  5:07     ` Huacai Chen
2023-01-28  9:02   ` Stafford Horne

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).