| From 466587d75c61aabd39f9907c931eb108e9c744ad Mon Sep 17 00:00:00 2001 |
| From: Vasily Gorbik <gor@linux.ibm.com> |
| Date: Fri, 22 Nov 2019 12:19:16 +0100 |
| Subject: [PATCH] s390: disable preemption when switching to nodat stack with |
| CALL_ON_STACK |
| |
| commit 7f28dad395243c5026d649136823bbc40029a828 upstream. |
| |
| 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> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/arch/s390/kernel/machine_kexec.c b/arch/s390/kernel/machine_kexec.c |
| index 2b0cc6d5cff0..e65c50a394f4 100644 |
| --- a/arch/s390/kernel/machine_kexec.c |
| +++ b/arch/s390/kernel/machine_kexec.c |
| @@ -163,7 +163,9 @@ static bool kdump_csum_valid(struct kimage *image) |
| #ifdef CONFIG_CRASH_DUMP |
| int rc; |
| |
| + preempt_disable(); |
| rc = CALL_ON_STACK(do_start_kdump, S390_lowcore.nodat_stack, 1, image); |
| + preempt_enable(); |
| return rc == 0; |
| #else |
| return false; |
| diff --git a/arch/s390/mm/maccess.c b/arch/s390/mm/maccess.c |
| index fb530e463136..b1cba90ce49c 100644 |
| --- a/arch/s390/mm/maccess.c |
| +++ b/arch/s390/mm/maccess.c |
| @@ -118,9 +118,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 |
| -- |
| 2.7.4 |
| |