From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tim Deegan Subject: [PATCH 2/4] x86/hvm: Avoid needlessly resetting the periodic timer. Date: Thu, 28 Mar 2013 16:09:28 +0000 Message-ID: <1364486970-14990-3-git-send-email-tim@xen.org> References: <1364486970-14990-1-git-send-email-tim@xen.org> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1364486970-14990-1-git-send-email-tim@xen.org> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xen.org Cc: suravee.suthikulpanit@amd.com, JBeulich@suse.com List-Id: xen-devel@lists.xenproject.org Signed-off-by: Tim Deegan --- xen/arch/x86/hvm/rtc.c | 18 ++++++++++++++---- xen/include/asm-x86/hvm/vpt.h | 10 +++++----- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/xen/arch/x86/hvm/rtc.c b/xen/arch/x86/hvm/rtc.c index e9aa81a..8d9195f 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; } diff --git a/xen/include/asm-x86/hvm/vpt.h b/xen/include/asm-x86/hvm/vpt.h index 2e9c7d2..ea9df42 100644 --- a/xen/include/asm-x86/hvm/vpt.h +++ b/xen/include/asm-x86/hvm/vpt.h @@ -104,16 +104,16 @@ typedef struct RTCState { struct hvm_hw_rtc hw; /* RTC's idea of the current time */ struct tm current_tm; - /* periodic timer */ - s_time_t start_time; - /* second update */ - struct periodic_time pt; /* update-ended timer */ struct timer update_timer; struct timer update_timer2; + uint64_t next_update_time; /* alarm timer */ struct timer alarm_timer; - uint64_t next_update_time; + /* periodic timer */ + struct periodic_time pt; + s_time_t start_time; + int pt_code; uint32_t use_timer; spinlock_t lock; } RTCState; -- 1.7.10.4