From nobody Fri Nov 14 18:26:44 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=yandex-team.ru ARC-Seal: i=1; a=rsa-sha256; t=1760563327; cv=none; d=zohomail.com; s=zohoarc; b=ZBvfX/LgQ7XpbvOUFzT7loHZeXts8lzG2MNZD7zEQbrZYkBh1giCibKYhMQkauurUYAjWtx8yr+j15kNrd0LPCtny0fMLexMAcCWfb7UDC7KP3V6jZYI4rfDtdd0DedruuzBRqMl9Bc1D7TMjHgReIVwx11uPDHoG0AhWHL60mk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1760563327; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=vEFpAi/SJoZ1FyW5/cNP/W5tIquHEsUoHiATdJxF5jc=; b=KYURrdgmsJ8pVMDHV3aSDdsAZEz/Bw40houYP+DArQwwQMY/zj6tR8gUACs7q5T65n8fIKhRC8rtbnbGdcLdylbez9VFHwDmxR3iUdy9825vZ22G2hmqHiIZKCG8BbRahI5K36LKDTK0UDYUf+NjJ20jPM8EV0XLLjWBnLW6bsE= 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) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1760563327027584.0977462850547; Wed, 15 Oct 2025 14:22:07 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1v98vk-0004WE-Ec; Wed, 15 Oct 2025 17:21:08 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1v98vi-0004VX-Mg for qemu-devel@nongnu.org; Wed, 15 Oct 2025 17:21:06 -0400 Received: from forwardcorp1b.mail.yandex.net ([178.154.239.136]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1v98vd-0001z3-Da for qemu-devel@nongnu.org; Wed, 15 Oct 2025 17:21:06 -0400 Received: from mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net [IPv6:2a02:6b8:c21:2d8b:0:640:7d49:0]) by forwardcorp1b.mail.yandex.net (Yandex) with ESMTPS id D784B80982; Thu, 16 Oct 2025 00:20:55 +0300 (MSK) Received: from vsementsov-lin.. (unknown [2a02:6bf:8080:a94::1:15]) by mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id rKYpxt3F20U0-EAFSjlug; Thu, 16 Oct 2025 00:20:55 +0300 Precedence: bulk X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1760563255; bh=vEFpAi/SJoZ1FyW5/cNP/W5tIquHEsUoHiATdJxF5jc=; h=Cc:Message-ID:References:Date:In-Reply-To:Subject:To:From; b=Ie4LCNoSXuLJsCVTEN6CVbRVo2l6ZK/xUdq59rkGEXYgIbnLgGLHgN4R+aAuS5tKb mndZptFzA/7XemdJRG7iB6SnjManNVMrYFsZ7Z3AEdKdbkTF38VntyNYa3UKh0Eocv S7fGIMjIrKWI1ayOfHAfKJvZ2FEkKaLqVzVKOxCw= Authentication-Results: mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net; dkim=pass header.i=@yandex-team.ru From: Vladimir Sementsov-Ogievskiy To: marcandre.lureau@redhat.com Cc: pbonzini@redhat.com, berrange@redhat.com, eduardo@habkost.net, qemu-devel@nongnu.org, vsementsov@yandex-team.ru, raphael@enfabrica.net, armbru@redhat.com, yc-core@yandex-team.ru, d-tatianin@yandex-team.ru Subject: [PATCH v4 1/7] chardev/char-socket: simplify reconnect-ms handling Date: Thu, 16 Oct 2025 00:20:45 +0300 Message-ID: <20251015212051.1156334-2-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20251015212051.1156334-1-vsementsov@yandex-team.ru> References: <20251015212051.1156334-1-vsementsov@yandex-team.ru> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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=178.154.239.136; envelope-from=vsementsov@yandex-team.ru; helo=forwardcorp1b.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, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=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.29 List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @yandex-team.ru) X-ZM-MESSAGEID: 1760563330627158500 We pass it to qmp_chardev_open_socket_client() only to write to s->reconnect_time_ms. Let's simply set this field earlier, together with other options. Signed-off-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Marc-Andr=C3=A9 Lureau --- chardev/char-socket.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/chardev/char-socket.c b/chardev/char-socket.c index 62852e3caf..f3bc6290d2 100644 --- a/chardev/char-socket.c +++ b/chardev/char-socket.c @@ -1274,18 +1274,16 @@ skip_listen: =20 =20 static int qmp_chardev_open_socket_client(Chardev *chr, - int64_t reconnect_ms, Error **errp) { SocketChardev *s =3D SOCKET_CHARDEV(chr); =20 - if (reconnect_ms > 0) { - s->reconnect_time_ms =3D reconnect_ms; + if (s->reconnect_time_ms > 0) { tcp_chr_connect_client_async(chr); return 0; - } else { - return tcp_chr_connect_client_sync(chr, errp); } + + return tcp_chr_connect_client_sync(chr, errp); } =20 =20 @@ -1378,7 +1376,6 @@ static void qmp_chardev_open_socket(Chardev *chr, bool is_tn3270 =3D sock->has_tn3270 ? sock->tn3270 : false; bool is_waitconnect =3D sock->has_wait ? sock->wait : false; bool is_websock =3D sock->has_websocket ? sock->websocket : false; - int64_t reconnect_ms =3D sock->has_reconnect_ms ? sock->reconnect_ms := 0; SocketAddress *addr; =20 s->is_listen =3D is_listen; @@ -1386,6 +1383,8 @@ static void qmp_chardev_open_socket(Chardev *chr, s->is_tn3270 =3D is_tn3270; s->is_websock =3D is_websock; s->do_nodelay =3D do_nodelay; + s->reconnect_time_ms =3D sock->has_reconnect_ms ? sock->reconnect_ms := 0; + if (sock->tls_creds) { Object *creds; creds =3D object_resolve_path_component( @@ -1450,7 +1449,7 @@ static void qmp_chardev_open_socket(Chardev *chr, return; } } else { - if (qmp_chardev_open_socket_client(chr, reconnect_ms, errp) < 0) { + if (qmp_chardev_open_socket_client(chr, errp) < 0) { return; } } --=20 2.48.1 From nobody Fri Nov 14 18:26:44 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=yandex-team.ru ARC-Seal: i=1; a=rsa-sha256; t=1760563320; cv=none; d=zohomail.com; s=zohoarc; b=G07PBOWimhbfeFSODYhZ+udAwgOSmnCccbJRRahz7VRkUb2DtJIHA3DKfL8ScRZL80EwAe2Bj2/fgoQGeIqVVuV6ICmcjOdQ2atRPU9v4LwcI01Nb1V0sRA8cO3AK/Vy91h8AnF82Q/LgU5NOkPcH/0nMXve7jMnmY6NkZaMbOo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1760563320; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=rSiygVaq/OKk7hWJBukWMBPr1Huyh4D+DvkeSRa44cU=; b=bMiFUIEcu9iCJIZCDHyZFVnU+zJUKUo9RqPo1mAHTKcZt9Mp4xmM3nkpG1dVtkgqi/iXo4q8jY2IWEF8LCJbHs7R/jz8cRFE+iOzPcBlGrTZ2T+Nh9AgIG14F0Zwa7ZbD01EsSjr98QsiH8yF3LOg/Hx//F/KShXRT6L+mWnlh8= 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) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1760563320394777.4582235294893; Wed, 15 Oct 2025 14:22:00 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1v98vk-0004WU-Rx; Wed, 15 Oct 2025 17:21:08 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1v98vi-0004VY-Ml for qemu-devel@nongnu.org; Wed, 15 Oct 2025 17:21:06 -0400 Received: from forwardcorp1b.mail.yandex.net ([178.154.239.136]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1v98vd-0001z7-Da for qemu-devel@nongnu.org; Wed, 15 Oct 2025 17:21:06 -0400 Received: from mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net [IPv6:2a02:6b8:c21:2d8b:0:640:7d49:0]) by forwardcorp1b.mail.yandex.net (Yandex) with ESMTPS id D21FD80E67; Thu, 16 Oct 2025 00:20:56 +0300 (MSK) Received: from vsementsov-lin.. (unknown [2a02:6bf:8080:a94::1:15]) by mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id rKYpxt3F20U0-rXlqsaYV; Thu, 16 Oct 2025 00:20:56 +0300 Precedence: bulk X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1760563256; bh=rSiygVaq/OKk7hWJBukWMBPr1Huyh4D+DvkeSRa44cU=; h=Cc:Message-ID:References:Date:In-Reply-To:Subject:To:From; b=XDzMvdiB75dT7fet9eKXVMzBlqs6cgNADYbnR7hHsuQCosfy073UOQr7dDBf+XXPi GDi4m/BcRj9qEKjAnsNzIzf/aTW82lOMhPF5c5WvTAV/tSR2DMQy156oq5yPUFAlwo 8TIXOoLLp096KVVURKMgE+cLVNc06BBswQUDvtWw= Authentication-Results: mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net; dkim=pass header.i=@yandex-team.ru From: Vladimir Sementsov-Ogievskiy To: marcandre.lureau@redhat.com Cc: pbonzini@redhat.com, berrange@redhat.com, eduardo@habkost.net, qemu-devel@nongnu.org, vsementsov@yandex-team.ru, raphael@enfabrica.net, armbru@redhat.com, yc-core@yandex-team.ru, d-tatianin@yandex-team.ru Subject: [PATCH v4 2/7] chardev/char: split chardev_init_common() out of qemu_char_open() Date: Thu, 16 Oct 2025 00:20:46 +0300 Message-ID: <20251015212051.1156334-3-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20251015212051.1156334-1-vsementsov@yandex-team.ru> References: <20251015212051.1156334-1-vsementsov@yandex-team.ru> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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=178.154.239.136; envelope-from=vsementsov@yandex-team.ru; helo=forwardcorp1b.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, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=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.29 List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @yandex-team.ru) X-ZM-MESSAGEID: 1760563326094158500 We are going to share new chardev_init_logfd() with further alternative initialization interface. Let qemu_char_open() be a wrapper for .open(), and its artifacts (handle be_opened if was not set to false by backend, and filename). Signed-off-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Marc-Andr=C3=A9 Lureau --- chardev/char.c | 50 ++++++++++++++++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 18 deletions(-) diff --git a/chardev/char.c b/chardev/char.c index a43b7e5481..4a531265c1 100644 --- a/chardev/char.c +++ b/chardev/char.c @@ -250,22 +250,6 @@ static void qemu_char_open(Chardev *chr, ChardevBacken= d *backend, bool *be_opened, Error **errp) { ChardevClass *cc =3D CHARDEV_GET_CLASS(chr); - /* Any ChardevCommon member would work */ - ChardevCommon *common =3D backend ? backend->u.null.data : NULL; - - if (common && common->logfile) { - int flags =3D O_WRONLY; - if (common->has_logappend && - common->logappend) { - flags |=3D O_APPEND; - } else { - flags |=3D O_TRUNC; - } - chr->logfd =3D qemu_create(common->logfile, flags, 0666, errp); - if (chr->logfd < 0) { - return; - } - } =20 if (cc->open) { cc->open(chr, backend, be_opened, errp); @@ -1000,6 +984,29 @@ void qemu_chr_set_feature(Chardev *chr, return set_bit(feature, chr->features); } =20 +static bool chardev_init_common(Chardev *chr, ChardevBackend *backend, + Error **errp) +{ + /* Any ChardevCommon member would work */ + ChardevCommon *common =3D backend ? backend->u.null.data : NULL; + + if (common && common->logfile) { + int flags =3D O_WRONLY; + if (common->has_logappend && + common->logappend) { + flags |=3D O_APPEND; + } else { + flags |=3D O_TRUNC; + } + chr->logfd =3D qemu_create(common->logfile, flags, 0666, errp); + if (chr->logfd < 0) { + return false; + } + } + + return true; +} + static Chardev *chardev_new(const char *id, const char *typename, ChardevBackend *backend, GMainContext *gcontext, @@ -1020,11 +1027,14 @@ static Chardev *chardev_new(const char *id, const c= har *typename, chr->label =3D g_strdup(id); chr->gcontext =3D gcontext; =20 + if (!chardev_init_common(chr, backend, errp)) { + goto fail; + } + qemu_char_open(chr, backend, &be_opened, &local_err); if (local_err) { error_propagate(errp, local_err); - object_unref(obj); - return NULL; + goto fail; } =20 if (!chr->filename) { @@ -1035,6 +1045,10 @@ static Chardev *chardev_new(const char *id, const ch= ar *typename, } =20 return chr; + +fail: + object_unref(obj); + return NULL; } =20 Chardev *qemu_chardev_new(const char *id, const char *typename, --=20 2.48.1 From nobody Fri Nov 14 18:26:44 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=yandex-team.ru ARC-Seal: i=1; a=rsa-sha256; t=1760563336; cv=none; d=zohomail.com; s=zohoarc; b=X5E3+a1ZHrXUFVXi5vxdFNFqfJYQATr0RPhp2fLArNKHczRYyTI8v+n64SpuopRWnb3vA3ZF1PdDxt4QnP71nDcdu75kew9JXTFYzLaafe9b+ZhpgBa7p5ClHiSSy8nZdqsdvzacxsp4CulW3gIvnwSWooMmNhCk1JZzOj2gCCk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1760563336; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=k697m3ndaQGNs2ve6uJCDH7RpOqwGOUv8cSc/t8jS/g=; b=Cxr+/5H9bV4pMYJmlmnd+01uvHq36Y+1Fa5n4GiTVi5YexuNtkaGprNyiKhtXSxZGrOY4As9o1OVoIy5d8mdgs+Moq6skwZBngOQNmbYs41YtTergXg5jVVy8VnqLPyZeSUMCH/i0QoTChsfKwljvEl0bFajeNF8qzG+hzMkHGc= 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) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1760563335951804.7467565619042; Wed, 15 Oct 2025 14:22:15 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1v98vl-0004Xq-OE; Wed, 15 Oct 2025 17:21:09 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1v98vj-0004Vp-08 for qemu-devel@nongnu.org; Wed, 15 Oct 2025 17:21:07 -0400 Received: from forwardcorp1b.mail.yandex.net ([178.154.239.136]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1v98vd-0001zC-GS for qemu-devel@nongnu.org; Wed, 15 Oct 2025 17:21:06 -0400 Received: from mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net [IPv6:2a02:6b8:c21:2d8b:0:640:7d49:0]) by forwardcorp1b.mail.yandex.net (Yandex) with ESMTPS id 98230880DB; Thu, 16 Oct 2025 00:20:57 +0300 (MSK) Received: from vsementsov-lin.. (unknown [2a02:6bf:8080:a94::1:15]) by mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id rKYpxt3F20U0-lqXEphi6; Thu, 16 Oct 2025 00:20:57 +0300 Precedence: bulk X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1760563257; bh=k697m3ndaQGNs2ve6uJCDH7RpOqwGOUv8cSc/t8jS/g=; h=Message-ID:Date:In-Reply-To:Cc:Subject:References:To:From; b=ChKU2VDWfj5xtua5raveuwQcbU0SPGkWsfpRVdqP/EQTfF/H2MQh38CiNvOL6pJAG G2B0g16namh06BV560AOzkBcGwd9NTip+qigrqSnnAAHEpqpdJsFYPpTgHLwoqjht5 QPLk7EQGLzLBWIvuojyskUTAlug48S1kTqxI07bo= Authentication-Results: mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net; dkim=pass header.i=@yandex-team.ru From: Vladimir Sementsov-Ogievskiy To: marcandre.lureau@redhat.com Cc: pbonzini@redhat.com, berrange@redhat.com, eduardo@habkost.net, qemu-devel@nongnu.org, vsementsov@yandex-team.ru, raphael@enfabrica.net, armbru@redhat.com, yc-core@yandex-team.ru, d-tatianin@yandex-team.ru Subject: [PATCH v4 3/7] chardev/char: qemu_char_open(): add return value Date: Thu, 16 Oct 2025 00:20:47 +0300 Message-ID: <20251015212051.1156334-4-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20251015212051.1156334-1-vsementsov@yandex-team.ru> References: <20251015212051.1156334-1-vsementsov@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=178.154.239.136; envelope-from=vsementsov@yandex-team.ru; helo=forwardcorp1b.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, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=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.29 List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @yandex-team.ru) X-ZM-MESSAGEID: 1760563342511158500 Content-Type: text/plain; charset="utf-8" Accordingly with recommendations in include/qapi/error.h accompany errp by boolean return value and get rid of error propagation. Signed-off-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Markus Armbruster --- chardev/char.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/chardev/char.c b/chardev/char.c index 4a531265c1..c874a2d31e 100644 --- a/chardev/char.c +++ b/chardev/char.c @@ -246,14 +246,20 @@ int qemu_chr_add_client(Chardev *s, int fd) CHARDEV_GET_CLASS(s)->chr_add_client(s, fd) : -1; } =20 -static void qemu_char_open(Chardev *chr, ChardevBackend *backend, +static bool qemu_char_open(Chardev *chr, ChardevBackend *backend, bool *be_opened, Error **errp) { + ERRP_GUARD(); ChardevClass *cc =3D CHARDEV_GET_CLASS(chr); =20 if (cc->open) { cc->open(chr, backend, be_opened, errp); + if (*errp) { + return false; + } } + + return true; } =20 static void char_init(Object *obj) @@ -1015,7 +1021,6 @@ static Chardev *chardev_new(const char *id, const cha= r *typename, { Object *obj; Chardev *chr =3D NULL; - Error *local_err =3D NULL; bool be_opened =3D true; =20 assert(g_str_has_prefix(typename, "chardev-")); @@ -1031,9 +1036,7 @@ static Chardev *chardev_new(const char *id, const cha= r *typename, goto fail; } =20 - qemu_char_open(chr, backend, &be_opened, &local_err); - if (local_err) { - error_propagate(errp, local_err); + if (!qemu_char_open(chr, backend, &be_opened, errp)) { goto fail; } =20 --=20 2.48.1 From nobody Fri Nov 14 18:26:44 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=yandex-team.ru ARC-Seal: i=1; a=rsa-sha256; t=1760563367; cv=none; d=zohomail.com; s=zohoarc; b=edwXXXzTN5wrCWe+bNehHrPxBhoAwou1uCnlKGDnswqdFc7KmlkeCxyVQ1P1VHV6LPOHRhDOdmHLwnSXC1B0xuFYNdfEbUf5fFxPrAGlGGjDRoO4dvbju60RfJk7+NSpM9qiMXhTXccE6vOBnXAXbbeXjApTOF2PhrfZ38afOqg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1760563367; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=mAcgyU8pWURnH1Cci2ISyWqlwVQRNioOv0+KYPy8xKQ=; b=jiKZmntTJllS46yabC4rTuGhqWhksSDYCtcr9PnIZdvqwh97qj4JwWw3vHGYwkTYelREaODolghLRsl73sFRPPLVr1H/SZzHmc104qfY5qFX+NQ1JgcjYuZW5XbO1BYQvmMFV+0gxufMhTZ9cn0e50nP96Q71ax/FB45GHDqB3w= 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) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1760563367639314.27987077727687; Wed, 15 Oct 2025 14:22:47 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1v98vl-0004Xc-Q7; Wed, 15 Oct 2025 17:21:09 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1v98vk-0004WD-3b for qemu-devel@nongnu.org; Wed, 15 Oct 2025 17:21:08 -0400 Received: from forwardcorp1b.mail.yandex.net ([2a02:6b8:c02:900:1:45:d181:df01]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1v98vd-0001zU-PT for qemu-devel@nongnu.org; Wed, 15 Oct 2025 17:21:07 -0400 Received: from mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net [IPv6:2a02:6b8:c21:2d8b:0:640:7d49:0]) by forwardcorp1b.mail.yandex.net (Yandex) with ESMTPS id 8149388438; Thu, 16 Oct 2025 00:20:58 +0300 (MSK) Received: from vsementsov-lin.. (unknown [2a02:6bf:8080:a94::1:15]) by mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id rKYpxt3F20U0-vjjJ7dYS; Thu, 16 Oct 2025 00:20:58 +0300 Precedence: bulk X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1760563258; bh=mAcgyU8pWURnH1Cci2ISyWqlwVQRNioOv0+KYPy8xKQ=; h=Cc:Message-ID:References:Date:In-Reply-To:Subject:To:From; b=dDv2NcWtq8FYgVbl9YgqsxwdZI1LfVkt6cDi6thgJKMqsU9X9qrMFCRmyZbkAMV1l CwqB43CFVy4Bfb0FHXdoupv3Mfswzf5H6abXQcsiH+qJ3aqQkoYfkdkcg7QJbxjnza Zxl7LexQjzsTHdfYZWFgX4FHLijP9w35LcnvX8ME= Authentication-Results: mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net; dkim=pass header.i=@yandex-team.ru From: Vladimir Sementsov-Ogievskiy To: marcandre.lureau@redhat.com Cc: pbonzini@redhat.com, berrange@redhat.com, eduardo@habkost.net, qemu-devel@nongnu.org, vsementsov@yandex-team.ru, raphael@enfabrica.net, armbru@redhat.com, yc-core@yandex-team.ru, d-tatianin@yandex-team.ru Subject: [PATCH v4 4/7] chardev/char: move filename and be_opened handling to qemu_char_open() Date: Thu, 16 Oct 2025 00:20:48 +0300 Message-ID: <20251015212051.1156334-5-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20251015212051.1156334-1-vsementsov@yandex-team.ru> References: <20251015212051.1156334-1-vsementsov@yandex-team.ru> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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=2a02:6b8:c02:900:1:45:d181:df01; envelope-from=vsementsov@yandex-team.ru; helo=forwardcorp1b.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: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @yandex-team.ru) X-ZM-MESSAGEID: 1760563368945158500 Absent filename and necessity to send CHR_EVENT_OPENED are artifacts of .open(). Handle them in qemu_char_open(). Signed-off-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Marc-Andr=C3=A9 Lureau --- chardev/char.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/chardev/char.c b/chardev/char.c index c874a2d31e..27290e26fb 100644 --- a/chardev/char.c +++ b/chardev/char.c @@ -247,18 +247,27 @@ int qemu_chr_add_client(Chardev *s, int fd) } =20 static bool qemu_char_open(Chardev *chr, ChardevBackend *backend, - bool *be_opened, Error **errp) + const char *default_filename, Error **errp) { ERRP_GUARD(); ChardevClass *cc =3D CHARDEV_GET_CLASS(chr); + bool be_opened =3D true; =20 if (cc->open) { - cc->open(chr, backend, be_opened, errp); + cc->open(chr, backend, &be_opened, errp); if (*errp) { return false; } } =20 + if (!chr->filename) { + chr->filename =3D g_strdup(default_filename); + } + + if (be_opened) { + qemu_chr_be_event(chr, CHR_EVENT_OPENED); + } + return true; } =20 @@ -1021,7 +1030,6 @@ static Chardev *chardev_new(const char *id, const cha= r *typename, { Object *obj; Chardev *chr =3D NULL; - bool be_opened =3D true; =20 assert(g_str_has_prefix(typename, "chardev-")); assert(id); @@ -1036,17 +1044,10 @@ static Chardev *chardev_new(const char *id, const c= har *typename, goto fail; } =20 - if (!qemu_char_open(chr, backend, &be_opened, errp)) { + if (!qemu_char_open(chr, backend, typename + 8, errp)) { goto fail; } =20 - if (!chr->filename) { - chr->filename =3D g_strdup(typename + 8); - } - if (be_opened) { - qemu_chr_be_event(chr, CHR_EVENT_OPENED); - } - return chr; =20 fail: --=20 2.48.1 From nobody Fri Nov 14 18:26:44 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=yandex-team.ru ARC-Seal: i=1; a=rsa-sha256; t=1760563379; cv=none; d=zohomail.com; s=zohoarc; b=S0jh09iQXyQpyzMM3Pf4mrCuCntRhxHrmklWdE74rYEA/UiQBj4YmgWVxN3DjJx9KnKGjE5UkhgAEnyyFw/6vv2HPEvmOdxXuAJ8ldMK/UaLDmWj3plua8EoZTEGgcgL5JU8ua9JFEDcF7T8hQqraS9JnFvVONhv985MGDNCJls= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1760563379; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=777nOupMccjmosNUbZ6QiUnU/GlqL65qS/gBptu9Ejk=; b=CUeVPGOULsNd+UoIYas+fqQAypM5k9r7AFFde6/jLA7gEtCp07izVmIHWg7a4ow6Oa+K4qUWPNGOCwysBkuXJJZi0KIE3wzB6DcjAkQO9E4/R6QVKWck0Gb4aBp7QaLZL/Vb4C1CHAnPQal5ag1qafowyviV20S65FdBYy/kbIs= 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) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1760563379149134.18567140455445; Wed, 15 Oct 2025 14:22:59 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1v98vm-0004Yh-En; Wed, 15 Oct 2025 17:21:10 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1v98vk-0004WM-Ei for qemu-devel@nongnu.org; Wed, 15 Oct 2025 17:21:08 -0400 Received: from forwardcorp1b.mail.yandex.net ([2a02:6b8:c02:900:1:45:d181:df01]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1v98vd-0001zk-PT for qemu-devel@nongnu.org; Wed, 15 Oct 2025 17:21:08 -0400 Received: from mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net [IPv6:2a02:6b8:c21:2d8b:0:640:7d49:0]) by forwardcorp1b.mail.yandex.net (Yandex) with ESMTPS id 3E9448843B; Thu, 16 Oct 2025 00:20:59 +0300 (MSK) Received: from vsementsov-lin.. (unknown [2a02:6bf:8080:a94::1:15]) by mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id rKYpxt3F20U0-Wrz5ZEK7; Thu, 16 Oct 2025 00:20:58 +0300 Precedence: bulk X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1760563258; bh=777nOupMccjmosNUbZ6QiUnU/GlqL65qS/gBptu9Ejk=; h=Cc:Message-ID:References:Date:In-Reply-To:Subject:To:From; b=v1D+ao3wu+39qiFNY4bUEor8zmuRh5LKPX9gszTkzzOBP4Nd0WwFOTYKw/DChbRap 0BK7ssi4Tb7wCS9zJ+i6lwiMdIF6nxp6gDEGLsjOwuTQ95iFKh3ymZk4/gpxrWulbq MhzY572G3Wf3Gk+gyuXRHYjtAKbKBbvYHbHcrvXw= Authentication-Results: mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net; dkim=pass header.i=@yandex-team.ru From: Vladimir Sementsov-Ogievskiy To: marcandre.lureau@redhat.com Cc: pbonzini@redhat.com, berrange@redhat.com, eduardo@habkost.net, qemu-devel@nongnu.org, vsementsov@yandex-team.ru, raphael@enfabrica.net, armbru@redhat.com, yc-core@yandex-team.ru, d-tatianin@yandex-team.ru Subject: [PATCH v4 5/7] chardev/char: introduce .init() + .connect() initialization interface Date: Thu, 16 Oct 2025 00:20:49 +0300 Message-ID: <20251015212051.1156334-6-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20251015212051.1156334-1-vsementsov@yandex-team.ru> References: <20251015212051.1156334-1-vsementsov@yandex-team.ru> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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=2a02:6b8:c02:900:1:45:d181:df01; envelope-from=vsementsov@yandex-team.ru; helo=forwardcorp1b.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: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @yandex-team.ru) X-ZM-MESSAGEID: 1760563381644154100 We'll need a possibility to postpone connect step to later point in time to implement backend-transfer migration feature for vhost-user-blk in further commits. Let's start with new char interface for backends. .init() takes QAPI parameters and should parse them, called early .connect() should actually establish a connection, and postponed to the point of attaching to frontend. Called at later point, either at time of attaching frontend, either from qemu_chr_wait_connected(). Signed-off-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Marc-Andr=C3=A9 Lureau --- chardev/char-fe.c | 4 ++++ chardev/char.c | 39 +++++++++++++++++++++++++++++++++++++-- include/chardev/char.h | 28 +++++++++++++++++++++++++++- 3 files changed, 68 insertions(+), 3 deletions(-) diff --git a/chardev/char-fe.c b/chardev/char-fe.c index 158a5f4f55..973fed5bea 100644 --- a/chardev/char-fe.c +++ b/chardev/char-fe.c @@ -193,6 +193,10 @@ bool qemu_chr_fe_init(CharBackend *b, Chardev *s, Erro= r **errp) { unsigned int tag =3D 0; =20 + if (!qemu_chr_connect(s, errp)) { + return false; + } + if (s) { if (CHARDEV_IS_MUX(s)) { MuxChardev *d =3D MUX_CHARDEV(s); diff --git a/chardev/char.c b/chardev/char.c index 27290e26fb..409f3aac1c 100644 --- a/chardev/char.c +++ b/chardev/char.c @@ -33,6 +33,7 @@ #include "qapi/error.h" #include "qapi/qapi-commands-char.h" #include "qapi/qmp/qerror.h" +#include "qom/object.h" #include "system/replay.h" #include "qemu/help_option.h" #include "qemu/module.h" @@ -338,10 +339,29 @@ static bool qemu_chr_is_busy(Chardev *s) } } =20 +bool qemu_chr_connect(Chardev *chr, Error **errp) +{ + ChardevClass *cc =3D CHARDEV_GET_CLASS(chr); + + if (chr->connect_postponed) { + assert(cc->connect); + chr->connect_postponed =3D false; + if (!cc->connect(chr, errp)) { + return false; + } + } + + return true; +} + int qemu_chr_wait_connected(Chardev *chr, Error **errp) { ChardevClass *cc =3D CHARDEV_GET_CLASS(chr); =20 + if (!qemu_chr_connect(chr, errp)) { + return -1; + } + if (cc->chr_wait_connected) { return cc->chr_wait_connected(chr, errp); } @@ -1030,6 +1050,7 @@ static Chardev *chardev_new(const char *id, const cha= r *typename, { Object *obj; Chardev *chr =3D NULL; + ChardevClass *cc; =20 assert(g_str_has_prefix(typename, "chardev-")); assert(id); @@ -1044,8 +1065,22 @@ static Chardev *chardev_new(const char *id, const ch= ar *typename, goto fail; } =20 - if (!qemu_char_open(chr, backend, typename + 8, errp)) { - goto fail; + cc =3D CHARDEV_GET_CLASS(chr); + + if (cc->init) { + assert(!cc->open); + assert(cc->connect); + + if (!cc->init(chr, backend, errp)) { + goto fail; + } + assert(chr->filename); + + chr->connect_postponed =3D true; + } else { + if (!qemu_char_open(chr, backend, typename + 8, errp)) { + goto fail; + } } =20 return chr; diff --git a/include/chardev/char.h b/include/chardev/char.h index 429852f8d9..d2e01f0f9c 100644 --- a/include/chardev/char.h +++ b/include/chardev/char.h @@ -63,6 +63,7 @@ struct Chardev { CharBackend *be; char *label; char *filename; + bool connect_postponed; int logfd; int be_open; /* used to coordinate the chardev-change special-case: */ @@ -225,6 +226,7 @@ QemuOpts *qemu_chr_parse_compat(const char *label, cons= t char *filename, bool permit_mux_mon); int qemu_chr_write(Chardev *s, const uint8_t *buf, int len, bool write_all= ); #define qemu_chr_write_all(s, buf, len) qemu_chr_write(s, buf, len, true) +bool qemu_chr_connect(Chardev *chr, Error **errp); int qemu_chr_wait_connected(Chardev *chr, Error **errp); =20 #define TYPE_CHARDEV "chardev" @@ -259,7 +261,31 @@ struct ChardevClass { /* parse command line options and populate QAPI @backend */ void (*parse)(QemuOpts *opts, ChardevBackend *backend, Error **errp); =20 - /* called after construction, open/starts the backend */ + /* + * Called after construction, create the backend, mutually exclusive + * with @open, and should be followed by @connect(). + * Must set the Chardev's chr->filename on success. + */ + bool (*init)(Chardev *chr, ChardevBackend *backend, + Error **errp); + + /* + * Called after @init(), starts the backend, mutually exclusive + * with @open. Should care to send CHR_EVENT_OPENED when connected. + */ + bool (*connect)(Chardev *chr, Error **errp); + + /* + * Called after construction, an alternative to @init + @connect + * and should do the work for both: create and start the backend. + * Mutual exclusive with @init and @connect. + * + * May not set the Chardev's chr->filename (generic code will care), + * and may not send CHR_EVENT_OPENED when connected (@be_opened + * should not be touched in this case, to signal the generic code + * to care about CHR_EVENT_OPENED). If backend care about + * CHR_EVENT_OPENED, it should set @be_opened to false. + */ void (*open)(Chardev *chr, ChardevBackend *backend, bool *be_opened, Error **errp); =20 --=20 2.48.1 From nobody Fri Nov 14 18:26:44 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=yandex-team.ru ARC-Seal: i=1; a=rsa-sha256; t=1760563322; cv=none; d=zohomail.com; s=zohoarc; b=NU2knNvRixuZ+V5sCFpddi3+I5l2uC3LxbcS3qYmatALXHDwL1ITHpmOPjdYpm/6uvPkZPgK6giNNlndO3Vy0FzmjBmV3Q4R5/5x38/rCKe2rwUdQzjkZGIE4BMkCBWK54K66bmFXfgDhwni80RZlix5Ylxt7hKaN3k99T8SADk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1760563322; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=kLc6+dIxyVu7x/mPWVadbK6vGVZkf5Pe36ikeBhkrU4=; b=nLxgpyO8ZpTof3/ApphCk+7li83TfUHsRFWS7HKqD+kGg8QvPBkwiaY7g1LCFs4OoYL9PQleU0qaxqbvuTxg37m8Mx1kL7peSl5fq0fiTa/NmkoJYyYBu1C1R3y1US+NZkjmd6Eo4tCIjAMaE+xmU257cFFDblbqs/XEvAMXpKo= 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) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1760563322194653.9119467898687; Wed, 15 Oct 2025 14:22:02 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1v98vm-0004ZF-VE; Wed, 15 Oct 2025 17:21:10 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1v98vk-0004WW-R5 for qemu-devel@nongnu.org; Wed, 15 Oct 2025 17:21:08 -0400 Received: from forwardcorp1b.mail.yandex.net ([2a02:6b8:c02:900:1:45:d181:df01]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1v98vd-00020A-TR for qemu-devel@nongnu.org; Wed, 15 Oct 2025 17:21:08 -0400 Received: from mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net [IPv6:2a02:6b8:c21:2d8b:0:640:7d49:0]) by forwardcorp1b.mail.yandex.net (Yandex) with ESMTPS id 1F92180C38; Thu, 16 Oct 2025 00:21:00 +0300 (MSK) Received: from vsementsov-lin.. (unknown [2a02:6bf:8080:a94::1:15]) by mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id rKYpxt3F20U0-28dQi40m; Thu, 16 Oct 2025 00:20:59 +0300 Precedence: bulk X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1760563259; bh=kLc6+dIxyVu7x/mPWVadbK6vGVZkf5Pe36ikeBhkrU4=; h=Cc:Message-ID:References:Date:In-Reply-To:Subject:To:From; b=mexwQka1BjS5ZVkfgQLtrKffc3hgkSLkrpa3w4wgNrrPsm5euULNn35oTQuY+Ip2E c3fMeWS3ZpCldYFaIIcpgEv2PhsYhmc5ue0EHYDBF0qD0bTn73gbxn/UgelMBkJhsZ xVvIgkbTFt5AtJMmOTb41BithAkKvZXVz0WLLWnI= Authentication-Results: mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net; dkim=pass header.i=@yandex-team.ru From: Vladimir Sementsov-Ogievskiy To: marcandre.lureau@redhat.com Cc: pbonzini@redhat.com, berrange@redhat.com, eduardo@habkost.net, qemu-devel@nongnu.org, vsementsov@yandex-team.ru, raphael@enfabrica.net, armbru@redhat.com, yc-core@yandex-team.ru, d-tatianin@yandex-team.ru Subject: [PATCH v4 6/7] chardev/char-socket: move to .init + .connect api Date: Thu, 16 Oct 2025 00:20:50 +0300 Message-ID: <20251015212051.1156334-7-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20251015212051.1156334-1-vsementsov@yandex-team.ru> References: <20251015212051.1156334-1-vsementsov@yandex-team.ru> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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=2a02:6b8:c02:900:1:45:d181:df01; envelope-from=vsementsov@yandex-team.ru; helo=forwardcorp1b.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: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @yandex-team.ru) X-ZM-MESSAGEID: 1760563326134154100 Move char-socket to new API. This will help to realize backend-transfer feature for vhost-user-blk. With this commit qemu_chr_fe_init() starts to do connecting, so we should handle its errors instead of passing &error_abort. Also, move qemu_chr_fe_init() in test-char.c, to trigger connect before trying to get address. Signed-off-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Marc-Andr=C3=A9 Lureau --- chardev/char-socket.c | 55 ++++++++++++++++++++--------------- chardev/char.c | 7 +++-- include/chardev/char-socket.h | 1 + tests/unit/test-char.c | 14 ++++----- ui/dbus-chardev.c | 12 ++++++-- 5 files changed, 54 insertions(+), 35 deletions(-) diff --git a/chardev/char-socket.c b/chardev/char-socket.c index f3bc6290d2..0a5738c158 100644 --- a/chardev/char-socket.c +++ b/chardev/char-socket.c @@ -1287,6 +1287,25 @@ static int qmp_chardev_open_socket_client(Chardev *c= hr, } =20 =20 +static bool char_socket_connect(Chardev *chr, Error **errp) +{ + SocketChardev *s =3D SOCKET_CHARDEV(chr); + + if (s->is_listen) { + if (qmp_chardev_open_socket_server(chr, s->is_telnet || s->is_tn32= 70, + s->is_waitconnect, errp) < 0) { + return false; + } + } else { + if (qmp_chardev_open_socket_client(chr, errp) < 0) { + return false; + } + } + + return true; +} + + static bool qmp_chardev_validate_socket(ChardevSocket *sock, SocketAddress *addr, Error **errp) @@ -1363,10 +1382,9 @@ static bool qmp_chardev_validate_socket(ChardevSocke= t *sock, } =20 =20 -static void qmp_chardev_open_socket(Chardev *chr, - ChardevBackend *backend, - bool *be_opened, - Error **errp) +static bool char_socket_init(Chardev *chr, + ChardevBackend *backend, + Error **errp) { SocketChardev *s =3D SOCKET_CHARDEV(chr); ChardevSocket *sock =3D backend->u.socket.data; @@ -1374,7 +1392,6 @@ static void qmp_chardev_open_socket(Chardev *chr, bool is_listen =3D sock->has_server ? sock->server : true; bool is_telnet =3D sock->has_telnet ? sock->telnet : false; bool is_tn3270 =3D sock->has_tn3270 ? sock->tn3270 : false; - bool is_waitconnect =3D sock->has_wait ? sock->wait : false; bool is_websock =3D sock->has_websocket ? sock->websocket : false; SocketAddress *addr; =20 @@ -1383,6 +1400,7 @@ static void qmp_chardev_open_socket(Chardev *chr, s->is_tn3270 =3D is_tn3270; s->is_websock =3D is_websock; s->do_nodelay =3D do_nodelay; + s->is_waitconnect =3D sock->has_wait ? sock->wait : false; s->reconnect_time_ms =3D sock->has_reconnect_ms ? sock->reconnect_ms := 0; =20 if (sock->tls_creds) { @@ -1392,7 +1410,7 @@ static void qmp_chardev_open_socket(Chardev *chr, if (!creds) { error_setg(errp, "No TLS credentials with id '%s'", sock->tls_creds); - return; + return false; } s->tls_creds =3D (QCryptoTLSCreds *) object_dynamic_cast(creds, @@ -1400,7 +1418,7 @@ static void qmp_chardev_open_socket(Chardev *chr, if (!s->tls_creds) { error_setg(errp, "Object with id '%s' is not TLS credentials", sock->tls_creds); - return; + return false; } object_ref(OBJECT(s->tls_creds)); if (!qcrypto_tls_creds_check_endpoint(s->tls_creds, @@ -1408,7 +1426,7 @@ static void qmp_chardev_open_socket(Chardev *chr, ? QCRYPTO_TLS_CREDS_ENDPOINT_SER= VER : QCRYPTO_TLS_CREDS_ENDPOINT_CLI= ENT, errp)) { - return; + return false; } } s->tls_authz =3D g_strdup(sock->tls_authz); @@ -1416,7 +1434,7 @@ static void qmp_chardev_open_socket(Chardev *chr, s->addr =3D addr =3D socket_address_flatten(sock->addr); =20 if (!qmp_chardev_validate_socket(sock, addr, errp)) { - return; + return false; } =20 qemu_chr_set_feature(chr, QEMU_CHAR_FEATURE_RECONNECTABLE); @@ -1433,26 +1451,14 @@ static void qmp_chardev_open_socket(Chardev *chr, */ if (!chr->handover_yank_instance) { if (!yank_register_instance(CHARDEV_YANK_INSTANCE(chr->label), err= p)) { - return; + return false; } } s->registered_yank =3D true; =20 - /* be isn't opened until we get a connection */ - *be_opened =3D false; - update_disconnected_filename(s); =20 - if (s->is_listen) { - if (qmp_chardev_open_socket_server(chr, is_telnet || is_tn3270, - is_waitconnect, errp) < 0) { - return; - } - } else { - if (qmp_chardev_open_socket_client(chr, errp) < 0) { - return; - } - } + return true; } =20 static void qemu_chr_parse_socket(QemuOpts *opts, ChardevBackend *backend, @@ -1576,7 +1582,8 @@ static void char_socket_class_init(ObjectClass *oc, c= onst void *data) cc->supports_yank =3D true; =20 cc->parse =3D qemu_chr_parse_socket; - cc->open =3D qmp_chardev_open_socket; + cc->init =3D char_socket_init; + cc->connect =3D char_socket_connect; cc->chr_wait_connected =3D tcp_chr_wait_connected; cc->chr_write =3D tcp_chr_write; cc->chr_sync_read =3D tcp_chr_sync_read; diff --git a/chardev/char.c b/chardev/char.c index 409f3aac1c..b68d44e394 100644 --- a/chardev/char.c +++ b/chardev/char.c @@ -1222,12 +1222,15 @@ ChardevReturn *qmp_chardev_change(const char *id, C= hardevBackend *backend, } =20 chr->be =3D NULL; - qemu_chr_fe_init(be, chr_new, &error_abort); + if (!qemu_chr_fe_init(be, chr_new, errp)) { + object_unref(OBJECT(chr_new)); + return NULL; + } =20 if (be->chr_be_change(be->opaque) < 0) { error_setg(errp, "Chardev '%s' change failed", chr_new->label); chr_new->be =3D NULL; - qemu_chr_fe_init(be, chr, &error_abort); + qemu_chr_fe_init(be, chr, NULL); if (closed_sent) { qemu_chr_be_event(chr, CHR_EVENT_OPENED); } diff --git a/include/chardev/char-socket.h b/include/chardev/char-socket.h index d6d13ad37f..0109727eaa 100644 --- a/include/chardev/char-socket.h +++ b/include/chardev/char-socket.h @@ -68,6 +68,7 @@ struct SocketChardev { bool is_listen; bool is_telnet; bool is_tn3270; + bool is_waitconnect; GSource *telnet_source; TCPChardevTelnetInit *telnet_init; =20 diff --git a/tests/unit/test-char.c b/tests/unit/test-char.c index f30a39f61f..5c9482a478 100644 --- a/tests/unit/test-char.c +++ b/tests/unit/test-char.c @@ -845,6 +845,7 @@ static void char_websock_test(void) 0xef, 0xaa, 0xc5, 0x97, /* Masking key */ 0xec, 0x42 /* Status code */ }; =20 + qemu_chr_fe_init(&be, chr, &error_abort); addr =3D object_property_get_qobject(OBJECT(chr), "addr", &error_abort= ); qdict =3D qobject_to(QDict, addr); port =3D qdict_get_str(qdict, "port"); @@ -852,7 +853,6 @@ static void char_websock_test(void) handshake_port =3D g_strdup_printf(handshake, port, port); qobject_unref(qdict); =20 - qemu_chr_fe_init(&be, chr, &error_abort); qemu_chr_fe_set_handlers(&be, websock_server_can_read, websock_server_= read, NULL, NULL, chr, NULL, true); =20 @@ -1216,6 +1216,8 @@ static void char_socket_server_test(gconstpointer opa= que) g_assert_nonnull(chr); g_assert(!object_property_get_bool(OBJECT(chr), "connected", &error_ab= ort)); =20 + qemu_chr_fe_init(&be, chr, &error_abort); + qaddr =3D object_property_get_qobject(OBJECT(chr), "addr", &error_abor= t); g_assert_nonnull(qaddr); =20 @@ -1224,8 +1226,6 @@ static void char_socket_server_test(gconstpointer opa= que) visit_free(v); qobject_unref(qaddr); =20 - qemu_chr_fe_init(&be, chr, &error_abort); - reconnect: data.event =3D -1; data.be =3D &be; @@ -1417,6 +1417,8 @@ static void char_socket_client_test(gconstpointer opa= que) qemu_opts_del(opts); g_assert_nonnull(chr); =20 + qemu_chr_fe_init(&be, chr, &error_abort); + if (config->reconnect) { /* * If reconnect is set, the connection will be @@ -1431,8 +1433,6 @@ static void char_socket_client_test(gconstpointer opa= que) &error_abort)); } =20 - qemu_chr_fe_init(&be, chr, &error_abort); - reconnect: data.event =3D -1; data.be =3D &be; @@ -1550,6 +1550,8 @@ static void char_socket_server_two_clients_test(gcons= tpointer opaque) g_assert_nonnull(chr); g_assert(!object_property_get_bool(OBJECT(chr), "connected", &error_ab= ort)); =20 + qemu_chr_fe_init(&be, chr, &error_abort); + qaddr =3D object_property_get_qobject(OBJECT(chr), "addr", &error_abor= t); g_assert_nonnull(qaddr); =20 @@ -1558,8 +1560,6 @@ static void char_socket_server_two_clients_test(gcons= tpointer opaque) visit_free(v); qobject_unref(qaddr); =20 - qemu_chr_fe_init(&be, chr, &error_abort); - qemu_chr_fe_set_handlers(&be, char_socket_can_read, char_socket_discar= d_read, count_closed_event, NULL, &closed, NULL, true); diff --git a/ui/dbus-chardev.c b/ui/dbus-chardev.c index d05dddaf81..23cf9d6ee9 100644 --- a/ui/dbus-chardev.c +++ b/ui/dbus-chardev.c @@ -210,8 +210,14 @@ dbus_chr_open(Chardev *chr, ChardevBackend *backend, if (*errp) { return; } - CHARDEV_CLASS(object_class_by_name(TYPE_CHARDEV_SOCKET))->open( - chr, be, be_opened, errp); + if (!CHARDEV_CLASS(object_class_by_name(TYPE_CHARDEV_SOCKET))->init( + chr, be, errp)) { + return; + } + if (!CHARDEV_CLASS(object_class_by_name(TYPE_CHARDEV_SOCKET))->connect( + chr, errp)) { + return; + } } =20 static void @@ -276,6 +282,8 @@ char_dbus_class_init(ObjectClass *oc, const void *data) =20 cc->parse =3D dbus_chr_parse; cc->open =3D dbus_chr_open; + cc->init =3D NULL; + cc->connect =3D NULL; cc->chr_set_fe_open =3D dbus_chr_set_fe_open; cc->chr_set_echo =3D dbus_chr_set_echo; klass->parent_chr_be_event =3D cc->chr_be_event; --=20 2.48.1 From nobody Fri Nov 14 18:26:44 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=yandex-team.ru ARC-Seal: i=1; a=rsa-sha256; t=1760563321; cv=none; d=zohomail.com; s=zohoarc; b=oEybYVK69AZHP3aJI7un7W59jIj8fPYxMkP3Gak42uDr0mqh7zEP20xbZEj2MWKvUl6oPTIWe5h5W/P4otAlCWpMOa3Ex3uLazKzkynDDoUYPJ6XkLbCm8iN6Q5ZQG53nXlyEmzKmGrn7Ugg9liQE3LFixiEX3fpd1Q3ZCFHY/k= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1760563321; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=003dNG22PLuJugCgAsa9x9io4U8gRJHb4+EM5V2J578=; b=LEhv43SQW/HNEMfF7UCvaAehHXjre4qr/h/hzXJwHaU2zOBVAhOdtSYlE4DFiYOCNrzcnOGn9yr3ypMXQkM5mMFPTMc8KAnHRFFLdGQR/QcBY1nPhg6cFKwMbf3vbxEy5l7KAVBMaSwPbqAiQZjyv451vtulDtfO0l3u/+ASFsA= 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) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1760563320506906.7040134090578; Wed, 15 Oct 2025 14:22:00 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1v98vn-0004aq-N9; Wed, 15 Oct 2025 17:21:11 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1v98vk-0004WV-R1 for qemu-devel@nongnu.org; Wed, 15 Oct 2025 17:21:08 -0400 Received: from forwardcorp1b.mail.yandex.net ([2a02:6b8:c02:900:1:45:d181:df01]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1v98ve-00020Z-Co for qemu-devel@nongnu.org; Wed, 15 Oct 2025 17:21:08 -0400 Received: from mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net [IPv6:2a02:6b8:c21:2d8b:0:640:7d49:0]) by forwardcorp1b.mail.yandex.net (Yandex) with ESMTPS id D6A7188462; Thu, 16 Oct 2025 00:21:00 +0300 (MSK) Received: from vsementsov-lin.. (unknown [2a02:6bf:8080:a94::1:15]) by mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id rKYpxt3F20U0-SfLtmZud; Thu, 16 Oct 2025 00:21:00 +0300 Precedence: bulk X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1760563260; bh=003dNG22PLuJugCgAsa9x9io4U8gRJHb4+EM5V2J578=; h=Message-ID:Date:In-Reply-To:Cc:Subject:References:To:From; b=Xc0hQp/sdmb/kDlzRT7ycM5PPD/pQRsFm2NzJzpXn7Mp7YkOSSGFPt/5a+45y+IPW Qrmbv/4DCD8j7JhxXcxjuOqyfWo2DcP3ZtuutlmVTiqXBu14YeceJQxYNzj0gvtp6k geG6pZ3zTj1lJclET4CRq0NPCCJI8PA/LuU7Yiwk= Authentication-Results: mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net; dkim=pass header.i=@yandex-team.ru From: Vladimir Sementsov-Ogievskiy To: marcandre.lureau@redhat.com Cc: pbonzini@redhat.com, berrange@redhat.com, eduardo@habkost.net, qemu-devel@nongnu.org, vsementsov@yandex-team.ru, raphael@enfabrica.net, armbru@redhat.com, yc-core@yandex-team.ru, d-tatianin@yandex-team.ru Subject: [PATCH v4 7/7] chardev: introduce DEFINE_PROP_CHR_NO_CONNECT Date: Thu, 16 Oct 2025 00:20:51 +0300 Message-ID: <20251015212051.1156334-8-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20251015212051.1156334-1-vsementsov@yandex-team.ru> References: <20251015212051.1156334-1-vsementsov@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=2a02:6b8:c02:900:1:45:d181:df01; envelope-from=vsementsov@yandex-team.ru; helo=forwardcorp1b.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: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @yandex-team.ru) X-ZM-MESSAGEID: 1760563326226158500 Content-Type: text/plain; charset="utf-8" For further vhost-user-blk backend-transfer migration realization we want to give it (vhost-user-blk) a possibility (and responsibility) to decide when do connect. For incoming migration we'll need to postpone connect at least until early stage of migrate-incoming command, when we already know all migration parameters and can decide, are we going to do incoming backend-transfer (and get chardev fd from incoming stream), or we finally need to connect. Signed-off-by: Vladimir Sementsov-Ogievskiy --- chardev/char-fe.c | 32 ++++++++++++++++++++++++----- hw/core/qdev-properties-system.c | 26 ++++++++++++++++++++--- include/chardev/char-fe.h | 6 +++++- include/hw/qdev-properties-system.h | 3 +++ 4 files changed, 58 insertions(+), 9 deletions(-) diff --git a/chardev/char-fe.c b/chardev/char-fe.c index 973fed5bea..d77d36960e 100644 --- a/chardev/char-fe.c +++ b/chardev/char-fe.c @@ -189,15 +189,26 @@ bool qemu_chr_fe_backend_open(CharBackend *be) return be->chr && be->chr->be_open; } =20 -bool qemu_chr_fe_init(CharBackend *b, Chardev *s, Error **errp) +bool qemu_chr_fe_init_ex(CharBackend *b, Chardev *s, bool connect, + Error **errp) { unsigned int tag =3D 0; =20 - if (!qemu_chr_connect(s, errp)) { - return false; - } - if (s) { + if (connect) { + if (!qemu_chr_connect(s, errp)) { + return false; + } + } else { + /* DEFINE_PROP_CHR_NO_CONNECT */ + if (!s->connect_postponed) { + error_setg(errp, + "Chardev %s does not support postponed connect", + s->label); + return false; + } + } + if (CHARDEV_IS_MUX(s)) { MuxChardev *d =3D MUX_CHARDEV(s); =20 @@ -210,6 +221,12 @@ bool qemu_chr_fe_init(CharBackend *b, Chardev *s, Erro= r **errp) } else { s->be =3D b; } + } else { + /* + * connect=3Dfalse comes only from DEFINE_PROP_CHR_NO_CONNECT, + * through do_set_chr, which provides chardev ptr. + */ + assert(connect); } =20 b->fe_is_open =3D false; @@ -218,6 +235,11 @@ bool qemu_chr_fe_init(CharBackend *b, Chardev *s, Erro= r **errp) return true; } =20 +bool qemu_chr_fe_init(CharBackend *b, Chardev *s, Error **errp) +{ + return qemu_chr_fe_init_ex(b, s, true, errp); +} + void qemu_chr_fe_deinit(CharBackend *b, bool del) { assert(b); diff --git a/hw/core/qdev-properties-system.c b/hw/core/qdev-properties-sys= tem.c index 1f810b7ddf..6a0572ca03 100644 --- a/hw/core/qdev-properties-system.c +++ b/hw/core/qdev-properties-system.c @@ -266,8 +266,8 @@ static void get_chr(Object *obj, Visitor *v, const char= *name, void *opaque, g_free(p); } =20 -static void set_chr(Object *obj, Visitor *v, const char *name, void *opaqu= e, - Error **errp) +static void do_set_chr(Object *obj, Visitor *v, const char *name, void *op= aque, + bool connect, Error **errp) { ERRP_GUARD(); const Property *prop =3D opaque; @@ -297,13 +297,25 @@ static void set_chr(Object *obj, Visitor *v, const ch= ar *name, void *opaque, if (s =3D=3D NULL) { error_setg(errp, "Property '%s.%s' can't find value '%s'", object_get_typename(obj), name, str); - } else if (!qemu_chr_fe_init(be, s, errp)) { + } else if (!qemu_chr_fe_init_ex(be, s, connect, errp)) { error_prepend(errp, "Property '%s.%s' can't take value '%s': ", object_get_typename(obj), name, str); } g_free(str); } =20 +static void set_chr(Object *obj, Visitor *v, const char *name, void *opaqu= e, + Error **errp) +{ + do_set_chr(obj, v, name, opaque, true, errp); +} + +static void set_chr_no_connect(Object *obj, Visitor *v, const char *name, + void *opaque, Error **errp) +{ + do_set_chr(obj, v, name, opaque, false, errp); +} + static void release_chr(Object *obj, const char *name, void *opaque) { const Property *prop =3D opaque; @@ -320,6 +332,14 @@ const PropertyInfo qdev_prop_chr =3D { .release =3D release_chr, }; =20 +const PropertyInfo qdev_prop_chr_no_connect =3D { + .type =3D "str", + .description =3D "ID of a chardev to use as a backend", + .get =3D get_chr, + .set =3D set_chr_no_connect, + .release =3D release_chr, +}; + /* --- mac address --- */ =20 /* diff --git a/include/chardev/char-fe.h b/include/chardev/char-fe.h index 8ef05b3dd0..32013623b3 100644 --- a/include/chardev/char-fe.h +++ b/include/chardev/char-fe.h @@ -25,15 +25,19 @@ struct CharBackend { }; =20 /** - * qemu_chr_fe_init: + * qemu_chr_fe_init(_ex): * * Initializes a front end for the given CharBackend and * Chardev. Call qemu_chr_fe_deinit() to remove the association and * release the driver. + * Call qemu_chr_connect(), except for the case when connect=3Dfalse + * parameter set for _ex() version. * * Returns: false on error. */ bool qemu_chr_fe_init(CharBackend *b, Chardev *s, Error **errp); +bool qemu_chr_fe_init_ex(CharBackend *b, Chardev *s, bool connect, + Error **errp); =20 /** * qemu_chr_fe_deinit: diff --git a/include/hw/qdev-properties-system.h b/include/hw/qdev-properti= es-system.h index 9601a11a09..41f68f60b9 100644 --- a/include/hw/qdev-properties-system.h +++ b/include/hw/qdev-properties-system.h @@ -7,6 +7,7 @@ bool qdev_prop_sanitize_s390x_loadparm(uint8_t *loadparm, c= onst char *str, Error **errp); =20 extern const PropertyInfo qdev_prop_chr; +extern const PropertyInfo qdev_prop_chr_no_connect; extern const PropertyInfo qdev_prop_macaddr; extern const PropertyInfo qdev_prop_reserved_region; extern const PropertyInfo qdev_prop_multifd_compression; @@ -39,6 +40,8 @@ extern const PropertyInfo qdev_prop_virtio_gpu_output_lis= t; =20 #define DEFINE_PROP_CHR(_n, _s, _f) \ DEFINE_PROP(_n, _s, _f, qdev_prop_chr, CharBackend) +#define DEFINE_PROP_CHR_NO_CONNECT(_n, _s, _f) \ + DEFINE_PROP(_n, _s, _f, qdev_prop_chr_no_connect, CharBackend) #define DEFINE_PROP_NETDEV(_n, _s, _f) \ DEFINE_PROP(_n, _s, _f, qdev_prop_netdev, NICPeers) #define DEFINE_PROP_DRIVE(_n, _s, _f) \ --=20 2.48.1