Message ID | 20210510085941.22769-2-eesposit@redhat.com |
---|---|
State | New |
Headers | show |
Series | block-copy: make helper APIs thread safe | expand |
10.05.2021 11:59, Emanuele Giuseppe Esposito wrote: > From: Paolo Bonzini <pbonzini@redhat.com> > > Both users of RateLimit, block-copy.c and blockjob.c, treat > a speed of zero as unlimited, while RateLimit treats it as > "as slow as possible". The latter is nicer from the code > point of view but pretty useless, so disable rate limiting > if a speed of zero is provided. > > Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> > Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> > --- > include/qemu/ratelimit.h | 12 ++++++++++-- > 1 file changed, 10 insertions(+), 2 deletions(-) > > diff --git a/include/qemu/ratelimit.h b/include/qemu/ratelimit.h > index 003ea6d5a3..48bf59e857 100644 > --- a/include/qemu/ratelimit.h > +++ b/include/qemu/ratelimit.h > @@ -43,7 +43,11 @@ static inline int64_t ratelimit_calculate_delay(RateLimit *limit, uint64_t n) > double delay_slices; > > QEMU_LOCK_GUARD(&limit->lock); > - assert(limit->slice_quota && limit->slice_ns); > + if (!limit->slice_quota) { > + /* Throttling disabled. */ > + return 0; > + } > + assert(limit->slice_ns); > > if (limit->slice_end_time < now) { > /* Previous, possibly extended, time slice finished; reset the > @@ -83,7 +87,11 @@ static inline void ratelimit_set_speed(RateLimit *limit, uint64_t speed, > { > QEMU_LOCK_GUARD(&limit->lock); > limit->slice_ns = slice_ns; > - limit->slice_quota = MAX(((double)speed * slice_ns) / 1000000000ULL, 1); > + if (speed == 0) { > + limit->slice_quota = 0; > + } else { > + limit->slice_quota = MAX(((double)speed * slice_ns) / 1000000000ULL, 1); > + } > } > > #endif >
diff --git a/include/qemu/ratelimit.h b/include/qemu/ratelimit.h index 003ea6d5a3..48bf59e857 100644 --- a/include/qemu/ratelimit.h +++ b/include/qemu/ratelimit.h @@ -43,7 +43,11 @@ static inline int64_t ratelimit_calculate_delay(RateLimit *limit, uint64_t n) double delay_slices; QEMU_LOCK_GUARD(&limit->lock); - assert(limit->slice_quota && limit->slice_ns); + if (!limit->slice_quota) { + /* Throttling disabled. */ + return 0; + } + assert(limit->slice_ns); if (limit->slice_end_time < now) { /* Previous, possibly extended, time slice finished; reset the @@ -83,7 +87,11 @@ static inline void ratelimit_set_speed(RateLimit *limit, uint64_t speed, { QEMU_LOCK_GUARD(&limit->lock); limit->slice_ns = slice_ns; - limit->slice_quota = MAX(((double)speed * slice_ns) / 1000000000ULL, 1); + if (speed == 0) { + limit->slice_quota = 0; + } else { + limit->slice_quota = MAX(((double)speed * slice_ns) / 1000000000ULL, 1); + } } #endif