diff options
author | Paolo Bonzini <pbonzini@redhat.com> | 2011-02-03 14:49:00 +0100 |
---|---|---|
committer | Anthony Liguori <aliguori@us.ibm.com> | 2011-02-04 06:33:26 -0600 |
commit | 6ad0a1ed21ecd187dbe3239eb45c3598672af6a8 (patch) | |
tree | 26cee8f2413348788f943b53ac98257ce3675391 | |
parent | 9c13246ac13a87e05b5e6e7158e715dfa65fc7aa (diff) |
Correct alarm deadline computation
When the QEMU_CLOCK_HOST clock was added, computation of its
deadline was added to qemu_next_deadline, which is correct but
incomplete.
I noticed this by reading the very convoluted rules whereby
qemu_next_deadline_dyntick is computed, which miss QEMU_CLOCK_HOST
when use_icount is true. This patch inlines qemu_next_deadline
into qemu_next_deadline_dyntick, and then corrects the logic to skip
only QEMU_CLOCK_VIRTUAL when use_icount is true.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Cc: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
-rw-r--r-- | qemu-timer.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/qemu-timer.c b/qemu-timer.c index bda072f849..69e71d73ed 100644 --- a/qemu-timer.c +++ b/qemu-timer.c @@ -724,11 +724,18 @@ static uint64_t qemu_next_deadline_dyntick(void) int64_t delta; int64_t rtdelta; - if (use_icount) + if (!use_icount && active_timers[QEMU_CLOCK_VIRTUAL]) { + delta = active_timers[QEMU_CLOCK_VIRTUAL]->expire_time - + qemu_get_clock(vm_clock); + } else { delta = INT32_MAX; - else - delta = qemu_next_deadline(); - + } + if (active_timers[QEMU_CLOCK_HOST]) { + int64_t hdelta = active_timers[QEMU_CLOCK_HOST]->expire_time - + qemu_get_clock_ns(host_clock); + if (hdelta < delta) + delta = hdelta; + } if (active_timers[QEMU_CLOCK_REALTIME]) { rtdelta = (active_timers[QEMU_CLOCK_REALTIME]->expire_time * 1000000 - qemu_get_clock_ns(rt_clock)); |