{"id":808127,"url":"http://patchwork.ozlabs.org/api/patches/808127/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20170831082210.8362-7-stefanha@redhat.com/","project":{"id":14,"url":"http://patchwork.ozlabs.org/api/projects/14/?format=json","name":"QEMU Development","link_name":"qemu-devel","list_id":"qemu-devel.nongnu.org","list_email":"qemu-devel@nongnu.org","web_url":"","scm_url":"","webscm_url":"","list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<20170831082210.8362-7-stefanha@redhat.com>","list_archive_url":null,"date":"2017-08-31T08:22:01","name":"[PULL,for-2.10,06/15] throttle: Make LeakyBucket.avg and LeakyBucket.max integer types","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"5bcf1cbaf5d987a27d97811f3ad31cf82508d373","submitter":{"id":17227,"url":"http://patchwork.ozlabs.org/api/people/17227/?format=json","name":"Stefan Hajnoczi","email":"stefanha@redhat.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20170831082210.8362-7-stefanha@redhat.com/mbox/","series":[{"id":766,"url":"http://patchwork.ozlabs.org/api/series/766/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/list/?series=766","date":"2017-08-31T08:21:55","name":"[PULL,for-2.10,01/15] nvme: Fix get/set number of queues feature, again","version":1,"mbox":"http://patchwork.ozlabs.org/series/766/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/808127/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/808127/checks/","tags":{},"related":[],"headers":{"Return-Path":"<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@bilbo.ozlabs.org","Authentication-Results":["ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=nongnu.org\n\t(client-ip=2001:4830:134:3::11; helo=lists.gnu.org;\n\tenvelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n\treceiver=<UNKNOWN>)","ext-mx09.extmail.prod.ext.phx2.redhat.com;\n\tdmarc=none (p=none dis=none) header.from=redhat.com","ext-mx09.extmail.prod.ext.phx2.redhat.com;\n\tspf=fail smtp.mailfrom=stefanha@redhat.com"],"Received":["from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11])\n\t(using TLSv1 with cipher AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3xjb923Vczz9t16\n\tfor <incoming@patchwork.ozlabs.org>;\n\tThu, 31 Aug 2017 18:27:50 +1000 (AEST)","from localhost ([::1]:54488 helo=lists.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.71) (envelope-from\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>)\n\tid 1dnKpI-00011U-AC\n\tfor incoming@patchwork.ozlabs.org; Thu, 31 Aug 2017 04:27:48 -0400","from eggs.gnu.org ([2001:4830:134:3::10]:42491)\n\tby lists.gnu.org with esmtp (Exim 4.71)\n\t(envelope-from <stefanha@redhat.com>) id 1dnKkF-0005MD-Pn\n\tfor qemu-devel@nongnu.org; Thu, 31 Aug 2017 04:22:37 -0400","from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)\n\t(envelope-from <stefanha@redhat.com>) id 1dnKkE-0005t9-PB\n\tfor qemu-devel@nongnu.org; Thu, 31 Aug 2017 04:22:35 -0400","from mx1.redhat.com ([209.132.183.28]:53674)\n\tby eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32)\n\t(Exim 4.71) (envelope-from <stefanha@redhat.com>) id 1dnKkE-0005sn-Gt\n\tfor qemu-devel@nongnu.org; Thu, 31 Aug 2017 04:22:34 -0400","from smtp.corp.redhat.com\n\t(int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15])\n\t(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby mx1.redhat.com (Postfix) with ESMTPS id AAC9568C2;\n\tThu, 31 Aug 2017 08:22:33 +0000 (UTC)","from localhost (ovpn-117-89.ams2.redhat.com [10.36.117.89])\n\tby smtp.corp.redhat.com (Postfix) with ESMTP id 3DF3892D01;\n\tThu, 31 Aug 2017 08:22:33 +0000 (UTC)"],"DMARC-Filter":"OpenDMARC Filter v1.3.2 mx1.redhat.com AAC9568C2","From":"Stefan Hajnoczi <stefanha@redhat.com>","To":"<qemu-devel@nongnu.org>","Date":"Thu, 31 Aug 2017 09:22:01 +0100","Message-Id":"<20170831082210.8362-7-stefanha@redhat.com>","In-Reply-To":"<20170831082210.8362-1-stefanha@redhat.com>","References":"<20170831082210.8362-1-stefanha@redhat.com>","X-Scanned-By":"MIMEDefang 2.79 on 10.5.11.15","X-Greylist":"Sender IP whitelisted, not delayed by milter-greylist-4.5.16\n\t(mx1.redhat.com [10.5.110.38]);\n\tThu, 31 Aug 2017 08:22:33 +0000 (UTC)","X-detected-operating-system":"by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]\n\t[fuzzy]","X-Received-From":"209.132.183.28","Subject":"[Qemu-devel] [PULL for-2.10 06/15] throttle: Make LeakyBucket.avg\n\tand LeakyBucket.max integer types","X-BeenThere":"qemu-devel@nongnu.org","X-Mailman-Version":"2.1.21","Precedence":"list","List-Id":"<qemu-devel.nongnu.org>","List-Unsubscribe":"<https://lists.nongnu.org/mailman/options/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>","List-Archive":"<http://lists.nongnu.org/archive/html/qemu-devel/>","List-Post":"<mailto:qemu-devel@nongnu.org>","List-Help":"<mailto:qemu-devel-request@nongnu.org?subject=help>","List-Subscribe":"<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=subscribe>","Cc":"Peter Maydell <peter.maydell@linaro.org>,\n\tAlberto Garcia <berto@igalia.com>, Stefan Hajnoczi <stefanha@redhat.com>","Errors-To":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org","Sender":"\"Qemu-devel\"\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>"},"content":"From: Alberto Garcia <berto@igalia.com>\n\nBoth the throttling limits set with the throttling.iops-* and\nthrottling.bps-* options and their QMP equivalents defined in the\nBlockIOThrottle struct are integer values.\n\nThose limits are also reported in the BlockDeviceInfo struct and they\nare integers there as well.\n\nTherefore there's no reason to store them internally as double and do\nthe conversion everytime we're setting or querying them, so this patch\nuses uint64_t for those types. Let's also use an unsigned type because\nwe don't allow negative values anyway.\n\nLeakyBucket.level and LeakyBucket.burst_level do however remain double\nbecause their value changes depending on the fraction of time elapsed\nsince the previous I/O operation.\n\nSigned-off-by: Alberto Garcia <berto@igalia.com>\nMessage-id: f29b840422767b5be2c41c2dfdbbbf6c5f8fedf8.1503580370.git.berto@igalia.com\nSigned-off-by: Stefan Hajnoczi <stefanha@redhat.com>\n---\n include/qemu/throttle.h | 4 ++--\n tests/test-throttle.c   | 3 ++-\n util/throttle.c         | 7 +++----\n 3 files changed, 7 insertions(+), 7 deletions(-)","diff":"diff --git a/include/qemu/throttle.h b/include/qemu/throttle.h\nindex 66a8ac10a4..6e31155fd4 100644\n--- a/include/qemu/throttle.h\n+++ b/include/qemu/throttle.h\n@@ -77,8 +77,8 @@ typedef enum {\n  */\n \n typedef struct LeakyBucket {\n-    double  avg;              /* average goal in units per second */\n-    double  max;              /* leaky bucket max burst in units */\n+    uint64_t avg;             /* average goal in units per second */\n+    uint64_t max;             /* leaky bucket max burst in units */\n     double  level;            /* bucket level in units */\n     double  burst_level;      /* bucket level in units (for computing bursts) */\n     unsigned burst_length;    /* max length of the burst period, in seconds */\ndiff --git a/tests/test-throttle.c b/tests/test-throttle.c\nindex 768f11dfed..41c0dd2529 100644\n--- a/tests/test-throttle.c\n+++ b/tests/test-throttle.c\n@@ -284,13 +284,14 @@ static void test_enabled(void)\n     for (i = 0; i < BUCKETS_COUNT; i++) {\n         throttle_config_init(&cfg);\n         set_cfg_value(false, i, 150);\n+        g_assert(throttle_is_valid(&cfg, NULL));\n         g_assert(throttle_enabled(&cfg));\n     }\n \n     for (i = 0; i < BUCKETS_COUNT; i++) {\n         throttle_config_init(&cfg);\n         set_cfg_value(false, i, -150);\n-        g_assert(!throttle_enabled(&cfg));\n+        g_assert(!throttle_is_valid(&cfg, NULL));\n     }\n }\n \ndiff --git a/util/throttle.c b/util/throttle.c\nindex 4e80a7ea54..80660ffd2c 100644\n--- a/util/throttle.c\n+++ b/util/throttle.c\n@@ -106,13 +106,13 @@ int64_t throttle_compute_wait(LeakyBucket *bkt)\n         /* If bkt->max is 0 we still want to allow short bursts of I/O\n          * from the guest, otherwise every other request will be throttled\n          * and performance will suffer considerably. */\n-        bucket_size = bkt->avg / 10;\n+        bucket_size = (double) bkt->avg / 10;\n         burst_bucket_size = 0;\n     } else {\n         /* If we have a burst limit then we have to wait until all I/O\n          * at burst rate has finished before throttling to bkt->avg */\n         bucket_size = bkt->max * bkt->burst_length;\n-        burst_bucket_size = bkt->max / 10;\n+        burst_bucket_size = (double) bkt->max / 10;\n     }\n \n     /* If the main bucket is full then we have to wait */\n@@ -338,8 +338,7 @@ bool throttle_is_valid(ThrottleConfig *cfg, Error **errp)\n \n     for (i = 0; i < BUCKETS_COUNT; i++) {\n         LeakyBucket *bkt = &cfg->buckets[i];\n-        if (bkt->avg < 0 || bkt->max < 0 ||\n-            bkt->avg > THROTTLE_VALUE_MAX || bkt->max > THROTTLE_VALUE_MAX) {\n+        if (bkt->avg > THROTTLE_VALUE_MAX || bkt->max > THROTTLE_VALUE_MAX) {\n             error_setg(errp, \"bps/iops/max values must be within [0, %lld]\",\n                        THROTTLE_VALUE_MAX);\n             return false;\n","prefixes":["PULL","for-2.10","06/15"]}