From nobody Thu May 2 19:28:39 2024 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; 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 (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1510850291079645.3797722623813; Thu, 16 Nov 2017 08:38:11 -0800 (PST) Received: from localhost ([::1]:41695 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eFNAf-0003Yw-Aa for importer@patchew.org; Thu, 16 Nov 2017 11:37:45 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:60165) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eFN9L-0002w4-9O for qemu-devel@nongnu.org; Thu, 16 Nov 2017 11:36:24 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eFN9H-00061A-UN for qemu-devel@nongnu.org; Thu, 16 Nov 2017 11:36:23 -0500 Received: from mx1.redhat.com ([209.132.183.28]:25966) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1eFN9H-00060t-O5 for qemu-devel@nongnu.org; Thu, 16 Nov 2017 11:36:19 -0500 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D6A97356FA; Thu, 16 Nov 2017 16:36:18 +0000 (UTC) Received: from localhost (ovpn-116-23.ams2.redhat.com [10.36.116.23]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7A02060F8A; Thu, 16 Nov 2017 16:36:18 +0000 (UTC) From: Stefan Hajnoczi To: Date: Thu, 16 Nov 2017 16:36:14 +0000 Message-Id: <20171116163614.24710-2-stefanha@redhat.com> In-Reply-To: <20171116163614.24710-1-stefanha@redhat.com> References: <20171116163614.24710-1-stefanha@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Thu, 16 Nov 2017 16:36:18 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PULL for-2.11 1/1] throttle-groups: forget timer and schedule next TGM on detach 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: Peter Maydell , Stefan Hajnoczi Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_6 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" tg->any_timer_armed[] must be cleared when detaching pending timers from the AioContext. Failure to do so leads to hung I/O because it looks like there are still timers pending when in fact they have been removed. Other ThrottleGroupMembers might have requests pending too so it's necessary to schedule the next TGM so it can set a timer. This patch fixes hung I/O when QEMU is launched with drives that are in the same throttling group: (guest)$ dd if=3D/dev/zero of=3D/dev/vdb oflag=3Ddirect bs=3D512 & (guest)$ dd if=3D/dev/zero of=3D/dev/vdc oflag=3Ddirect bs=3D512 & (qemu) stop (qemu) cont ...I/O is stuck... Signed-off-by: Stefan Hajnoczi Message-id: 20171116112150.27607-1-stefanha@redhat.com Signed-off-by: Stefan Hajnoczi --- block/throttle-groups.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/block/throttle-groups.c b/block/throttle-groups.c index 2587f19ca3..f26bcb5eee 100644 --- a/block/throttle-groups.c +++ b/block/throttle-groups.c @@ -593,13 +593,25 @@ void throttle_group_attach_aio_context(ThrottleGroupM= ember *tgm, =20 void throttle_group_detach_aio_context(ThrottleGroupMember *tgm) { + ThrottleGroup *tg =3D container_of(tgm->throttle_state, ThrottleGroup,= ts); ThrottleTimers *tt =3D &tgm->throttle_timers; + int i; =20 /* Requests must have been drained */ assert(tgm->pending_reqs[0] =3D=3D 0 && tgm->pending_reqs[1] =3D=3D 0); assert(qemu_co_queue_empty(&tgm->throttled_reqs[0])); assert(qemu_co_queue_empty(&tgm->throttled_reqs[1])); =20 + /* Kick off next ThrottleGroupMember, if necessary */ + qemu_mutex_lock(&tg->lock); + for (i =3D 0; i < 2; i++) { + if (timer_pending(tt->timers[i])) { + tg->any_timer_armed[i] =3D false; + schedule_next_request(tgm, i); + } + } + qemu_mutex_unlock(&tg->lock); + throttle_timers_detach_aio_context(tt); tgm->aio_context =3D NULL; } --=20 2.13.6