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) | |
| download | focaccia-qemu-6ad0a1ed21ecd187dbe3239eb45c3598672af6a8.tar.gz focaccia-qemu-6ad0a1ed21ecd187dbe3239eb45c3598672af6a8.zip | |
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)); |