* [Qemu-devel] [PATCH] throttle: Check current timers before updating any_timer_armed[]
@ 2015-06-15 15:41 Alberto Garcia
2015-06-16 9:53 ` Stefan Hajnoczi
0 siblings, 1 reply; 2+ messages in thread
From: Alberto Garcia @ 2015-06-15 15:41 UTC (permalink / raw)
To: qemu-devel; +Cc: Alberto Garcia, Stefan Hajnoczi, qemu-block
Calling throttle_group_config() cancels all timers from a particular
BlockDriverState, so any_timer_armed[] should be updated accordingly.
However, with the current code it may happen that a timer is armed in
a different BlockDriverState from the same group, so any_timer_armed[]
would be set to false in a situation where there is still a timer
armed.
The consequence is that we might end up with two timers armed. This
should not have any noticeable impact however, since all accesses to
the ThrottleGroup are protected by a lock, and the situation would
become normal again shortly thereafter as soon as all timers have been
fired.
The correct way to solve this is to check that we're actually
cancelling a timer before updating any_timer_armed[].
Signed-off-by: Alberto Garcia <berto@igalia.com>
---
block/throttle-groups.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/block/throttle-groups.c b/block/throttle-groups.c
index efc462f..1abc6fc 100644
--- a/block/throttle-groups.c
+++ b/block/throttle-groups.c
@@ -324,9 +324,14 @@ void throttle_group_config(BlockDriverState *bs, ThrottleConfig *cfg)
ThrottleState *ts = bs->throttle_state;
ThrottleGroup *tg = container_of(ts, ThrottleGroup, ts);
qemu_mutex_lock(&tg->lock);
- throttle_config(ts, tt, cfg);
/* throttle_config() cancels the timers */
- tg->any_timer_armed[0] = tg->any_timer_armed[1] = false;
+ if (timer_pending(tt->timers[0])) {
+ tg->any_timer_armed[0] = false;
+ }
+ if (timer_pending(tt->timers[1])) {
+ tg->any_timer_armed[1] = false;
+ }
+ throttle_config(ts, tt, cfg);
qemu_mutex_unlock(&tg->lock);
}
--
2.1.4
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [Qemu-devel] [PATCH] throttle: Check current timers before updating any_timer_armed[]
2015-06-15 15:41 [Qemu-devel] [PATCH] throttle: Check current timers before updating any_timer_armed[] Alberto Garcia
@ 2015-06-16 9:53 ` Stefan Hajnoczi
0 siblings, 0 replies; 2+ messages in thread
From: Stefan Hajnoczi @ 2015-06-16 9:53 UTC (permalink / raw)
To: Alberto Garcia; +Cc: qemu-devel, qemu-block
[-- Attachment #1: Type: text/plain, Size: 1119 bytes --]
On Mon, Jun 15, 2015 at 06:41:15PM +0300, Alberto Garcia wrote:
> Calling throttle_group_config() cancels all timers from a particular
> BlockDriverState, so any_timer_armed[] should be updated accordingly.
>
> However, with the current code it may happen that a timer is armed in
> a different BlockDriverState from the same group, so any_timer_armed[]
> would be set to false in a situation where there is still a timer
> armed.
>
> The consequence is that we might end up with two timers armed. This
> should not have any noticeable impact however, since all accesses to
> the ThrottleGroup are protected by a lock, and the situation would
> become normal again shortly thereafter as soon as all timers have been
> fired.
>
> The correct way to solve this is to check that we're actually
> cancelling a timer before updating any_timer_armed[].
>
> Signed-off-by: Alberto Garcia <berto@igalia.com>
> ---
> block/throttle-groups.c | 9 +++++++--
> 1 file changed, 7 insertions(+), 2 deletions(-)
Thanks, applied to my block tree:
https://github.com/stefanha/qemu/commits/block
Stefan
[-- Attachment #2: Type: application/pgp-signature, Size: 473 bytes --]
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2015-06-16 9:53 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-06-15 15:41 [Qemu-devel] [PATCH] throttle: Check current timers before updating any_timer_armed[] Alberto Garcia
2015-06-16 9:53 ` Stefan Hajnoczi
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).