diff options
Diffstat (limited to 'arch/s390/kernel/time.c')
| -rw-r--r-- | arch/s390/kernel/time.c | 9 | 
1 files changed, 6 insertions, 3 deletions
diff --git a/arch/s390/kernel/time.c b/arch/s390/kernel/time.c index 7fcd690d42c..0aa98db8a80 100644 --- a/arch/s390/kernel/time.c +++ b/arch/s390/kernel/time.c @@ -63,7 +63,7 @@ static DEFINE_PER_CPU(struct clock_event_device, comparators);   */  unsigned long long notrace __kprobes sched_clock(void)  { -	return (get_clock_monotonic() * 125) >> 9; +	return tod_to_ns(get_clock_monotonic());  }  /* @@ -120,6 +120,9 @@ static int s390_next_ktime(ktime_t expires,  	nsecs = ktime_to_ns(ktime_add(timespec_to_ktime(ts), expires));  	do_div(nsecs, 125);  	S390_lowcore.clock_comparator = sched_clock_base_cc + (nsecs << 9); +	/* Program the maximum value if we have an overflow (== year 2042) */ +	if (unlikely(S390_lowcore.clock_comparator < sched_clock_base_cc)) +		S390_lowcore.clock_comparator = -1ULL;  	set_clock_comparator(S390_lowcore.clock_comparator);  	return 0;  } @@ -168,7 +171,7 @@ static void clock_comparator_interrupt(struct ext_code ext_code,  				       unsigned int param32,  				       unsigned long param64)  { -	kstat_cpu(smp_processor_id()).irqs[EXTINT_CLK]++; +	inc_irq_stat(IRQEXT_CLK);  	if (S390_lowcore.clock_comparator == -1ULL)  		set_clock_comparator(S390_lowcore.clock_comparator);  } @@ -179,7 +182,7 @@ static void stp_timing_alert(struct stp_irq_parm *);  static void timing_alert_interrupt(struct ext_code ext_code,  				   unsigned int param32, unsigned long param64)  { -	kstat_cpu(smp_processor_id()).irqs[EXTINT_TLA]++; +	inc_irq_stat(IRQEXT_TLA);  	if (param32 & 0x00c40000)  		etr_timing_alert((struct etr_irq_parm *) ¶m32);  	if (param32 & 0x00038000)  |