[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH RFC 1/3] x86/hvm/rtc: Don't run the vpt timer when !REG_B.PIE.
>>> On 13.02.14 at 18:32, Tim Deegan <tim@xxxxxxx> wrote: > If the guest has not asked for interrupts, don't run the vpt timer > to generate them. This is a prerequisite for a patch to simplify how > the vpt interacts with the RTC, and also gets rid of a timer series in > Xen in a case where it's unlikely to be needed. > > Instead, calculate the correct value for REG_C.PF whenever REG_C is > read or PIE is enabled. This allow a guest to poll for the PF bit > while not asking for actual timer interrupts. Such a guest would no > longer get the benefit of the vpt's timer modes. > > Signed-off-by: Tim Deegan <tim@xxxxxxx> Looks okay to me. Two minor comments below. > @@ -125,24 +144,28 @@ static void rtc_timer_update(RTCState *s) > case RTC_REF_CLCK_4MHZ: > if ( period_code != 0 ) > { > - if ( period_code != s->pt_code ) > + now = NOW(); This is needed only inside the next if, so perhaps move it there (and I'd prefer the variable declaration to be moved there too). > + period = 1 << (period_code - 1); /* period in 32 Khz cycles */ > + period = DIV_ROUND(period * 1000000000ULL, 32768); /* in ns */ > + if ( period != s->period ) > { > - s->pt_code = period_code; > - period = 1 << (period_code - 1); /* period in 32 Khz cycles > */ > - period = DIV_ROUND(period * 1000000000ULL, 32768); /* in ns > */ > + s->period = period; > if ( v->domain->arch.hvm_domain.params[HVM_PARAM_VPT_ALIGN] ) > delta = 0; > else > - delta = period - ((NOW() - s->start_time) % period); > - create_periodic_time(v, &s->pt, delta, period, > - RTC_IRQ, NULL, s); > + delta = period - ((now - s->start_time) % period); > + if ( s->hw.cmos_data[RTC_REG_B] & RTC_PIE ) > + create_periodic_time(v, &s->pt, delta, period, > + RTC_IRQ, NULL, s); > + else > + s->check_ticks_since = now; > } > break; > } > @@ -492,6 +516,11 @@ static int rtc_ioport_write(void *opaque, uint32_t addr, > uint32_t data) > rtc_update_irq(s); > if ( (data & RTC_PIE) && !(orig & RTC_PIE) ) > rtc_timer_update(s); > + else if ( !(data & RTC_PIE) && (orig & RTC_PIE) ) > + { > + destroy_periodic_time(&s->pt); > + rtc_timer_update(s); > + } I think these two paths should be folded, along the lines of if ( (data ^ orig) & RTC_PIE ) { if ( !(data & RTC_PIE) ) destroy_periodic_time(&s->pt); rtc_timer_update(s); } Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |