powerpc/powernv: Add indirect levels to it_userspace
authorAlexey Kardashevskiy <aik@ozlabs.ru>
Wed, 4 Jul 2018 06:13:47 +0000 (16:13 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Mon, 16 Jul 2018 12:53:10 +0000 (22:53 +1000)
commit090bad39b237aad92d8e01baa033699cf0c81cbe
treee9586d1bdb4a7eaf03714c1d3c7eca391e4235fa
parent00a5c58d9499bd0c290b57205f43a70f2e69d3f6
powerpc/powernv: Add indirect levels to it_userspace

We want to support sparse memory and therefore huge chunks of DMA windows
do not need to be mapped. If a DMA window big enough to require 2 or more
indirect levels, and a DMA window is used to map all RAM (which is
a default case for 64bit window), we can actually save some memory by
not allocation TCE for regions which we are not going to map anyway.

The hardware tables alreary support indirect levels but we also keep
host-physical-to-userspace translation array which is allocated by
vmalloc() and is a flat array which might use quite some memory.

This converts it_userspace from vmalloc'ed array to a multi level table.

As the format becomes platform dependend, this replaces the direct access
to it_usespace with a iommu_table_ops::useraddrptr hook which returns
a pointer to the userspace copy of a TCE; future extension will return
NULL if the level was not allocated.

This should not change non-KVM handling of TCE tables and it_userspace
will not be allocated for non-KVM tables.

Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/include/asm/iommu.h
arch/powerpc/kvm/book3s_64_vio_hv.c
arch/powerpc/platforms/powernv/pci-ioda-tce.c
arch/powerpc/platforms/powernv/pci-ioda.c
arch/powerpc/platforms/powernv/pci.h
drivers/vfio/vfio_iommu_spapr_tce.c