Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1b44e98d authored by Martin Schwidefsky's avatar Martin Schwidefsky Committed by Linus Torvalds
Browse files

[PATCH] s390: stop_hz_timer vs. xtime updates



The calculation of the value return by next_timer_interrupt from jiffies to
jiffies_64 is racy against xtime updates.  We need to protect the calculation
with read_seqbegin/read_seqretry.

Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent e1c3ad96
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -237,6 +237,8 @@ int sysctl_hz_timer = 1;
 */
static inline void stop_hz_timer(void)
{
	unsigned long flags;
	unsigned long seq, next;
	__u64 timer, todval;

	if (sysctl_hz_timer != 0)
@@ -257,7 +259,11 @@ static inline void stop_hz_timer(void)
	 * This cpu is going really idle. Set up the clock comparator
	 * for the next event.
	 */
	timer = (__u64) (next_timer_interrupt() - jiffies) + jiffies_64;
	next = next_timer_interrupt();
	do {
		seq = read_seqbegin_irqsave(&xtime_lock, flags);
		timer = (__u64)(next - jiffies) + jiffies_64;
	} while (read_seqretry_irqrestore(&xtime_lock, seq, flags));
	todval = -1ULL;
	/* Be careful about overflows. */
	if (timer < (-1ULL / CLK_TICKS_PER_JIFFY)) {