]> git.baikalelectronics.ru Git - kernel.git/commit
powerpc/mm: Fix virt_addr_valid() etc. on 64-bit hash
authorMichael Ellerman <mpe@ellerman.id.au>
Thu, 18 May 2017 10:37:31 +0000 (20:37 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Fri, 19 May 2017 03:04:35 +0000 (13:04 +1000)
commit4c8d11beb802f30a7748751e82ed1660ef23cbb6
tree6dcc62e4b1497d5d890c095b13166138e08fa6fb
parent607b2e23aec34a7f95c78df029550cd388fdcc4c
powerpc/mm: Fix virt_addr_valid() etc. on 64-bit hash

virt_addr_valid() is supposed to tell you if it's OK to call virt_to_page() on
an address. What this means in practice is that it should only return true for
addresses in the linear mapping which are backed by a valid PFN.

We are failing to properly check that the address is in the linear mapping,
because virt_to_pfn() will return a valid looking PFN for more or less any
address. That bug is actually caused by __pa(), used in virt_to_pfn().

eg: __pa(0xc000000000010000) = 0x10000  # Good
    __pa(0xd000000000010000) = 0x10000  # Bad!
    __pa(0x0000000000010000) = 0x10000  # Bad!

This started happening after commit 7ba08200c956 ("powerpc: Work around gcc
miscompilation of __pa() on 64-bit") (Aug 2013), where we changed the definition
of __pa() to work around a GCC bug. Prior to that we subtracted PAGE_OFFSET from
the value passed to __pa(), meaning __pa() of a 0xd or 0x0 address would give
you something bogus back.

Until we can verify if that GCC bug is no longer an issue, or come up with
another solution, this commit does the minimal fix to make virt_addr_valid()
work, by explicitly checking that the address is in the linear mapping region.

Fixes: 7ba08200c956 ("powerpc: Work around gcc miscompilation of __pa() on 64-bit")
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Reviewed-by: Paul Mackerras <paulus@ozlabs.org>
Reviewed-by: Balbir Singh <bsingharora@gmail.com>
Tested-by: Breno Leitao <breno.leitao@gmail.com>
arch/powerpc/include/asm/page.h