mm: replace open coded page to virt conversion with page_to_virt()
authorArd Biesheuvel <ard.biesheuvel@linaro.org>
Mon, 18 Apr 2016 16:04:57 +0000 (18:04 +0200)
committerWill Deacon <will.deacon@arm.com>
Fri, 22 Apr 2016 09:08:37 +0000 (10:08 +0100)
commit1dff8083a024650c75a9c961c38082473ceae8cf
tree7e160165fa5e964a90359e7e8c7e353f34f5bc57
parent86d618cd1d9fdf4b46b68eb014d4fbde08c4ae62
mm: replace open coded page to virt conversion with page_to_virt()

The open coded conversion from struct page address to virtual address in
lowmem_page_address() involves an intermediate conversion step to pfn
number/physical address. Since the placement of the struct page array
relative to the linear mapping may be completely independent from the
placement of physical RAM (as is that case for arm64 after commit
dfd55ad85e 'arm64: vmemmap: use virtual projection of linear region'),
the conversion to physical address and back again should factor out of
the equation, but unfortunately, the shifting and pointer arithmetic
involved prevent this from happening, and the resulting calculation
essentially subtracts the address of the start of physical memory and
adds it back again, in a way that prevents the compiler from optimizing
it away.

Since the start of physical memory is not a build time constant on arm64,
the resulting conversion involves an unnecessary memory access, which
we would like to get rid of. So replace the open coded conversion with
a call to page_to_virt(), and use the open coded conversion as its
default definition, to be overriden by the architecture, if desired.
The existing arch specific definitions of page_to_virt are all equivalent
to this default definition, so by itself this patch is a no-op.

Acked-by: Andrew Morton <akpm@linux-foundation.org>
Acked-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: Will Deacon <will.deacon@arm.com>
include/linux/mm.h