diff mbox series

[1/6] ratelimit: treat zero speed as unlimited

Message ID 20210510085941.22769-2-eesposit@redhat.com (mailing list archive)
State New, archived
Headers show
Series block-copy: make helper APIs thread safe | expand

Commit Message

Emanuele Giuseppe Esposito May 10, 2021, 8:59 a.m. UTC
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>
---
 include/qemu/ratelimit.h | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

Comments

Vladimir Sementsov-Ogievskiy May 10, 2021, 11 a.m. UTC | #1
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 mbox series

Patch

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