Re: [PATCH] icount: fix shift=auto for record/replay
On 19/05/20 12:43, Pavel Dovgalyuk wrote: > This patch fixes shift=auto when record/replay is enabled. > Now user does not need to guess the best shift value. > > Signed-off-by: Pavel Dovgalyuk Queued, thanks! Paolo > -- > > v2: > moved icount_time_shift to vmstate subsection > --- > cpus.c | 20 +++- > 1 file changed, 19 insertions(+), 1 deletion(-) > > diff --git a/cpus.c b/cpus.c > index 5670c96bcf..7ce0d569b3 100644 > --- a/cpus.c > +++ b/cpus.c > @@ -379,7 +379,8 @@ static void icount_adjust(void) > > seqlock_write_lock(_state.vm_clock_seqlock, > _state.vm_clock_lock); > -cur_time = cpu_get_clock_locked(); > +cur_time = REPLAY_CLOCK_LOCKED(REPLAY_CLOCK_VIRTUAL_RT, > + cpu_get_clock_locked()); > cur_icount = cpu_get_icount_locked(); > > delta = cur_icount - cur_time; > @@ -647,6 +648,11 @@ static bool adjust_timers_state_needed(void *opaque) > return s->icount_rt_timer != NULL; > } > > +static bool shift_state_needed(void *opaque) > +{ > +return use_icount == 2; > +} > + > /* > * Subsection for warp timer migration is optional, because may not be > created > */ > @@ -674,6 +680,17 @@ static const VMStateDescription > icount_vmstate_adjust_timers = { > } > }; > > +static const VMStateDescription icount_vmstate_shift = { > +.name = "timer/icount/shift", > +.version_id = 1, > +.minimum_version_id = 1, > +.needed = shift_state_needed, > +.fields = (VMStateField[]) { > +VMSTATE_INT16(icount_time_shift, TimersState), > +VMSTATE_END_OF_LIST() > +} > +}; > + > /* > * This is a subsection for icount migration. > */ > @@ -690,6 +707,7 @@ static const VMStateDescription icount_vmstate_timers = { > .subsections = (const VMStateDescription*[]) { > _vmstate_warp_timer, > _vmstate_adjust_timers, > +_vmstate_shift, > NULL > } > }; >
Re: [PATCH] icount: fix shift=auto for record/replay
On 18.05.2020 19:14, Alex Bennée wrote: Pavel Dovgalyuk writes: This patch fixes shift=auto when record/replay is enabled. Now user does not need to guess the best shift value. Signed-off-by: Pavel Dovgalyuk --- cpus.c |4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cpus.c b/cpus.c index 5670c96bcf..dfb9f4717f 100644 --- a/cpus.c +++ b/cpus.c @@ -379,7 +379,8 @@ static void icount_adjust(void) seqlock_write_lock(_state.vm_clock_seqlock, _state.vm_clock_lock); -cur_time = cpu_get_clock_locked(); +cur_time = REPLAY_CLOCK_LOCKED(REPLAY_CLOCK_VIRTUAL_RT, + cpu_get_clock_locked()); cur_icount = cpu_get_icount_locked(); delta = cur_icount - cur_time; @@ -685,6 +686,7 @@ static const VMStateDescription icount_vmstate_timers = { .fields = (VMStateField[]) { VMSTATE_INT64(qemu_icount_bias, TimersState), VMSTATE_INT64(qemu_icount, TimersState), +VMSTATE_INT16(icount_time_shift, TimersState), Surely we should be bumping .version_id/.minimum_version_id here so we error out gracefully. No recordings pre this change would work right? You're right. But before this patch shift=auto doesn't work for RR at all. Therefore no recordings should exist. I think, for other icount use cases would be better to move icount_time_shift to subsection and use it only when auto is enabled. VMSTATE_END_OF_LIST() }, .subsections = (const VMStateDescription*[]) {
Re: [PATCH] icount: fix shift=auto for record/replay
Pavel Dovgalyuk writes: > This patch fixes shift=auto when record/replay is enabled. > Now user does not need to guess the best shift value. > > Signed-off-by: Pavel Dovgalyuk > --- > cpus.c |4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/cpus.c b/cpus.c > index 5670c96bcf..dfb9f4717f 100644 > --- a/cpus.c > +++ b/cpus.c > @@ -379,7 +379,8 @@ static void icount_adjust(void) > > seqlock_write_lock(_state.vm_clock_seqlock, > _state.vm_clock_lock); > -cur_time = cpu_get_clock_locked(); > +cur_time = REPLAY_CLOCK_LOCKED(REPLAY_CLOCK_VIRTUAL_RT, > + cpu_get_clock_locked()); > cur_icount = cpu_get_icount_locked(); > > delta = cur_icount - cur_time; > @@ -685,6 +686,7 @@ static const VMStateDescription icount_vmstate_timers = { > .fields = (VMStateField[]) { > VMSTATE_INT64(qemu_icount_bias, TimersState), > VMSTATE_INT64(qemu_icount, TimersState), > +VMSTATE_INT16(icount_time_shift, TimersState), Surely we should be bumping .version_id/.minimum_version_id here so we error out gracefully. No recordings pre this change would work right? > VMSTATE_END_OF_LIST() > }, > .subsections = (const VMStateDescription*[]) { -- Alex Bennée
Re: [PATCH] icount: fix shift=auto for record/replay
+Alex On 5/6/20 9:52 AM, Pavel Dovgalyuk wrote: This patch fixes shift=auto when record/replay is enabled. Now user does not need to guess the best shift value. Signed-off-by: Pavel Dovgalyuk --- cpus.c |4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cpus.c b/cpus.c index 5670c96bcf..dfb9f4717f 100644 --- a/cpus.c +++ b/cpus.c @@ -379,7 +379,8 @@ static void icount_adjust(void) seqlock_write_lock(_state.vm_clock_seqlock, _state.vm_clock_lock); -cur_time = cpu_get_clock_locked(); +cur_time = REPLAY_CLOCK_LOCKED(REPLAY_CLOCK_VIRTUAL_RT, + cpu_get_clock_locked()); cur_icount = cpu_get_icount_locked(); delta = cur_icount - cur_time; @@ -685,6 +686,7 @@ static const VMStateDescription icount_vmstate_timers = { .fields = (VMStateField[]) { VMSTATE_INT64(qemu_icount_bias, TimersState), VMSTATE_INT64(qemu_icount, TimersState), +VMSTATE_INT16(icount_time_shift, TimersState), VMSTATE_END_OF_LIST() }, .subsections = (const VMStateDescription*[]) {
Re: [PATCH] icount: fix shift=auto for record/replay
ping On 06.05.2020 10:52, Pavel Dovgalyuk wrote: This patch fixes shift=auto when record/replay is enabled. Now user does not need to guess the best shift value. Signed-off-by: Pavel Dovgalyuk --- cpus.c |4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cpus.c b/cpus.c index 5670c96bcf..dfb9f4717f 100644 --- a/cpus.c +++ b/cpus.c @@ -379,7 +379,8 @@ static void icount_adjust(void) seqlock_write_lock(_state.vm_clock_seqlock, _state.vm_clock_lock); -cur_time = cpu_get_clock_locked(); +cur_time = REPLAY_CLOCK_LOCKED(REPLAY_CLOCK_VIRTUAL_RT, + cpu_get_clock_locked()); cur_icount = cpu_get_icount_locked(); delta = cur_icount - cur_time; @@ -685,6 +686,7 @@ static const VMStateDescription icount_vmstate_timers = { .fields = (VMStateField[]) { VMSTATE_INT64(qemu_icount_bias, TimersState), VMSTATE_INT64(qemu_icount, TimersState), +VMSTATE_INT16(icount_time_shift, TimersState), VMSTATE_END_OF_LIST() }, .subsections = (const VMStateDescription*[]) {