]>
Commit | Line | Data |
---|---|---|
22ea5045 WB |
1 | From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
2 | From: Wolfgang Bumiller <w.bumiller@proxmox.com> | |
3 | Date: Tue, 6 Feb 2018 11:34:34 +0100 | |
4 | Subject: [PATCH] ratelimit: don't align wait time with slices | |
5 | ||
6 | It is possible for rate limited writes to keep overshooting a slice's | |
7 | quota by a tiny amount causing the slice-aligned waiting period to | |
8 | effectively halve the rate. | |
9 | ||
10 | Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com> | |
11 | --- | |
12 | include/qemu/ratelimit.h | 11 +++++------ | |
13 | 1 file changed, 5 insertions(+), 6 deletions(-) | |
14 | ||
15 | diff --git a/include/qemu/ratelimit.h b/include/qemu/ratelimit.h | |
6838f038 | 16 | index 8dece483f5..1b38291823 100644 |
22ea5045 WB |
17 | --- a/include/qemu/ratelimit.h |
18 | +++ b/include/qemu/ratelimit.h | |
6838f038 | 19 | @@ -36,7 +36,7 @@ typedef struct { |
22ea5045 WB |
20 | static inline int64_t ratelimit_calculate_delay(RateLimit *limit, uint64_t n) |
21 | { | |
22 | int64_t now = qemu_clock_get_ns(QEMU_CLOCK_REALTIME); | |
23 | - uint64_t delay_slices; | |
24 | + double delay_slices; | |
25 | ||
26 | assert(limit->slice_quota && limit->slice_ns); | |
27 | ||
6838f038 | 28 | @@ -55,12 +55,11 @@ static inline int64_t ratelimit_calculate_delay(RateLimit *limit, uint64_t n) |
22ea5045 WB |
29 | return 0; |
30 | } | |
31 | ||
32 | - /* Quota exceeded. Calculate the next time slice we may start | |
33 | - * sending data again. */ | |
34 | - delay_slices = (limit->dispatched + limit->slice_quota - 1) / | |
35 | - limit->slice_quota; | |
36 | + /* Quota exceeded. Wait based on the excess amount and then start a new | |
37 | + * slice. */ | |
38 | + delay_slices = (double)limit->dispatched / limit->slice_quota; | |
39 | limit->slice_end_time = limit->slice_start_time + | |
40 | - delay_slices * limit->slice_ns; | |
41 | + (uint64_t)(delay_slices * limit->slice_ns); | |
42 | return limit->slice_end_time - now; | |
43 | } | |
44 | ||
45 | -- | |
46 | 2.11.0 | |
47 |