On 26/09/2016 06:37, zhong...@sangfor.com.cn wrote: > Hi, Paolo > This is another patch arround RTC. Would you please have a review. > > ------------------separation------------------------------------------------- > > MC146818 RTC: Get correct guest time when irq coalesced > > When irq coalesce occurred, irq_coalesced actually store the seconds > that the time sawn in guest lags behind real guest virtual time. > At this time , if guest read cmos for virtual time, it shouldn't see > those delayed seconds, so we must substract irq_coalesced from guest > virtual time. Otherwise, after seconds queued in irq_coalesced applied > to guest, time in guest will go ahead of time it should be.
No, it's not seconds. It depends on the interval of the periodic interrupt. In any case this approach is not acceptable, unfortunately; it causes the time to go backwards for the guest as soon as an interrupt is coalesced. What is the guest that you're seeing issues with? Thanks, Paolo > --- > hw/timer/mc146818rtc.c | 3 +++ > 1 file changed, 3 insertions(+) > > diff --git a/hw/timer/mc146818rtc.c b/hw/timer/mc146818rtc.c > index 1df17af..4cb8e5e 100644 > --- a/hw/timer/mc146818rtc.c > +++ b/hw/timer/mc146818rtc.c > @@ -549,6 +549,8 @@ static void rtc_set_time(RTCState *s) > rtc_get_time(s, &tm); > s->base_rtc = mktimegm(&tm); > s->last_update = qemu_clock_get_ns(rtc_clock); > + s->irq_coalesced = 0; > + s->irq_reinject_on_ack_count = 0; > > qapi_event_send_rtc_change(qemu_timedate_diff(&tm), &error_abort); > } > @@ -585,6 +587,7 @@ static void rtc_update_time(RTCState *s) > > guest_nsec = get_guest_rtc_ns(s); > guest_sec = guest_nsec / NANOSECONDS_PER_SECOND; > + guest_sec -= s->irq_coalesced; > gmtime_r(&guest_sec, &ret); > > /* Is SET flag of Register B disabled? */ >