powerpc/npu-dma.c: Fix crash after __mmu_notifier_register failure
authorMark Hairgrove <mhairgrove@nvidia.com>
Sat, 10 Feb 2018 03:20:06 +0000 (19:20 -0800)
committerMichael Ellerman <mpe@ellerman.id.au>
Wed, 14 Mar 2018 09:04:43 +0000 (20:04 +1100)
commit720c84046c26444fe825f8614ddceb5c46539e67
tree07203313bbcdc9271fb1630bb4581a1579085f75
parentc2be663d5307fb9751a562ac664fa78cd7a00e2b
powerpc/npu-dma.c: Fix crash after __mmu_notifier_register failure

pnv_npu2_init_context wasn't checking the return code from
__mmu_notifier_register. If  __mmu_notifier_register failed, the
npu_context was still assigned to the mm and the caller wasn't given any
indication that things went wrong. Later on pnv_npu2_destroy_context would
be called, which in turn called mmu_notifier_unregister and dropped
mm->mm_count without having incremented it in the first place. This led to
various forms of corruption like mm use-after-free and mm double-free.

__mmu_notifier_register can fail with EINTR if a signal is pending, so
this case can be frequent.

This patch calls opal_npu_destroy_context on the failure paths, and makes
sure not to assign mm->context.npu_context until past the failure points.

Signed-off-by: Mark Hairgrove <mhairgrove@nvidia.com>
Acked-By: Alistair Popple <alistair@popple.id.au>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/platforms/powernv/npu-dma.c