From nobody Mon Feb 9 01:16:58 2026 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=yandex-team.ru Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1636969486246263.5132221934098; Mon, 15 Nov 2021 01:44:46 -0800 (PST) Received: from localhost ([::1]:46454 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mmYXd-0002vx-8T for importer@patchew.org; Mon, 15 Nov 2021 04:44:45 -0500 Received: from eggs.gnu.org ([209.51.188.92]:38256) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mmYV4-0000IO-H2 for qemu-devel@nongnu.org; Mon, 15 Nov 2021 04:42:06 -0500 Received: from forwardcorp1j.mail.yandex.net ([5.45.199.163]:53710) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mmYUy-0003Up-DX for qemu-devel@nongnu.org; Mon, 15 Nov 2021 04:42:04 -0500 Received: from iva8-d2cd82b7433e.qloud-c.yandex.net (iva8-d2cd82b7433e.qloud-c.yandex.net [IPv6:2a02:6b8:c0c:a88e:0:640:d2cd:82b7]) by forwardcorp1j.mail.yandex.net (Yandex) with ESMTP id 3AFC32E0462; Mon, 15 Nov 2021 12:41:54 +0300 (MSK) Received: from myt6-10e59078d438.qloud-c.yandex.net (myt6-10e59078d438.qloud-c.yandex.net [2a02:6b8:c12:5209:0:640:10e5:9078]) by iva8-d2cd82b7433e.qloud-c.yandex.net (mxbackcorp/Yandex) with ESMTP id aQLUYEobOW-frsqMZeB; Mon, 15 Nov 2021 12:41:54 +0300 Received: from den-plotnikov-w.yandex-team.ru (dynamic-vpn.dhcp.yndx.net [2a02:6b8:b081:8016::1:27]) by myt6-10e59078d438.qloud-c.yandex.net (smtpcorp/Yandex) with ESMTPS id 1oVbS2CALn-frw4ZtRJ; Mon, 15 Nov 2021 12:41:53 +0300 (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (Client certificate not present) Precedence: bulk DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1636969314; bh=3INGRPaU4lFYUpZiso/dx30jieje2Eb1lFLzsE+acKA=; h=In-Reply-To:Message-Id:References:Date:Subject:To:From:Cc; b=U2T6zBJ+NGClUygHXQMloQ8VZJy17wwxMmu3AP8y5EunQK/GFjndBuFI3cjAmPuMl EreiUKcFEn140zM7MhnXc1fBf/8JiFhoxdFmIOIasi1+v2KudYc8citXJ4JT1vRQRx Q9Y2L5xV9Y3MvQxkNyQjdw5zNimKxKoZFv1EU2kw= Authentication-Results: iva8-d2cd82b7433e.qloud-c.yandex.net; dkim=pass header.i=@yandex-team.ru X-Yandex-Fwd: 2 From: Denis Plotnikov To: qemu-devel@nongnu.org Subject: [PATCH v1 1/2] monitor: move monitor destruction to the very end of qemu cleanup Date: Mon, 15 Nov 2021 12:41:42 +0300 Message-Id: <20211115094143.157399-2-den-plotnikov@yandex-team.ru> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20211115094143.157399-1-den-plotnikov@yandex-team.ru> References: <20211115094143.157399-1-den-plotnikov@yandex-team.ru> MIME-Version: 1.0 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=5.45.199.163; envelope-from=den-plotnikov@yandex-team.ru; helo=forwardcorp1j.mail.yandex.net 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, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, 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.29 List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: pbonzini@redhat.com, dgilbert@redhat.com, yc-core@yandex-team.ru, armbru@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1636969488642100001 Content-Type: text/plain; charset="utf-8" This is needed to keep sending DEVICE_DELETED events on qemu cleanup. The event may happen in the rcu thread and we're going to flush the rcu que= ue explicitly before qemu exiting in the next patch. So move the monitor destruction to the very end of qemu cleanup to be able to send all the even= ts. Signed-off-by: Denis Plotnikov --- monitor/monitor.c | 6 ++++++ softmmu/runstate.c | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/monitor/monitor.c b/monitor/monitor.c index 21c7a68758f5..b04ae4850db2 100644 --- a/monitor/monitor.c +++ b/monitor/monitor.c @@ -605,11 +605,17 @@ void monitor_data_init(Monitor *mon, bool is_qmp, boo= l skip_flush, mon->outbuf =3D g_string_new(NULL); mon->skip_flush =3D skip_flush; mon->use_io_thread =3D use_io_thread; + /* + * take an extra ref to prevent monitor's chardev + * from destroying in qemu_chr_cleanup() + */ + object_ref(OBJECT(mon->chr.chr)); } =20 void monitor_data_destroy(Monitor *mon) { g_free(mon->mon_cpu_path); + object_unref(OBJECT(mon->chr.chr)); qemu_chr_fe_deinit(&mon->chr, false); if (monitor_is_qmp(mon)) { monitor_data_destroy_qmp(container_of(mon, MonitorQMP, common)); diff --git a/softmmu/runstate.c b/softmmu/runstate.c index 10d9b7365aa7..8d29dd2c00e2 100644 --- a/softmmu/runstate.c +++ b/softmmu/runstate.c @@ -819,8 +819,8 @@ void qemu_cleanup(void) tpm_cleanup(); net_cleanup(); audio_cleanup(); - monitor_cleanup(); qemu_chr_cleanup(); user_creatable_cleanup(); + monitor_cleanup(); /* TODO: unref root container, check all devices are ok */ } --=20 2.25.1 From nobody Mon Feb 9 01:16:58 2026 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=yandex-team.ru Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1636969467778540.3382770357755; Mon, 15 Nov 2021 01:44:27 -0800 (PST) Received: from localhost ([::1]:46156 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mmYXK-0002kA-Gw for importer@patchew.org; Mon, 15 Nov 2021 04:44:26 -0500 Received: from eggs.gnu.org ([209.51.188.92]:38248) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mmYV2-0000I9-1b for qemu-devel@nongnu.org; Mon, 15 Nov 2021 04:42:04 -0500 Received: from forwardcorp1p.mail.yandex.net ([77.88.29.217]:57514) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mmYUy-0003Uq-DY for qemu-devel@nongnu.org; Mon, 15 Nov 2021 04:42:02 -0500 Received: from sas1-4cbebe29391b.qloud-c.yandex.net (sas1-4cbebe29391b.qloud-c.yandex.net [IPv6:2a02:6b8:c08:789:0:640:4cbe:be29]) by forwardcorp1p.mail.yandex.net (Yandex) with ESMTP id 26DF92E0A2C; Mon, 15 Nov 2021 12:41:55 +0300 (MSK) Received: from myt6-10e59078d438.qloud-c.yandex.net (myt6-10e59078d438.qloud-c.yandex.net [2a02:6b8:c12:5209:0:640:10e5:9078]) by sas1-4cbebe29391b.qloud-c.yandex.net (mxbackcorp/Yandex) with ESMTP id 9qoVj7sgfN-fssObqAM; Mon, 15 Nov 2021 12:41:55 +0300 Received: from den-plotnikov-w.yandex-team.ru (dynamic-vpn.dhcp.yndx.net [2a02:6b8:b081:8016::1:27]) by myt6-10e59078d438.qloud-c.yandex.net (smtpcorp/Yandex) with ESMTPS id 1oVbS2CALn-fsw4Tomv; Mon, 15 Nov 2021 12:41:54 +0300 (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (Client certificate not present) Precedence: bulk DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1636969315; bh=3kiwD/t2GjiTMDtVtYiHujmyCLuy/WmBdmnj7Nqa41s=; h=In-Reply-To:Message-Id:References:Date:Subject:To:From:Cc; b=igVSc6HsiHR4euEY07OdBLhqjKWbPgPqpJuaghuQ04aT2eZ2a0UcC2X+R142i5TvA dVLB0CYS6YBSusvVbn18NfUpRtQURsriI9NxyjvvvzHyu5pOEGFwILGJls1yhxVvw4 AolL+rv9fhlDW43hSGJ9sShaQHlpEH8ggRUZ84kc= Authentication-Results: sas1-4cbebe29391b.qloud-c.yandex.net; dkim=pass header.i=@yandex-team.ru X-Yandex-Fwd: 2 From: Denis Plotnikov To: qemu-devel@nongnu.org Subject: [PATCH v1 2/2] vl: flush all task from rcu queue before exiting Date: Mon, 15 Nov 2021 12:41:43 +0300 Message-Id: <20211115094143.157399-3-den-plotnikov@yandex-team.ru> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20211115094143.157399-1-den-plotnikov@yandex-team.ru> References: <20211115094143.157399-1-den-plotnikov@yandex-team.ru> MIME-Version: 1.0 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=77.88.29.217; envelope-from=den-plotnikov@yandex-team.ru; helo=forwardcorp1p.mail.yandex.net 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, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, 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.29 List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: pbonzini@redhat.com, dgilbert@redhat.com, yc-core@yandex-team.ru, armbru@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1636969469591100002 Content-Type: text/plain; charset="utf-8" The device destruction may superimpose over qemu shutdown. In this case some management layer, requested a device unplug and waiting for DEVICE_DELETED event, may never get this event. This happens because device_finalize() may never be called on qemu shutdown for some devices using address_space_destroy(). The later is called from the rcu thread. On qemu shutdown, not all rcu callbacks may be called because the rcu thread may not have enough time to converge before qemu main thread exit. To resolve this issue this patch makes rcu thread to finish all its callbac= ks explicitly by calling a new rcu intreface function right before qemu main thread exit. Signed-off-by: Denis Plotnikov --- include/qemu/rcu.h | 1 + softmmu/runstate.c | 2 ++ util/rcu.c | 12 ++++++++++++ 3 files changed, 15 insertions(+) diff --git a/include/qemu/rcu.h b/include/qemu/rcu.h index 515d327cf11c..f7fbdc3781e5 100644 --- a/include/qemu/rcu.h +++ b/include/qemu/rcu.h @@ -134,6 +134,7 @@ struct rcu_head { =20 extern void call_rcu1(struct rcu_head *head, RCUCBFunc *func); extern void drain_call_rcu(void); +extern void flush_rcu(void); =20 /* The operands of the minus operator must have the same type, * which must be the one that we specify in the cast. diff --git a/softmmu/runstate.c b/softmmu/runstate.c index 8d29dd2c00e2..3f833678f6eb 100644 --- a/softmmu/runstate.c +++ b/softmmu/runstate.c @@ -821,6 +821,8 @@ void qemu_cleanup(void) audio_cleanup(); qemu_chr_cleanup(); user_creatable_cleanup(); + /* finish all the tasks from rcu queue before exiting */ + flush_rcu(); monitor_cleanup(); /* TODO: unref root container, check all devices are ok */ } diff --git a/util/rcu.c b/util/rcu.c index 13ac0f75cb2a..f047f8ee8d16 100644 --- a/util/rcu.c +++ b/util/rcu.c @@ -348,6 +348,18 @@ void drain_call_rcu(void) =20 } =20 +/* + * This function drains rcu queue until there are no tasks to do left + * and aims to the cases when one needs to ensure that no work hang + * in rcu thread before proceeding, e.g. on qemu shutdown. + */ +void flush_rcu(void) +{ + while (qatomic_read(&rcu_call_count) > 0) { + drain_call_rcu(); + } +} + void rcu_register_thread(void) { assert(rcu_reader.ctr =3D=3D 0); --=20 2.25.1