X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=qemu%2Finclude%2Fqemu%2Fratelimit.h;fp=qemu%2Finclude%2Fqemu%2Fratelimit.h;h=d413a4a696b78f79628e459395bb87dd35d681c1;hb=e44e3482bdb4d0ebde2d8b41830ac2cdb07948fb;hp=0000000000000000000000000000000000000000;hpb=9ca8dbcc65cfc63d6f5ef3312a33184e1d726e00;p=kvmfornfv.git diff --git a/qemu/include/qemu/ratelimit.h b/qemu/include/qemu/ratelimit.h new file mode 100644 index 000000000..d413a4a69 --- /dev/null +++ b/qemu/include/qemu/ratelimit.h @@ -0,0 +1,48 @@ +/* + * Ratelimiting calculations + * + * Copyright IBM, Corp. 2011 + * + * Authors: + * Stefan Hajnoczi + * + * This work is licensed under the terms of the GNU LGPL, version 2 or later. + * See the COPYING.LIB file in the top-level directory. + * + */ + +#ifndef QEMU_RATELIMIT_H +#define QEMU_RATELIMIT_H 1 + +typedef struct { + int64_t next_slice_time; + uint64_t slice_quota; + uint64_t slice_ns; + uint64_t dispatched; +} RateLimit; + +static inline int64_t ratelimit_calculate_delay(RateLimit *limit, uint64_t n) +{ + int64_t now = qemu_clock_get_ns(QEMU_CLOCK_REALTIME); + + if (limit->next_slice_time < now) { + limit->next_slice_time = now + limit->slice_ns; + limit->dispatched = 0; + } + if (limit->dispatched == 0 || limit->dispatched + n <= limit->slice_quota) { + limit->dispatched += n; + return 0; + } else { + limit->dispatched = n; + return limit->next_slice_time - now; + } +} + +static inline void ratelimit_set_speed(RateLimit *limit, uint64_t speed, + uint64_t slice_ns) +{ + limit->slice_ns = slice_ns; + limit->slice_quota = ((double)speed * slice_ns)/1000000000ULL; +} + +#endif