diff options
author | Tim Deegan <tim@xen.org> | 2013-03-28 12:19:32 +0000 |
---|---|---|
committer | Tim Deegan <tim@xen.org> | 2013-03-29 09:43:11 +0000 |
commit | 82ec83c425af79823d9fdb818ece44bae1298578 (patch) | |
tree | 7657a958c5567017c72865c5c319af9aa118c840 /xen/arch/x86/hvm/rtc.c | |
parent | 58afa7ef12ff31c1f11658f35a9fef35ca15d641 (diff) | |
download | xen-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.c | 18 |
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; } |