Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ARC: mm: Make virt_to_pfn() a static inline

Making virt_to_pfn() a static inline taking a strongly typed
(const void *) makes the contract of a passing a pointer of that
type to the function explicit and exposes any misuse of the
macro virt_to_pfn() acting polymorphic and accepting many types
such as (void *), (unitptr_t) or (unsigned long) as arguments
without warnings.

In order to do this we move the virt_to_phys() and
below the definition of the __pa() and __va() macros so it
compiles. The macro version was also able to do recursive
symbol resolution.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>

authored by

Linus Walleij and committed by
Arnd Bergmann
da4382a7 235a59c3

+13 -10
+12 -9
arch/arc/include/asm/page.h
··· 85 85 typedef struct page *pgtable_t; 86 86 87 87 /* 88 - * Use virt_to_pfn with caution: 89 - * If used in pte or paddr related macros, it could cause truncation 90 - * in PAE40 builds 91 - * As a rule of thumb, only use it in helpers starting with virt_ 92 - * You have been warned ! 93 - */ 94 - #define virt_to_pfn(kaddr) (__pa(kaddr) >> PAGE_SHIFT) 95 - 96 - /* 97 88 * When HIGHMEM is enabled we have holes in the memory map so we need 98 89 * pfn_valid() that takes into account the actual extents of the physical 99 90 * memory ··· 112 121 */ 113 122 #define __pa(vaddr) ((unsigned long)(vaddr)) 114 123 #define __va(paddr) ((void *)((unsigned long)(paddr))) 124 + 125 + /* 126 + * Use virt_to_pfn with caution: 127 + * If used in pte or paddr related macros, it could cause truncation 128 + * in PAE40 builds 129 + * As a rule of thumb, only use it in helpers starting with virt_ 130 + * You have been warned ! 131 + */ 132 + static inline unsigned long virt_to_pfn(const void *kaddr) 133 + { 134 + return __pa(kaddr) >> PAGE_SHIFT; 135 + } 115 136 116 137 #define virt_to_page(kaddr) pfn_to_page(virt_to_pfn(kaddr)) 117 138 #define virt_addr_valid(kaddr) pfn_valid(virt_to_pfn(kaddr))
+1 -1
arch/arc/include/asm/pgtable-levels.h
··· 159 159 #define pmd_clear(xp) do { pmd_val(*(xp)) = 0; } while (0) 160 160 #define pmd_page_vaddr(pmd) (pmd_val(pmd) & PAGE_MASK) 161 161 #define pmd_pfn(pmd) ((pmd_val(pmd) & PAGE_MASK) >> PAGE_SHIFT) 162 - #define pmd_page(pmd) virt_to_page(pmd_page_vaddr(pmd)) 162 + #define pmd_page(pmd) virt_to_page((void *)pmd_page_vaddr(pmd)) 163 163 #define set_pmd(pmdp, pmd) (*(pmdp) = pmd) 164 164 #define pmd_pgtable(pmd) ((pgtable_t) pmd_page(pmd)) 165 165