diff options
-rw-r--r-- | blockdev.c | 6 | ||||
-rw-r--r-- | include/qemu/throttle.h | 2 | ||||
-rw-r--r-- | tests/test-throttle.c | 21 | ||||
-rw-r--r-- | util/throttle.c | 15 |
4 files changed, 44 insertions, 0 deletions
@@ -337,6 +337,12 @@ static bool check_throttle_config(ThrottleConfig *cfg, Error **errp) return false; } + if (throttle_max_is_missing_limit(cfg)) { + error_setg(errp, "bps_max/iops_max require corresponding" + " bps/iops values"); + return false; + } + return true; } diff --git a/include/qemu/throttle.h b/include/qemu/throttle.h index 995b2d5..12faaad 100644 --- a/include/qemu/throttle.h +++ b/include/qemu/throttle.h @@ -114,6 +114,8 @@ bool throttle_conflicting(ThrottleConfig *cfg); bool throttle_is_valid(ThrottleConfig *cfg); +bool throttle_max_is_missing_limit(ThrottleConfig *cfg); + void throttle_config(ThrottleState *ts, ThrottleTimers *tt, ThrottleConfig *cfg); diff --git a/tests/test-throttle.c b/tests/test-throttle.c index 0168445..85c9b6c 100644 --- a/tests/test-throttle.c +++ b/tests/test-throttle.c @@ -329,6 +329,26 @@ static void test_is_valid(void) test_is_valid_for_value(1, true); } +static void test_max_is_missing_limit(void) +{ + int i; + + for (i = 0; i < BUCKETS_COUNT; i++) { + memset(&cfg, 0, sizeof(cfg)); + cfg.buckets[i].max = 100; + cfg.buckets[i].avg = 0; + g_assert(throttle_max_is_missing_limit(&cfg)); + + cfg.buckets[i].max = 0; + cfg.buckets[i].avg = 0; + g_assert(!throttle_max_is_missing_limit(&cfg)); + + cfg.buckets[i].max = 0; + cfg.buckets[i].avg = 100; + g_assert(!throttle_max_is_missing_limit(&cfg)); + } +} + static void test_have_timer(void) { /* zero structures */ @@ -591,6 +611,7 @@ int main(int argc, char **argv) g_test_add_func("/throttle/config/enabled", test_enabled); g_test_add_func("/throttle/config/conflicting", test_conflicting_config); g_test_add_func("/throttle/config/is_valid", test_is_valid); + g_test_add_func("/throttle/config/max", test_max_is_missing_limit); g_test_add_func("/throttle/config_functions", test_config_functions); g_test_add_func("/throttle/accounting", test_accounting); g_test_add_func("/throttle/groups", test_groups); diff --git a/util/throttle.c b/util/throttle.c index 706c131..1113671 100644 --- a/util/throttle.c +++ b/util/throttle.c @@ -300,6 +300,21 @@ bool throttle_is_valid(ThrottleConfig *cfg) return !invalid; } +/* check if bps_max/iops_max is used without bps/iops + * @cfg: the throttling configuration to inspect + */ +bool throttle_max_is_missing_limit(ThrottleConfig *cfg) +{ + int i; + + for (i = 0; i < BUCKETS_COUNT; i++) { + if (cfg->buckets[i].max && !cfg->buckets[i].avg) { + return true; + } + } + return false; +} + /* fix bucket parameters */ static void throttle_fix_bucket(LeakyBucket *bkt) { |