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

Reply via email to