On Fri 23 Oct 2015 03:31:38 PM CEST, Stefan Hajnoczi <stefa...@redhat.com> wrote: >> +uint64_t timed_average_sum(TimedAverage *ta, uint64_t *elapsed) >> +{ >> + TimedAverageWindow *w; >> + check_expirations(ta); >> + w = current_window(ta); >> + if (elapsed != NULL) { >> + int64_t remaining = w->expiration - >> qemu_clock_get_ns(ta->clock_type); >> + *elapsed = ta->period - remaining; > > There is no guarantee that qemu_clock_get_ns(ta->clock_type) executes > quickly after check_expirations(ta). If the system is under heavy load > and swapping, maybe significant amounts of time have passed. This race > condition could result in bad elapsed values being calculated. > > We need to be careful about elapsed <= 0 values, especially if the > caller divides by elapsed and is exposed to Divide By 0 exceptions. > > Either check_expirations() needs to integrate qemu_clock_get_ns() or we > simply need to deal with bogus values here.
Good catch, thanks! I think having check_expirations() return the time is probably the best option. Berto