icount: improve counting for record/replay
icount_warp_rt function is called by qemu_clock_warp and as callback of icount_warp timer. This patch adds call to qemu_clock_warp into main_loop_wait function, because icount warp may be missed in record/replay mode, when CPU is sleeping. This patch also disables of calling this function by timer, because it is not needed after making modifications of main_loop_wait. Signed-off-by: Pavel Dovgalyuk <pavel.dovgaluk@ispras.ru> Message-Id: <20150917162439.8676.38290.stgit@PASHA-ISP.def.inno> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Pavel Dovgalyuk <Pavel.Dovgaluk@ispras.ru>
This commit is contained in:
parent
b60c48a701
commit
efab87cf79
11
cpus.c
11
cpus.c
@ -335,7 +335,7 @@ static int64_t qemu_icount_round(int64_t count)
|
|||||||
return (count + (1 << icount_time_shift) - 1) >> icount_time_shift;
|
return (count + (1 << icount_time_shift) - 1) >> icount_time_shift;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void icount_warp_rt(void *opaque)
|
static void icount_warp_rt(void)
|
||||||
{
|
{
|
||||||
/* The icount_warp_timer is rescheduled soon after vm_clock_warp_start
|
/* The icount_warp_timer is rescheduled soon after vm_clock_warp_start
|
||||||
* changes from -1 to another value, so the race here is okay.
|
* changes from -1 to another value, so the race here is okay.
|
||||||
@ -370,6 +370,11 @@ static void icount_warp_rt(void *opaque)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void icount_dummy_timer(void *opaque)
|
||||||
|
{
|
||||||
|
(void)opaque;
|
||||||
|
}
|
||||||
|
|
||||||
void qtest_clock_warp(int64_t dest)
|
void qtest_clock_warp(int64_t dest)
|
||||||
{
|
{
|
||||||
int64_t clock = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
|
int64_t clock = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
|
||||||
@ -414,7 +419,7 @@ void qemu_clock_warp(QEMUClockType type)
|
|||||||
* the CPU starts running, in case the CPU is woken by an event other
|
* the CPU starts running, in case the CPU is woken by an event other
|
||||||
* than the earliest QEMU_CLOCK_VIRTUAL timer.
|
* than the earliest QEMU_CLOCK_VIRTUAL timer.
|
||||||
*/
|
*/
|
||||||
icount_warp_rt(NULL);
|
icount_warp_rt();
|
||||||
timer_del(icount_warp_timer);
|
timer_del(icount_warp_timer);
|
||||||
}
|
}
|
||||||
if (!all_cpu_threads_idle()) {
|
if (!all_cpu_threads_idle()) {
|
||||||
@ -607,7 +612,7 @@ void configure_icount(QemuOpts *opts, Error **errp)
|
|||||||
icount_sleep = qemu_opt_get_bool(opts, "sleep", true);
|
icount_sleep = qemu_opt_get_bool(opts, "sleep", true);
|
||||||
if (icount_sleep) {
|
if (icount_sleep) {
|
||||||
icount_warp_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL_RT,
|
icount_warp_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL_RT,
|
||||||
icount_warp_rt, NULL);
|
icount_dummy_timer, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
icount_align_option = qemu_opt_get_bool(opts, "align", false);
|
icount_align_option = qemu_opt_get_bool(opts, "align", false);
|
||||||
|
@ -506,6 +506,9 @@ int main_loop_wait(int nonblocking)
|
|||||||
slirp_pollfds_poll(gpollfds, (ret < 0));
|
slirp_pollfds_poll(gpollfds, (ret < 0));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* CPU thread can infinitely wait for event after
|
||||||
|
missing the warp */
|
||||||
|
qemu_clock_warp(QEMU_CLOCK_VIRTUAL);
|
||||||
qemu_clock_run_all_timers();
|
qemu_clock_run_all_timers();
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
Loading…
Reference in New Issue
Block a user