powerpc/powernv/ioda: Fix race in TCE level allocation
authorAlexey Kardashevskiy <aik@ozlabs.ru>
Thu, 18 Jul 2019 05:11:36 +0000 (15:11 +1000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 11 Oct 2019 16:20:50 +0000 (18:20 +0200)
commit19c12f12093e8bc86994a1480673003c67215e69
tree200f13eed47be81229c192e228f5158f261e0c66
parent032ce7d766a9846167916cb0713ab91b2de9cbdf
powerpc/powernv/ioda: Fix race in TCE level allocation

commit 56090a3902c80c296e822d11acdb6a101b322c52 upstream.

pnv_tce() returns a pointer to a TCE entry and originally a TCE table
would be pre-allocated. For the default case of 2GB window the table
needs only a single level and that is fine. However if more levels are
requested, it is possible to get a race when 2 threads want a pointer
to a TCE entry from the same page of TCEs.

This adds cmpxchg to handle the race. Note that once TCE is non-zero,
it cannot become zero again.

Fixes: a68bd1267b72 ("powerpc/powernv/ioda: Allocate indirect TCE levels on demand")
CC: stable@vger.kernel.org # v4.19+
Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20190718051139.74787-2-aik@ozlabs.ru
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/powerpc/platforms/powernv/pci-ioda-tce.c