From nobody Sat Apr 27 06:45:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) 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=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 152327930939336.398004471991044; Mon, 9 Apr 2018 06:08:29 -0700 (PDT) Received: from localhost ([::1]:37073 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1f5WWx-00034J-6U for importer@patchew.org; Mon, 09 Apr 2018 09:08:19 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50301) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1f5WVy-0002ac-49 for qemu-devel@nongnu.org; Mon, 09 Apr 2018 09:07:23 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1f5WVt-0008CB-16 for qemu-devel@nongnu.org; Mon, 09 Apr 2018 09:07:18 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:43752 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1f5WVs-0008BG-Sv; Mon, 09 Apr 2018 09:07:12 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D67414023141; Mon, 9 Apr 2018 13:07:08 +0000 (UTC) Received: from t460s.redhat.com (ovpn-117-190.ams2.redhat.com [10.36.117.190]) by smtp.corp.redhat.com (Postfix) with ESMTP id 750AED7DFB; Mon, 9 Apr 2018 13:07:01 +0000 (UTC) From: David Hildenbrand To: qemu-devel@nongnu.org Date: Mon, 9 Apr 2018 15:07:00 +0200 Message-Id: <20180409130700.5692-1-david@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.6]); Mon, 09 Apr 2018 13:07:08 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.6]); Mon, 09 Apr 2018 13:07:08 +0000 (UTC) for IP:'10.11.54.5' DOMAIN:'int-mx05.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'david@redhat.com' RCPT:'' X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH v1] cpus: track calls to resume/pause_all_vcpus() 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 Crosthwaite , Cornelia Huck , David Hildenbrand , Christian Borntraeger , qemu-s390x@nongnu.org, Paolo Bonzini , Richard Henderson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" If we have parallel calls to resume/pause_all_vcpus() we can get into trouble because the qemu mutex is temporarily dropped while waiting for all threads to stop. This can happen e.g. for s390x, where resume/pause_all_vcpus() can be triggered by a VCPU. Pause/Resume exactly once, when we leave/hit "0". Signed-off-by: David Hildenbrand --- cpus.c | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/cpus.c b/cpus.c index 2e6701795b..7c7e0245c5 100644 --- a/cpus.c +++ b/cpus.c @@ -1778,17 +1778,26 @@ static bool all_vcpus_paused(void) return true; } =20 +/* wait for the initial vm_start() call */ +static int vcpus_paused =3D 1; + void pause_all_vcpus(void) { CPUState *cpu; =20 - qemu_clock_enable(QEMU_CLOCK_VIRTUAL, false); - CPU_FOREACH(cpu) { - if (qemu_cpu_is_self(cpu)) { - qemu_cpu_stop(cpu, true); - } else { - cpu->stop =3D true; - qemu_cpu_kick(cpu); + assert(qemu_mutex_iothread_locked()); + assert(vcpus_paused >=3D 0); + + vcpus_paused++; + if (vcpus_paused =3D=3D 1) { + qemu_clock_enable(QEMU_CLOCK_VIRTUAL, false); + CPU_FOREACH(cpu) { + if (qemu_cpu_is_self(cpu)) { + qemu_cpu_stop(cpu, true); + } else { + cpu->stop =3D true; + qemu_cpu_kick(cpu); + } } } =20 @@ -1820,6 +1829,14 @@ void resume_all_vcpus(void) { CPUState *cpu; =20 + assert(vcpus_paused >=3D 0); + assert(qemu_mutex_iothread_locked()); + + vcpus_paused--; + if (vcpus_paused > 0) { + return; + } + qemu_clock_enable(QEMU_CLOCK_VIRTUAL, true); CPU_FOREACH(cpu) { cpu_resume(cpu); --=20 2.14.3