From nobody Mon Feb 9 12:11:17 2026 Delivered-To: importer@patchew.org Received-SPF: temperror (zoho.com: Error in retrieving data from DNS) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=temperror (zoho.com: Error in retrieving data from DNS) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1510340351707897.7061923918935; Fri, 10 Nov 2017 10:59:11 -0800 (PST) Received: from localhost ([::1]:43084 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eDEVw-0003bz-Ml for importer@patchew.org; Fri, 10 Nov 2017 13:58:52 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36873) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eDESO-0000m7-Si for qemu-devel@nongnu.org; Fri, 10 Nov 2017 13:55:14 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eDESK-0001t1-Vg for qemu-devel@nongnu.org; Fri, 10 Nov 2017 13:55:12 -0500 Received: from fanzine.igalia.com ([91.117.99.155]:56037) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1eDESK-0001r9-Hn; Fri, 10 Nov 2017 13:55:08 -0500 Received: from a88-114-101-76.elisa-laajakaista.fi ([88.114.101.76] helo=perseus.local) by fanzine.igalia.com with esmtpsa (Cipher TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim) id 1eDESG-0000sW-Hb; Fri, 10 Nov 2017 19:55:04 +0100 Received: from berto by perseus.local with local (Exim 4.89) (envelope-from ) id 1eDES3-0004PT-59; Fri, 10 Nov 2017 20:54:51 +0200 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=igalia.com; s=20170329; h=References:In-Reply-To:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From; bh=nzcW8tZCCtnjfCpI/Op9g1owXzLVv3zPg6oMivsQIkw=; b=GBRUBCx8AOaiNrIrsV1EapB8+PWKJbmuvk3uW/1OlNEc+Pu5zpos1RdIQ3MAFf/vZi9JWsjfzRW5PJ8M3xL/Ca6pLkFvnpvwMSCffSpx0eBtZS4E2FXxgWCiUQpPZmEPOdwwamgoj7QKbeEq7J/MppYC/VKtaHje0VuUHx/tqZmHHmiEfQsYrcOOp3n/yN6QQ/k+/7M+UJu6PV6qLbNP1AsCgPBCR6ueqN8wME5ut8FpmS67QkVzdUcaBk0nv/ui9kBR/qOsImHBQ7BNduqeMu1tOSfzfT9cIuAPLd1bWIN5LNseMLfJV6f2yP+djytYmiZsvFC8wsMFgzH2FTUgbw==; From: Alberto Garcia To: qemu-devel@nongnu.org Date: Fri, 10 Nov 2017 20:54:47 +0200 Message-Id: X-Mailer: git-send-email 2.11.0 In-Reply-To: References: In-Reply-To: References: X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x (no timestamps) [generic] [fuzzy] X-Received-From: 91.117.99.155 Subject: [Qemu-devel] [PATCH 2/3] block: Leave valid throttle timers when removing a BDS from a backend X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Alberto Garcia , qemu-block@nongnu.org, Max Reitz , Stefan Hajnoczi , sochin jiang Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_6 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" If a BlockBackend has I/O limits set then its ThrottleGroupMember structure uses the AioContext from its attached BlockDriverState. Those two contexts must be kept in sync manually. This is not ideal and will be fixed in the future by removing the throttling configuration from the BlockBackend and storing it in an implicit filter node instead, but for now we have to live with this. When you remove the BlockDriverState from the backend then the throttle timers are destroyed. If a new BlockDriverState is later inserted then they are created again using the new AioContext. There'a a couple of problems with this: a) The code manipulates the timers directly, leaving the ThrottleGroupMember.aio_context field in an inconsisent state. b) If you remove the I/O limits (e.g by destroying the backend) when the timers are gone then throttle_group_unregister_tgm() will attempt to destroy them again, crashing QEMU. While b) could be fixed easily by allowing the timers to be freed twice, this would result in a situation in which we can no longer guarantee that a valid ThrottleState has a valid AioContext and timers. This patch ensures that the timers and AioContext are always valid when I/O limits are set, regardless of whether the BlockBackend has a BlockDriverState inserted or not. Reported-by: sochin jiang Signed-off-by: Alberto Garcia Reviewed-by: Max Reitz --- block/block-backend.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/block/block-backend.c b/block/block-backend.c index 193a080096..38db6e639b 100644 --- a/block/block-backend.c +++ b/block/block-backend.c @@ -655,15 +655,15 @@ BlockBackend *blk_by_public(BlockBackendPublic *publi= c) */ void blk_remove_bs(BlockBackend *blk) { + ThrottleGroupMember *tgm =3D &blk->public.throttle_group_member; BlockDriverState *bs; - ThrottleTimers *tt; =20 notifier_list_notify(&blk->remove_bs_notifiers, blk); - if (blk->public.throttle_group_member.throttle_state) { - tt =3D &blk->public.throttle_group_member.throttle_timers; + if (tgm->throttle_state) { bs =3D blk_bs(blk); bdrv_drained_begin(bs); - throttle_timers_detach_aio_context(tt); + throttle_group_detach_aio_context(tgm); + throttle_group_attach_aio_context(tgm, qemu_get_aio_context()); bdrv_drained_end(bs); } =20 @@ -678,6 +678,7 @@ void blk_remove_bs(BlockBackend *blk) */ int blk_insert_bs(BlockBackend *blk, BlockDriverState *bs, Error **errp) { + ThrottleGroupMember *tgm =3D &blk->public.throttle_group_member; blk->root =3D bdrv_root_attach_child(bs, "root", &child_root, blk->perm, blk->shared_perm, blk, e= rrp); if (blk->root =3D=3D NULL) { @@ -686,10 +687,9 @@ int blk_insert_bs(BlockBackend *blk, BlockDriverState = *bs, Error **errp) bdrv_ref(bs); =20 notifier_list_notify(&blk->insert_bs_notifiers, blk); - if (blk->public.throttle_group_member.throttle_state) { - throttle_timers_attach_aio_context( - &blk->public.throttle_group_member.throttle_timers, - bdrv_get_aio_context(bs)); + if (tgm->throttle_state) { + throttle_group_detach_aio_context(tgm); + throttle_group_attach_aio_context(tgm, bdrv_get_aio_context(bs)); } =20 return 0; --=20 2.11.0