Messages in this thread Patch in this message | | | Date | Fri, 28 Oct 2005 16:07:06 +0200 | From | Martin Schwidefsky <> | Subject | [patch 3/14] s390: stop_hz_timer vs. xtime updates. |
| |
From: Martin Schwidefsky <schwidefsky@de.ibm.com>
[patch 3/14] 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: Martin Schwidefsky <schwidefsky@de.ibm.com> ---
arch/s390/kernel/time.c | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletion(-)
diff -urpN linux-2.6/arch/s390/kernel/time.c linux-2.6-patched/arch/s390/kernel/time.c --- linux-2.6/arch/s390/kernel/time.c 2005-10-28 02:02:08.000000000 +0200 +++ linux-2.6-patched/arch/s390/kernel/time.c 2005-10-28 14:04:45.000000000 +0200 @@ -241,6 +241,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) @@ -261,7 +263,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)) { - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |