]> git.dujemihanovic.xyz Git - linux.git/commitdiff
powerpc: Make virt_to_pfn() a static inline
authorLinus Walleij <linus.walleij@linaro.org>
Wed, 9 Aug 2023 08:07:13 +0000 (10:07 +0200)
committerMichael Ellerman <mpe@ellerman.id.au>
Wed, 16 Aug 2023 13:54:49 +0000 (23:54 +1000)
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.

Move the virt_to_pfn() and related functions below the
declaration of __pa() so it compiles.

For symmetry do the same with pfn_to_kaddr().

As the file is included right into the linker file, we need
to surround the functions with ifndef __ASSEMBLY__ so we
don't cause compilation errors.

The conversion moreover exposes the fact that pmd_page_vaddr()
was returning an unsigned long rather than a const void * as
could be expected, so all the sites defining pmd_page_vaddr()
had to be augmented as well.

Finally the KVM code in book3s_64_mmu_hv.c was passing an
unsigned int to virt_to_phys() so fix that up with a cast so the
result compiles.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
[mpe: Fixup kfence.h, simplify pfn_to_kaddr() & pmd_page_vaddr()]
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://msgid.link/20230809-virt-to-phys-powerpc-v1-1-12e912a7d439@linaro.org
arch/powerpc/include/asm/kfence.h
arch/powerpc/include/asm/nohash/32/pgtable.h
arch/powerpc/include/asm/nohash/64/pgtable.h
arch/powerpc/include/asm/page.h
arch/powerpc/include/asm/pgtable.h
arch/powerpc/kvm/book3s_64_mmu_hv.c

index 6fd2b4d486c5257a1343002703829a6ac5d31f2b..424ceef82ae6151aeed5037d5f4cab1df8fc6c9f 100644 (file)
@@ -23,7 +23,7 @@ static inline bool arch_kfence_init_pool(void)
 #ifdef CONFIG_PPC64
 static inline bool kfence_protect_page(unsigned long addr, bool protect)
 {
-       struct page *page = virt_to_page(addr);
+       struct page *page = virt_to_page((void *)addr);
 
        __kernel_map_pages(page, 1, !protect);
 
index fec56d965f00de9d8a4c8be6fddcc03d8b1a2f3d..d6201b5096b83fbec80e37014ae665866f7e921a 100644 (file)
@@ -355,7 +355,7 @@ static inline int pte_young(pte_t pte)
 #define pmd_pfn(pmd)           (pmd_val(pmd) >> PAGE_SHIFT)
 #else
 #define pmd_page_vaddr(pmd)    \
-       ((unsigned long)(pmd_val(pmd) & ~(PTE_TABLE_SIZE - 1)))
+       ((const void *)(pmd_val(pmd) & ~(PTE_TABLE_SIZE - 1)))
 #define pmd_pfn(pmd)           (__pa(pmd_val(pmd)) >> PAGE_SHIFT)
 #endif
 
index 287e25864ffae07ef5745ffbc837fdd494bbb14e..81c801880933eebdf1e1af1c0a844dd7a6709940 100644 (file)
@@ -127,7 +127,7 @@ static inline pte_t pmd_pte(pmd_t pmd)
 #define        pmd_bad(pmd)            (!is_kernel_addr(pmd_val(pmd)) \
                                 || (pmd_val(pmd) & PMD_BAD_BITS))
 #define        pmd_present(pmd)        (!pmd_none(pmd))
-#define pmd_page_vaddr(pmd)    (pmd_val(pmd) & ~PMD_MASKED_BITS)
+#define pmd_page_vaddr(pmd)    ((const void *)(pmd_val(pmd) & ~PMD_MASKED_BITS))
 extern struct page *pmd_page(pmd_t pmd);
 #define pmd_pfn(pmd)           (page_to_pfn(pmd_page(pmd)))
 
index f2b6bf5687d0efc2fc3515b51fead74eb331a315..e5fcc79b5bfba175b56b2783763d8041a355debe 100644 (file)
@@ -9,6 +9,7 @@
 #ifndef __ASSEMBLY__
 #include <linux/types.h>
 #include <linux/kernel.h>
+#include <linux/bug.h>
 #else
 #include <asm/types.h>
 #endif
@@ -119,16 +120,6 @@ extern long long virt_phys_offset;
 #define ARCH_PFN_OFFSET                ((unsigned long)(MEMORY_START >> PAGE_SHIFT))
 #endif
 
-#define virt_to_pfn(kaddr)     (__pa(kaddr) >> PAGE_SHIFT)
-#define virt_to_page(kaddr)    pfn_to_page(virt_to_pfn(kaddr))
-#define pfn_to_kaddr(pfn)      __va((pfn) << PAGE_SHIFT)
-
-#define virt_addr_valid(vaddr) ({                                      \
-       unsigned long _addr = (unsigned long)vaddr;                     \
-       _addr >= PAGE_OFFSET && _addr < (unsigned long)high_memory &&   \
-       pfn_valid(virt_to_pfn(_addr));                                  \
-})
-
 /*
  * On Book-E parts we need __va to parse the device tree and we can't
  * determine MEMORY_START until then.  However we can determine PHYSICAL_START
@@ -233,6 +224,25 @@ extern long long virt_phys_offset;
 #endif
 #endif
 
+#ifndef __ASSEMBLY__
+static inline unsigned long virt_to_pfn(const void *kaddr)
+{
+       return __pa(kaddr) >> PAGE_SHIFT;
+}
+
+static inline const void *pfn_to_kaddr(unsigned long pfn)
+{
+       return __va(pfn << PAGE_SHIFT);
+}
+#endif
+
+#define virt_to_page(kaddr)    pfn_to_page(virt_to_pfn(kaddr))
+#define virt_addr_valid(vaddr) ({                                      \
+       unsigned long _addr = (unsigned long)vaddr;                     \
+       _addr >= PAGE_OFFSET && _addr < (unsigned long)high_memory &&   \
+       pfn_valid(virt_to_pfn((void *)_addr));                          \
+})
+
 /*
  * Unfortunately the PLT is in the BSS in the PPC32 ELF ABI,
  * and needs to be executable.  This means the whole heap ends
index 6a88bfdaa69b6f586152d653294c7fa26ca65bc8..a92f1f65d0a7b0ecce80f670b886b810cb7bd848 100644 (file)
@@ -60,9 +60,9 @@ static inline pgprot_t pte_pgprot(pte_t pte)
 }
 
 #ifndef pmd_page_vaddr
-static inline unsigned long pmd_page_vaddr(pmd_t pmd)
+static inline const void *pmd_page_vaddr(pmd_t pmd)
 {
-       return ((unsigned long)__va(pmd_val(pmd) & ~PMD_MASKED_BITS));
+       return __va(pmd_val(pmd) & ~PMD_MASKED_BITS);
 }
 #define pmd_page_vaddr pmd_page_vaddr
 #endif
index 7f765d5ad43663ac51480c075ad088a9c82a0895..efd0ebf70a5e602a4f163cae0e8440efe4b2cbe0 100644 (file)
@@ -182,7 +182,7 @@ void kvmppc_free_hpt(struct kvm_hpt_info *info)
        vfree(info->rev);
        info->rev = NULL;
        if (info->cma)
-               kvm_free_hpt_cma(virt_to_page(info->virt),
+               kvm_free_hpt_cma(virt_to_page((void *)info->virt),
                                 1 << (info->order - PAGE_SHIFT));
        else if (info->virt)
                free_pages(info->virt, info->order - PAGE_SHIFT);