diff options
author | Vasily Gorbik <gor@linux.ibm.com> | 2019-11-22 12:19:16 +0100 |
---|---|---|
committer | Vasily Gorbik <gor@linux.ibm.com> | 2019-11-30 10:52:45 +0100 |
commit | 7f28dad395243c5026d649136823bbc40029a828 (patch) | |
tree | a5fc949c7deed860f285fea388b1b34cc7e23d9c /arch/s390/mm | |
parent | s390: always inline disabled_wait (diff) | |
download | linux-7f28dad395243c5026d649136823bbc40029a828.tar.xz linux-7f28dad395243c5026d649136823bbc40029a828.zip |
s390: disable preemption when switching to nodat stack with CALL_ON_STACK
Make sure preemption is disabled when temporary switching to nodat
stack with CALL_ON_STACK helper, because nodat stack is per cpu.
Reviewed-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
Diffstat (limited to 'arch/s390/mm')
-rw-r--r-- | arch/s390/mm/maccess.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/arch/s390/mm/maccess.c b/arch/s390/mm/maccess.c index 59ad7997fed1..de7ca4b6718f 100644 --- a/arch/s390/mm/maccess.c +++ b/arch/s390/mm/maccess.c @@ -119,9 +119,15 @@ static unsigned long __no_sanitize_address _memcpy_real(unsigned long dest, */ int memcpy_real(void *dest, void *src, size_t count) { - if (S390_lowcore.nodat_stack != 0) - return CALL_ON_STACK(_memcpy_real, S390_lowcore.nodat_stack, - 3, dest, src, count); + int rc; + + if (S390_lowcore.nodat_stack != 0) { + preempt_disable(); + rc = CALL_ON_STACK(_memcpy_real, S390_lowcore.nodat_stack, 3, + dest, src, count); + preempt_enable(); + return rc; + } /* * This is a really early memcpy_real call, the stacks are * not set up yet. Just call _memcpy_real on the early boot |