Message ID | 1296510679-12268-3-git-send-email-pbonzini@redhat.com |
---|---|
State | New |
Headers | show |
On 2011-01-31 22:51, Paolo Bonzini wrote: > 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> > --- > qemu-timer.c | 15 +++++++++++---- > 1 files changed, 11 insertions(+), 4 deletions(-) > > diff --git a/qemu-timer.c b/qemu-timer.c > index 60283a8..c19d0a2 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(host_clock); > + if (hdelta < delta) > + delta = hdelta; > + } > if (active_timers[QEMU_CLOCK_REALTIME]) { > rtdelta = (active_timers[QEMU_CLOCK_REALTIME]->expire_time - > qemu_get_clock_ns(rt_clock)); Looks good to me. I guess this applies without the first patch? Then it should go in (unless you are working on a new version for 1/3). Thanks for fixing this. Jan
On 02/01/2011 02:01 PM, Jan Kiszka wrote: > Looks good to me. I guess this applies without the first patch? Then it > should go in (unless you are working on a new version for 1/3). It's wrong without the first patch (micro instead of nanoseconds). However, I read Anthony's message as a suggestion rather than a rejection. Paolo
On 2011-02-01 14:04, Paolo Bonzini wrote: > On 02/01/2011 02:01 PM, Jan Kiszka wrote: >> Looks good to me. I guess this applies without the first patch? Then it >> should go in (unless you are working on a new version for 1/3). > > It's wrong without the first patch (micro instead of nanoseconds). > However, I read Anthony's message as a suggestion rather than a rejection. > Yes, it's probably a better idea anyway to do this stepwise. Jan
diff --git a/qemu-timer.c b/qemu-timer.c index 60283a8..c19d0a2 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(host_clock); + if (hdelta < delta) + delta = hdelta; + } if (active_timers[QEMU_CLOCK_REALTIME]) { rtdelta = (active_timers[QEMU_CLOCK_REALTIME]->expire_time - qemu_get_clock_ns(rt_clock));
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> --- qemu-timer.c | 15 +++++++++++---- 1 files changed, 11 insertions(+), 4 deletions(-)