From nobody Sun Nov 16 23:02:10 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1602225424; cv=none; d=zohomail.com; s=zohoarc; b=PgnWOjy7DKJY9uqBHq5GI9Us54qU49ZAHK1QF+zHO5yKK89UXvgIo/63Ijjnsvl5Tb4RAHWVB0Dg6NkT1OzXdj0nn3lMfn3286XrDo/UBap7qfBhk2KsoHI7VyUqATf9JSRUxWyWqojvYHP6IYsyQMpZpL+YaaNldcz3tiYC9JI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1602225424; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=XdXfbd71VnvQSGDTayJ67mVOXGGwmcfjlhu8p5Zlhm0=; b=B4jv3d8Mh6OyAE5vNFCoqBCFlFAw8EZNsO199hMLVyQ/P8JXpGRFZ6PUNWqSAT3jQJQbTa+Pr8AI9Gx9fCYNCKXuFYCHMHQNTR7UmCSi/Kkp0lU7XsvWDMAiRHix2wpl7dxM9WDEwPuuz+CZyzkIor+BcPYLoonZTpI2s99ZR34= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1602225424888525.5288009973876; Thu, 8 Oct 2020 23:37:04 -0700 (PDT) Received: from localhost ([::1]:50260 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kQm1X-0003ve-JB for importer@patchew.org; Fri, 09 Oct 2020 02:37:03 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53858) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kQlzH-0001xb-Rb for qemu-devel@nongnu.org; Fri, 09 Oct 2020 02:34:43 -0400 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:51956) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kQlzF-0008UQ-SR for qemu-devel@nongnu.org; Fri, 09 Oct 2020 02:34:43 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-174-Hz_ieRKTPGyfIbB3GXYYpA-1; Fri, 09 Oct 2020 02:34:38 -0400 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 mimecast-mx01.redhat.com (Postfix) with ESMTPS id 053E218BA288 for ; Fri, 9 Oct 2020 06:34:38 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-112-182.ams2.redhat.com [10.36.112.182]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 9BF6460BFA; Fri, 9 Oct 2020 06:34:34 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 0750F112CE12; Fri, 9 Oct 2020 08:34:33 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1602225280; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=XdXfbd71VnvQSGDTayJ67mVOXGGwmcfjlhu8p5Zlhm0=; b=GiAZM9i8rXyjieuNiDWXgu7yLnqX3m0u6Bq+XX/6uesgWj1qRHUHRp5A1HNrwEWbVdmR0q pOHRyZp8Ejn6lw3ok2Pl2H3HLXPki8BljtPqJWcFGE0kbEHoY8Lfqqkgs7GzelxgyCKyVA PYYfNo/yB/N8DGj7oAdVELswZADVlNA= X-MC-Unique: Hz_ieRKTPGyfIbB3GXYYpA-1 From: Markus Armbruster To: qemu-devel@nongnu.org Subject: [PULL 01/14] monitor: Add Monitor parameter to monitor_set_cpu() Date: Fri, 9 Oct 2020 08:34:19 +0200 Message-Id: <20201009063432.303441-2-armbru@redhat.com> In-Reply-To: <20201009063432.303441-1-armbru@redhat.com> References: <20201009063432.303441-1-armbru@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=armbru@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=63.128.21.124; envelope-from=armbru@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/10/09 02:34:40 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, Stefan Hajnoczi Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Kevin Wolf Most callers actually don't have to rely on cur_mon, but already know for which monitor they call monitor_set_cpu(). Signed-off-by: Kevin Wolf Reviewed-by: Eric Blake Message-Id: <20201005155855.256490-2-kwolf@redhat.com> Reviewed-by: Markus Armbruster Reviewed-by: Stefan Hajnoczi Signed-off-by: Markus Armbruster --- include/monitor/monitor.h | 2 +- monitor/hmp-cmds.c | 2 +- monitor/misc.c | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/include/monitor/monitor.h b/include/monitor/monitor.h index c0170773d4..04f472ac4f 100644 --- a/include/monitor/monitor.h +++ b/include/monitor/monitor.h @@ -33,7 +33,7 @@ int monitor_vprintf(Monitor *mon, const char *fmt, va_lis= t ap) GCC_FMT_ATTR(2, 0); int monitor_printf(Monitor *mon, const char *fmt, ...) GCC_FMT_ATTR(2, 3); void monitor_flush(Monitor *mon); -int monitor_set_cpu(int cpu_index); +int monitor_set_cpu(Monitor *mon, int cpu_index); int monitor_get_cpu_index(void); =20 void monitor_read_command(MonitorHMP *mon, int show_prompt); diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c index dc0de39219..0c0a03f824 100644 --- a/monitor/hmp-cmds.c +++ b/monitor/hmp-cmds.c @@ -998,7 +998,7 @@ void hmp_cpu(Monitor *mon, const QDict *qdict) /* XXX: drop the monitor_set_cpu() usage when all HMP commands that use it are converted to the QAPI */ cpu_index =3D qdict_get_int(qdict, "index"); - if (monitor_set_cpu(cpu_index) < 0) { + if (monitor_set_cpu(mon, cpu_index) < 0) { monitor_printf(mon, "invalid CPU index\n"); } } diff --git a/monitor/misc.c b/monitor/misc.c index 6e0da0cb96..25b42593cc 100644 --- a/monitor/misc.c +++ b/monitor/misc.c @@ -129,7 +129,7 @@ char *qmp_human_monitor_command(const char *command_lin= e, bool has_cpu_index, cur_mon =3D &hmp.common; =20 if (has_cpu_index) { - int ret =3D monitor_set_cpu(cpu_index); + int ret =3D monitor_set_cpu(&hmp.common, cpu_index); if (ret < 0) { cur_mon =3D old_mon; error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "cpu-index", @@ -255,7 +255,7 @@ static void monitor_init_qmp_commands(void) } =20 /* Set the current CPU defined by the user. Callers must hold BQL. */ -int monitor_set_cpu(int cpu_index) +int monitor_set_cpu(Monitor *mon, int cpu_index) { CPUState *cpu; =20 @@ -263,8 +263,8 @@ int monitor_set_cpu(int cpu_index) if (cpu =3D=3D NULL) { return -1; } - g_free(cur_mon->mon_cpu_path); - cur_mon->mon_cpu_path =3D object_get_canonical_path(OBJECT(cpu)); + g_free(mon->mon_cpu_path); + mon->mon_cpu_path =3D object_get_canonical_path(OBJECT(cpu)); return 0; } =20 @@ -285,7 +285,7 @@ static CPUState *mon_get_cpu_sync(bool synchronize) if (!first_cpu) { return NULL; } - monitor_set_cpu(first_cpu->cpu_index); + monitor_set_cpu(cur_mon, first_cpu->cpu_index); cpu =3D first_cpu; } assert(cpu !=3D NULL); --=20 2.26.2 From nobody Sun Nov 16 23:02:10 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1602225422; cv=none; d=zohomail.com; s=zohoarc; b=GEsvSYfetdzsbHivp4t/hZ9kR/55E08WJcNl+ItNmia8rhA/LgG2Gnr+1L2dU5s6fuqTXck37355nYwrHU9JVCes1WEAcJ/Sij+CnDaBBdLY7wtsnS7qzomPpsnxSSY1zFpIlqAz9jWwAjGVK7lehX1GqHc2v3rALLFDP7nnAmQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1602225422; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=pS8f7it183y/R7vQ1LmbruHYeQi5MTsJSWEiyI9uchc=; b=BdUw/9YF6S03WWH7FhA4ZkNAupEgAmXw079+gmrf8e2WbVdiPDS+O7i04nJukMLWkyb8HXfJcoEHnReWwuVCmfMX7Y/cn+YP4Gax22EthUgJfP+UNJGFgZm2D5DKsNxUH3I2KfLKYA/VAQacUr9nBHxXWknM+/IJ49D3EstAGKQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1602225422673850.9927588515925; Thu, 8 Oct 2020 23:37:02 -0700 (PDT) Received: from localhost ([::1]:49990 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kQm1V-0003oi-9z for importer@patchew.org; Fri, 09 Oct 2020 02:37:01 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53826) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kQlzG-0001wy-Ti for qemu-devel@nongnu.org; Fri, 09 Oct 2020 02:34:42 -0400 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:54621) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kQlzF-0008UF-6p for qemu-devel@nongnu.org; Fri, 09 Oct 2020 02:34:42 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-337-DQ7PgGDuOKqad3QQUpNvIg-1; Fri, 09 Oct 2020 02:34:38 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id C86D3108E1A0 for ; Fri, 9 Oct 2020 06:34:37 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-112-182.ams2.redhat.com [10.36.112.182]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 9F6DF5C1D7; Fri, 9 Oct 2020 06:34:34 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 09AFD112CE14; Fri, 9 Oct 2020 08:34:33 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1602225280; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=pS8f7it183y/R7vQ1LmbruHYeQi5MTsJSWEiyI9uchc=; b=b9Q8uAwV/uf1DDdXvGpOxIwM8TG6oC4nHWs0sfm319T5Ay6EmLoXFd+VhhznOrhvfeLu+R 52+gIZTpEr48XzwIOYErKcPEQgNOZGxYwbeCJD3etPQVbkbcpiga2sMCGMdzk1Ieyg9TAl G/n98r8YVybMH+BeXZG54yXMeVkrFqA= X-MC-Unique: DQ7PgGDuOKqad3QQUpNvIg-1 From: Markus Armbruster To: qemu-devel@nongnu.org Subject: [PULL 02/14] monitor: Add Monitor parameter to monitor_get_cpu_index() Date: Fri, 9 Oct 2020 08:34:20 +0200 Message-Id: <20201009063432.303441-3-armbru@redhat.com> In-Reply-To: <20201009063432.303441-1-armbru@redhat.com> References: <20201009063432.303441-1-armbru@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=armbru@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=216.205.24.124; envelope-from=armbru@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/10/09 02:34:37 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, Stefan Hajnoczi Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" From: Kevin Wolf Most callers actually don't have to rely on cur_mon, but already know for which monitor they call monitor_get_cpu_index(). Signed-off-by: Kevin Wolf Message-Id: <20201005155855.256490-3-kwolf@redhat.com> Reviewed-by: Markus Armbruster Reviewed-by: Stefan Hajnoczi Signed-off-by: Markus Armbruster --- include/monitor/monitor.h | 2 +- hw/core/machine-hmp-cmds.c | 2 +- monitor/hmp-cmds.c | 2 +- monitor/misc.c | 20 ++++++++++---------- softmmu/cpus.c | 2 +- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/include/monitor/monitor.h b/include/monitor/monitor.h index 04f472ac4f..93bedf0b75 100644 --- a/include/monitor/monitor.h +++ b/include/monitor/monitor.h @@ -34,7 +34,7 @@ int monitor_vprintf(Monitor *mon, const char *fmt, va_lis= t ap) int monitor_printf(Monitor *mon, const char *fmt, ...) GCC_FMT_ATTR(2, 3); void monitor_flush(Monitor *mon); int monitor_set_cpu(Monitor *mon, int cpu_index); -int monitor_get_cpu_index(void); +int monitor_get_cpu_index(Monitor *mon); =20 void monitor_read_command(MonitorHMP *mon, int show_prompt); int monitor_read_password(MonitorHMP *mon, ReadLineFunc *readline_func, diff --git a/hw/core/machine-hmp-cmds.c b/hw/core/machine-hmp-cmds.c index f4092b98cc..6357be9c6b 100644 --- a/hw/core/machine-hmp-cmds.c +++ b/hw/core/machine-hmp-cmds.c @@ -34,7 +34,7 @@ void hmp_info_cpus(Monitor *mon, const QDict *qdict) for (cpu =3D cpu_list; cpu; cpu =3D cpu->next) { int active =3D ' '; =20 - if (cpu->value->cpu_index =3D=3D monitor_get_cpu_index()) { + if (cpu->value->cpu_index =3D=3D monitor_get_cpu_index(mon)) { active =3D '*'; } =20 diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c index 0c0a03f824..9789f4277f 100644 --- a/monitor/hmp-cmds.c +++ b/monitor/hmp-cmds.c @@ -1009,7 +1009,7 @@ void hmp_memsave(Monitor *mon, const QDict *qdict) const char *filename =3D qdict_get_str(qdict, "filename"); uint64_t addr =3D qdict_get_int(qdict, "val"); Error *err =3D NULL; - int cpu_index =3D monitor_get_cpu_index(); + int cpu_index =3D monitor_get_cpu_index(mon); =20 if (cpu_index < 0) { monitor_printf(mon, "No CPU available\n"); diff --git a/monitor/misc.c b/monitor/misc.c index 25b42593cc..4ea575eea8 100644 --- a/monitor/misc.c +++ b/monitor/misc.c @@ -269,23 +269,23 @@ int monitor_set_cpu(Monitor *mon, int cpu_index) } =20 /* Callers must hold BQL. */ -static CPUState *mon_get_cpu_sync(bool synchronize) +static CPUState *mon_get_cpu_sync(Monitor *mon, bool synchronize) { CPUState *cpu =3D NULL; =20 - if (cur_mon->mon_cpu_path) { - cpu =3D (CPUState *) object_resolve_path_type(cur_mon->mon_cpu_pat= h, + if (mon->mon_cpu_path) { + cpu =3D (CPUState *) object_resolve_path_type(mon->mon_cpu_path, TYPE_CPU, NULL); if (!cpu) { - g_free(cur_mon->mon_cpu_path); - cur_mon->mon_cpu_path =3D NULL; + g_free(mon->mon_cpu_path); + mon->mon_cpu_path =3D NULL; } } - if (!cur_mon->mon_cpu_path) { + if (!mon->mon_cpu_path) { if (!first_cpu) { return NULL; } - monitor_set_cpu(cur_mon, first_cpu->cpu_index); + monitor_set_cpu(mon, first_cpu->cpu_index); cpu =3D first_cpu; } assert(cpu !=3D NULL); @@ -297,7 +297,7 @@ static CPUState *mon_get_cpu_sync(bool synchronize) =20 CPUState *mon_get_cpu(void) { - return mon_get_cpu_sync(true); + return mon_get_cpu_sync(cur_mon, true); } =20 CPUArchState *mon_get_cpu_env(void) @@ -307,9 +307,9 @@ CPUArchState *mon_get_cpu_env(void) return cs ? cs->env_ptr : NULL; } =20 -int monitor_get_cpu_index(void) +int monitor_get_cpu_index(Monitor *mon) { - CPUState *cs =3D mon_get_cpu_sync(false); + CPUState *cs =3D mon_get_cpu_sync(mon, false); =20 return cs ? cs->cpu_index : UNASSIGNED_CPU_INDEX; } diff --git a/softmmu/cpus.c b/softmmu/cpus.c index 9e33416b4d..e9d4a44fcc 100644 --- a/softmmu/cpus.c +++ b/softmmu/cpus.c @@ -793,6 +793,6 @@ exit: =20 void qmp_inject_nmi(Error **errp) { - nmi_monitor_handle(monitor_get_cpu_index(), errp); + nmi_monitor_handle(monitor_get_cpu_index(cur_mon), errp); } =20 --=20 2.26.2 From nobody Sun Nov 16 23:02:10 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1602225613; cv=none; d=zohomail.com; s=zohoarc; b=GJReG+EI308Hg/Vnkuekx+Kct+Z+H2SqkY4DqJ8bvnwfV72ZxoXm88ge4lXs4OsGjLhJZqoGxleItyeXNWphkyjeyWViAq1XmE6bLJqbfMRz9LcxdAGvbb3ZLFkVEdW+igOXugKKU+v8DtNwFpWtIZH8OT3Yurufn5jWhZRdqcM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1602225613; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=Pjxz44RxGj/Mj44Bi6b7vChuzYk9dhgB0xz2XcQ63gI=; b=bEgtx6vvpG5K9erWBBBA0qlmWLbAUg0dVHhstzGRpKAcyayFL5o5xO8D+EL6T89KX5vcE+mDb4ph6T3GrQE8coYCmobn/4VBWON510p9/sFuQ5UZgHRO2Hyed0rkYqRP/ji/UlhWYc05T1nvtSNjRH+yop9zkjPa3WyY0J3w1wQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1602225613967379.2632159810357; Thu, 8 Oct 2020 23:40:13 -0700 (PDT) Received: from localhost ([::1]:58468 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kQm4a-0007Qk-KQ for importer@patchew.org; Fri, 09 Oct 2020 02:40:12 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53928) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kQlzK-000246-NT for qemu-devel@nongnu.org; Fri, 09 Oct 2020 02:34:46 -0400 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:59663) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kQlzF-0008UI-8a for qemu-devel@nongnu.org; Fri, 09 Oct 2020 02:34:46 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-329-f8haCST_POOo2Bz_nFkb0w-1; Fri, 09 Oct 2020 02:34:38 -0400 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id CF78380B70A for ; Fri, 9 Oct 2020 06:34:37 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-112-182.ams2.redhat.com [10.36.112.182]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 9BD1F10013C1; Fri, 9 Oct 2020 06:34:34 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 0D4CB112CE16; Fri, 9 Oct 2020 08:34:33 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1602225280; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Pjxz44RxGj/Mj44Bi6b7vChuzYk9dhgB0xz2XcQ63gI=; b=PY9bFJWkBpXlPQ3lYSD0586vT/DdOneTTaE7stDkU5ILkNmInXl6Z2LBXmqJqVbLgZh3IG 9ycaqtJaDDtI26z5dGUSf2U30mJRPv/NQqSBo1goLseHDWmKnD6JhGtr9ErEL+kenySAcv TY+2Jz0B96glLYu7R42pajALNwNg8EM= X-MC-Unique: f8haCST_POOo2Bz_nFkb0w-1 From: Markus Armbruster To: qemu-devel@nongnu.org Subject: [PULL 03/14] monitor: Use getter/setter functions for cur_mon Date: Fri, 9 Oct 2020 08:34:21 +0200 Message-Id: <20201009063432.303441-4-armbru@redhat.com> In-Reply-To: <20201009063432.303441-1-armbru@redhat.com> References: <20201009063432.303441-1-armbru@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=armbru@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=216.205.24.124; envelope-from=armbru@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/10/09 02:34:37 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, Stefan Hajnoczi Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" From: Kevin Wolf cur_mon really needs to be coroutine-local as soon as we move monitor command handlers to coroutines and let them yield. As a first step, just remove all direct accesses to cur_mon so that we can implement this in the getter function later. Signed-off-by: Kevin Wolf Message-Id: <20201005155855.256490-4-kwolf@redhat.com> Reviewed-by: Markus Armbruster Reviewed-by: Stefan Hajnoczi Signed-off-by: Markus Armbruster --- include/monitor/monitor.h | 3 ++- audio/wavcapture.c | 8 ++++---- dump/dump.c | 2 +- hw/scsi/vhost-scsi.c | 2 +- hw/virtio/vhost-vsock.c | 2 +- migration/fd.c | 4 ++-- monitor/hmp.c | 11 +++++------ monitor/misc.c | 13 +++++++------ monitor/monitor.c | 24 +++++++++++++++++++++++- monitor/qmp-cmds-control.c | 2 ++ monitor/qmp-cmds.c | 2 +- monitor/qmp.c | 7 ++----- net/socket.c | 2 +- net/tap.c | 6 +++--- softmmu/cpus.c | 2 +- stubs/monitor-core.c | 5 ++++- tests/test-util-sockets.c | 12 ++++++------ trace/control.c | 2 +- util/qemu-error.c | 6 +++--- util/qemu-print.c | 3 ++- util/qemu-sockets.c | 1 + 21 files changed, 73 insertions(+), 46 deletions(-) diff --git a/include/monitor/monitor.h b/include/monitor/monitor.h index 93bedf0b75..543eafcb76 100644 --- a/include/monitor/monitor.h +++ b/include/monitor/monitor.h @@ -5,7 +5,6 @@ #include "qapi/qapi-types-misc.h" #include "qemu/readline.h" =20 -extern __thread Monitor *cur_mon; typedef struct MonitorHMP MonitorHMP; typedef struct MonitorOptions MonitorOptions; =20 @@ -13,6 +12,8 @@ typedef struct MonitorOptions MonitorOptions; =20 extern QemuOptsList qemu_mon_opts; =20 +Monitor *monitor_cur(void); +Monitor *monitor_set_cur(Monitor *mon); bool monitor_cur_is_qmp(void); =20 void monitor_init_globals(void); diff --git a/audio/wavcapture.c b/audio/wavcapture.c index 17e87ed6f4..c60286e162 100644 --- a/audio/wavcapture.c +++ b/audio/wavcapture.c @@ -1,5 +1,5 @@ #include "qemu/osdep.h" -#include "monitor/monitor.h" +#include "qemu/qemu-print.h" #include "qapi/error.h" #include "qemu/error-report.h" #include "audio.h" @@ -94,9 +94,9 @@ static void wav_capture_info (void *opaque) WAVState *wav =3D opaque; char *path =3D wav->path; =20 - monitor_printf (cur_mon, "Capturing audio(%d,%d,%d) to %s: %d bytes\n", - wav->freq, wav->bits, wav->nchannels, - path ? path : "", wav->bytes); + qemu_printf("Capturing audio(%d,%d,%d) to %s: %d bytes\n", + wav->freq, wav->bits, wav->nchannels, + path ? path : "", wav->bytes); } =20 static struct capture_ops wav_capture_ops =3D { diff --git a/dump/dump.c b/dump/dump.c index 45da46a952..dec32468d9 100644 --- a/dump/dump.c +++ b/dump/dump.c @@ -1986,7 +1986,7 @@ void qmp_dump_guest_memory(bool paging, const char *f= ile, =20 #if !defined(WIN32) if (strstart(file, "fd:", &p)) { - fd =3D monitor_get_fd(cur_mon, p, errp); + fd =3D monitor_get_fd(monitor_cur(), p, errp); if (fd =3D=3D -1) { return; } diff --git a/hw/scsi/vhost-scsi.c b/hw/scsi/vhost-scsi.c index a83ffeefc8..4d70fa036b 100644 --- a/hw/scsi/vhost-scsi.c +++ b/hw/scsi/vhost-scsi.c @@ -177,7 +177,7 @@ static void vhost_scsi_realize(DeviceState *dev, Error = **errp) } =20 if (vs->conf.vhostfd) { - vhostfd =3D monitor_fd_param(cur_mon, vs->conf.vhostfd, errp); + vhostfd =3D monitor_fd_param(monitor_cur(), vs->conf.vhostfd, errp= ); if (vhostfd =3D=3D -1) { error_prepend(errp, "vhost-scsi: unable to parse vhostfd: "); return; diff --git a/hw/virtio/vhost-vsock.c b/hw/virtio/vhost-vsock.c index c8f0699b4f..f9db4beb47 100644 --- a/hw/virtio/vhost-vsock.c +++ b/hw/virtio/vhost-vsock.c @@ -143,7 +143,7 @@ static void vhost_vsock_device_realize(DeviceState *dev= , Error **errp) } =20 if (vsock->conf.vhostfd) { - vhostfd =3D monitor_fd_param(cur_mon, vsock->conf.vhostfd, errp); + vhostfd =3D monitor_fd_param(monitor_cur(), vsock->conf.vhostfd, e= rrp); if (vhostfd =3D=3D -1) { error_prepend(errp, "vhost-vsock: unable to parse vhostfd: "); return; diff --git a/migration/fd.c b/migration/fd.c index 0a29ecdebf..6f2f50475f 100644 --- a/migration/fd.c +++ b/migration/fd.c @@ -26,7 +26,7 @@ void fd_start_outgoing_migration(MigrationState *s, const char *fdname, Er= ror **errp) { QIOChannel *ioc; - int fd =3D monitor_get_fd(cur_mon, fdname, errp); + int fd =3D monitor_get_fd(monitor_cur(), fdname, errp); if (fd =3D=3D -1) { return; } @@ -55,7 +55,7 @@ static gboolean fd_accept_incoming_migration(QIOChannel *= ioc, void fd_start_incoming_migration(const char *fdname, Error **errp) { QIOChannel *ioc; - int fd =3D monitor_fd_param(cur_mon, fdname, errp); + int fd =3D monitor_fd_param(monitor_cur(), fdname, errp); if (fd =3D=3D -1) { return; } diff --git a/monitor/hmp.c b/monitor/hmp.c index 4ecdefd705..e0cc9e65dd 100644 --- a/monitor/hmp.c +++ b/monitor/hmp.c @@ -1300,12 +1300,11 @@ cleanup: =20 static void monitor_read(void *opaque, const uint8_t *buf, int size) { - MonitorHMP *mon; - Monitor *old_mon =3D cur_mon; + MonitorHMP *mon =3D container_of(opaque, MonitorHMP, common); + Monitor *old_mon; int i; =20 - cur_mon =3D opaque; - mon =3D container_of(cur_mon, MonitorHMP, common); + old_mon =3D monitor_set_cur(&mon->common); =20 if (mon->rs) { for (i =3D 0; i < size; i++) { @@ -1313,13 +1312,13 @@ static void monitor_read(void *opaque, const uint8_= t *buf, int size) } } else { if (size =3D=3D 0 || buf[size - 1] !=3D 0) { - monitor_printf(cur_mon, "corrupted command\n"); + monitor_printf(&mon->common, "corrupted command\n"); } else { handle_hmp_command(mon, (char *)buf); } } =20 - cur_mon =3D old_mon; + monitor_set_cur(old_mon); } =20 static void monitor_event(void *opaque, QEMUChrEvent event) diff --git a/monitor/misc.c b/monitor/misc.c index 4ea575eea8..ee8db45094 100644 --- a/monitor/misc.c +++ b/monitor/misc.c @@ -125,13 +125,12 @@ char *qmp_human_monitor_command(const char *command_l= ine, bool has_cpu_index, =20 monitor_data_init(&hmp.common, false, true, false); =20 - old_mon =3D cur_mon; - cur_mon =3D &hmp.common; + old_mon =3D monitor_set_cur(&hmp.common); =20 if (has_cpu_index) { int ret =3D monitor_set_cpu(&hmp.common, cpu_index); if (ret < 0) { - cur_mon =3D old_mon; + monitor_set_cur(old_mon); error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "cpu-index", "a CPU number"); goto out; @@ -139,7 +138,7 @@ char *qmp_human_monitor_command(const char *command_lin= e, bool has_cpu_index, } =20 handle_hmp_command(&hmp, command_line); - cur_mon =3D old_mon; + monitor_set_cur(old_mon); =20 WITH_QEMU_LOCK_GUARD(&hmp.common.mon_lock) { if (qstring_get_length(hmp.common.outbuf) > 0) { @@ -297,7 +296,7 @@ static CPUState *mon_get_cpu_sync(Monitor *mon, bool sy= nchronize) =20 CPUState *mon_get_cpu(void) { - return mon_get_cpu_sync(cur_mon, true); + return mon_get_cpu_sync(monitor_cur(), true); } =20 CPUArchState *mon_get_cpu_env(void) @@ -1232,6 +1231,7 @@ static void hmp_acl_remove(Monitor *mon, const QDict = *qdict) =20 void qmp_getfd(const char *fdname, Error **errp) { + Monitor *cur_mon =3D monitor_cur(); mon_fd_t *monfd; int fd, tmp_fd; =20 @@ -1270,6 +1270,7 @@ void qmp_getfd(const char *fdname, Error **errp) =20 void qmp_closefd(const char *fdname, Error **errp) { + Monitor *cur_mon =3D monitor_cur(); mon_fd_t *monfd; int tmp_fd; =20 @@ -1356,7 +1357,7 @@ AddfdInfo *qmp_add_fd(bool has_fdset_id, int64_t fdse= t_id, bool has_opaque, const char *opaque, Error **errp) { int fd; - Monitor *mon =3D cur_mon; + Monitor *mon =3D monitor_cur(); AddfdInfo *fdinfo; =20 fd =3D qemu_chr_fe_get_msgfd(&mon->chr); diff --git a/monitor/monitor.c b/monitor/monitor.c index 0f32892ad4..099c164c6d 100644 --- a/monitor/monitor.c +++ b/monitor/monitor.c @@ -66,13 +66,31 @@ MonitorList mon_list; int mon_refcount; static bool monitor_destroyed; =20 -__thread Monitor *cur_mon; +static __thread Monitor *cur_monitor; + +Monitor *monitor_cur(void) +{ + return cur_monitor; +} + +/** + * Sets a new current monitor and returns the old one. + */ +Monitor *monitor_set_cur(Monitor *mon) +{ + Monitor *old_monitor =3D cur_monitor; + + cur_monitor =3D mon; + return old_monitor; +} =20 /** * Is the current monitor, if any, a QMP monitor? */ bool monitor_cur_is_qmp(void) { + Monitor *cur_mon =3D monitor_cur(); + return cur_mon && monitor_is_qmp(cur_mon); } =20 @@ -209,6 +227,8 @@ int monitor_printf(Monitor *mon, const char *fmt, ...) */ int error_vprintf(const char *fmt, va_list ap) { + Monitor *cur_mon =3D monitor_cur(); + if (cur_mon && !monitor_cur_is_qmp()) { return monitor_vprintf(cur_mon, fmt, ap); } @@ -217,6 +237,8 @@ int error_vprintf(const char *fmt, va_list ap) =20 int error_vprintf_unless_qmp(const char *fmt, va_list ap) { + Monitor *cur_mon =3D monitor_cur(); + if (!cur_mon) { return vfprintf(stderr, fmt, ap); } diff --git a/monitor/qmp-cmds-control.c b/monitor/qmp-cmds-control.c index 8f04cfa6e6..a456762f6a 100644 --- a/monitor/qmp-cmds-control.c +++ b/monitor/qmp-cmds-control.c @@ -69,6 +69,7 @@ static bool qmp_caps_accept(MonitorQMP *mon, QMPCapabilit= yList *list, void qmp_qmp_capabilities(bool has_enable, QMPCapabilityList *enable, Error **errp) { + Monitor *cur_mon =3D monitor_cur(); MonitorQMP *mon; =20 assert(monitor_is_qmp(cur_mon)); @@ -119,6 +120,7 @@ static void query_commands_cb(const QmpCommand *cmd, vo= id *opaque) CommandInfoList *qmp_query_commands(Error **errp) { CommandInfoList *list =3D NULL; + Monitor *cur_mon =3D monitor_cur(); MonitorQMP *mon; =20 assert(monitor_is_qmp(cur_mon)); diff --git a/monitor/qmp-cmds.c b/monitor/qmp-cmds.c index 0ab5b78580..1abef70a89 100644 --- a/monitor/qmp-cmds.c +++ b/monitor/qmp-cmds.c @@ -328,7 +328,7 @@ void qmp_add_client(const char *protocol, const char *f= dname, Chardev *s; int fd; =20 - fd =3D monitor_get_fd(cur_mon, fdname, errp); + fd =3D monitor_get_fd(monitor_cur(), fdname, errp); if (fd < 0) { return; } diff --git a/monitor/qmp.c b/monitor/qmp.c index d433ceae5b..bb2d9d0cc7 100644 --- a/monitor/qmp.c +++ b/monitor/qmp.c @@ -139,12 +139,9 @@ static void monitor_qmp_dispatch(MonitorQMP *mon, QObj= ect *req) QDict *rsp; QDict *error; =20 - old_mon =3D cur_mon; - cur_mon =3D &mon->common; - + old_mon =3D monitor_set_cur(&mon->common); rsp =3D qmp_dispatch(mon->commands, req, qmp_oob_enabled(mon)); - - cur_mon =3D old_mon; + monitor_set_cur(old_mon); =20 if (mon->commands =3D=3D &qmp_cap_negotiation_commands) { error =3D qdict_get_qdict(rsp, "error"); diff --git a/net/socket.c b/net/socket.c index 2d21fddd9c..15b410e8d8 100644 --- a/net/socket.c +++ b/net/socket.c @@ -727,7 +727,7 @@ int net_init_socket(const Netdev *netdev, const char *n= ame, if (sock->has_fd) { int fd, ret; =20 - fd =3D monitor_fd_param(cur_mon, sock->fd, errp); + fd =3D monitor_fd_param(monitor_cur(), sock->fd, errp); if (fd =3D=3D -1) { return -1; } diff --git a/net/tap.c b/net/tap.c index 04ce72dd2f..c46ff66184 100644 --- a/net/tap.c +++ b/net/tap.c @@ -700,7 +700,7 @@ static void net_init_tap_one(const NetdevTapOptions *ta= p, NetClientState *peer, if (vhostfdname) { int ret; =20 - vhostfd =3D monitor_fd_param(cur_mon, vhostfdname, &err); + vhostfd =3D monitor_fd_param(monitor_cur(), vhostfdname, &err); if (vhostfd =3D=3D -1) { if (tap->has_vhostforce && tap->vhostforce) { error_propagate(errp, err); @@ -808,7 +808,7 @@ int net_init_tap(const Netdev *netdev, const char *name, return -1; } =20 - fd =3D monitor_fd_param(cur_mon, tap->fd, errp); + fd =3D monitor_fd_param(monitor_cur(), tap->fd, errp); if (fd =3D=3D -1) { return -1; } @@ -862,7 +862,7 @@ int net_init_tap(const Netdev *netdev, const char *name, } =20 for (i =3D 0; i < nfds; i++) { - fd =3D monitor_fd_param(cur_mon, fds[i], errp); + fd =3D monitor_fd_param(monitor_cur(), fds[i], errp); if (fd =3D=3D -1) { ret =3D -1; goto free_fail; diff --git a/softmmu/cpus.c b/softmmu/cpus.c index e9d4a44fcc..47cceddd80 100644 --- a/softmmu/cpus.c +++ b/softmmu/cpus.c @@ -793,6 +793,6 @@ exit: =20 void qmp_inject_nmi(Error **errp) { - nmi_monitor_handle(monitor_get_cpu_index(cur_mon), errp); + nmi_monitor_handle(monitor_get_cpu_index(monitor_cur()), errp); } =20 diff --git a/stubs/monitor-core.c b/stubs/monitor-core.c index 6cff1c4e1d..0cd2d864b2 100644 --- a/stubs/monitor-core.c +++ b/stubs/monitor-core.c @@ -3,7 +3,10 @@ #include "qemu-common.h" #include "qapi/qapi-emit-events.h" =20 -__thread Monitor *cur_mon; +Monitor *monitor_cur(void) +{ + return NULL; +} =20 void monitor_init_qmp(Chardev *chr, bool pretty, Error **errp) { diff --git a/tests/test-util-sockets.c b/tests/test-util-sockets.c index 1bbb16d9b1..f6336e0f91 100644 --- a/tests/test-util-sockets.c +++ b/tests/test-util-sockets.c @@ -52,6 +52,7 @@ static void test_fd_is_socket_good(void) =20 static int mon_fd =3D -1; static const char *mon_fdname; +__thread Monitor *cur_mon; =20 int monitor_get_fd(Monitor *mon, const char *fdname, Error **errp) { @@ -65,15 +66,14 @@ int monitor_get_fd(Monitor *mon, const char *fdname, Er= ror **errp) } =20 /* - * Syms of stubs in libqemuutil.a are discarded at .o file granularity. - * To replace monitor_get_fd() we must ensure everything in - * stubs/monitor.c is defined, to make sure monitor.o is discarded + * Syms of stubs in libqemuutil.a are discarded at .o file + * granularity. To replace monitor_get_fd() and monitor_cur(), we + * must ensure that we also replace any other symbol that is used in + * the binary and would be taken from the same stub object file, * otherwise we get duplicate syms at link time. */ -__thread Monitor *cur_mon; +Monitor *monitor_cur(void) { return cur_mon; } int monitor_vprintf(Monitor *mon, const char *fmt, va_list ap) { abort(); } -void monitor_init_qmp(Chardev *chr, bool pretty, Error **errp) {} -void monitor_init_hmp(Chardev *chr, bool use_readline, Error **errp) {} =20 #ifndef _WIN32 static void test_socket_fd_pass_name_good(void) diff --git a/trace/control.c b/trace/control.c index c63a4de732..b35e512dce 100644 --- a/trace/control.c +++ b/trace/control.c @@ -176,7 +176,7 @@ void trace_enable_events(const char *line_buf) { if (is_help_option(line_buf)) { trace_list_events(); - if (cur_mon =3D=3D NULL) { + if (monitor_cur() =3D=3D NULL) { exit(0); } } else { diff --git a/util/qemu-error.c b/util/qemu-error.c index 3ee41438e9..aa30f03564 100644 --- a/util/qemu-error.c +++ b/util/qemu-error.c @@ -171,7 +171,7 @@ static void print_loc(void) int i; const char *const *argp; =20 - if (!cur_mon && progname) { + if (!monitor_cur() && progname) { fprintf(stderr, "%s:", progname); sep =3D " "; } @@ -208,7 +208,7 @@ static void vreport(report_type type, const char *fmt, = va_list ap) GTimeVal tv; gchar *timestr; =20 - if (error_with_timestamp && !cur_mon) { + if (error_with_timestamp && !monitor_cur()) { g_get_current_time(&tv); timestr =3D g_time_val_to_iso8601(&tv); error_printf("%s ", timestr); @@ -216,7 +216,7 @@ static void vreport(report_type type, const char *fmt, = va_list ap) } =20 /* Only prepend guest name if -msg guest-name and -name guest=3D... ar= e set */ - if (error_with_guestname && error_guest_name && !cur_mon) { + if (error_with_guestname && error_guest_name && !monitor_cur()) { error_printf("%s ", error_guest_name); } =20 diff --git a/util/qemu-print.c b/util/qemu-print.c index e79d6b8396..69ba612f56 100644 --- a/util/qemu-print.c +++ b/util/qemu-print.c @@ -20,6 +20,7 @@ */ int qemu_vprintf(const char *fmt, va_list ap) { + Monitor *cur_mon =3D monitor_cur(); if (cur_mon) { return monitor_vprintf(cur_mon, fmt, ap); } @@ -48,7 +49,7 @@ int qemu_printf(const char *fmt, ...) int qemu_vfprintf(FILE *stream, const char *fmt, va_list ap) { if (!stream) { - return monitor_vprintf(cur_mon, fmt, ap); + return monitor_vprintf(monitor_cur(), fmt, ap); } return vfprintf(stream, fmt, ap); } diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c index de4bf7616e..05e5c73f9d 100644 --- a/util/qemu-sockets.c +++ b/util/qemu-sockets.c @@ -1092,6 +1092,7 @@ fail: =20 static int socket_get_fd(const char *fdstr, int num, Error **errp) { + Monitor *cur_mon =3D monitor_cur(); int fd; if (num !=3D 1) { error_setg_errno(errp, EINVAL, "socket_get_fd: too many connection= s"); --=20 2.26.2 From nobody Sun Nov 16 23:02:10 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1602225683; cv=none; d=zohomail.com; s=zohoarc; b=AaRZOYNHamlatI+8S3OeUdlGpe8nhblS/JVyc0rFiQ+XD+BaDxhaNT97GHqKGAc6lSGWTwaa9rDk+RjkpWo3A5UyM2jsuLCnb9m0LQs7ZhJwn2uA6zAJnNNYozXb2cw/A8bvEcF6Z3P3ePxOI7nm04PQgyYctZhvTxLlokZLqV4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1602225683; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=QA0eKCVR49OxCOB1MYnGtY8y7W2asvJeZcr6BgRb52s=; b=FbsHtJzC3BqltxBH7LeF/eF+YnijC5J9F30lTLg6rtzEnMGewquNTZBObxEmVnQAMmKx5DVQj58j95mitE/zrAGtP3WQPQ1/E/4ZlqaIaE/B/uszofDNbSULuH3bMSN9rRY9ivDPTM9hJ+wP26YoDBejJQLXKuH2dY+GwThVVMQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1602225683629407.79987349749183; Thu, 8 Oct 2020 23:41:23 -0700 (PDT) Received: from localhost ([::1]:33170 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kQm5h-0000Lj-Qa for importer@patchew.org; Fri, 09 Oct 2020 02:41:22 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53876) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kQlzI-0001yP-CN for qemu-devel@nongnu.org; Fri, 09 Oct 2020 02:34:44 -0400 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:25239) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kQlzF-0008UB-8a for qemu-devel@nongnu.org; Fri, 09 Oct 2020 02:34:44 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-421-yVSIb-D_Nm63VjzQ96OG6A-1; Fri, 09 Oct 2020 02:34:38 -0400 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 82E6018BA285 for ; Fri, 9 Oct 2020 06:34:37 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-112-182.ams2.redhat.com [10.36.112.182]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 9BD66100164C; Fri, 9 Oct 2020 06:34:34 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 108C9112CE18; Fri, 9 Oct 2020 08:34:33 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1602225280; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=QA0eKCVR49OxCOB1MYnGtY8y7W2asvJeZcr6BgRb52s=; b=Sg2Elo5FoPIaiCsO7dC+35eQ4iDxoaPUA9gMyYKbve+PKkERGfAmGXT4df6ShVW0NeFT33 v+d7XzpyaLn9WJiOfI/YTG2cxnGTwRajKyxIbTVOF2KJ1fzfSVAPWGqpWaO+aC0zdVpoHB fZMBi9H/oITxQI5+KYwH0Co1u6PUpeI= X-MC-Unique: yVSIb-D_Nm63VjzQ96OG6A-1 From: Markus Armbruster To: qemu-devel@nongnu.org Subject: [PULL 04/14] hmp: Update current monitor only in handle_hmp_command() Date: Fri, 9 Oct 2020 08:34:22 +0200 Message-Id: <20201009063432.303441-5-armbru@redhat.com> In-Reply-To: <20201009063432.303441-1-armbru@redhat.com> References: <20201009063432.303441-1-armbru@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=armbru@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=216.205.24.124; envelope-from=armbru@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/10/09 02:34:37 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, Stefan Hajnoczi Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Kevin Wolf The current monitor is updated relatively early in the command handling code even though only the command handler actually needs it. The current monitor will become coroutine-local later, so we can only update it when we know in which coroutine the command will be exectued. Move it to handle_hmp_command() where this information will be available. Signed-off-by: Kevin Wolf Reviewed-by: Eric Blake Message-Id: <20201005155855.256490-5-kwolf@redhat.com> Reviewed-by: Markus Armbruster Reviewed-by: Stefan Hajnoczi Signed-off-by: Markus Armbruster --- monitor/hmp.c | 10 +++++----- monitor/misc.c | 5 ----- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/monitor/hmp.c b/monitor/hmp.c index e0cc9e65dd..560ec98e7b 100644 --- a/monitor/hmp.c +++ b/monitor/hmp.c @@ -1061,6 +1061,7 @@ void handle_hmp_command(MonitorHMP *mon, const char *= cmdline) QDict *qdict; const HMPCommand *cmd; const char *cmd_start =3D cmdline; + Monitor *old_mon; =20 trace_handle_hmp_command(mon, cmdline); =20 @@ -1079,7 +1080,11 @@ void handle_hmp_command(MonitorHMP *mon, const char = *cmdline) return; } =20 + /* old_mon is non-NULL when called from qmp_human_monitor_command() */ + old_mon =3D monitor_set_cur(&mon->common); cmd->cmd(&mon->common, qdict); + monitor_set_cur(old_mon); + qobject_unref(qdict); } =20 @@ -1301,11 +1306,8 @@ cleanup: static void monitor_read(void *opaque, const uint8_t *buf, int size) { MonitorHMP *mon =3D container_of(opaque, MonitorHMP, common); - Monitor *old_mon; int i; =20 - old_mon =3D monitor_set_cur(&mon->common); - if (mon->rs) { for (i =3D 0; i < size; i++) { readline_handle_byte(mon->rs, buf[i]); @@ -1317,8 +1319,6 @@ static void monitor_read(void *opaque, const uint8_t = *buf, int size) handle_hmp_command(mon, (char *)buf); } } - - monitor_set_cur(old_mon); } =20 static void monitor_event(void *opaque, QEMUChrEvent event) diff --git a/monitor/misc.c b/monitor/misc.c index ee8db45094..4a859fb24a 100644 --- a/monitor/misc.c +++ b/monitor/misc.c @@ -120,17 +120,13 @@ char *qmp_human_monitor_command(const char *command_l= ine, bool has_cpu_index, int64_t cpu_index, Error **errp) { char *output =3D NULL; - Monitor *old_mon; MonitorHMP hmp =3D {}; =20 monitor_data_init(&hmp.common, false, true, false); =20 - old_mon =3D monitor_set_cur(&hmp.common); - if (has_cpu_index) { int ret =3D monitor_set_cpu(&hmp.common, cpu_index); if (ret < 0) { - monitor_set_cur(old_mon); error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "cpu-index", "a CPU number"); goto out; @@ -138,7 +134,6 @@ char *qmp_human_monitor_command(const char *command_lin= e, bool has_cpu_index, } =20 handle_hmp_command(&hmp, command_line); - monitor_set_cur(old_mon); =20 WITH_QEMU_LOCK_GUARD(&hmp.common.mon_lock) { if (qstring_get_length(hmp.common.outbuf) > 0) { --=20 2.26.2 From nobody Sun Nov 16 23:02:10 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1602225601; cv=none; d=zohomail.com; s=zohoarc; b=nd2kEO5krfXU5A0IhU7Ph26C9wlEoU2GxumCkHohuiB7CGi23QzUKZRfzWGT/DE+xu6oivQzzMtezwX/i3EfA+a2mvRjqjRFhuABkp1LJPsgbAcgSrytBok6g5XSKzcdgPj+X7mN+zd1OZ3qW/g9agZuugbpr8szGde6FLlKL5M= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1602225601; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=UUdjAkwwL5jzMjQ5C2t55dG2Pabh1ubSLMUY2M4pOFQ=; b=aLnPwa265QZvU//gtG2JhJH38k4DicED2DPWqp45mMMgRHLV0zuWISN/e7x2nqJTWaZUef7xP/HMbsuaNHNUyMcUn0O0tDLGe0aEg6U0phRKNoL7/TIC7D82MI/tbfi/ohiphqUUPrhtz4eMGLANzDxMh4jl76qIRg5r3uKsLVM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1602225601039623.5860838517563; Thu, 8 Oct 2020 23:40:01 -0700 (PDT) Received: from localhost ([::1]:58288 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kQm4N-0007M3-Ec for importer@patchew.org; Fri, 09 Oct 2020 02:39:59 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53894) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kQlzJ-00020c-7u for qemu-devel@nongnu.org; Fri, 09 Oct 2020 02:34:45 -0400 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:42863) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kQlzH-0008Uh-0N for qemu-devel@nongnu.org; Fri, 09 Oct 2020 02:34:44 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-182-LAD-Pkl8M3SY6zxjlkuR_w-1; Fri, 09 Oct 2020 02:34:40 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 74DB564145 for ; Fri, 9 Oct 2020 06:34:39 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-112-182.ams2.redhat.com [10.36.112.182]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 623806266E; Fri, 9 Oct 2020 06:34:36 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 13937112CE1A; Fri, 9 Oct 2020 08:34:33 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1602225282; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=UUdjAkwwL5jzMjQ5C2t55dG2Pabh1ubSLMUY2M4pOFQ=; b=Gx5Pql5B8jBohl0ULrgCCs3cCDZRjxkMVWtXfQKBF+DpXSLTvOX0mXOHdcY9iH2tKeTK89 +cHulaS4Swska8U8VpvUlifXke1S62HoHth/4Rt4tL5JtvO0vSCl25XeAQT52C5w1C2j6J KwEArvrAwTZvjipGkkasQNdiveEvBkI= X-MC-Unique: LAD-Pkl8M3SY6zxjlkuR_w-1 From: Markus Armbruster To: qemu-devel@nongnu.org Subject: [PULL 05/14] qmp: Assert that no other monitor is active Date: Fri, 9 Oct 2020 08:34:23 +0200 Message-Id: <20201009063432.303441-6-armbru@redhat.com> In-Reply-To: <20201009063432.303441-1-armbru@redhat.com> References: <20201009063432.303441-1-armbru@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=armbru@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=63.128.21.124; envelope-from=armbru@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/10/09 02:34:40 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, Stefan Hajnoczi Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" From: Kevin Wolf monitor_qmp_dispatch() is never supposed to be called in the context of another monitor, so assert that monitor_cur() is NULL instead of saving and restoring it. Signed-off-by: Kevin Wolf Message-Id: <20201005155855.256490-6-kwolf@redhat.com> Reviewed-by: Markus Armbruster Reviewed-by: Stefan Hajnoczi Signed-off-by: Markus Armbruster --- monitor/qmp.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/monitor/qmp.c b/monitor/qmp.c index bb2d9d0cc7..8469970c69 100644 --- a/monitor/qmp.c +++ b/monitor/qmp.c @@ -140,8 +140,11 @@ static void monitor_qmp_dispatch(MonitorQMP *mon, QObj= ect *req) QDict *error; =20 old_mon =3D monitor_set_cur(&mon->common); + assert(old_mon =3D=3D NULL); + rsp =3D qmp_dispatch(mon->commands, req, qmp_oob_enabled(mon)); - monitor_set_cur(old_mon); + + monitor_set_cur(NULL); =20 if (mon->commands =3D=3D &qmp_cap_negotiation_commands) { error =3D qdict_get_qdict(rsp, "error"); --=20 2.26.2 From nobody Sun Nov 16 23:02:10 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1602225422; cv=none; d=zohomail.com; s=zohoarc; b=NViEBqWb9nNEGRJMFlbuwJSUApv4NT44dhybcFFgUKbLKgI8yTiN/EKMUqWfSXXlAGNl62tCXGLmkNwrqxLGe6p2N463VH8s3sHcPZG1jgUcy0jjNaCchGoBqGSdDtPI2tzJ/5Y3yuKTRIDOO8z0aAD5+Ixjc2ediE8tWvUpYlM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1602225422; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=OBkniY5zYY8f0UMKJUn+DDWI2bGks6XloSLFLnQ1cOo=; b=Fu7ks1XrPWU1IZ2Rv1Wn/uAXkkG9HwCDOKJ3AVKgJdJvqTiZ53AQ+1Epjan0tz2wEG2F9U5PCxTWU0MbFWFnUklGBl8PYPEDfejutK5QcGqOT2483D7Xpa/v9ntE+JNiUbObFiWYW9gRlFnigUJCDlX25gscQqzyBJjNi8k98/4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 160222542233144.98177846271949; Thu, 8 Oct 2020 23:37:02 -0700 (PDT) Received: from localhost ([::1]:49944 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kQm1U-0003ne-O3 for importer@patchew.org; Fri, 09 Oct 2020 02:37:00 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53842) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kQlzH-0001x5-6S for qemu-devel@nongnu.org; Fri, 09 Oct 2020 02:34:43 -0400 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:29797) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kQlzF-0008UC-8Y for qemu-devel@nongnu.org; Fri, 09 Oct 2020 02:34:42 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-327-WSGKsM66NZyS1janEWMLIA-1; Fri, 09 Oct 2020 02:34:38 -0400 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id AA84364143 for ; Fri, 9 Oct 2020 06:34:37 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-112-182.ams2.redhat.com [10.36.112.182]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 62A7910002A4; Fri, 9 Oct 2020 06:34:36 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 16C10112CE1D; Fri, 9 Oct 2020 08:34:33 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1602225280; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=OBkniY5zYY8f0UMKJUn+DDWI2bGks6XloSLFLnQ1cOo=; b=GPmVytoq2Ygq/4YueYN2B0sH+v6Ee5iUa77geGpD6ZY+kJZj8jXD6ZNrtRi2AjkJXQA3Re C1PNEacW0K8X/xGt82rYr+Or6aqqZKAUIZbdXKljwk0tSANEqIVsHwh/0nSW9YYIFZlOL+ F0KlFxl1bac0ROqk+tvD8iLJ0lelqqY= X-MC-Unique: WSGKsM66NZyS1janEWMLIA-1 From: Markus Armbruster To: qemu-devel@nongnu.org Subject: [PULL 06/14] qmp: Call monitor_set_cur() only in qmp_dispatch() Date: Fri, 9 Oct 2020 08:34:24 +0200 Message-Id: <20201009063432.303441-7-armbru@redhat.com> In-Reply-To: <20201009063432.303441-1-armbru@redhat.com> References: <20201009063432.303441-1-armbru@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=armbru@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=216.205.24.124; envelope-from=armbru@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/10/09 02:34:37 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, Stefan Hajnoczi Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" From: Kevin Wolf The correct way to set the current monitor for a coroutine handler will be different than for a blocking handler, so monitor_set_cur() needs to be called in qmp_dispatch(). Signed-off-by: Kevin Wolf Message-Id: <20201005155855.256490-7-kwolf@redhat.com> Reviewed-by: Markus Armbruster Reviewed-by: Stefan Hajnoczi Signed-off-by: Markus Armbruster --- include/qapi/qmp/dispatch.h | 3 ++- monitor/qmp.c | 9 ++------- qapi/qmp-dispatch.c | 8 +++++++- qga/main.c | 2 +- stubs/monitor-core.c | 5 +++++ tests/test-qmp-cmds.c | 6 +++--- 6 files changed, 20 insertions(+), 13 deletions(-) diff --git a/include/qapi/qmp/dispatch.h b/include/qapi/qmp/dispatch.h index 5a9cf82472..0c2f467028 100644 --- a/include/qapi/qmp/dispatch.h +++ b/include/qapi/qmp/dispatch.h @@ -14,6 +14,7 @@ #ifndef QAPI_QMP_DISPATCH_H #define QAPI_QMP_DISPATCH_H =20 +#include "monitor/monitor.h" #include "qemu/queue.h" =20 typedef void (QmpCommandFunc)(QDict *, QObject **, Error **); @@ -49,7 +50,7 @@ const char *qmp_command_name(const QmpCommand *cmd); bool qmp_has_success_response(const QmpCommand *cmd); QDict *qmp_error_response(Error *err); QDict *qmp_dispatch(const QmpCommandList *cmds, QObject *request, - bool allow_oob); + bool allow_oob, Monitor *cur_mon); bool qmp_is_oob(const QDict *dict); =20 typedef void (*qmp_cmd_callback_fn)(const QmpCommand *cmd, void *opaque); diff --git a/monitor/qmp.c b/monitor/qmp.c index 8469970c69..e746b3575d 100644 --- a/monitor/qmp.c +++ b/monitor/qmp.c @@ -135,16 +135,11 @@ static void monitor_qmp_respond(MonitorQMP *mon, QDic= t *rsp) =20 static void monitor_qmp_dispatch(MonitorQMP *mon, QObject *req) { - Monitor *old_mon; QDict *rsp; QDict *error; =20 - old_mon =3D monitor_set_cur(&mon->common); - assert(old_mon =3D=3D NULL); - - rsp =3D qmp_dispatch(mon->commands, req, qmp_oob_enabled(mon)); - - monitor_set_cur(NULL); + rsp =3D qmp_dispatch(mon->commands, req, qmp_oob_enabled(mon), + &mon->common); =20 if (mon->commands =3D=3D &qmp_cap_negotiation_commands) { error =3D qdict_get_qdict(rsp, "error"); diff --git a/qapi/qmp-dispatch.c b/qapi/qmp-dispatch.c index 79347e0864..2fdbc0fba4 100644 --- a/qapi/qmp-dispatch.c +++ b/qapi/qmp-dispatch.c @@ -89,7 +89,7 @@ bool qmp_is_oob(const QDict *dict) } =20 QDict *qmp_dispatch(const QmpCommandList *cmds, QObject *request, - bool allow_oob) + bool allow_oob, Monitor *cur_mon) { Error *err =3D NULL; bool oob; @@ -152,7 +152,13 @@ QDict *qmp_dispatch(const QmpCommandList *cmds, QObjec= t *request, args =3D qdict_get_qdict(dict, "arguments"); qobject_ref(args); } + + assert(monitor_cur() =3D=3D NULL); + monitor_set_cur(cur_mon); + cmd->fn(args, &ret, &err); + + monitor_set_cur(NULL); qobject_unref(args); if (err) { /* or assert(!ret) after reviewing all handlers: */ diff --git a/qga/main.c b/qga/main.c index 740f5f7303..dea6a3aa64 100644 --- a/qga/main.c +++ b/qga/main.c @@ -579,7 +579,7 @@ static void process_event(void *opaque, QObject *obj, E= rror *err) } =20 g_debug("processing command"); - rsp =3D qmp_dispatch(&ga_commands, obj, false); + rsp =3D qmp_dispatch(&ga_commands, obj, false, NULL); =20 end: ret =3D send_response(s, rsp); diff --git a/stubs/monitor-core.c b/stubs/monitor-core.c index 0cd2d864b2..dc1748bf13 100644 --- a/stubs/monitor-core.c +++ b/stubs/monitor-core.c @@ -8,6 +8,11 @@ Monitor *monitor_cur(void) return NULL; } =20 +Monitor *monitor_set_cur(Monitor *mon) +{ + return NULL; +} + void monitor_init_qmp(Chardev *chr, bool pretty, Error **errp) { } diff --git a/tests/test-qmp-cmds.c b/tests/test-qmp-cmds.c index d12ff47e26..5f1b245e19 100644 --- a/tests/test-qmp-cmds.c +++ b/tests/test-qmp-cmds.c @@ -152,7 +152,7 @@ static QObject *do_qmp_dispatch(bool allow_oob, const c= har *template, ...) req =3D qdict_from_vjsonf_nofail(template, ap); va_end(ap); =20 - resp =3D qmp_dispatch(&qmp_commands, QOBJECT(req), allow_oob); + resp =3D qmp_dispatch(&qmp_commands, QOBJECT(req), allow_oob, NULL); g_assert(resp); ret =3D qdict_get(resp, "return"); g_assert(ret); @@ -175,7 +175,7 @@ static void do_qmp_dispatch_error(bool allow_oob, Error= Class cls, req =3D qdict_from_vjsonf_nofail(template, ap); va_end(ap); =20 - resp =3D qmp_dispatch(&qmp_commands, QOBJECT(req), allow_oob); + resp =3D qmp_dispatch(&qmp_commands, QOBJECT(req), allow_oob, NULL); g_assert(resp); error =3D qdict_get_qdict(resp, "error"); g_assert(error); @@ -231,7 +231,7 @@ static void test_dispatch_cmd_success_response(void) QDict *resp; =20 qdict_put_str(req, "execute", "cmd-success-response"); - resp =3D qmp_dispatch(&qmp_commands, QOBJECT(req), false); + resp =3D qmp_dispatch(&qmp_commands, QOBJECT(req), false, NULL); g_assert_null(resp); qobject_unref(req); } --=20 2.26.2 From nobody Sun Nov 16 23:02:10 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1602225620; cv=none; d=zohomail.com; s=zohoarc; b=B7/kzdCxirLtBMM2MbyRhjhcIjCpOd9j4VskjBIRV9zKCnBRCioEO6bRWFhV0TjrrQDh1YDWWWPuvBqZy2RlYU8wj2zqjZbn2xDytd+GEDSlbeKa76gppQdkFlgRw9+dfvzxMW9tLHtLZggA3I7iK66pmPymYphQWxp+tM+VOMc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1602225620; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=nc0S564zvbZDDacLzReRWr4W1eIG5z/1hDL3G1z0XpI=; b=WzLBYE+PeJjge6ItEEHfGqkwCuOZUqQAISF9unm1INl89WZxdQXJznKd1b4JsdlfayN5o4bcLgwe/GZJX1nzOxeNgJ/9rinsvI92HqeMcXQWVUJlQ0X7srPiRtMrOBYYlasX3s6IDbiTF75UZOgeIip2UuhNAo2WnRl9Aq2PwqM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 160222562028243.27984888042636; Thu, 8 Oct 2020 23:40:20 -0700 (PDT) Received: from localhost ([::1]:58582 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kQm4h-0007Tr-25 for importer@patchew.org; Fri, 09 Oct 2020 02:40:19 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53912) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kQlzK-00022e-0b for qemu-devel@nongnu.org; Fri, 09 Oct 2020 02:34:46 -0400 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:36370) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kQlzH-0008Um-0o for qemu-devel@nongnu.org; Fri, 09 Oct 2020 02:34:45 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-184-7xseoB20NiKmDL_cbq6llA-1; Fri, 09 Oct 2020 02:34:40 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 90D1264143 for ; Fri, 9 Oct 2020 06:34:39 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-112-182.ams2.redhat.com [10.36.112.182]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 0E41D55780; Fri, 9 Oct 2020 06:34:39 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 19F6E112CE1F; Fri, 9 Oct 2020 08:34:33 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1602225282; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=nc0S564zvbZDDacLzReRWr4W1eIG5z/1hDL3G1z0XpI=; b=NOs1uVHsrgYtisLlMPQaTp6ocFm1lZOIc3SqatmDeTcexScOjQKk2B1mqwcgoZyJozAUGr ED5bZVDzrzY007MjyVcCbyjCGMAMKFWZ9Ii5Nxg5r2tCXJHx3SxJ8+ig9hDajG6G+wTwA7 ie2POlLPkeXOQpG7Ldwu03q6RNHW50E= X-MC-Unique: 7xseoB20NiKmDL_cbq6llA-1 From: Markus Armbruster To: qemu-devel@nongnu.org Subject: [PULL 07/14] monitor: Make current monitor a per-coroutine property Date: Fri, 9 Oct 2020 08:34:25 +0200 Message-Id: <20201009063432.303441-8-armbru@redhat.com> In-Reply-To: <20201009063432.303441-1-armbru@redhat.com> References: <20201009063432.303441-1-armbru@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=armbru@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=63.128.21.124; envelope-from=armbru@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/10/09 02:34:40 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, Stefan Hajnoczi Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Kevin Wolf This way, a monitor command handler will still be able to access the current monitor, but when it yields, all other code code will correctly get NULL from monitor_cur(). This uses a hash table to map the coroutine pointer to the current monitor of that coroutine. Outside of coroutine context, we associate the current monitor with the leader coroutine of the current thread. Approaches to implement some form of coroutine local storage directly in the coroutine core code have been considered and discarded because they didn't end up being much more generic than the hash table and their performance impact on coroutines not using coroutine local storage was unclear. As the block layer uses a coroutine per I/O request, this is a fast path and we have to be careful. It's safest to just stay out of this path with code only used by the monitor. Signed-off-by: Kevin Wolf Reviewed-by: Eric Blake Message-Id: <20201005155855.256490-8-kwolf@redhat.com> Reviewed-by: Markus Armbruster Reviewed-by: Stefan Hajnoczi Signed-off-by: Markus Armbruster --- include/monitor/monitor.h | 2 +- monitor/hmp.c | 4 ++-- monitor/monitor.c | 34 +++++++++++++++++++++++++++------- qapi/qmp-dispatch.c | 4 ++-- stubs/monitor-core.c | 2 +- 5 files changed, 33 insertions(+), 13 deletions(-) diff --git a/include/monitor/monitor.h b/include/monitor/monitor.h index 543eafcb76..348bfad3d5 100644 --- a/include/monitor/monitor.h +++ b/include/monitor/monitor.h @@ -13,7 +13,7 @@ typedef struct MonitorOptions MonitorOptions; extern QemuOptsList qemu_mon_opts; =20 Monitor *monitor_cur(void); -Monitor *monitor_set_cur(Monitor *mon); +Monitor *monitor_set_cur(Coroutine *co, Monitor *mon); bool monitor_cur_is_qmp(void); =20 void monitor_init_globals(void); diff --git a/monitor/hmp.c b/monitor/hmp.c index 560ec98e7b..abaf939b2d 100644 --- a/monitor/hmp.c +++ b/monitor/hmp.c @@ -1081,9 +1081,9 @@ void handle_hmp_command(MonitorHMP *mon, const char *= cmdline) } =20 /* old_mon is non-NULL when called from qmp_human_monitor_command() */ - old_mon =3D monitor_set_cur(&mon->common); + old_mon =3D monitor_set_cur(qemu_coroutine_self(), &mon->common); cmd->cmd(&mon->common, qdict); - monitor_set_cur(old_mon); + monitor_set_cur(qemu_coroutine_self(), old_mon); =20 qobject_unref(qdict); } diff --git a/monitor/monitor.c b/monitor/monitor.c index 099c164c6d..ef68ca9d21 100644 --- a/monitor/monitor.c +++ b/monitor/monitor.c @@ -58,29 +58,48 @@ IOThread *mon_iothread; /* Bottom half to dispatch the requests received from I/O thread */ QEMUBH *qmp_dispatcher_bh; =20 -/* Protects mon_list, monitor_qapi_event_state, monitor_destroyed. */ +/* + * Protects mon_list, monitor_qapi_event_state, coroutine_mon, + * monitor_destroyed. + */ QemuMutex monitor_lock; static GHashTable *monitor_qapi_event_state; +static GHashTable *coroutine_mon; /* Maps Coroutine* to Monitor* */ =20 MonitorList mon_list; int mon_refcount; static bool monitor_destroyed; =20 -static __thread Monitor *cur_monitor; - Monitor *monitor_cur(void) { - return cur_monitor; + Monitor *mon; + + qemu_mutex_lock(&monitor_lock); + mon =3D g_hash_table_lookup(coroutine_mon, qemu_coroutine_self()); + qemu_mutex_unlock(&monitor_lock); + + return mon; } =20 /** * Sets a new current monitor and returns the old one. + * + * If a non-NULL monitor is set for a coroutine, another call + * resetting it to NULL is required before the coroutine terminates, + * otherwise a stale entry would remain in the hash table. */ -Monitor *monitor_set_cur(Monitor *mon) +Monitor *monitor_set_cur(Coroutine *co, Monitor *mon) { - Monitor *old_monitor =3D cur_monitor; + Monitor *old_monitor =3D monitor_cur(); + + qemu_mutex_lock(&monitor_lock); + if (mon) { + g_hash_table_replace(coroutine_mon, co, mon); + } else { + g_hash_table_remove(coroutine_mon, co); + } + qemu_mutex_unlock(&monitor_lock); =20 - cur_monitor =3D mon; return old_monitor; } =20 @@ -623,6 +642,7 @@ void monitor_init_globals_core(void) { monitor_qapi_event_init(); qemu_mutex_init(&monitor_lock); + coroutine_mon =3D g_hash_table_new(NULL, NULL); =20 /* * The dispatcher BH must run in the main loop thread, since we diff --git a/qapi/qmp-dispatch.c b/qapi/qmp-dispatch.c index 2fdbc0fba4..5677ba92ca 100644 --- a/qapi/qmp-dispatch.c +++ b/qapi/qmp-dispatch.c @@ -154,11 +154,11 @@ QDict *qmp_dispatch(const QmpCommandList *cmds, QObje= ct *request, } =20 assert(monitor_cur() =3D=3D NULL); - monitor_set_cur(cur_mon); + monitor_set_cur(qemu_coroutine_self(), cur_mon); =20 cmd->fn(args, &ret, &err); =20 - monitor_set_cur(NULL); + monitor_set_cur(qemu_coroutine_self(), NULL); qobject_unref(args); if (err) { /* or assert(!ret) after reviewing all handlers: */ diff --git a/stubs/monitor-core.c b/stubs/monitor-core.c index dc1748bf13..d058a2a00d 100644 --- a/stubs/monitor-core.c +++ b/stubs/monitor-core.c @@ -8,7 +8,7 @@ Monitor *monitor_cur(void) return NULL; } =20 -Monitor *monitor_set_cur(Monitor *mon) +Monitor *monitor_set_cur(Coroutine *co, Monitor *mon) { return NULL; } --=20 2.26.2 From nobody Sun Nov 16 23:02:10 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1602226308; cv=none; d=zohomail.com; s=zohoarc; b=f7IGzRqTUJBwbOwgBtYc8B1AOZYVIgmlqBjULaQGaMPScX+BzATYUzack+Ht6AE+oru6EEQTdisU+6p0d7hNk3UtAq8KTuc1v7MXaBq14Qp5v6U4URsAXhWa1dTWYcJFvapsEUFL4AzAjwZdKoroip0hVQAOSqxEL9d0IhB57xw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1602226308; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=zFvY/CHMRSUPpFFQ0GIi6kE8dN2hQgvirQhJ95oOMjo=; b=e+C1Xpx2WZbbqgS394j3/9VUWXWDUbqAjvKXeCXCyqQIFqL0/mhfJm8rDOZj+Cf1kqvFg30XC3Q3CfG9da/MZZ1j6BgB3z5Jhyjr6yJ/8ZL1bFNeyn/3MKgW5dQOi94vSgIB6q0mBKcwTZamXppD6mpXgRseObsvODV5TsgJ8qQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1602226308325905.4392273797249; Thu, 8 Oct 2020 23:51:48 -0700 (PDT) Received: from localhost ([::1]:57412 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kQmFm-0002g6-UD for importer@patchew.org; Fri, 09 Oct 2020 02:51:46 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53960) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kQlzM-00028L-FD for qemu-devel@nongnu.org; Fri, 09 Oct 2020 02:34:48 -0400 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:21258) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kQlzH-0008V9-Kl for qemu-devel@nongnu.org; Fri, 09 Oct 2020 02:34:48 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-108-D-SF7b_NPdGsERNfJ9poXw-1; Fri, 09 Oct 2020 02:34:40 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 9747A80B714 for ; Fri, 9 Oct 2020 06:34:39 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-112-182.ams2.redhat.com [10.36.112.182]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 16B065C1BB; Fri, 9 Oct 2020 06:34:39 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 1D5B7112C7B4; Fri, 9 Oct 2020 08:34:33 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1602225282; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=zFvY/CHMRSUPpFFQ0GIi6kE8dN2hQgvirQhJ95oOMjo=; b=K+4GpEc643veAHrHbDfwppHTFcWIPwp4txnKpk57D5YP38nuXg42mFGcT93bryigYXjOQf qOTqe3y1gg/Btg1N3pV4g+cBB64/4Yisir4UBVVZ/rYhLDkkww33HVGZAbOyV/XBGmNjQy FUvYdCTXz08Wwsp1LEqYre2liGPuc9M= X-MC-Unique: D-SF7b_NPdGsERNfJ9poXw-1 From: Markus Armbruster To: qemu-devel@nongnu.org Subject: [PULL 08/14] qapi: Add a 'coroutine' flag for commands Date: Fri, 9 Oct 2020 08:34:26 +0200 Message-Id: <20201009063432.303441-9-armbru@redhat.com> In-Reply-To: <20201009063432.303441-1-armbru@redhat.com> References: <20201009063432.303441-1-armbru@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=armbru@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=63.128.21.124; envelope-from=armbru@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/10/09 02:34:40 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, Stefan Hajnoczi Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" From: Kevin Wolf This patch adds a new 'coroutine' flag to QMP command definitions that tells the QMP dispatcher that the command handler is safe to be run in a coroutine. The documentation of the new flag pretends that this flag is already used as intended, which it isn't yet after this patch. We'll implement this in another patch in this series. Signed-off-by: Kevin Wolf Message-Id: <20201005155855.256490-9-kwolf@redhat.com> Reviewed-by: Markus Armbruster Reviewed-by: Stefan Hajnoczi Signed-off-by: Markus Armbruster --- docs/devel/qapi-code-gen.txt | 29 +++++++++++++++++++++++++ docs/sphinx/qapidoc.py | 2 +- include/qapi/qmp/dispatch.h | 1 + tests/test-qmp-cmds.c | 4 ++++ scripts/qapi/commands.py | 10 ++++++--- scripts/qapi/expr.py | 11 ++++++++-- scripts/qapi/introspect.py | 2 +- scripts/qapi/schema.py | 13 +++++++---- tests/qapi-schema/meson.build | 1 + tests/qapi-schema/oob-coroutine.err | 2 ++ tests/qapi-schema/oob-coroutine.json | 2 ++ tests/qapi-schema/oob-coroutine.out | 0 tests/qapi-schema/qapi-schema-test.json | 1 + tests/qapi-schema/qapi-schema-test.out | 2 ++ tests/qapi-schema/test-qapi.py | 7 +++--- 15 files changed, 73 insertions(+), 14 deletions(-) create mode 100644 tests/qapi-schema/oob-coroutine.err create mode 100644 tests/qapi-schema/oob-coroutine.json create mode 100644 tests/qapi-schema/oob-coroutine.out diff --git a/docs/devel/qapi-code-gen.txt b/docs/devel/qapi-code-gen.txt index 5fc67c99cd..4a41e36a75 100644 --- a/docs/devel/qapi-code-gen.txt +++ b/docs/devel/qapi-code-gen.txt @@ -472,6 +472,7 @@ Syntax: '*gen': false, '*allow-oob': true, '*allow-preconfig': true, + '*coroutine': true, '*if': COND, '*features': FEATURES } =20 @@ -596,6 +597,34 @@ before the machine is built. It defaults to false. F= or example: QMP is available before the machine is built only when QEMU was started with --preconfig. =20 +Member 'coroutine' tells the QMP dispatcher whether the command handler +is safe to be run in a coroutine. It defaults to false. If it is true, +the command handler is called from coroutine context and may yield while +waiting for an external event (such as I/O completion) in order to avoid +blocking the guest and other background operations. + +Coroutine safety can be hard to prove, similar to thread safety. Common +pitfalls are: + +- The global mutex isn't held across qemu_coroutine_yield(), so + operations that used to assume that they execute atomically may have + to be more careful to protect against changes in the global state. + +- Nested event loops (AIO_WAIT_WHILE() etc.) are problematic in + coroutine context and can easily lead to deadlocks. They should be + replaced by yielding and reentering the coroutine when the condition + becomes false. + +Since the command handler may assume coroutine context, any callers +other than the QMP dispatcher must also call it in coroutine context. +In particular, HMP commands calling such a QMP command handler must +enter coroutine context before calling the handler. + +It is an error to specify both 'coroutine': true and 'allow-oob': true +for a command. We don't currently have a use case for both together and +without a use case, it's not entirely clear what the semantics should +be. + The optional 'if' member specifies a conditional. See "Configuring the schema" below for more on this. =20 diff --git a/docs/sphinx/qapidoc.py b/docs/sphinx/qapidoc.py index 6944ffa6aa..e03abcbb95 100644 --- a/docs/sphinx/qapidoc.py +++ b/docs/sphinx/qapidoc.py @@ -330,7 +330,7 @@ class QAPISchemaGenRSTVisitor(QAPISchemaVisitor): =20 def visit_command(self, name, info, ifcond, features, arg_type, ret_type, gen, success_response, boxed, allow_oob, - allow_preconfig): + allow_preconfig, coroutine): doc =3D self._cur_doc self._add_doc('Command', self._nodes_for_arguments(doc, diff --git a/include/qapi/qmp/dispatch.h b/include/qapi/qmp/dispatch.h index 0c2f467028..9fd2b720a7 100644 --- a/include/qapi/qmp/dispatch.h +++ b/include/qapi/qmp/dispatch.h @@ -25,6 +25,7 @@ typedef enum QmpCommandOptions QCO_NO_SUCCESS_RESP =3D (1U << 0), QCO_ALLOW_OOB =3D (1U << 1), QCO_ALLOW_PRECONFIG =3D (1U << 2), + QCO_COROUTINE =3D (1U << 3), } QmpCommandOptions; =20 typedef struct QmpCommand diff --git a/tests/test-qmp-cmds.c b/tests/test-qmp-cmds.c index 5f1b245e19..d3413bfef0 100644 --- a/tests/test-qmp-cmds.c +++ b/tests/test-qmp-cmds.c @@ -36,6 +36,10 @@ void qmp_cmd_success_response(Error **errp) { } =20 +void qmp_coroutine_cmd(Error **errp) +{ +} + Empty2 *qmp_user_def_cmd0(Error **errp) { return g_new0(Empty2, 1); diff --git a/scripts/qapi/commands.py b/scripts/qapi/commands.py index 3cf9e1110b..6e6fc94a14 100644 --- a/scripts/qapi/commands.py +++ b/scripts/qapi/commands.py @@ -176,7 +176,8 @@ out: return ret =20 =20 -def gen_register_command(name, success_response, allow_oob, allow_preconfi= g): +def gen_register_command(name, success_response, allow_oob, allow_preconfi= g, + coroutine): options =3D [] =20 if not success_response: @@ -185,6 +186,8 @@ def gen_register_command(name, success_response, allow_= oob, allow_preconfig): options +=3D ['QCO_ALLOW_OOB'] if allow_preconfig: options +=3D ['QCO_ALLOW_PRECONFIG'] + if coroutine: + options +=3D ['QCO_COROUTINE'] =20 if not options: options =3D ['QCO_NO_OPTIONS'] @@ -267,7 +270,7 @@ void %(c_prefix)sqmp_init_marshal(QmpCommandList *cmds); =20 def visit_command(self, name, info, ifcond, features, arg_type, ret_type, gen, success_response, boxed, - allow_oob, allow_preconfig): + allow_oob, allow_preconfig, coroutine): if not gen: return # FIXME: If T is a user-defined type, the user is responsible @@ -285,7 +288,8 @@ void %(c_prefix)sqmp_init_marshal(QmpCommandList *cmds); self._genh.add(gen_marshal_decl(name)) self._genc.add(gen_marshal(name, arg_type, boxed, ret_type)) self._regy.add(gen_register_command(name, success_response, - allow_oob, allow_preconfig= )) + allow_oob, allow_preconfig, + coroutine)) =20 =20 def gen_commands(schema, output_dir, prefix): diff --git a/scripts/qapi/expr.py b/scripts/qapi/expr.py index 2942520399..a15c1fb474 100644 --- a/scripts/qapi/expr.py +++ b/scripts/qapi/expr.py @@ -88,10 +88,17 @@ def check_flags(expr, info): if key in expr and expr[key] is not False: raise QAPISemError( info, "flag '%s' may only use false value" % key) - for key in ['boxed', 'allow-oob', 'allow-preconfig']: + for key in ['boxed', 'allow-oob', 'allow-preconfig', 'coroutine']: if key in expr and expr[key] is not True: raise QAPISemError( info, "flag '%s' may only use true value" % key) + if 'allow-oob' in expr and 'coroutine' in expr: + # This is not necessarily a fundamental incompatibility, but + # we don't have a use case and the desired semantics isn't + # obvious. The simplest solution is to forbid it until we get + # a use case for it. + raise QAPISemError(info, "flags 'allow-oob' and 'coroutine' " + "are incompatible") =20 =20 def check_if(expr, info, source): @@ -342,7 +349,7 @@ def check_exprs(exprs): ['command'], ['data', 'returns', 'boxed', 'if', 'features', 'gen', 'success-response', 'allow-oob', - 'allow-preconfig']) + 'allow-preconfig', 'coroutine']) normalize_members(expr.get('data')) check_command(expr, info) elif meta =3D=3D 'event': diff --git a/scripts/qapi/introspect.py b/scripts/qapi/introspect.py index 23652be810..5907b09cd5 100644 --- a/scripts/qapi/introspect.py +++ b/scripts/qapi/introspect.py @@ -216,7 +216,7 @@ const QLitObject %(c_name)s =3D %(c_string)s; =20 def visit_command(self, name, info, ifcond, features, arg_type, ret_type, gen, success_response, boxed, - allow_oob, allow_preconfig): + allow_oob, allow_preconfig, coroutine): arg_type =3D arg_type or self._schema.the_empty_object_type ret_type =3D ret_type or self._schema.the_empty_object_type obj =3D {'arg-type': self._use_type(arg_type), diff --git a/scripts/qapi/schema.py b/scripts/qapi/schema.py index 78309a00f0..d1307ec661 100644 --- a/scripts/qapi/schema.py +++ b/scripts/qapi/schema.py @@ -128,7 +128,7 @@ class QAPISchemaVisitor: =20 def visit_command(self, name, info, ifcond, features, arg_type, ret_type, gen, success_response, boxed, - allow_oob, allow_preconfig): + allow_oob, allow_preconfig, coroutine): pass =20 def visit_event(self, name, info, ifcond, features, arg_type, boxed): @@ -713,7 +713,8 @@ class QAPISchemaCommand(QAPISchemaEntity): =20 def __init__(self, name, info, doc, ifcond, features, arg_type, ret_type, - gen, success_response, boxed, allow_oob, allow_preconfig): + gen, success_response, boxed, allow_oob, allow_preconfig, + coroutine): super().__init__(name, info, doc, ifcond, features) assert not arg_type or isinstance(arg_type, str) assert not ret_type or isinstance(ret_type, str) @@ -726,6 +727,7 @@ class QAPISchemaCommand(QAPISchemaEntity): self.boxed =3D boxed self.allow_oob =3D allow_oob self.allow_preconfig =3D allow_preconfig + self.coroutine =3D coroutine =20 def check(self, schema): super().check(schema) @@ -768,7 +770,8 @@ class QAPISchemaCommand(QAPISchemaEntity): visitor.visit_command( self.name, self.info, self.ifcond, self.features, self.arg_type, self.ret_type, self.gen, self.success_response, - self.boxed, self.allow_oob, self.allow_preconfig) + self.boxed, self.allow_oob, self.allow_preconfig, + self.coroutine) =20 =20 class QAPISchemaEvent(QAPISchemaEntity): @@ -1074,6 +1077,7 @@ class QAPISchema: boxed =3D expr.get('boxed', False) allow_oob =3D expr.get('allow-oob', False) allow_preconfig =3D expr.get('allow-preconfig', False) + coroutine =3D expr.get('coroutine', False) ifcond =3D expr.get('if') features =3D self._make_features(expr.get('features'), info) if isinstance(data, OrderedDict): @@ -1086,7 +1090,8 @@ class QAPISchema: self._def_entity(QAPISchemaCommand(name, info, doc, ifcond, featur= es, data, rets, gen, success_response, - boxed, allow_oob, allow_preconf= ig)) + boxed, allow_oob, allow_preconf= ig, + coroutine)) =20 def _def_event(self, expr, info, doc): name =3D expr['event'] diff --git a/tests/qapi-schema/meson.build b/tests/qapi-schema/meson.build index f08c902911..1f222a7a13 100644 --- a/tests/qapi-schema/meson.build +++ b/tests/qapi-schema/meson.build @@ -142,6 +142,7 @@ schemas =3D [ 'nested-struct-data.json', 'nested-struct-data-invalid-dict.json', 'non-objects.json', + 'oob-coroutine.json', 'oob-test.json', 'allow-preconfig-test.json', 'pragma-doc-required-crap.json', diff --git a/tests/qapi-schema/oob-coroutine.err b/tests/qapi-schema/oob-co= routine.err new file mode 100644 index 0000000000..c01a4992bd --- /dev/null +++ b/tests/qapi-schema/oob-coroutine.err @@ -0,0 +1,2 @@ +oob-coroutine.json: In command 'oob-command-1': +oob-coroutine.json:2: flags 'allow-oob' and 'coroutine' are incompatible diff --git a/tests/qapi-schema/oob-coroutine.json b/tests/qapi-schema/oob-c= oroutine.json new file mode 100644 index 0000000000..0f67663bcd --- /dev/null +++ b/tests/qapi-schema/oob-coroutine.json @@ -0,0 +1,2 @@ +# Check that incompatible flags allow-oob and coroutine are rejected +{ 'command': 'oob-command-1', 'allow-oob': true, 'coroutine': true } diff --git a/tests/qapi-schema/oob-coroutine.out b/tests/qapi-schema/oob-co= routine.out new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/qapi-schema/qapi-schema-test.json b/tests/qapi-schema/qa= pi-schema-test.json index 3a9f2cbb33..63f92adf68 100644 --- a/tests/qapi-schema/qapi-schema-test.json +++ b/tests/qapi-schema/qapi-schema-test.json @@ -148,6 +148,7 @@ 'returns': 'UserDefTwo' } =20 { 'command': 'cmd-success-response', 'data': {}, 'success-response': false= } +{ 'command': 'coroutine-cmd', 'data': {}, 'coroutine': true } =20 # Returning a non-dictionary requires a name from the whitelist { 'command': 'guest-get-time', 'data': {'a': 'int', '*b': 'int' }, diff --git a/tests/qapi-schema/qapi-schema-test.out b/tests/qapi-schema/qap= i-schema-test.out index 891b4101e0..8868ca0dca 100644 --- a/tests/qapi-schema/qapi-schema-test.out +++ b/tests/qapi-schema/qapi-schema-test.out @@ -203,6 +203,8 @@ command user_def_cmd2 q_obj_user_def_cmd2-arg -> UserDe= fTwo gen=3DTrue success_response=3DTrue boxed=3DFalse oob=3DFalse preconfig= =3DFalse command cmd-success-response None -> None gen=3DTrue success_response=3DFalse boxed=3DFalse oob=3DFalse preconfi= g=3DFalse +command coroutine-cmd None -> None + gen=3DTrue success_response=3DTrue boxed=3DFalse oob=3DFalse preconfig= =3DFalse coroutine=3DTrue object q_obj_guest-get-time-arg member a: int optional=3DFalse member b: int optional=3DTrue diff --git a/tests/qapi-schema/test-qapi.py b/tests/qapi-schema/test-qapi.py index f396b471eb..e8db9d09d9 100755 --- a/tests/qapi-schema/test-qapi.py +++ b/tests/qapi-schema/test-qapi.py @@ -68,12 +68,13 @@ class QAPISchemaTestVisitor(QAPISchemaVisitor): =20 def visit_command(self, name, info, ifcond, features, arg_type, ret_type, gen, success_response, boxed, - allow_oob, allow_preconfig): + allow_oob, allow_preconfig, coroutine): print('command %s %s -> %s' % (name, arg_type and arg_type.name, ret_type and ret_type.name)) - print(' gen=3D%s success_response=3D%s boxed=3D%s oob=3D%s prec= onfig=3D%s' - % (gen, success_response, boxed, allow_oob, allow_preconfig)) + print(' gen=3D%s success_response=3D%s boxed=3D%s oob=3D%s prec= onfig=3D%s%s' + % (gen, success_response, boxed, allow_oob, allow_preconfig, + " coroutine=3DTrue" if coroutine else "")) self._print_if(ifcond) self._print_features(features) =20 --=20 2.26.2 From nobody Sun Nov 16 23:02:10 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1602225834; cv=none; d=zohomail.com; s=zohoarc; b=iid2ncuzp/KY2KuyjzHKjIZxLNkq5GROqzEMYrMTJx1qZP9/a3Zi4ml6wLa+GAtt03GB6bfTrHZgOFeqlPe0M0hAzHYe4M+en08TAyQhUvVuAb/i1RSAsz2uvDp5Gf0oGYnDVIZEsUF1muS9eQ8g9WeVaPPRJLd3LYh6q8kn460= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1602225834; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=R5SS4apPbn9jWsnxjuglDSV3luWjQ9+i1BgnIH4/MIw=; b=XKdxH1+r2AHw7LVIXunagiRMdXxmYmQEO2kTSuBzqifYtLUzkPIBGtDZPFbL0oevdeFpPg6QU5j+kn70MEIyUJr1Uh1czOBToxHzPyp5zdM4NScZEaxgtIoTH1C/YLWZr2FYfMr40/lTaY3mbjrn82RJa/Touo6HeKXMaZzwayc= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1602225834757372.0341754723305; Thu, 8 Oct 2020 23:43:54 -0700 (PDT) Received: from localhost ([::1]:38834 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kQm89-0002rW-CT for importer@patchew.org; Fri, 09 Oct 2020 02:43:53 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53934) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kQlzL-000253-44 for qemu-devel@nongnu.org; Fri, 09 Oct 2020 02:34:47 -0400 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:55177) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kQlzH-0008Us-23 for qemu-devel@nongnu.org; Fri, 09 Oct 2020 02:34:46 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-184-pXy6kX71NZuI5V52U673FA-1; Fri, 09 Oct 2020 02:34:40 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id B259218BA2B1 for ; Fri, 9 Oct 2020 06:34:39 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-112-182.ams2.redhat.com [10.36.112.182]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 139CD55795; Fri, 9 Oct 2020 06:34:39 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 20D58112C7BA; Fri, 9 Oct 2020 08:34:33 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1602225282; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=R5SS4apPbn9jWsnxjuglDSV3luWjQ9+i1BgnIH4/MIw=; b=N2tCNFDVG00p5hXUDMsYPJZ+bctAleRAaj0PeMN/k7G6KN5vi/N+ehRUx0sYQLqFlRpu8i uSzpUNFGg7qM+h688nAqD9pw7gn1mMl/WR+ObyhnUEHEbHZfSKdvfH6ugNEqCtawHwqr0T qK/pzFbXUMimAlPZYOFZA0ctNWJM3fg= X-MC-Unique: pXy6kX71NZuI5V52U673FA-1 From: Markus Armbruster To: qemu-devel@nongnu.org Subject: [PULL 09/14] qmp: Move dispatcher to a coroutine Date: Fri, 9 Oct 2020 08:34:27 +0200 Message-Id: <20201009063432.303441-10-armbru@redhat.com> In-Reply-To: <20201009063432.303441-1-armbru@redhat.com> References: <20201009063432.303441-1-armbru@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=armbru@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=63.128.21.124; envelope-from=armbru@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/10/09 02:34:40 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, Stefan Hajnoczi Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" From: Kevin Wolf This moves the QMP dispatcher to a coroutine and runs all QMP command handlers that declare 'coroutine': true in coroutine context so they can avoid blocking the main loop while doing I/O or waiting for other events. For commands that are not declared safe to run in a coroutine, the dispatcher drops out of coroutine context by calling the QMP command handler from a bottom half. Signed-off-by: Kevin Wolf Reviewed-by: Markus Armbruster Message-Id: <20201005155855.256490-10-kwolf@redhat.com> Reviewed-by: Markus Armbruster Reviewed-by: Stefan Hajnoczi Signed-off-by: Markus Armbruster --- include/qapi/qmp/dispatch.h | 1 + monitor/monitor-internal.h | 6 +- monitor/monitor.c | 55 +++++++++++++--- monitor/qmp.c | 122 +++++++++++++++++++++++++++--------- qapi/qmp-dispatch.c | 63 +++++++++++++++++-- qapi/qmp-registry.c | 3 + util/aio-posix.c | 8 ++- 7 files changed, 213 insertions(+), 45 deletions(-) diff --git a/include/qapi/qmp/dispatch.h b/include/qapi/qmp/dispatch.h index 9fd2b720a7..af8d96c570 100644 --- a/include/qapi/qmp/dispatch.h +++ b/include/qapi/qmp/dispatch.h @@ -31,6 +31,7 @@ typedef enum QmpCommandOptions typedef struct QmpCommand { const char *name; + /* Runs in coroutine context if QCO_COROUTINE is set */ QmpCommandFunc *fn; QmpCommandOptions options; QTAILQ_ENTRY(QmpCommand) node; diff --git a/monitor/monitor-internal.h b/monitor/monitor-internal.h index b39e03b744..b55d6df07f 100644 --- a/monitor/monitor-internal.h +++ b/monitor/monitor-internal.h @@ -155,7 +155,9 @@ static inline bool monitor_is_qmp(const Monitor *mon) =20 typedef QTAILQ_HEAD(MonitorList, Monitor) MonitorList; extern IOThread *mon_iothread; -extern QEMUBH *qmp_dispatcher_bh; +extern Coroutine *qmp_dispatcher_co; +extern bool qmp_dispatcher_co_shutdown; +extern bool qmp_dispatcher_co_busy; extern QmpCommandList qmp_commands, qmp_cap_negotiation_commands; extern QemuMutex monitor_lock; extern MonitorList mon_list; @@ -173,7 +175,7 @@ void monitor_fdsets_cleanup(void); =20 void qmp_send_response(MonitorQMP *mon, const QDict *rsp); void monitor_data_destroy_qmp(MonitorQMP *mon); -void monitor_qmp_bh_dispatcher(void *data); +void coroutine_fn monitor_qmp_dispatcher_co(void *data); =20 int get_monitor_def(int64_t *pval, const char *name); void help_cmd(Monitor *mon, const char *name); diff --git a/monitor/monitor.c b/monitor/monitor.c index ef68ca9d21..ceffe1a83b 100644 --- a/monitor/monitor.c +++ b/monitor/monitor.c @@ -55,8 +55,32 @@ typedef struct { /* Shared monitor I/O thread */ IOThread *mon_iothread; =20 -/* Bottom half to dispatch the requests received from I/O thread */ -QEMUBH *qmp_dispatcher_bh; +/* Coroutine to dispatch the requests received from I/O thread */ +Coroutine *qmp_dispatcher_co; + +/* Set to true when the dispatcher coroutine should terminate */ +bool qmp_dispatcher_co_shutdown; + +/* + * qmp_dispatcher_co_busy is used for synchronisation between the + * monitor thread and the main thread to ensure that the dispatcher + * coroutine never gets scheduled a second time when it's already + * scheduled (scheduling the same coroutine twice is forbidden). + * + * It is true if the coroutine is active and processing requests. + * Additional requests may then be pushed onto mon->qmp_requests, + * and @qmp_dispatcher_co_shutdown may be set without further ado. + * @qmp_dispatcher_co_busy must not be woken up in this case. + * + * If false, you also have to set @qmp_dispatcher_co_busy to true and + * wake up @qmp_dispatcher_co after pushing the new requests. + * + * The coroutine will automatically change this variable back to false + * before it yields. Nobody else may set the variable to false. + * + * Access must be atomic for thread safety. + */ +bool qmp_dispatcher_co_busy; =20 /* * Protects mon_list, monitor_qapi_event_state, coroutine_mon, @@ -623,9 +647,24 @@ void monitor_cleanup(void) } qemu_mutex_unlock(&monitor_lock); =20 - /* QEMUBHs needs to be deleted before destroying the I/O thread */ - qemu_bh_delete(qmp_dispatcher_bh); - qmp_dispatcher_bh =3D NULL; + /* + * The dispatcher needs to stop before destroying the I/O thread. + * + * We need to poll both qemu_aio_context and iohandler_ctx to make + * sure that the dispatcher coroutine keeps making progress and + * eventually terminates. qemu_aio_context is automatically + * polled by calling AIO_WAIT_WHILE on it, but we must poll + * iohandler_ctx manually. + */ + qmp_dispatcher_co_shutdown =3D true; + if (!qatomic_xchg(&qmp_dispatcher_co_busy, true)) { + aio_co_wake(qmp_dispatcher_co); + } + + AIO_WAIT_WHILE(qemu_get_aio_context(), + (aio_poll(iohandler_get_aio_context(), false), + qatomic_mb_read(&qmp_dispatcher_co_busy))); + if (mon_iothread) { iothread_destroy(mon_iothread); mon_iothread =3D NULL; @@ -649,9 +688,9 @@ void monitor_init_globals_core(void) * have commands assuming that context. It would be nice to get * rid of those assumptions. */ - qmp_dispatcher_bh =3D aio_bh_new(iohandler_get_aio_context(), - monitor_qmp_bh_dispatcher, - NULL); + qmp_dispatcher_co =3D qemu_coroutine_create(monitor_qmp_dispatcher_co,= NULL); + qatomic_mb_set(&qmp_dispatcher_co_busy, true); + aio_co_schedule(iohandler_get_aio_context(), qmp_dispatcher_co); } =20 int monitor_init(MonitorOptions *opts, bool allow_hmp, Error **errp) diff --git a/monitor/qmp.c b/monitor/qmp.c index e746b3575d..b42f8c6af3 100644 --- a/monitor/qmp.c +++ b/monitor/qmp.c @@ -133,6 +133,10 @@ static void monitor_qmp_respond(MonitorQMP *mon, QDict= *rsp) } } =20 +/* + * Runs outside of coroutine context for OOB commands, but in + * coroutine context for everything else. + */ static void monitor_qmp_dispatch(MonitorQMP *mon, QObject *req) { QDict *rsp; @@ -206,43 +210,99 @@ static QMPRequest *monitor_qmp_requests_pop_any_with_= lock(void) return req_obj; } =20 -void monitor_qmp_bh_dispatcher(void *data) +void coroutine_fn monitor_qmp_dispatcher_co(void *data) { - QMPRequest *req_obj =3D monitor_qmp_requests_pop_any_with_lock(); + QMPRequest *req_obj =3D NULL; QDict *rsp; bool need_resume; MonitorQMP *mon; =20 - if (!req_obj) { - return; - } + while (true) { + assert(qatomic_mb_read(&qmp_dispatcher_co_busy) =3D=3D true); =20 - mon =3D req_obj->mon; - /* qmp_oob_enabled() might change after "qmp_capabilities" */ - need_resume =3D !qmp_oob_enabled(mon) || - mon->qmp_requests->length =3D=3D QMP_REQ_QUEUE_LEN_MAX - 1; - qemu_mutex_unlock(&mon->qmp_queue_lock); - if (req_obj->req) { - QDict *qdict =3D qobject_to(QDict, req_obj->req); - QObject *id =3D qdict ? qdict_get(qdict, "id") : NULL; - trace_monitor_qmp_cmd_in_band(qobject_get_try_str(id) ?: ""); - monitor_qmp_dispatch(mon, req_obj->req); - } else { - assert(req_obj->err); - rsp =3D qmp_error_response(req_obj->err); - req_obj->err =3D NULL; - monitor_qmp_respond(mon, rsp); - qobject_unref(rsp); - } + /* + * Mark the dispatcher as not busy already here so that we + * don't miss any new requests coming in the middle of our + * processing. + */ + qatomic_mb_set(&qmp_dispatcher_co_busy, false); =20 - if (need_resume) { - /* Pairs with the monitor_suspend() in handle_qmp_command() */ - monitor_resume(&mon->common); - } - qmp_request_free(req_obj); + while (!(req_obj =3D monitor_qmp_requests_pop_any_with_lock())) { + /* + * No more requests to process. Wait to be reentered from + * handle_qmp_command() when it pushes more requests, or + * from monitor_cleanup() when it requests shutdown. + */ + if (!qmp_dispatcher_co_shutdown) { + qemu_coroutine_yield(); =20 - /* Reschedule instead of looping so the main loop stays responsive */ - qemu_bh_schedule(qmp_dispatcher_bh); + /* + * busy must be set to true again by whoever + * rescheduled us to avoid double scheduling + */ + assert(qatomic_xchg(&qmp_dispatcher_co_busy, false) =3D=3D= true); + } + + /* + * qmp_dispatcher_co_shutdown may have changed if we + * yielded and were reentered from monitor_cleanup() + */ + if (qmp_dispatcher_co_shutdown) { + return; + } + } + + if (qatomic_xchg(&qmp_dispatcher_co_busy, true) =3D=3D true) { + /* + * Someone rescheduled us (probably because a new requests + * came in), but we didn't actually yield. Do that now, + * only to be immediately reentered and removed from the + * list of scheduled coroutines. + */ + qemu_coroutine_yield(); + } + + /* + * Move the coroutine from iohandler_ctx to qemu_aio_context for + * executing the command handler so that it can make progress if it + * involves an AIO_WAIT_WHILE(). + */ + aio_co_schedule(qemu_get_aio_context(), qmp_dispatcher_co); + qemu_coroutine_yield(); + + mon =3D req_obj->mon; + /* qmp_oob_enabled() might change after "qmp_capabilities" */ + need_resume =3D !qmp_oob_enabled(mon) || + mon->qmp_requests->length =3D=3D QMP_REQ_QUEUE_LEN_MAX - 1; + qemu_mutex_unlock(&mon->qmp_queue_lock); + if (req_obj->req) { + QDict *qdict =3D qobject_to(QDict, req_obj->req); + QObject *id =3D qdict ? qdict_get(qdict, "id") : NULL; + trace_monitor_qmp_cmd_in_band(qobject_get_try_str(id) ?: ""); + monitor_qmp_dispatch(mon, req_obj->req); + } else { + assert(req_obj->err); + rsp =3D qmp_error_response(req_obj->err); + req_obj->err =3D NULL; + monitor_qmp_respond(mon, rsp); + qobject_unref(rsp); + } + + if (need_resume) { + /* Pairs with the monitor_suspend() in handle_qmp_command() */ + monitor_resume(&mon->common); + } + qmp_request_free(req_obj); + + /* + * Yield and reschedule so the main loop stays responsive. + * + * Move back to iohandler_ctx so that nested event loops for + * qemu_aio_context don't start new monitor commands. + */ + aio_co_schedule(iohandler_get_aio_context(), qmp_dispatcher_co); + qemu_coroutine_yield(); + } } =20 static void handle_qmp_command(void *opaque, QObject *req, Error *err) @@ -303,7 +363,9 @@ static void handle_qmp_command(void *opaque, QObject *r= eq, Error *err) qemu_mutex_unlock(&mon->qmp_queue_lock); =20 /* Kick the dispatcher routine */ - qemu_bh_schedule(qmp_dispatcher_bh); + if (!qatomic_xchg(&qmp_dispatcher_co_busy, true)) { + aio_co_wake(qmp_dispatcher_co); + } } =20 static void monitor_qmp_read(void *opaque, const uint8_t *buf, int size) diff --git a/qapi/qmp-dispatch.c b/qapi/qmp-dispatch.c index 5677ba92ca..9a2d7dd29a 100644 --- a/qapi/qmp-dispatch.c +++ b/qapi/qmp-dispatch.c @@ -12,12 +12,16 @@ */ =20 #include "qemu/osdep.h" + +#include "block/aio.h" #include "qapi/error.h" #include "qapi/qmp/dispatch.h" #include "qapi/qmp/qdict.h" #include "qapi/qmp/qjson.h" #include "sysemu/runstate.h" #include "qapi/qmp/qbool.h" +#include "qemu/coroutine.h" +#include "qemu/main-loop.h" =20 static QDict *qmp_dispatch_check_obj(QDict *dict, bool allow_oob, Error **errp) @@ -88,6 +92,30 @@ bool qmp_is_oob(const QDict *dict) && !qdict_haskey(dict, "execute"); } =20 +typedef struct QmpDispatchBH { + const QmpCommand *cmd; + Monitor *cur_mon; + QDict *args; + QObject **ret; + Error **errp; + Coroutine *co; +} QmpDispatchBH; + +static void do_qmp_dispatch_bh(void *opaque) +{ + QmpDispatchBH *data =3D opaque; + + assert(monitor_cur() =3D=3D NULL); + monitor_set_cur(qemu_coroutine_self(), data->cur_mon); + data->cmd->fn(data->args, data->ret, data->errp); + monitor_set_cur(qemu_coroutine_self(), NULL); + aio_co_wake(data->co); +} + +/* + * Runs outside of coroutine context for OOB commands, but in coroutine + * context for everything else. + */ QDict *qmp_dispatch(const QmpCommandList *cmds, QObject *request, bool allow_oob, Monitor *cur_mon) { @@ -153,12 +181,39 @@ QDict *qmp_dispatch(const QmpCommandList *cmds, QObje= ct *request, qobject_ref(args); } =20 + assert(!(oob && qemu_in_coroutine())); assert(monitor_cur() =3D=3D NULL); - monitor_set_cur(qemu_coroutine_self(), cur_mon); + if (!!(cmd->options & QCO_COROUTINE) =3D=3D qemu_in_coroutine()) { + monitor_set_cur(qemu_coroutine_self(), cur_mon); + cmd->fn(args, &ret, &err); + monitor_set_cur(qemu_coroutine_self(), NULL); + } else { + /* + * Actual context doesn't match the one the command needs. + * + * Case 1: we are in coroutine context, but command does not + * have QCO_COROUTINE. We need to drop out of coroutine + * context for executing it. + * + * Case 2: we are outside coroutine context, but command has + * QCO_COROUTINE. Can't actually happen, because we get here + * outside coroutine context only when executing a command + * out of band, and OOB commands never have QCO_COROUTINE. + */ + assert(!oob && qemu_in_coroutine() && !(cmd->options & QCO_COROUTI= NE)); =20 - cmd->fn(args, &ret, &err); - - monitor_set_cur(qemu_coroutine_self(), NULL); + QmpDispatchBH data =3D { + .cur_mon =3D cur_mon, + .cmd =3D cmd, + .args =3D args, + .ret =3D &ret, + .errp =3D &err, + .co =3D qemu_coroutine_self(), + }; + aio_bh_schedule_oneshot(qemu_get_aio_context(), do_qmp_dispatch_bh, + &data); + qemu_coroutine_yield(); + } qobject_unref(args); if (err) { /* or assert(!ret) after reviewing all handlers: */ diff --git a/qapi/qmp-registry.c b/qapi/qmp-registry.c index d0f9a1d3e3..58c65b5052 100644 --- a/qapi/qmp-registry.c +++ b/qapi/qmp-registry.c @@ -20,6 +20,9 @@ void qmp_register_command(QmpCommandList *cmds, const cha= r *name, { QmpCommand *cmd =3D g_malloc0(sizeof(*cmd)); =20 + /* QCO_COROUTINE and QCO_ALLOW_OOB are incompatible for now */ + assert(!((options & QCO_COROUTINE) && (options & QCO_ALLOW_OOB))); + cmd->name =3D name; cmd->fn =3D fn; cmd->enabled =3D true; diff --git a/util/aio-posix.c b/util/aio-posix.c index 280f27bb99..30f5354b1e 100644 --- a/util/aio-posix.c +++ b/util/aio-posix.c @@ -15,6 +15,7 @@ =20 #include "qemu/osdep.h" #include "block/block.h" +#include "qemu/main-loop.h" #include "qemu/rcu.h" #include "qemu/rcu_queue.h" #include "qemu/sockets.h" @@ -558,8 +559,13 @@ bool aio_poll(AioContext *ctx, bool blocking) * There cannot be two concurrent aio_poll calls for the same AioConte= xt (or * an aio_poll concurrent with a GSource prepare/check/dispatch callba= ck). * We rely on this below to avoid slow locked accesses to ctx->notify_= me. + * + * aio_poll() may only be called in the AioContext's thread. iohandler= _ctx + * is special in that it runs in the main thread, but that thread's co= ntext + * is qemu_aio_context. */ - assert(in_aio_context_home_thread(ctx)); + assert(in_aio_context_home_thread(ctx =3D=3D iohandler_get_aio_context= () ? + qemu_get_aio_context() : ctx)); =20 qemu_lockcnt_inc(&ctx->list_lock); =20 --=20 2.26.2 From nobody Sun Nov 16 23:02:10 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1602226081; cv=none; d=zohomail.com; s=zohoarc; b=UVIXc+pIVRToY1BHLcgKZFdfy9hBMHf8S86rVuaqB4/a2vGgbtPGeZjbdNgkcpHyYEEKX7Q7NOy2mawB+S3PjQmVv2J5k9/lvKZ+7uqBOHenmdjYii36mQQiYocZHD7hDmFEPu5aezY3UALuBql88CbjgsNXunvurtgz7QntjXc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1602226081; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=zz4qRsPQbPWt3nzBjUYvlC1ssuN6ZIeeCpWSOlSMJG8=; b=Fsc3j/zjekKVtum7KoBsZv70eiiPlg3dLX4Z1Zd4b4y0unj0KYMSCN6J9WsyijHeTEzaRGbxR9KY+Xpf42muE2dNbetBJlDYfBEXuLBk4SVTtBDKPHOUc3ujQCmd6qcEyl2KukU8RcZX+bIm0CeZycS9616rAyOt/APCvz9DEho= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 160222608172421.188583358316464; Thu, 8 Oct 2020 23:48:01 -0700 (PDT) Received: from localhost ([::1]:47116 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kQmC8-0006ZZ-FV for importer@patchew.org; Fri, 09 Oct 2020 02:48:00 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53978) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kQlzO-0002F8-Qq for qemu-devel@nongnu.org; Fri, 09 Oct 2020 02:34:51 -0400 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:54171) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kQlzK-0008Vn-CU for qemu-devel@nongnu.org; Fri, 09 Oct 2020 02:34:50 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-453-1-SeK0ooP7qbF0_s45x6sw-1; Fri, 09 Oct 2020 02:34:43 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id ED064101FFA7 for ; Fri, 9 Oct 2020 06:34:42 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-112-182.ams2.redhat.com [10.36.112.182]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 1FA406EF6A; Fri, 9 Oct 2020 06:34:39 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 2403F1129C4C; Fri, 9 Oct 2020 08:34:33 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1602225285; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=zz4qRsPQbPWt3nzBjUYvlC1ssuN6ZIeeCpWSOlSMJG8=; b=PI4r+gajFhS/79y47lzokNzDlsDgJjFnY4FqId3m4WXjHyVf3sBCi0SNTXeiuA6YhRoyl5 3Mu2nY+z5b0DnkCBD8qHm2CjxcbdFjNvIAXSbt3MriEgR53w4IWdmwOaRCXzyTOxcAvm4K ah732zp6uHt76G7zxbq6Txk7AnsIp7g= X-MC-Unique: 1-SeK0ooP7qbF0_s45x6sw-1 From: Markus Armbruster To: qemu-devel@nongnu.org Subject: [PULL 10/14] hmp: Add support for coroutine command handlers Date: Fri, 9 Oct 2020 08:34:28 +0200 Message-Id: <20201009063432.303441-11-armbru@redhat.com> In-Reply-To: <20201009063432.303441-1-armbru@redhat.com> References: <20201009063432.303441-1-armbru@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=armbru@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=216.205.24.124; envelope-from=armbru@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/10/09 02:34:37 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, "Dr . David Alan Gilbert" , Stefan Hajnoczi Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" From: Kevin Wolf Often, QMP command handlers are not only called to handle QMP commands, but also from a corresponding HMP command handler. In order to give them a consistent environment, optionally run HMP command handlers in a coroutine, too. The implementation is a lot simpler than in QMP because for HMP, we still block the VM while the coroutine is running. Signed-off-by: Kevin Wolf Reviewed-by: Dr. David Alan Gilbert Message-Id: <20201005155855.256490-11-kwolf@redhat.com> Reviewed-by: Markus Armbruster Reviewed-by: Stefan Hajnoczi Signed-off-by: Markus Armbruster --- docs/devel/qapi-code-gen.txt | 4 ++-- monitor/monitor-internal.h | 1 + monitor/hmp.c | 37 +++++++++++++++++++++++++++++++----- 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/docs/devel/qapi-code-gen.txt b/docs/devel/qapi-code-gen.txt index 4a41e36a75..c6438c6aa9 100644 --- a/docs/devel/qapi-code-gen.txt +++ b/docs/devel/qapi-code-gen.txt @@ -617,8 +617,8 @@ pitfalls are: =20 Since the command handler may assume coroutine context, any callers other than the QMP dispatcher must also call it in coroutine context. -In particular, HMP commands calling such a QMP command handler must -enter coroutine context before calling the handler. +In particular, HMP commands calling such a QMP command handler must be +marked .coroutine =3D true in hmp-commands.hx. =20 It is an error to specify both 'coroutine': true and 'allow-oob': true for a command. We don't currently have a use case for both together and diff --git a/monitor/monitor-internal.h b/monitor/monitor-internal.h index b55d6df07f..ad2e64be13 100644 --- a/monitor/monitor-internal.h +++ b/monitor/monitor-internal.h @@ -74,6 +74,7 @@ typedef struct HMPCommand { const char *help; const char *flags; /* p=3Dpreconfig */ void (*cmd)(Monitor *mon, const QDict *qdict); + bool coroutine; /* * @sub_table is a list of 2nd level of commands. If it does not exist, * cmd should be used. If it exists, sub_table[?].cmd should be diff --git a/monitor/hmp.c b/monitor/hmp.c index abaf939b2d..c5cd9d372b 100644 --- a/monitor/hmp.c +++ b/monitor/hmp.c @@ -1056,12 +1056,26 @@ fail: return NULL; } =20 +typedef struct HandleHmpCommandCo { + Monitor *mon; + const HMPCommand *cmd; + QDict *qdict; + bool done; +} HandleHmpCommandCo; + +static void handle_hmp_command_co(void *opaque) +{ + HandleHmpCommandCo *data =3D opaque; + data->cmd->cmd(data->mon, data->qdict); + monitor_set_cur(qemu_coroutine_self(), NULL); + data->done =3D true; +} + void handle_hmp_command(MonitorHMP *mon, const char *cmdline) { QDict *qdict; const HMPCommand *cmd; const char *cmd_start =3D cmdline; - Monitor *old_mon; =20 trace_handle_hmp_command(mon, cmdline); =20 @@ -1080,10 +1094,23 @@ void handle_hmp_command(MonitorHMP *mon, const char= *cmdline) return; } =20 - /* old_mon is non-NULL when called from qmp_human_monitor_command() */ - old_mon =3D monitor_set_cur(qemu_coroutine_self(), &mon->common); - cmd->cmd(&mon->common, qdict); - monitor_set_cur(qemu_coroutine_self(), old_mon); + if (!cmd->coroutine) { + /* old_mon is non-NULL when called from qmp_human_monitor_command(= ) */ + Monitor *old_mon =3D monitor_set_cur(qemu_coroutine_self(), &mon->= common); + cmd->cmd(&mon->common, qdict); + monitor_set_cur(qemu_coroutine_self(), old_mon); + } else { + HandleHmpCommandCo data =3D { + .mon =3D &mon->common, + .cmd =3D cmd, + .qdict =3D qdict, + .done =3D false, + }; + Coroutine *co =3D qemu_coroutine_create(handle_hmp_command_co, &da= ta); + monitor_set_cur(co, &mon->common); + aio_co_enter(qemu_get_aio_context(), co); + AIO_WAIT_WHILE(qemu_get_aio_context(), !data.done); + } =20 qobject_unref(qdict); } --=20 2.26.2 From nobody Sun Nov 16 23:02:10 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1602226463; cv=none; d=zohomail.com; s=zohoarc; b=WFlP/VY0fBxZ7o4/g/UvVDo3tir/p6YyP1/PQ5EPl8WT0ZN167Pwgb14pXjUIfxGSNxXgsC/E27m6JnJDwKjayxQZLIEBzhXU/4xku3RDnL7/5yu+HAMe8Axg7KMlaaPq7x1NgXnywoBCcpoeSQS0KPE/VhQHDAjb/wiPbGjVZo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1602226463; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=NwBaSYBB/sxiJzmlg84ife1ZA83qDiOPiyoHyauG2Lw=; b=LLhu7cBIdIDGBRUpT5LBJnUIDVCB4ueZ/ABfcOs65crxHZ69bZDiVbnE1P30QjE6AjdIbd+c1nGCTF9BZXd7+SMAC0+77fLuWtfk99/ie2rq0o3D5pXxZ1ltAx3egcF25y1/KjeBs+G0UHoK0HFlEjJsY/LhAiKivVmlfS5C5gM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1602226463227895.5857862119032; Thu, 8 Oct 2020 23:54:23 -0700 (PDT) Received: from localhost ([::1]:35984 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kQmIH-0005lC-MC for importer@patchew.org; Fri, 09 Oct 2020 02:54:21 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53974) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kQlzN-00029q-3q for qemu-devel@nongnu.org; Fri, 09 Oct 2020 02:34:49 -0400 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:58648) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kQlzJ-0008Vd-Ld for qemu-devel@nongnu.org; Fri, 09 Oct 2020 02:34:48 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-513-2qxebLqAMyue0duwd84OKA-1; Fri, 09 Oct 2020 02:34:43 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 6178885B686 for ; Fri, 9 Oct 2020 06:34:42 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-112-182.ams2.redhat.com [10.36.112.182]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 71C835D9F3; Fri, 9 Oct 2020 06:34:39 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 272F41129C66; Fri, 9 Oct 2020 08:34:33 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1602225285; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=NwBaSYBB/sxiJzmlg84ife1ZA83qDiOPiyoHyauG2Lw=; b=iIARToMLqqMh5c+qvWAKiolWpJ2TQWW+CqWi6lRBuOxMMPMv3uxmL7ziel6PzgdvgYEw7b GX40JwJZ1KlDN1yBAn4WubanwTXn18r5jS1on5SatG2vsr9Tq0UxWmo6UY9J+srMg4h5Ni Jh8+sugPWvr0LTI+4hSfDC7LTG1zRTA= X-MC-Unique: 2qxebLqAMyue0duwd84OKA-1 From: Markus Armbruster To: qemu-devel@nongnu.org Subject: [PULL 11/14] util/async: Add aio_co_reschedule_self() Date: Fri, 9 Oct 2020 08:34:29 +0200 Message-Id: <20201009063432.303441-12-armbru@redhat.com> In-Reply-To: <20201009063432.303441-1-armbru@redhat.com> References: <20201009063432.303441-1-armbru@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=armbru@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=216.205.24.124; envelope-from=armbru@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/10/09 02:34:37 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, Stefan Hajnoczi Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" From: Kevin Wolf Add a function that can be used to move the currently running coroutine to a different AioContext (and therefore potentially a different thread). Signed-off-by: Kevin Wolf Reviewed-by: Stefan Hajnoczi Message-Id: <20201005155855.256490-12-kwolf@redhat.com> Reviewed-by: Markus Armbruster Reviewed-by: Stefan Hajnoczi Signed-off-by: Markus Armbruster --- include/block/aio.h | 10 ++++++++++ util/async.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/include/block/aio.h b/include/block/aio.h index ec8c5af642..5f342267d5 100644 --- a/include/block/aio.h +++ b/include/block/aio.h @@ -17,6 +17,7 @@ #ifdef CONFIG_LINUX_IO_URING #include #endif +#include "qemu/coroutine.h" #include "qemu/queue.h" #include "qemu/event_notifier.h" #include "qemu/thread.h" @@ -654,6 +655,15 @@ static inline bool aio_node_check(AioContext *ctx, boo= l is_external) */ void aio_co_schedule(AioContext *ctx, struct Coroutine *co); =20 +/** + * aio_co_reschedule_self: + * @new_ctx: the new context + * + * Move the currently running coroutine to new_ctx. If the coroutine is al= ready + * running in new_ctx, do nothing. + */ +void coroutine_fn aio_co_reschedule_self(AioContext *new_ctx); + /** * aio_co_wake: * @co: the coroutine diff --git a/util/async.c b/util/async.c index f758354c6a..674dbefb7c 100644 --- a/util/async.c +++ b/util/async.c @@ -569,6 +569,36 @@ void aio_co_schedule(AioContext *ctx, Coroutine *co) aio_context_unref(ctx); } =20 +typedef struct AioCoRescheduleSelf { + Coroutine *co; + AioContext *new_ctx; +} AioCoRescheduleSelf; + +static void aio_co_reschedule_self_bh(void *opaque) +{ + AioCoRescheduleSelf *data =3D opaque; + aio_co_schedule(data->new_ctx, data->co); +} + +void coroutine_fn aio_co_reschedule_self(AioContext *new_ctx) +{ + AioContext *old_ctx =3D qemu_get_current_aio_context(); + + if (old_ctx !=3D new_ctx) { + AioCoRescheduleSelf data =3D { + .co =3D qemu_coroutine_self(), + .new_ctx =3D new_ctx, + }; + /* + * We can't directly schedule the coroutine in the target context + * because this would be racy: The other thread could try to enter= the + * coroutine before it has yielded in this one. + */ + aio_bh_schedule_oneshot(old_ctx, aio_co_reschedule_self_bh, &data); + qemu_coroutine_yield(); + } +} + void aio_co_wake(struct Coroutine *co) { AioContext *ctx; --=20 2.26.2 From nobody Sun Nov 16 23:02:10 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1602225874; cv=none; d=zohomail.com; s=zohoarc; b=N+Nwn/l1ViwgD4hKB6X0lrZM2utXGvs5IgEpkZuPWvq+LvS/ZSilNGvlea/SDqiv0lCrZ4Uty9xNblYZk5dn3smAyav5CSIg3apofHkmbGZTLbozoMALyci7+ww7GBhPqlbA0awD/9TgJdyC7kqZnYPgwDS/TpwmsD3+l7F765I= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1602225874; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=CLyDWMeNHpHjWrzq3YeyNor0Ou8l1NL+W3Oo+IlQZ/k=; b=Dp0kM0P79NPkIBkJzv55hv7f599D2GATtDu3wphLKcptEf4DTZTdXCNVLSgizWwr+3VfjlsE3qIQhJ8O6UFfl4Ax0t7U0hu6MwkOmQRpyoe1OljmTSgrWqIEMHpGvbRetEabozzCT7TQ54FeNVtDGrRafTYhHddZxkR8u+DjyaA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1602225874465315.2719133040455; Thu, 8 Oct 2020 23:44:34 -0700 (PDT) Received: from localhost ([::1]:41372 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kQm8n-0003w3-77 for importer@patchew.org; Fri, 09 Oct 2020 02:44:33 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53880) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kQlzI-0001yr-L3 for qemu-devel@nongnu.org; Fri, 09 Oct 2020 02:34:44 -0400 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:40290) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kQlzG-0008Up-Ts for qemu-devel@nongnu.org; Fri, 09 Oct 2020 02:34:44 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-419-yFBjsAQVN2CS4PLKWHyi_Q-1; Fri, 09 Oct 2020 02:34:40 -0400 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 mimecast-mx01.redhat.com (Postfix) with ESMTPS id 9EE9718BA2B0 for ; Fri, 9 Oct 2020 06:34:39 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-112-182.ams2.redhat.com [10.36.112.182]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 7062160BFA; Fri, 9 Oct 2020 06:34:39 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 2A5AE112993C; Fri, 9 Oct 2020 08:34:33 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1602225282; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=CLyDWMeNHpHjWrzq3YeyNor0Ou8l1NL+W3Oo+IlQZ/k=; b=jC016M4bTXNpRhYIM+dfSrxTSpMz3HhRBTjGnXgC2fyMpL13BzPNVdA17ebTcFVBdQyOLq RnYq/iggl1brtThwlIxfuJ2p7izFpyznOzT/qiJTwRWi2bQSQokiu1ujeidt22YYM8VcGk AZF+u7F8zHdRBi7wJuTz0KhnMQAKw18= X-MC-Unique: yFBjsAQVN2CS4PLKWHyi_Q-1 From: Markus Armbruster To: qemu-devel@nongnu.org Subject: [PULL 12/14] block: Add bdrv_co_enter()/leave() Date: Fri, 9 Oct 2020 08:34:30 +0200 Message-Id: <20201009063432.303441-13-armbru@redhat.com> In-Reply-To: <20201009063432.303441-1-armbru@redhat.com> References: <20201009063432.303441-1-armbru@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=armbru@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=216.205.24.124; envelope-from=armbru@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/10/09 02:34:37 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, Stefan Hajnoczi Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" From: Kevin Wolf Add a pair of functions to temporarily move the current coroutine to the AioContext of a given BlockDriverState. Signed-off-by: Kevin Wolf Message-Id: <20201005155855.256490-13-kwolf@redhat.com> Reviewed-by: Stefan Hajnoczi Signed-off-by: Markus Armbruster --- include/block/block.h | 17 +++++++++++++++++ block.c | 23 +++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/include/block/block.h b/include/block/block.h index ce2ac39299..1027c58a41 100644 --- a/include/block/block.h +++ b/include/block/block.h @@ -640,6 +640,23 @@ bool bdrv_debug_is_suspended(BlockDriverState *bs, con= st char *tag); */ AioContext *bdrv_get_aio_context(BlockDriverState *bs); =20 +/** + * Move the current coroutine to the AioContext of @bs and return the old + * AioContext of the coroutine. Increase bs->in_flight so that draining @bs + * will wait for the operation to proceed until the corresponding + * bdrv_co_leave(). + * + * Consequently, you can't call drain inside a bdrv_co_enter/leave() secti= on as + * this will deadlock. + */ +AioContext *coroutine_fn bdrv_co_enter(BlockDriverState *bs); + +/** + * Ends a section started by bdrv_co_enter(). Move the current coroutine b= ack + * to old_ctx and decrease bs->in_flight again. + */ +void coroutine_fn bdrv_co_leave(BlockDriverState *bs, AioContext *old_ctx); + /** * Transfer control to @co in the aio context of @bs */ diff --git a/block.c b/block.c index 52b2e2709f..8d9b9017d3 100644 --- a/block.c +++ b/block.c @@ -6303,6 +6303,29 @@ AioContext *bdrv_get_aio_context(BlockDriverState *b= s) return bs ? bs->aio_context : qemu_get_aio_context(); } =20 +AioContext *coroutine_fn bdrv_co_enter(BlockDriverState *bs) +{ + Coroutine *self =3D qemu_coroutine_self(); + AioContext *old_ctx =3D qemu_coroutine_get_aio_context(self); + AioContext *new_ctx; + + /* + * Increase bs->in_flight to ensure that this operation is completed b= efore + * moving the node to a different AioContext. Read new_ctx only afterw= ards. + */ + bdrv_inc_in_flight(bs); + + new_ctx =3D bdrv_get_aio_context(bs); + aio_co_reschedule_self(new_ctx); + return old_ctx; +} + +void coroutine_fn bdrv_co_leave(BlockDriverState *bs, AioContext *old_ctx) +{ + aio_co_reschedule_self(old_ctx); + bdrv_dec_in_flight(bs); +} + void bdrv_coroutine_enter(BlockDriverState *bs, Coroutine *co) { aio_co_enter(bdrv_get_aio_context(bs), co); --=20 2.26.2 From nobody Sun Nov 16 23:02:10 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1602225832; cv=none; d=zohomail.com; s=zohoarc; b=KgvTwflrmj9gbUIuJsB3IEkKFUKqof4LjjGtkiY+f+SYoL5jYDyyPThlobSpYGVUt70RBYmGp3+SPbAfEn8IzuKJRqIV8RnSd1aq6Kkzkml7z3cGwwSlaNLYFlMib3blS8Bnp7//dbaSDO/2rT/yLyR1q9nyF8FwcOBhqa36Q2Q= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1602225832; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=lyc0nP3wSxqrGG1ZvIQufgDbDyfxbVgN+LU++ks7MPs=; b=OLoqyX0DSwV9L473S2xUk4UKH3h5TIv8xlAtl7v7Gk50VVf9ARFbjWQQbQw5G8G+beK4LoKv8tSFppnPhgy/OtvdKr37YaDJ4C5gkY6zEnxFRog9+D1OGeNx8QmxIq+5PHCep7vVZT1DqZRjvF7FY1/b2qCrlavcJHimPc2i6G4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1602225832324767.8477784011067; Thu, 8 Oct 2020 23:43:52 -0700 (PDT) Received: from localhost ([::1]:38676 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kQm86-0002nf-Nf for importer@patchew.org; Fri, 09 Oct 2020 02:43:50 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53976) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kQlzN-0002BD-He for qemu-devel@nongnu.org; Fri, 09 Oct 2020 02:34:49 -0400 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:54214) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kQlzK-0008Vj-BB for qemu-devel@nongnu.org; Fri, 09 Oct 2020 02:34:49 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-354-Lsvy-sakOuSYb3ervZDjzg-1; Fri, 09 Oct 2020 02:34:43 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id EE5796414A for ; Fri, 9 Oct 2020 06:34:42 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-112-182.ams2.redhat.com [10.36.112.182]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 70EE77367C; Fri, 9 Oct 2020 06:34:39 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 2DB3D1129942; Fri, 9 Oct 2020 08:34:33 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1602225285; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=lyc0nP3wSxqrGG1ZvIQufgDbDyfxbVgN+LU++ks7MPs=; b=BcuisGP1WgAE10PhC8OKoUv2IUb3icfXcmC2amV5ovJ8KMH7jR1rGwLZUjUcbt09qcc3Kt BtH/qEkTJuN6CnobTjA9T2gfMdQPhFkGyN7/CPvR0vLZ0IRf4k9Y/RI3FNHlL/dJiJlFcj h696d9E3JTSKQYIMkidJQ9qjB2hZkOY= X-MC-Unique: Lsvy-sakOuSYb3ervZDjzg-1 From: Markus Armbruster To: qemu-devel@nongnu.org Subject: [PULL 13/14] block: Add bdrv_lock()/unlock() Date: Fri, 9 Oct 2020 08:34:31 +0200 Message-Id: <20201009063432.303441-14-armbru@redhat.com> In-Reply-To: <20201009063432.303441-1-armbru@redhat.com> References: <20201009063432.303441-1-armbru@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=armbru@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=63.128.21.124; envelope-from=armbru@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/10/09 02:34:40 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, Stefan Hajnoczi Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" From: Kevin Wolf Inside of coroutine context, we can't directly use aio_context_acquire() for the AioContext of a block node because we already own the lock of the current AioContext and we need to avoid double locking to prevent deadlocks. This provides helper functions to lock the AioContext of a node only if it's not the same as the current AioContext. Signed-off-by: Kevin Wolf Message-Id: <20201005155855.256490-14-kwolf@redhat.com> Reviewed-by: Stefan Hajnoczi Signed-off-by: Markus Armbruster --- include/block/block.h | 14 ++++++++++++++ block.c | 27 +++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/include/block/block.h b/include/block/block.h index 1027c58a41..d16c401cb4 100644 --- a/include/block/block.h +++ b/include/block/block.h @@ -657,6 +657,20 @@ AioContext *coroutine_fn bdrv_co_enter(BlockDriverStat= e *bs); */ void coroutine_fn bdrv_co_leave(BlockDriverState *bs, AioContext *old_ctx); =20 +/** + * Locks the AioContext of @bs if it's not the current AioContext. This av= oids + * double locking which could lead to deadlocks: This is a coroutine_fn, s= o we + * know we already own the lock of the current AioContext. + * + * May only be called in the main thread. + */ +void coroutine_fn bdrv_co_lock(BlockDriverState *bs); + +/** + * Unlocks the AioContext of @bs if it's not the current AioContext. + */ +void coroutine_fn bdrv_co_unlock(BlockDriverState *bs); + /** * Transfer control to @co in the aio context of @bs */ diff --git a/block.c b/block.c index 8d9b9017d3..430edf79bb 100644 --- a/block.c +++ b/block.c @@ -6326,6 +6326,33 @@ void coroutine_fn bdrv_co_leave(BlockDriverState *bs= , AioContext *old_ctx) bdrv_dec_in_flight(bs); } =20 +void coroutine_fn bdrv_co_lock(BlockDriverState *bs) +{ + AioContext *ctx =3D bdrv_get_aio_context(bs); + + /* In the main thread, bs->aio_context won't change concurrently */ + assert(qemu_get_current_aio_context() =3D=3D qemu_get_aio_context()); + + /* + * We're in coroutine context, so we already hold the lock of the main + * loop AioContext. Don't lock it twice to avoid deadlocks. + */ + assert(qemu_in_coroutine()); + if (ctx !=3D qemu_get_aio_context()) { + aio_context_acquire(ctx); + } +} + +void coroutine_fn bdrv_co_unlock(BlockDriverState *bs) +{ + AioContext *ctx =3D bdrv_get_aio_context(bs); + + assert(qemu_in_coroutine()); + if (ctx !=3D qemu_get_aio_context()) { + aio_context_release(ctx); + } +} + void bdrv_coroutine_enter(BlockDriverState *bs, Coroutine *co) { aio_co_enter(bdrv_get_aio_context(bs), co); --=20 2.26.2 From nobody Sun Nov 16 23:02:10 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1602226152; cv=none; d=zohomail.com; s=zohoarc; b=cAEZbPNLhr87la1vwz8Pc2LNhCxdntTN/1EU/XLU5/aljdUha4N34rvTLaaKJ+iZMh+3bEs4TvyE7wiUubbspV7YoiAmb5Bfq9C8CNzFVYyDr+5lm10jjACPksPCNZ5dDZS/MMzbSBa6fbhHNqFbTX7tgEOTIcQSt38wx6oYoYE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1602226152; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=1klNddQ1EsfOTyg/MTQM8HmrEtFuJAGy9UnFoQNHaWg=; b=dI3eh8iCPSk1quV3rtq7u75nHNbM6e543kAysVxnBugs3KYurem4LHLXdMcLJ2AEY2dh3nVlUFJoWadR8xsIFi2d9bDNciJXd6W7jQQ+ByDL9QgFYT4XHZuo2kSWzfvS4Olyta46V/rrTVM9vO9znj+Mwnxd+d4NzIrbHLK71V0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1602226152583764.9724722045793; Thu, 8 Oct 2020 23:49:12 -0700 (PDT) Received: from localhost ([::1]:49826 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kQmDH-0007o0-6W for importer@patchew.org; Fri, 09 Oct 2020 02:49:11 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53888) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kQlzJ-00020D-3j for qemu-devel@nongnu.org; Fri, 09 Oct 2020 02:34:45 -0400 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:39689) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kQlzG-0008Uk-Sf for qemu-devel@nongnu.org; Fri, 09 Oct 2020 02:34:44 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-417-HxTe5YqoPGmvbPbEfoZdFA-1; Fri, 09 Oct 2020 02:34:40 -0400 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id A4F7D80B71D for ; Fri, 9 Oct 2020 06:34:39 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-112-182.ams2.redhat.com [10.36.112.182]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 7128A10013C1; Fri, 9 Oct 2020 06:34:39 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 384F11129947; Fri, 9 Oct 2020 08:34:33 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1602225282; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=1klNddQ1EsfOTyg/MTQM8HmrEtFuJAGy9UnFoQNHaWg=; b=Mcv7WMXbZ/oxtdanEsQ13/A9VKL89QLR0B23xwFRoMf9CZcr6RHsXSP47HWX5+WlZA73ct rvg51yqdAvjuLdWPR2RufRfJWgkO8Wn/hxjdKEC/Hx9ggMfn9jxmXsHwa8iklK+ikFh0Au 4KLup7iMH3xgzimu0qxV4TGt+AReTRQ= X-MC-Unique: HxTe5YqoPGmvbPbEfoZdFA-1 From: Markus Armbruster To: qemu-devel@nongnu.org Subject: [PULL 14/14] block: Convert 'block_resize' to coroutine Date: Fri, 9 Oct 2020 08:34:32 +0200 Message-Id: <20201009063432.303441-15-armbru@redhat.com> In-Reply-To: <20201009063432.303441-1-armbru@redhat.com> References: <20201009063432.303441-1-armbru@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=armbru@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=216.205.24.124; envelope-from=armbru@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/10/09 02:34:37 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, Stefan Hajnoczi Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" From: Kevin Wolf block_resize performs some I/O that could potentially take quite some time, so use it as an example for the new 'coroutine': true annotation in the QAPI schema. bdrv_truncate() requires that we're already in the right AioContext for the BlockDriverState if called in coroutine context. So instead of just taking the AioContext lock, move the QMP handler coroutine to the context. Call blk_unref() only after switching back because blk_unref() may only be called in the main thread. Signed-off-by: Kevin Wolf Message-Id: <20201005155855.256490-15-kwolf@redhat.com> Reviewed-by: Stefan Hajnoczi Signed-off-by: Markus Armbruster --- qapi/block-core.json | 3 ++- blockdev.c | 16 ++++++++-------- hmp-commands.hx | 1 + 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/qapi/block-core.json b/qapi/block-core.json index 3758ea9912..ee5ebef7f2 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json @@ -1310,7 +1310,8 @@ { 'command': 'block_resize', 'data': { '*device': 'str', '*node-name': 'str', - 'size': 'int' } } + 'size': 'int' }, + 'coroutine': true } =20 ## # @NewImageMode: diff --git a/blockdev.c b/blockdev.c index a6ae475dac..fe6fb5dc1d 100644 --- a/blockdev.c +++ b/blockdev.c @@ -2449,14 +2449,14 @@ BlockDirtyBitmapSha256 *qmp_x_debug_block_dirty_bit= map_sha256(const char *node, return ret; } =20 -void qmp_block_resize(bool has_device, const char *device, - bool has_node_name, const char *node_name, - int64_t size, Error **errp) +void coroutine_fn qmp_block_resize(bool has_device, const char *device, + bool has_node_name, const char *node_na= me, + int64_t size, Error **errp) { Error *local_err =3D NULL; BlockBackend *blk =3D NULL; BlockDriverState *bs; - AioContext *aio_context; + AioContext *old_ctx; =20 bs =3D bdrv_lookup_bs(has_device ? device : NULL, has_node_name ? node_name : NULL, @@ -2466,9 +2466,6 @@ void qmp_block_resize(bool has_device, const char *de= vice, return; } =20 - aio_context =3D bdrv_get_aio_context(bs); - aio_context_acquire(aio_context); - if (size < 0) { error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "size", "a >0 size"= ); goto out; @@ -2485,12 +2482,15 @@ void qmp_block_resize(bool has_device, const char *= device, } =20 bdrv_drained_begin(bs); + old_ctx =3D bdrv_co_enter(bs); blk_truncate(blk, size, false, PREALLOC_MODE_OFF, 0, errp); + bdrv_co_leave(bs, old_ctx); bdrv_drained_end(bs); =20 out: + bdrv_co_lock(bs); blk_unref(blk); - aio_context_release(aio_context); + bdrv_co_unlock(bs); } =20 void qmp_block_stream(bool has_job_id, const char *job_id, const char *dev= ice, diff --git a/hmp-commands.hx b/hmp-commands.hx index e43ce600b8..cd068389de 100644 --- a/hmp-commands.hx +++ b/hmp-commands.hx @@ -76,6 +76,7 @@ ERST .params =3D "device size", .help =3D "resize a block image", .cmd =3D hmp_block_resize, + .coroutine =3D true, }, =20 SRST --=20 2.26.2