diff options
Diffstat (limited to 'arch/powerpc/include/asm/page.h')
| -rw-r--r-- | arch/powerpc/include/asm/page.h | 12 | 
1 files changed, 12 insertions, 0 deletions
diff --git a/arch/powerpc/include/asm/page.h b/arch/powerpc/include/asm/page.h index 2a32483c7b6c..8da5d4c1cab2 100644 --- a/arch/powerpc/include/asm/page.h +++ b/arch/powerpc/include/asm/page.h @@ -132,7 +132,19 @@ extern long long virt_phys_offset;  #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) + +#ifdef CONFIG_PPC_BOOK3S_64 +/* + * On hash the vmalloc and other regions alias to the kernel region when passed + * through __pa(), which virt_to_pfn() uses. That means virt_addr_valid() can + * return true for some vmalloc addresses, which is incorrect. So explicitly + * check that the address is in the kernel region. + */ +#define virt_addr_valid(kaddr) (REGION_ID(kaddr) == KERNEL_REGION_ID && \ +				pfn_valid(virt_to_pfn(kaddr))) +#else  #define virt_addr_valid(kaddr)	pfn_valid(virt_to_pfn(kaddr)) +#endif  /*   * On Book-E parts we need __va to parse the device tree and we can't  |