From: Stefan Hajnoczi <stefanha@redhat.com>
To: qemu-devel@nongnu.org
Cc: Peter Maydell <peter.maydell@linaro.org>,
Alberto Garcia <berto@igalia.com>,
Stefan Hajnoczi <stefanha@redhat.com>
Subject: [Qemu-devel] [PULL for-2.10 06/15] throttle: Make LeakyBucket.avg and LeakyBucket.max integer types
Date: Thu, 31 Aug 2017 09:22:01 +0100 [thread overview]
Message-ID: <20170831082210.8362-7-stefanha@redhat.com> (raw)
In-Reply-To: <20170831082210.8362-1-stefanha@redhat.com>
From: Alberto Garcia <berto@igalia.com>
Both the throttling limits set with the throttling.iops-* and
throttling.bps-* options and their QMP equivalents defined in the
BlockIOThrottle struct are integer values.
Those limits are also reported in the BlockDeviceInfo struct and they
are integers there as well.
Therefore there's no reason to store them internally as double and do
the conversion everytime we're setting or querying them, so this patch
uses uint64_t for those types. Let's also use an unsigned type because
we don't allow negative values anyway.
LeakyBucket.level and LeakyBucket.burst_level do however remain double
because their value changes depending on the fraction of time elapsed
since the previous I/O operation.
Signed-off-by: Alberto Garcia <berto@igalia.com>
Message-id: f29b840422767b5be2c41c2dfdbbbf6c5f8fedf8.1503580370.git.berto@igalia.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
---
include/qemu/throttle.h | 4 ++--
tests/test-throttle.c | 3 ++-
util/throttle.c | 7 +++----
3 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/include/qemu/throttle.h b/include/qemu/throttle.h
index 66a8ac10a4..6e31155fd4 100644
--- a/include/qemu/throttle.h
+++ b/include/qemu/throttle.h
@@ -77,8 +77,8 @@ typedef enum {
*/
typedef struct LeakyBucket {
- double avg; /* average goal in units per second */
- double max; /* leaky bucket max burst in units */
+ uint64_t avg; /* average goal in units per second */
+ uint64_t max; /* leaky bucket max burst in units */
double level; /* bucket level in units */
double burst_level; /* bucket level in units (for computing bursts) */
unsigned burst_length; /* max length of the burst period, in seconds */
diff --git a/tests/test-throttle.c b/tests/test-throttle.c
index 768f11dfed..41c0dd2529 100644
--- a/tests/test-throttle.c
+++ b/tests/test-throttle.c
@@ -284,13 +284,14 @@ static void test_enabled(void)
for (i = 0; i < BUCKETS_COUNT; i++) {
throttle_config_init(&cfg);
set_cfg_value(false, i, 150);
+ g_assert(throttle_is_valid(&cfg, NULL));
g_assert(throttle_enabled(&cfg));
}
for (i = 0; i < BUCKETS_COUNT; i++) {
throttle_config_init(&cfg);
set_cfg_value(false, i, -150);
- g_assert(!throttle_enabled(&cfg));
+ g_assert(!throttle_is_valid(&cfg, NULL));
}
}
diff --git a/util/throttle.c b/util/throttle.c
index 4e80a7ea54..80660ffd2c 100644
--- a/util/throttle.c
+++ b/util/throttle.c
@@ -106,13 +106,13 @@ int64_t throttle_compute_wait(LeakyBucket *bkt)
/* If bkt->max is 0 we still want to allow short bursts of I/O
* from the guest, otherwise every other request will be throttled
* and performance will suffer considerably. */
- bucket_size = bkt->avg / 10;
+ bucket_size = (double) bkt->avg / 10;
burst_bucket_size = 0;
} else {
/* If we have a burst limit then we have to wait until all I/O
* at burst rate has finished before throttling to bkt->avg */
bucket_size = bkt->max * bkt->burst_length;
- burst_bucket_size = bkt->max / 10;
+ burst_bucket_size = (double) bkt->max / 10;
}
/* If the main bucket is full then we have to wait */
@@ -338,8 +338,7 @@ bool throttle_is_valid(ThrottleConfig *cfg, Error **errp)
for (i = 0; i < BUCKETS_COUNT; i++) {
LeakyBucket *bkt = &cfg->buckets[i];
- if (bkt->avg < 0 || bkt->max < 0 ||
- bkt->avg > THROTTLE_VALUE_MAX || bkt->max > THROTTLE_VALUE_MAX) {
+ if (bkt->avg > THROTTLE_VALUE_MAX || bkt->max > THROTTLE_VALUE_MAX) {
error_setg(errp, "bps/iops/max values must be within [0, %lld]",
THROTTLE_VALUE_MAX);
return false;
--
2.13.5
next prev parent reply other threads:[~2017-08-31 8:22 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-08-31 8:21 [Qemu-devel] [PULL for-2.10 00/15] Block patches Stefan Hajnoczi
2017-08-31 8:21 ` [Qemu-devel] [PULL for-2.10 01/15] nvme: Fix get/set number of queues feature, again Stefan Hajnoczi
2017-08-31 8:21 ` [Qemu-devel] [PULL for-2.10 02/15] throttle: Fix wrong variable name in the header documentation Stefan Hajnoczi
2017-08-31 8:21 ` [Qemu-devel] [PULL for-2.10 03/15] throttle: Update the throttle_fix_bucket() documentation Stefan Hajnoczi
2017-08-31 8:21 ` [Qemu-devel] [PULL for-2.10 04/15] throttle: Make throttle_is_valid() a bit less verbose Stefan Hajnoczi
2017-08-31 8:22 ` [Qemu-devel] [PULL for-2.10 05/15] throttle: Remove throttle_fix_bucket() / throttle_unfix_bucket() Stefan Hajnoczi
2017-09-12 17:37 ` Peter Maydell
2017-08-31 8:22 ` Stefan Hajnoczi [this message]
2017-08-31 8:22 ` [Qemu-devel] [PULL for-2.10 07/15] throttle: Make burst_length 64bit and add range checks Stefan Hajnoczi
2017-08-31 8:22 ` [Qemu-devel] [PULL for-2.10 08/15] throttle: Test the valid range of config values Stefan Hajnoczi
2017-08-31 8:22 ` [Qemu-devel] [PULL for-2.10 09/15] oslib-posix: Print errors before aborting on qemu_alloc_stack() Stefan Hajnoczi
2017-08-31 8:22 ` [Qemu-devel] [PULL for-2.10 10/15] misc: Remove unused Error variables Stefan Hajnoczi
2017-08-31 8:22 ` [Qemu-devel] [PULL for-2.10 11/15] scripts: add argparse module for Python 2.6 compatibility Stefan Hajnoczi
2017-08-31 8:22 ` [Qemu-devel] [PULL for-2.10 12/15] docker.py: Python 2.6 argparse compatibility Stefan Hajnoczi
2017-08-31 8:22 ` [Qemu-devel] [PULL for-2.10 13/15] tests: migration/guestperf " Stefan Hajnoczi
2017-08-31 8:22 ` [Qemu-devel] [PULL for-2.10 14/15] qemu-doc: Add UUID support in initiator name Stefan Hajnoczi
2017-08-31 8:22 ` [Qemu-devel] [PULL for-2.10 15/15] qcow2: allocate cluster_cache/cluster_data on demand Stefan Hajnoczi
2017-08-31 8:37 ` [Qemu-devel] [PULL for-2.10 00/15] Block patches no-reply
2017-08-31 13:47 ` Eric Blake
2017-08-31 14:51 ` Peter Maydell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170831082210.8362-7-stefanha@redhat.com \
--to=stefanha@redhat.com \
--cc=berto@igalia.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).