|
@@ -843,11 +843,19 @@ void qemu_timer_notify_cb(void *opaque, QEMUClockType type)
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
- if (!qemu_in_vcpu_thread() && first_cpu) {
|
|
|
|
|
|
+ if (qemu_in_vcpu_thread()) {
|
|
|
|
+ /* A CPU is currently running; kick it back out to the
|
|
|
|
+ * tcg_cpu_exec() loop so it will recalculate its
|
|
|
|
+ * icount deadline immediately.
|
|
|
|
+ */
|
|
|
|
+ qemu_cpu_kick(current_cpu);
|
|
|
|
+ } else if (first_cpu) {
|
|
/* qemu_cpu_kick is not enough to kick a halted CPU out of
|
|
/* qemu_cpu_kick is not enough to kick a halted CPU out of
|
|
* qemu_tcg_wait_io_event. async_run_on_cpu, instead,
|
|
* qemu_tcg_wait_io_event. async_run_on_cpu, instead,
|
|
* causes cpu_thread_is_idle to return false. This way,
|
|
* causes cpu_thread_is_idle to return false. This way,
|
|
* handle_icount_deadline can run.
|
|
* handle_icount_deadline can run.
|
|
|
|
+ * If we have no CPUs at all for some reason, we don't
|
|
|
|
+ * need to do anything.
|
|
*/
|
|
*/
|
|
async_run_on_cpu(first_cpu, do_nothing, RUN_ON_CPU_NULL);
|
|
async_run_on_cpu(first_cpu, do_nothing, RUN_ON_CPU_NULL);
|
|
}
|
|
}
|