aboutsummaryrefslogtreecommitdiffstats
path: root/xen/arch/x86/hvm/rtc.c
diff options
context:
space:
mode:
authorTim Deegan <tim@xen.org>2013-03-28 12:19:32 +0000
committerTim Deegan <tim@xen.org>2013-03-29 09:43:11 +0000
commit82ec83c425af79823d9fdb818ece44bae1298578 (patch)
tree7657a958c5567017c72865c5c319af9aa118c840 /xen/arch/x86/hvm/rtc.c
parent58afa7ef12ff31c1f11658f35a9fef35ca15d641 (diff)
downloadxen-82ec83c425af79823d9fdb818ece44bae1298578.tar.gz
xen-82ec83c425af79823d9fdb818ece44bae1298578.tar.bz2
xen-82ec83c425af79823d9fdb818ece44bae1298578.zip
x86/hvm: Avoid needlessly resetting the periodic timer.
Signed-off-by: Tim Deegan <tim@xen.org> Acked-by: Jan Beulich <jbeulich@suse.com> Acked-by: Keir Fraser <keir@xen.org>
Diffstat (limited to 'xen/arch/x86/hvm/rtc.c')
-rw-r--r--xen/arch/x86/hvm/rtc.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/xen/arch/x86/hvm/rtc.c b/xen/arch/x86/hvm/rtc.c
index e9aa81a390..8d9195fa49 100644
--- a/xen/arch/x86/hvm/rtc.c
+++ b/xen/arch/x86/hvm/rtc.c
@@ -66,7 +66,10 @@ void rtc_periodic_interrupt(void *opaque)
spin_lock(&s->lock);
if ( s->hw.cmos_data[RTC_REG_C] & RTC_PF )
+ {
destroy_periodic_time(&s->pt);
+ s->pt_code = 0;
+ }
else
{
s->hw.cmos_data[RTC_REG_C] |= RTC_PF;
@@ -96,15 +99,21 @@ static void rtc_timer_update(RTCState *s)
case RTC_REF_CLCK_4MHZ:
if ( period_code != 0 )
{
- period = 1 << (period_code - 1); /* period in 32 Khz cycles */
- period = DIV_ROUND(period * 1000000000ULL, 32768); /* in ns */
- delta = period - ((NOW() - s->start_time) % period);
- create_periodic_time(v, &s->pt, delta, period, RTC_IRQ, NULL, s);
+ if ( period_code != s->pt_code )
+ {
+ s->pt_code = period_code;
+ period = 1 << (period_code - 1); /* period in 32 Khz cycles */
+ period = DIV_ROUND(period * 1000000000ULL, 32768); /* in ns */
+ delta = period - ((NOW() - s->start_time) % period);
+ create_periodic_time(v, &s->pt, delta, period,
+ RTC_IRQ, NULL, s);
+ }
break;
}
/* fall through */
default:
destroy_periodic_time(&s->pt);
+ s->pt_code = 0;
break;
}
}
@@ -716,6 +725,7 @@ void rtc_reset(struct domain *d)
RTCState *s = domain_vrtc(d);
destroy_periodic_time(&s->pt);
+ s->pt_code = 0;
s->pt.source = PTSRC_isa;
}