From: Alberto Garcia Date: Wed, 4 Nov 2015 13:15:35 +0000 (+0200) Subject: throttle: Check for pending requests in throttle_group_unregister_bs() X-Git-Tag: v2.5.0-rc0~14^2~8 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5ac724184c286b367525035eabf4b8bb4a386c54;p=thirdparty%2Fqemu.git throttle: Check for pending requests in throttle_group_unregister_bs() throttle_group_unregister_bs() removes a BlockDriverState from its throttling group and destroys the timers. This means that there must be no pending throttled requests at that point (because it would be impossible to complete them), so the caller has to drain them first. At the moment throttle_group_unregister_bs() is only called from bdrv_io_limits_disable(), which already takes care of draining the requests, so there's nothing to worry about, but this patch makes this invariant explicit in the documentation and adds the relevant assertions. Signed-off-by: Alberto Garcia Signed-off-by: Kevin Wolf --- diff --git a/block/throttle-groups.c b/block/throttle-groups.c index 3419af7d96f..13b5baa5d78 100644 --- a/block/throttle-groups.c +++ b/block/throttle-groups.c @@ -437,6 +437,9 @@ void throttle_group_register_bs(BlockDriverState *bs, const char *groupname) * list, destroying the timers and setting the throttle_state pointer * to NULL. * + * The BlockDriverState must not have pending throttled requests, so + * the caller has to drain them first. + * * The group will be destroyed if it's empty after this operation. * * @bs: the BlockDriverState to remove @@ -446,6 +449,10 @@ void throttle_group_unregister_bs(BlockDriverState *bs) ThrottleGroup *tg = container_of(bs->throttle_state, ThrottleGroup, ts); int i; + assert(bs->pending_reqs[0] == 0 && bs->pending_reqs[1] == 0); + assert(qemu_co_queue_empty(&bs->throttled_reqs[0])); + assert(qemu_co_queue_empty(&bs->throttled_reqs[1])); + qemu_mutex_lock(&tg->lock); for (i = 0; i < 2; i++) { if (tg->tokens[i] == bs) {