root / include / qemu / ratelimit.h @ 1de7afc9
History | View | Annotate | Download (1.2 kB)
1 | 6ef228fc | Paolo Bonzini | /*
|
---|---|---|---|
2 | 6ef228fc | Paolo Bonzini | * Ratelimiting calculations
|
3 | 6ef228fc | Paolo Bonzini | *
|
4 | 6ef228fc | Paolo Bonzini | * Copyright IBM, Corp. 2011
|
5 | 6ef228fc | Paolo Bonzini | *
|
6 | 6ef228fc | Paolo Bonzini | * Authors:
|
7 | 6ef228fc | Paolo Bonzini | * Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
|
8 | 6ef228fc | Paolo Bonzini | *
|
9 | 6ef228fc | Paolo Bonzini | * This work is licensed under the terms of the GNU LGPL, version 2 or later.
|
10 | 6ef228fc | Paolo Bonzini | * See the COPYING.LIB file in the top-level directory.
|
11 | 6ef228fc | Paolo Bonzini | *
|
12 | 6ef228fc | Paolo Bonzini | */
|
13 | 6ef228fc | Paolo Bonzini | |
14 | 6ef228fc | Paolo Bonzini | #ifndef QEMU_RATELIMIT_H
|
15 | 6ef228fc | Paolo Bonzini | #define QEMU_RATELIMIT_H 1 |
16 | 6ef228fc | Paolo Bonzini | |
17 | 6ef228fc | Paolo Bonzini | typedef struct { |
18 | 6ef228fc | Paolo Bonzini | int64_t next_slice_time; |
19 | 6ef228fc | Paolo Bonzini | uint64_t slice_quota; |
20 | 6ef228fc | Paolo Bonzini | uint64_t slice_ns; |
21 | 6ef228fc | Paolo Bonzini | uint64_t dispatched; |
22 | 6ef228fc | Paolo Bonzini | } RateLimit; |
23 | 6ef228fc | Paolo Bonzini | |
24 | 6ef228fc | Paolo Bonzini | static inline int64_t ratelimit_calculate_delay(RateLimit *limit, uint64_t n) |
25 | 6ef228fc | Paolo Bonzini | { |
26 | 6ef228fc | Paolo Bonzini | int64_t now = qemu_get_clock_ns(rt_clock); |
27 | 6ef228fc | Paolo Bonzini | |
28 | 6ef228fc | Paolo Bonzini | if (limit->next_slice_time < now) {
|
29 | 6ef228fc | Paolo Bonzini | limit->next_slice_time = now + limit->slice_ns; |
30 | 6ef228fc | Paolo Bonzini | limit->dispatched = 0;
|
31 | 6ef228fc | Paolo Bonzini | } |
32 | 6ef228fc | Paolo Bonzini | if (limit->dispatched == 0 || limit->dispatched + n <= limit->slice_quota) { |
33 | 6ef228fc | Paolo Bonzini | limit->dispatched += n; |
34 | 6ef228fc | Paolo Bonzini | return 0; |
35 | 6ef228fc | Paolo Bonzini | } else {
|
36 | 6ef228fc | Paolo Bonzini | limit->dispatched = n; |
37 | 6ef228fc | Paolo Bonzini | return limit->next_slice_time - now;
|
38 | 6ef228fc | Paolo Bonzini | } |
39 | 6ef228fc | Paolo Bonzini | } |
40 | 6ef228fc | Paolo Bonzini | |
41 | 6ef228fc | Paolo Bonzini | static inline void ratelimit_set_speed(RateLimit *limit, uint64_t speed, |
42 | 6ef228fc | Paolo Bonzini | uint64_t slice_ns) |
43 | 6ef228fc | Paolo Bonzini | { |
44 | 6ef228fc | Paolo Bonzini | limit->slice_ns = slice_ns; |
45 | e3980e28 | Dietmar Maurer | limit->slice_quota = ((double)speed * slice_ns)/1000000000ULL; |
46 | 6ef228fc | Paolo Bonzini | } |
47 | 6ef228fc | Paolo Bonzini | |
48 | 6ef228fc | Paolo Bonzini | #endif |