[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 3/4] x86/hvm: Avoid needlessly resetting the periodic timer.
>>> On 28.03.13 at 14:22, Tim Deegan <tim@xxxxxxx> wrote: > --- a/xen/arch/x86/hvm/rtc.c > +++ b/xen/arch/x86/hvm/rtc.c > @@ -78,7 +78,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_active = 0; > + } > else > { > s->hw.cmos_data[RTC_REG_C] |= RTC_PF; > @@ -109,13 +112,20 @@ static void rtc_timer_update(RTCState *s) > { > 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 ( !s->pt_active || (period != s->period) ) > + { > + s->period = period; > + s->pt_active = 1; I think that by storing period_code rather than period, you could easily fold the two new fields "period" and "pt_active" into one (because period_code is zero if and only if the timer is inactive). Beyond that the patch looks mostly like what I had in mind during our recent discussion. Jan > + 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_active = 0; > break; > } > } > @@ -717,6 +727,7 @@ void rtc_reset(struct domain *d) > RTCState *s = domain_vrtc(d); > > destroy_periodic_time(&s->pt); > + s->pt_active = 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..76a83a1 100644 > --- a/xen/include/asm-x86/hvm/vpt.h > +++ b/xen/include/asm-x86/hvm/vpt.h > @@ -104,16 +104,17 @@ 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 period; > + bool_t pt_active; > uint32_t use_timer; > spinlock_t lock; > } RTCState; > -- > 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |