This will be needed by the group throttling patches for the algorithm to be accurate.
Signed-off-by: Benoit Canet <benoit.ca...@nodalink.com> --- block.c | 7 +++++-- include/qemu/throttle.h | 3 ++- util/throttle.c | 12 +++++++----- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/block.c b/block.c index 079b0dc..527ea48 100644 --- a/block.c +++ b/block.c @@ -202,10 +202,13 @@ static void bdrv_io_limits_intercept(BlockDriverState *bs, unsigned int bytes, bool is_write) { + bool armed; + /* does this io must wait */ bool must_wait = throttle_schedule_timer(&bs->throttle_state, &bs->throttle_timers, - is_write); + is_write, + &armed); /* if must wait or any request of this type throttled queue the IO */ if (must_wait || @@ -219,7 +222,7 @@ static void bdrv_io_limits_intercept(BlockDriverState *bs, /* if the next request must wait -> do nothing */ if (throttle_schedule_timer(&bs->throttle_state, &bs->throttle_timers, - is_write)) { + is_write, &armed)) { return; } diff --git a/include/qemu/throttle.h b/include/qemu/throttle.h index 3aece3a..3a16c48 100644 --- a/include/qemu/throttle.h +++ b/include/qemu/throttle.h @@ -124,7 +124,8 @@ void throttle_get_config(ThrottleState *ts, ThrottleConfig *cfg); /* usage */ bool throttle_schedule_timer(ThrottleState *ts, ThrottleTimers *tt, - bool is_write); + bool is_write, + bool *armed); void throttle_timer_fired(ThrottleState *ts, bool is_write); diff --git a/util/throttle.c b/util/throttle.c index 0e305e3..a273acb 100644 --- a/util/throttle.c +++ b/util/throttle.c @@ -375,11 +375,13 @@ void throttle_get_config(ThrottleState *ts, ThrottleConfig *cfg) */ bool throttle_schedule_timer(ThrottleState *ts, ThrottleTimers *tt, - bool is_write) + bool is_write, + bool *armed) { int64_t now = qemu_clock_get_ns(tt->clock_type); int64_t next_timestamp; bool must_wait; + *armed = false; must_wait = throttle_compute_timer(ts, is_write, @@ -392,12 +394,12 @@ bool throttle_schedule_timer(ThrottleState *ts, } /* request throttled and any timer pending -> do nothing */ - if (ts->any_timer_armed[is_write]) { - return true; + if (!ts->any_timer_armed[is_write]) { + *armed = true; + ts->any_timer_armed[is_write] = true; + timer_mod(tt->timers[is_write], next_timestamp); } - ts->any_timer_armed[is_write] = true; - timer_mod(tt->timers[is_write], next_timestamp); return true; } -- 2.1.1