Re: [PATCH 2/2] asm-generic: add an optional pfn_valid check to page_to_phys
Christophe Leroy <[email protected]>
| Newsgroups | gmane.linux.ports.mips,gmane.linux.ports.alpha,gmane.linux.kernel,gmane.linux.kernel.arc,gmane.linux.ports.arm.kernel,gmane.linux.ports.hexagon,gmane.linux.ports.parisc,gmane.linux.ports.ppc64.devel,gmane.linux.ports.riscv,gmane.linux.ports.sh.devel,gmane.linux.ports.sparc,gmane.linux.uml.devel,gmane.linux.kernel.cross-arch |
|---|---|
| Message-ID | <[email protected]> |
Le 23/10/2024 à 07:36, Christoph Hellwig a écrit : > page_to_pfn is usually implemented by pointer arithmetics on the memory > map, which means that bogus input can lead to even more bogus output. > > Powerpc had a pfn_valid check on the intermediate pfn in the page_to_phys > implementation when CONFIG_DEBUG_VIRTUAL is defined, which seems > generally useful, so add that to the generic version. > > Signed-off-by: Christoph Hellwig <[email protected]> > --- > include/asm-generic/memory_model.h | 10 ++++++++++ > 1 file changed, 10 insertions(+) > > diff --git a/include/asm-generic/memory_model.h b/include/asm-generic/memory_model.h > index a73a140cbecd..6d1fb6162ac1 100644 > --- a/include/asm-generic/memory_model.h > +++ b/include/asm-generic/memory_model.h > @@ -64,7 +64,17 @@ static inline int pfn_valid(unsigned long pfn) > #define page_to_pfn __page_to_pfn > #define pfn_to_page __pfn_to_page > > +#ifdef CONFIG_DEBUG_VIRTUAL > +#define page_to_phys(page) \ > +({ \ > + unsigned long __pfn = page_to_pfn(page); \ > + \ > + WARN_ON_ONCE(!pfn_valid(__pfn)); \ On powerpc I think it was a WARN_ON(). Will a WARN_ON_ONCE() be enough ? > + PFN_PHYS(__pfn); \ > +}) > +#else > #define page_to_phys(page) PFN_PHYS(page_to_pfn(page)) > +#endif /* CONFIG_DEBUG_VIRTUAL */ > #define phys_to_page(phys) pfn_to_page(PHYS_PFN(phys)) > > #endif /* __ASSEMBLY__ */