On 26/09/2016 05:37, zhong...@sangfor.com.cn wrote: > Hi, Paolo > This is a simplified patch according to your advice. Would you please reiview > it again. > > > ------------------------------------separation > line-------------------------------------------- > > > MC146818 RTC: coordinate guest clock base to destination host after migration > > qemu tracks guest time based on vector [base_rtc, last_update], in which > last_update stands for a monotonic tick which is actually uptime of the host. > according to rtc implementation codes of recent releases and upstream, after > migration, the time base vector [base_rtc, last_update] isn't updated to > coordinate with the destionation host, ie. qemu doesnt update last_update to > uptime of the destination host. > what problem have we got because of this bug? after migration, guest time may > jump back to several days ago, that will make some critical business > applications, > such as lotus notes, malfunction. > this patch is trying to fix the problem. first, when vmsave in progress, we > rtc_update_time to refresh time stamp in cmos array, then during vmrestore, > we rtc_set_time to update qemu base_rtc and last_update variable according to > time > stamp in cmos array. > > Signed-off-by: Junlian Bell <zhong...@sangfor.com.cn> > --- > hw/timer/mc146818rtc.c | 15 ++++++++++----- > 1 file changed, 10 insertions(+), 5 deletions(-) > > diff --git a/hw/timer/mc146818rtc.c b/hw/timer/mc146818rtc.c > index ea625f2..1df17af 100644 > --- a/hw/timer/mc146818rtc.c > +++ b/hw/timer/mc146818rtc.c > @@ -717,15 +717,20 @@ static void rtc_set_date_from_host(ISADevice *dev) > rtc_set_cmos(s, &tm); > } > > +static void rtc_pre_save(void *opaque) > +{ > + RTCState *s = opaque; > + > + rtc_update_time(s); > +} > + > static int rtc_post_load(void *opaque, int version_id) > { > RTCState *s = opaque; > > - if (version_id <= 2) { > - rtc_set_time(s); > - s->offset = 0; > - check_update_timer(s); > - } > + rtc_set_time(s); > + s->offset = 0; > + check_update_timer(s);
This is wrong if rtc_clock is not QEMU_CLOCK_REALTIME. Paolo