ratelimit: treat zero speed as unlimited

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.

Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com>
Message-Id: <20210614081130.22134-2-eesposit@redhat.com>
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
This commit is contained in:
Paolo Bonzini 2021-06-14 10:11:26 +02:00 committed by Vladimir Sementsov-Ogievskiy
parent e0da9171e0
commit 720507ed95

View File

@ -43,7 +43,11 @@ static inline int64_t ratelimit_calculate_delay(RateLimit *limit, uint64_t n)
double delay_slices; double delay_slices;
QEMU_LOCK_GUARD(&limit->lock); 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) { if (limit->slice_end_time < now) {
/* Previous, possibly extended, time slice finished; reset the /* 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); QEMU_LOCK_GUARD(&limit->lock);
limit->slice_ns = slice_ns; 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 #endif