]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commit - arch/arm64/kernel/entry.S
arm64: Mask all exceptions during kernel_exit
authorJames Morse <james.morse@arm.com>
Thu, 2 Nov 2017 12:12:37 +0000 (12:12 +0000)
committerWill Deacon <will.deacon@arm.com>
Thu, 2 Nov 2017 15:55:41 +0000 (15:55 +0000)
commit8d66772e869e79ffb94eed7492ca3d2267e150e8
tree5392449810e76786aaed93c02dfd010f1b62cfb0
parent41bd5b5d22b77c7300df2a2fa5397cbe785189b4
arm64: Mask all exceptions during kernel_exit

To take RAS Exceptions as quickly as possible we need to keep SError
unmasked as much as possible. We need to mask it during kernel_exit
as taking an error from this code will overwrite the exception-registers.

Adding a naked 'disable_daif' to kernel_exit causes a performance problem
for micro-benchmarks that do no real work, (e.g. calling getpid() in a
loop). This is because the ret_to_user loop has already masked IRQs so
that the TIF_WORK_MASK thread flags can't change underneath it, adding
disable_daif is an additional self-synchronising operation.

In the future, the RAS APEI code may need to modify the TIF_WORK_MASK
flags from an SError, in which case the ret_to_user loop must mask SError
while it examines the flags.

Disable all exceptions for return to EL1. For return to EL0 get the
ret_to_user loop to leave all exceptions masked once it has done its
work, this avoids an extra pstate-write.

Signed-off-by: James Morse <james.morse@arm.com>
Reviewed-by: Julien Thierry <julien.thierry@arm.com>
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
arch/arm64/kernel/entry.S
arch/arm64/kernel/signal.c