summaryrefslogtreecommitdiffstats
path: root/arch/s390
diff options
context:
space:
mode:
authorVasily Gorbik <gor@linux.ibm.com>2018-07-13 08:13:13 +0200
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2018-07-16 15:45:41 +0200
commitac4c4fc87d6beb6dd8287f24670e5e81c24b1de7 (patch)
treed6306145ff1baaaf3c0c134006ad24116ff9f1cd /arch/s390
parenta09baa9543ef1ced2cc7c171a055712ec8af62a3 (diff)
downloadlinux-stable-ac4c4fc87d6beb6dd8287f24670e5e81c24b1de7.tar.gz
linux-stable-ac4c4fc87d6beb6dd8287f24670e5e81c24b1de7.tar.bz2
linux-stable-ac4c4fc87d6beb6dd8287f24670e5e81c24b1de7.zip
s390/cmm: avoid add_timer on concurrently used timer
cmm_set_timer could be called concurrently from cmm_thread, cmm proc handler, upon cmm smsg receive and timer function itself. To avoid potential race condition and hitting BUG_ON in add_timer on already pending timer simply reuse mod_timer which is according to documentation "the only safe way to modify the timeout" with multiple unserialized concurrent users. mod_timer can handle both active and inactive timers which allows to carry out minor code simplification as well. Reviewed-by: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Vasily Gorbik <gor@linux.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'arch/s390')
-rw-r--r--arch/s390/mm/cmm.c7
1 files changed, 1 insertions, 6 deletions
diff --git a/arch/s390/mm/cmm.c b/arch/s390/mm/cmm.c
index 50d8d1c887a4..510a18299196 100644
--- a/arch/s390/mm/cmm.c
+++ b/arch/s390/mm/cmm.c
@@ -191,12 +191,7 @@ static void cmm_set_timer(void)
del_timer(&cmm_timer);
return;
}
- if (timer_pending(&cmm_timer)) {
- if (mod_timer(&cmm_timer, jiffies + cmm_timeout_seconds*HZ))
- return;
- }
- cmm_timer.expires = jiffies + cmm_timeout_seconds*HZ;
- add_timer(&cmm_timer);
+ mod_timer(&cmm_timer, jiffies + cmm_timeout_seconds * HZ);
}
static void cmm_timer_fn(struct timer_list *unused)