mm: implement for_each_valid_pfn() for CONFIG_FLATMEM

In the FLATMEM case, the default pfn_valid() just checks that the PFN is
within the range [ ARCH_PFN_OFFSET ..  ARCH_PFN_OFFSET + max_mapnr ).

The for_each_valid_pfn() function can therefore be a simple for() loop
using those as min/max respectively.

Link: https://lkml.kernel.org/r/20250423133821.789413-3-dwmw2@infradead.org
Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
Acked-by: David Hildenbrand <david@redhat.com>
Cc: Anshuman Khandual <anshuman.khandual@arm.com>
Cc: Ard Biesheuvel <ardb@kernel.org>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Marc Rutland <mark.rutland@arm.com>
Cc: Marc Zyngier <maz@kernel.org>
Cc: Ruihan Li <lrh2000@pku.edu.cn>
Cc: Will Deacon <will@kernel.org>
Cc: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
David Woodhouse
2025-04-23 14:33:38 +01:00
committed by Andrew Morton
parent f88ce2c84a
commit 928930c2e0

View File

@@ -30,7 +30,15 @@ static inline int pfn_valid(unsigned long pfn)
return pfn >= pfn_offset && (pfn - pfn_offset) < max_mapnr;
}
#define pfn_valid pfn_valid
#endif
#ifndef for_each_valid_pfn
#define for_each_valid_pfn(pfn, start_pfn, end_pfn) \
for ((pfn) = max_t(unsigned long, (start_pfn), ARCH_PFN_OFFSET); \
(pfn) < min_t(unsigned long, (end_pfn), \
ARCH_PFN_OFFSET + max_mapnr); \
(pfn)++)
#endif /* for_each_valid_pfn */
#endif /* valid_pfn */
#elif defined(CONFIG_SPARSEMEM_VMEMMAP)