From nobody Fri Nov 14 17:03:05 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=1762251551; cv=none; d=zohomail.com; s=zohoarc; b=myJAxR6yBT/qSewUD2wdABZEZjdnWrRvgch4jkYHCbrKlnYuJsyIDBuusWXUo9RYFX84jeF5tYrfIC36v99xEwKPugkp/s32Lm5Ml1QfEjR0oZpmrs/8IaaTr4/2zFkTnYC5C5CimFZHQ/NdCd9IazP52M7TfrFg88tup4tFsIc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1762251551; 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=QuaZZvtdw69WwmYPpL9h5+4R4y+kp1/qy8s6gzh44F5Gdn+p1214JOlPee0IAmWFNuxDy+SeNDXvgak9Kbm0cYAwr8kJYIQ+SRMvgvLNWCaRhBJyeTK3PlkiBWhbtF4V1XLogyoAuy/ZAWYPx3vzyObzG/xzBLkS9BvAugT7dVI= 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 1762251551095733.7233084777336; Tue, 4 Nov 2025 02:19:11 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vGE6X-00018o-AR; Tue, 04 Nov 2025 05:17:33 -0500 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 1vGE6W-00018Y-4H for qemu-devel@nongnu.org; Tue, 04 Nov 2025 05:17:32 -0500 Received: from forwardcorp1a.mail.yandex.net ([178.154.239.72]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vGE6U-0002lQ-07 for qemu-devel@nongnu.org; Tue, 04 Nov 2025 05:17:31 -0500 Received: from mail-nwsmtp-smtp-corp-main-66.iva.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-66.iva.yp-c.yandex.net [IPv6:2a02:6b8:c0c:1a8f:0:640:2fa2:0]) by forwardcorp1a.mail.yandex.net (Yandex) with ESMTPS id 11D15C00D9; Tue, 04 Nov 2025 13:17:26 +0300 (MSK) Received: from vsementsov-lin.. (unknown [2a02:6bf:8080:95c::1:2]) by mail-nwsmtp-smtp-corp-main-66.iva.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id NHhfHh1FIW20-NxAdS7S0; Tue, 04 Nov 2025 13:17:25 +0300 Precedence: bulk X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1762251445; bh=vEFpAi/SJoZ1FyW5/cNP/W5tIquHEsUoHiATdJxF5jc=; h=Cc:Message-ID:References:Date:In-Reply-To:Subject:To:From; b=uPFYThA4E2T/ATKctcc9m481GKYNSV8ib3ZY0MtvV2Zs4S/tvnPYMWcxGnWGEHlSl 9ga9pL1J6BBeTOaO/1ml1gb9vej/SqKgWn4JPmfPXWQTJGswqLpRoQfgIrusEg5WNW xqa3gqwln+UtKGPmCcUY9h6mIauCFFbqTi3384pw= Authentication-Results: mail-nwsmtp-smtp-corp-main-66.iva.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 v6 1/7] chardev/char-socket: simplify reconnect-ms handling Date: Tue, 4 Nov 2025 13:17:09 +0300 Message-ID: <20251104101715.76691-2-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20251104101715.76691-1-vsementsov@yandex-team.ru> References: <20251104101715.76691-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.72; envelope-from=vsementsov@yandex-team.ru; helo=forwardcorp1a.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_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_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: 1762251553918154100 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 17:03:05 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=1762251542; cv=none; d=zohomail.com; s=zohoarc; b=eeuAnkwSO6B6lndx3AYayaHVMOJ/MQkuYJbgh4uWHHYYUg5FuFZU2Ib3ud8fskqQ79RkOHD1EYiJH/2SNq4sYZULB4w2xlMSc4BthC4I+OSPWuO75Vozpb814j7d22YxC5pcJlPYsI8YLkVueKWlc81lL88FKgXIoP79p6jJ87U= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1762251542; 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=hth7YYgv5oIa1kzM1USTJdXw0rOKTSihTZikQSyHH3w=; b=jDlUI0iPsAvQ732lCDlsOFqeUnVd1RcOwONxv6jCAfsJPyeT4xQ6NuxXws1Tw0yS+mr1mInpFjUYPrQy0VAq4MRzqvw1LeB+5Nz3Hte2YfWKp6THtQOTDEtt0SWZb+HoDrZmpQQdy2bKsDu1BNT8IJRJgNxBpS7Kv44dtff8YoY= 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 17622515421171007.4442523896973; Tue, 4 Nov 2025 02:19:02 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vGE6X-00018u-N6; Tue, 04 Nov 2025 05:17:34 -0500 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 1vGE6W-00018Z-87 for qemu-devel@nongnu.org; Tue, 04 Nov 2025 05:17:32 -0500 Received: from forwardcorp1a.mail.yandex.net ([2a02:6b8:c0e:500: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 1vGE6T-0002lW-Vg for qemu-devel@nongnu.org; Tue, 04 Nov 2025 05:17:31 -0500 Received: from mail-nwsmtp-smtp-corp-main-66.iva.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-66.iva.yp-c.yandex.net [IPv6:2a02:6b8:c0c:1a8f:0:640:2fa2:0]) by forwardcorp1a.mail.yandex.net (Yandex) with ESMTPS id 2405EC00DD; Tue, 04 Nov 2025 13:17:27 +0300 (MSK) Received: from vsementsov-lin.. (unknown [2a02:6bf:8080:95c::1:2]) by mail-nwsmtp-smtp-corp-main-66.iva.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id NHhfHh1FIW20-lemsCXZH; Tue, 04 Nov 2025 13:17:26 +0300 Precedence: bulk X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1762251446; bh=hth7YYgv5oIa1kzM1USTJdXw0rOKTSihTZikQSyHH3w=; h=Cc:Message-ID:References:Date:In-Reply-To:Subject:To:From; b=wwPM6y/8ZbJCRHMMgWG7ZBA9gCJOEhdySflWmX4t/Rr3IUk9ntyR+MXyUbby/IMYo ASJmpWDmJCgxCnB7GtstNdA95tAPNyomcM1eES4GkgHzdaOoplfarZiqMhiYbdrtvb ZBABkKDjzI+FwQef7k63OumB+TeScxuAdqdZIUlw= Authentication-Results: mail-nwsmtp-smtp-corp-main-66.iva.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 v6 2/7] chardev/char: split chardev_init_common() out of qemu_char_open() Date: Tue, 4 Nov 2025 13:17:10 +0300 Message-ID: <20251104101715.76691-3-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20251104101715.76691-1-vsementsov@yandex-team.ru> References: <20251104101715.76691-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:c0e:500:1:45:d181:df01; envelope-from=vsementsov@yandex-team.ru; helo=forwardcorp1a.mail.yandex.net X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 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_DNSWL_LOW=-0.7, 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: 1762251543917154100 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 3e432195a5..216c95c053 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 17:03:05 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=1762251525; cv=none; d=zohomail.com; s=zohoarc; b=Pt+OhEU71b/syIfyrTa6gdMmDTXT3ansbdu1sMKNWv/kzyE4uxY20U72WB2Rn+I5LNdAaKAzPbo0t2gFJ/JkKnGQzjS+sgNvPRQYYfFeDGJEzSP0b4xe2KssDWIgKnFbweMQGF0HgjCyLcllioFDYHzEij04ZF0B6ekyJ5Mv9Lo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1762251525; 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=OyEDQt/UD/uta2M4iXMXqAM/L/B3XLaYf2JW8GQOWMM=; b=dvNnrhoDzPnA0lhZd7xGP5PbIYMRiCzKPQVC080Y7Ds4YCwzc8IDsUOSL7X5aH+kQKkFddktwzOzRiKP3ABMxp98Ko8b6KDRkysue7dDLCgpxtBa0iXt5j/1LgPX8oXzpiIxZJ/uIiPNImRPtNGQPawIIr/wPrxn9CV9ea2I7dI= 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 1762251525095647.24613572193; Tue, 4 Nov 2025 02:18:45 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vGE6g-0001Bg-F5; Tue, 04 Nov 2025 05:17:42 -0500 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 1vGE6X-00018t-L4 for qemu-devel@nongnu.org; Tue, 04 Nov 2025 05:17:33 -0500 Received: from forwardcorp1d.mail.yandex.net ([178.154.239.200]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vGE6U-0002lg-Ae for qemu-devel@nongnu.org; Tue, 04 Nov 2025 05:17:33 -0500 Received: from mail-nwsmtp-smtp-corp-main-66.iva.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-66.iva.yp-c.yandex.net [IPv6:2a02:6b8:c0c:1a8f:0:640:2fa2:0]) by forwardcorp1d.mail.yandex.net (Yandex) with ESMTPS id 3493080C62; Tue, 04 Nov 2025 13:17:28 +0300 (MSK) Received: from vsementsov-lin.. (unknown [2a02:6bf:8080:95c::1:2]) by mail-nwsmtp-smtp-corp-main-66.iva.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id NHhfHh1FIW20-aBpWBWCW; Tue, 04 Nov 2025 13:17:27 +0300 Precedence: bulk X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1762251447; bh=OyEDQt/UD/uta2M4iXMXqAM/L/B3XLaYf2JW8GQOWMM=; h=Message-ID:Date:In-Reply-To:Cc:Subject:References:To:From; b=c+tWgsmCC3KjQAJjly+R35YxO1hgBDrvS268Jzss7q/9jFnENHqXWciJ3dao1qz7y BKn4MJckRt3Fzmt++W8DokyRaWS25JS64+b25Gq5xoO3ZMyg1REKK1vKPdOq9F0EYD fI9eqd1WuXIVGrdlCH9HBq/Dd64+kcHEb7f6+74s= Authentication-Results: mail-nwsmtp-smtp-corp-main-66.iva.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 v6 3/7] chardev/char: qemu_char_open(): add return value Date: Tue, 4 Nov 2025 13:17:11 +0300 Message-ID: <20251104101715.76691-4-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20251104101715.76691-1-vsementsov@yandex-team.ru> References: <20251104101715.76691-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.200; envelope-from=vsementsov@yandex-team.ru; helo=forwardcorp1d.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_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_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: 1762251527705154100 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 216c95c053..3e9a274d7d 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 17:03:05 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=1762251508; cv=none; d=zohomail.com; s=zohoarc; b=V5TwrGjXsMJRN34exph+cz93OPB/I4jHQejzj484wDuNlDxAXzPCb+/xgQSve5/b4klR66tSbgVuxN69I6P8lOiCQP3pI5+fa4A7+dSS6Xa7P7y3yvmD7wZdSKiVeZjjdMemxRufRgAJM8EcR3FMSrm9WVV9pdsQA/qvqY/59x0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1762251508; 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=vY0OE5QMEqzOyQE29iXX8SgUTFf8mtXdoyKSkyX34oo=; b=gkZulUpmaZPTB6MrU/ewrkBXjlj9YrrO5Q7CJhdwq1Chbcq/ArcGSM8k78dF9v0nDL/RwJVypSSIe8zPX3/abYbME+ZHkbLo+IfHmiWNaCuJJ3SYkZQIreQrA4hy6bHGF2QZuR5ybNLhAyb7Vo7pnxeUGJQGK2rIswtqWqOx99o= 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 17622515084261011.9369556473355; Tue, 4 Nov 2025 02:18:28 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vGE6d-0001Aj-IE; Tue, 04 Nov 2025 05:17:39 -0500 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 1vGE6X-00018q-HY for qemu-devel@nongnu.org; Tue, 04 Nov 2025 05:17:33 -0500 Received: from forwardcorp1a.mail.yandex.net ([2a02:6b8:c0e:500: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 1vGE6V-0002ln-Rc for qemu-devel@nongnu.org; Tue, 04 Nov 2025 05:17:33 -0500 Received: from mail-nwsmtp-smtp-corp-main-66.iva.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-66.iva.yp-c.yandex.net [IPv6:2a02:6b8:c0c:1a8f:0:640:2fa2:0]) by forwardcorp1a.mail.yandex.net (Yandex) with ESMTPS id E7AB0C00E2; Tue, 04 Nov 2025 13:17:28 +0300 (MSK) Received: from vsementsov-lin.. (unknown [2a02:6bf:8080:95c::1:2]) by mail-nwsmtp-smtp-corp-main-66.iva.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id NHhfHh1FIW20-csK6cdq8; Tue, 04 Nov 2025 13:17:28 +0300 Precedence: bulk X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1762251448; bh=vY0OE5QMEqzOyQE29iXX8SgUTFf8mtXdoyKSkyX34oo=; h=Cc:Message-ID:References:Date:In-Reply-To:Subject:To:From; b=0Gv+OPdAEf1hDXOfo0doqtr3MioYOtGYla/3LlIEfoU+pu0j3/wv4anU2f6SgZvIQ ZW7G7QBdH1d9sMpJQrOevDQX2U1Rxe2MOQ4s9eSY75fSLbEAMppnxIRYt9FVR6JlC1 RWW6cU/O/xof0Zk8P0k2lqyQyNsPQxYHJViMR5ns= Authentication-Results: mail-nwsmtp-smtp-corp-main-66.iva.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 v6 4/7] chardev/char: move filename and be_opened handling to qemu_char_open() Date: Tue, 4 Nov 2025 13:17:12 +0300 Message-ID: <20251104101715.76691-5-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20251104101715.76691-1-vsementsov@yandex-team.ru> References: <20251104101715.76691-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:c0e:500:1:45:d181:df01; envelope-from=vsementsov@yandex-team.ru; helo=forwardcorp1a.mail.yandex.net X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 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_DNSWL_LOW=-0.7, 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: 1762251513021154100 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 3e9a274d7d..7a029b0eb9 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 17:03:05 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=1762251509; cv=none; d=zohomail.com; s=zohoarc; b=gKI6VDVUsvj/YpWxMDKWLta3L4slD8q4KMVAqBW1aRjyM1LiSPEVhmOxlpdM2Fpsr1FhZIsyLp+m6m0B9uRUINO8pLwP4WKV0Pf/u9HTO+W+XUUgYOjq5hw5uWxcygaQEaJr1p1ehoniPA8gbINGGNNfJtGtsnX+c0AFClznOC8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1762251509; 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=m8rsqzagb5Hme/nqQw97sYa5xgh2xOtNzjhi3iopVFk=; b=QGiWyRSgrYWFWIx8RBve36/6zqBYcyc328Pr+t0SAz61EwrnlT4whM002b7/rDBTVf4XdSKhOj46c4e7IR9NjtATzM7sedtgkGmMZaxxSC/t0E8VtEFNbmOOkJvabI+BvkW1Ah37kOvQLR7DjYfmjcRbLDIV4upJt8PjSuhfLwc= 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 1762251509430121.17095333825807; Tue, 4 Nov 2025 02:18:29 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vGE6d-0001Ah-Hn; Tue, 04 Nov 2025 05:17:39 -0500 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 1vGE6X-000195-O5 for qemu-devel@nongnu.org; Tue, 04 Nov 2025 05:17:34 -0500 Received: from forwardcorp1a.mail.yandex.net ([178.154.239.72]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vGE6V-0002lx-7y for qemu-devel@nongnu.org; Tue, 04 Nov 2025 05:17:33 -0500 Received: from mail-nwsmtp-smtp-corp-main-66.iva.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-66.iva.yp-c.yandex.net [IPv6:2a02:6b8:c0c:1a8f:0:640:2fa2:0]) by forwardcorp1a.mail.yandex.net (Yandex) with ESMTPS id CD521C00E3; Tue, 04 Nov 2025 13:17:29 +0300 (MSK) Received: from vsementsov-lin.. (unknown [2a02:6bf:8080:95c::1:2]) by mail-nwsmtp-smtp-corp-main-66.iva.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id NHhfHh1FIW20-MuLf21R2; Tue, 04 Nov 2025 13:17:29 +0300 Precedence: bulk X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1762251449; bh=m8rsqzagb5Hme/nqQw97sYa5xgh2xOtNzjhi3iopVFk=; h=Cc:Message-ID:References:Date:In-Reply-To:Subject:To:From; b=RmTUPpn9/0QnXUnAGMsaKxkTZEEZUPXQ/Ze/xgOOwMYwFvDphkow72mxWmt5SQtFP Q2BcbHFYgfDK+3haz2sIPFfJ+dQJ9qDJB644vfMb9JiXjsil1X4dGaLL6PDJrsM6uA s08lZeZiljuazwBxfJrawt6zxVmhEyyiFbOE2i6s= Authentication-Results: mail-nwsmtp-smtp-corp-main-66.iva.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 v6 5/7] chardev/char: introduce .init() + .connect() initialization interface Date: Tue, 4 Nov 2025 13:17:13 +0300 Message-ID: <20251104101715.76691-6-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20251104101715.76691-1-vsementsov@yandex-team.ru> References: <20251104101715.76691-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.72; envelope-from=vsementsov@yandex-team.ru; helo=forwardcorp1a.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_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_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: 1762251513064154100 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, or 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 | 30 +++++++++++++++++++++++++++++- 3 files changed, 70 insertions(+), 3 deletions(-) diff --git a/chardev/char-fe.c b/chardev/char-fe.c index 34b83fc1c4..504c3653e5 100644 --- a/chardev/char-fe.c +++ b/chardev/char-fe.c @@ -194,6 +194,10 @@ bool qemu_chr_fe_init(CharFrontend *c, Chardev *s, Err= or **errp) unsigned int tag =3D 0; =20 if (s) { + if (!qemu_chr_connect(s, errp)) { + return false; + } + if (CHARDEV_IS_MUX(s)) { MuxChardev *d =3D MUX_CHARDEV(s); =20 diff --git a/chardev/char.c b/chardev/char.c index 7a029b0eb9..33eba0cdc0 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 b65e9981c1..24c449b07b 100644 --- a/include/chardev/char.h +++ b/include/chardev/char.h @@ -63,6 +63,7 @@ struct Chardev { CharFrontend *fe; 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,33 @@ 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 + * (this may happen asynchronously after .connect() call alredy + * returned). + */ + 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. + * Mutually 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 the backend cares 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 17:03:05 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=1762251509; cv=none; d=zohomail.com; s=zohoarc; b=bmaNywWeS7tm/CE37NuwBxGvJIJ7sByoKkDjqsMudBFKzxzSgnp1XPQB7q4rfDHhvBcW2uRrlqzHnxcYJIjh5qni3NH2kGBadRlvU2yWpTxAPjP7vaDqrHMIgrBBgsKYTxUcknukz1WNoEAnyo2JlhwfVf6hczOCzIbmpxtiZ9A= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1762251509; 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=xYy79KhJdbRf73qAJW7T8dFetl8fZysPsUK+12kaI4g=; b=Hq2jNFc6k+3zyO/OBxOlwNna1McIidOuCd9RcAVkdq3uEnVBtyGynp/HdV4TqecE5MRBJgEAGsQ4mPRcz8Cnei/yDEu/sm2+hPyY/5FVl4z0wzP+d8AiE07rI5Cvl3LOIBQa3fmITmosYxpqyCY27Qh3HZQdcAf2lkH9J5TAa3Y= 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 1762251509183861.1743585824848; Tue, 4 Nov 2025 02:18:29 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vGE6f-0001BG-QA; Tue, 04 Nov 2025 05:17:41 -0500 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 1vGE6Y-00019h-Kk for qemu-devel@nongnu.org; Tue, 04 Nov 2025 05:17:34 -0500 Received: from forwardcorp1d.mail.yandex.net ([178.154.239.200]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vGE6W-0002m3-Et for qemu-devel@nongnu.org; Tue, 04 Nov 2025 05:17:34 -0500 Received: from mail-nwsmtp-smtp-corp-main-66.iva.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-66.iva.yp-c.yandex.net [IPv6:2a02:6b8:c0c:1a8f:0:640:2fa2:0]) by forwardcorp1d.mail.yandex.net (Yandex) with ESMTPS id C17D180C3A; Tue, 04 Nov 2025 13:17:30 +0300 (MSK) Received: from vsementsov-lin.. (unknown [2a02:6bf:8080:95c::1:2]) by mail-nwsmtp-smtp-corp-main-66.iva.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id NHhfHh1FIW20-WK8iWMNn; Tue, 04 Nov 2025 13:17:30 +0300 Precedence: bulk X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1762251450; bh=xYy79KhJdbRf73qAJW7T8dFetl8fZysPsUK+12kaI4g=; h=Cc:Message-ID:References:Date:In-Reply-To:Subject:To:From; b=WNVNjLcRHXCtDPlD9j+BixTaLznzJui7xWkU7LnuRWQgIqg1niDr7gT2qtmuMrWjP TOVFWFuURU0f/vySmDtrg4Y5PwEo+TdUcsfvw4j03xXU4JD1+ltc02x0jpfSmbd5oX vE3boqmp0lywNMagY/h4BYH3ugVNlliEnOHSLuG0= Authentication-Results: mail-nwsmtp-smtp-corp-main-66.iva.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 v6 6/7] chardev/char-socket: move to .init + .connect api Date: Tue, 4 Nov 2025 13:17:14 +0300 Message-ID: <20251104101715.76691-7-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20251104101715.76691-1-vsementsov@yandex-team.ru> References: <20251104101715.76691-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.200; envelope-from=vsementsov@yandex-team.ru; helo=forwardcorp1d.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_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_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: 1762251515119158500 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 33eba0cdc0..a6212d57ed 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->fe =3D NULL; - qemu_chr_fe_init(fe, chr_new, &error_abort); + if (!qemu_chr_fe_init(fe, chr_new, errp)) { + object_unref(OBJECT(chr_new)); + return NULL; + } =20 if (fe->chr_be_change(fe->opaque) < 0) { error_setg(errp, "Chardev '%s' change failed", chr_new->label); chr_new->fe =3D NULL; - qemu_chr_fe_init(fe, chr, &error_abort); + qemu_chr_fe_init(fe, 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 8a98e42cad..9ecd5ccfe6 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(&fe, 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(&fe, chr, &error_abort); qemu_chr_fe_set_handlers(&fe, 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(&c, 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(&c, chr, &error_abort); - reconnect: data.event =3D -1; data.fe =3D &c; @@ -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(&c, 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(&c, chr, &error_abort); - reconnect: data.event =3D -1; data.fe =3D &c; @@ -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(&c, 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(&c, chr, &error_abort); - qemu_chr_fe_set_handlers(&c, char_socket_can_read, char_socket_discard= _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 17:03:05 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=1762251558; cv=none; d=zohomail.com; s=zohoarc; b=FwkABBu3qyLEx6EyY3NIUjLpJYAKJXsuLDyxVVx8e81hWHfUEtGhDGHJLCu18Mt7B0iyX+XKz/rIwEONq/ez2GBinDL8L4Scwaj75yBsRd+TCLXxjh2nfJa8/vOGlNzuWYNg6oCN8BiOOYcSK9kPwxNWBD7lTpv70bqayQpi+yM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1762251558; 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=BmL4bf+MiFO9yHgpIaYFUjP289D4bjT//+SgdM56yk0=; b=dgEr21NnCmaXoyHBcaoarH2yKNv6k8jPKqpVR1lwxDHufVOF2BB1XPgzAyh08uLyvuZubAw700UHAZJvfSb9UuLde3/Ce5r1zBD0yPXglxp3IAEd0CES0SG4HzhOczpBlQJLV8UW4adhLxBGY+0zB4Fo7BsAjM8lXe89FLess4U= 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 1762251558070104.8119056352391; Tue, 4 Nov 2025 02:19:18 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vGE6h-0001C2-QK; Tue, 04 Nov 2025 05:17:43 -0500 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 1vGE6Z-0001A2-0M for qemu-devel@nongnu.org; Tue, 04 Nov 2025 05:17:35 -0500 Received: from forwardcorp1d.mail.yandex.net ([178.154.239.200]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vGE6X-0002mE-0n for qemu-devel@nongnu.org; Tue, 04 Nov 2025 05:17:34 -0500 Received: from mail-nwsmtp-smtp-corp-main-66.iva.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-66.iva.yp-c.yandex.net [IPv6:2a02:6b8:c0c:1a8f:0:640:2fa2:0]) by forwardcorp1d.mail.yandex.net (Yandex) with ESMTPS id AC07080CA1; Tue, 04 Nov 2025 13:17:31 +0300 (MSK) Received: from vsementsov-lin.. (unknown [2a02:6bf:8080:95c::1:2]) by mail-nwsmtp-smtp-corp-main-66.iva.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id NHhfHh1FIW20-u4XDF2Am; Tue, 04 Nov 2025 13:17:31 +0300 Precedence: bulk X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1762251451; bh=BmL4bf+MiFO9yHgpIaYFUjP289D4bjT//+SgdM56yk0=; h=Cc:Message-ID:References:Date:In-Reply-To:Subject:To:From; b=I3fwLL5mJ2e8XHYvMUOfUdupi0ekNIV0oj2XxP5i48/W3Huw2uBp0S2YgKubcZQjq cjoRpHraYaKUO4vW0eHl7uegLhPHH1QUdhEpQcEah20JeJADvA58aiAovk/Atq33Tn AnR1vcB8wCvvZpJPWB935PMt9IkrZKHmStE5/FtI= Authentication-Results: mail-nwsmtp-smtp-corp-main-66.iva.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 v6 7/7] chardev: introduce DEFINE_PROP_CHR_NO_CONNECT Date: Tue, 4 Nov 2025 13:17:15 +0300 Message-ID: <20251104101715.76691-8-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20251104101715.76691-1-vsementsov@yandex-team.ru> References: <20251104101715.76691-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.200; envelope-from=vsementsov@yandex-team.ru; helo=forwardcorp1d.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_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_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: 1762251562242158500 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 Reviewed-by: Marc-Andr=C3=A9 Lureau --- chardev/char-fe.c | 22 +++++++++++++++++++--- hw/core/qdev-properties-system.c | 26 +++++++++++++++++++++++--- include/chardev/char-fe.h | 9 +++++++-- include/hw/qdev-properties-system.h | 3 +++ 4 files changed, 52 insertions(+), 8 deletions(-) diff --git a/chardev/char-fe.c b/chardev/char-fe.c index 504c3653e5..349b462e14 100644 --- a/chardev/char-fe.c +++ b/chardev/char-fe.c @@ -189,13 +189,24 @@ bool qemu_chr_fe_backend_open(CharFrontend *c) return c->chr && c->chr->be_open; } =20 -bool qemu_chr_fe_init(CharFrontend *c, Chardev *s, Error **errp) +bool qemu_chr_fe_init_ex(CharFrontend *c, Chardev *s, bool connect, + Error **errp) { unsigned int tag =3D 0; =20 if (s) { - if (!qemu_chr_connect(s, errp)) { - return false; + 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; + } } =20 if (CHARDEV_IS_MUX(s)) { @@ -218,6 +229,11 @@ bool qemu_chr_fe_init(CharFrontend *c, Chardev *s, Err= or **errp) return true; } =20 +bool qemu_chr_fe_init(CharFrontend *c, Chardev *s, Error **errp) +{ + return qemu_chr_fe_init_ex(c, s, true, errp); +} + void qemu_chr_fe_deinit(CharFrontend *c, bool del) { assert(c); diff --git a/hw/core/qdev-properties-system.c b/hw/core/qdev-properties-sys= tem.c index 7aa5cbb510..9803e582e9 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(fe, s, errp)) { + } else if (!qemu_chr_fe_init_ex(fe, 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 5f8a6df17d..c0d991a19f 100644 --- a/include/chardev/char-fe.h +++ b/include/chardev/char-fe.h @@ -25,14 +25,19 @@ struct CharFrontend { }; =20 /** - * qemu_chr_fe_init: + * qemu_chr_fe_init(_ex): * * Initializes the frontend @c for the given Chardev backend @s. Call * qemu_chr_fe_deinit() to remove the association and release the backend. + * Call qemu_chr_connect(), except for the case when connect=3Dfalse + * parameter set for _ex() version, or when @s =3D=3D NULL. For the latter, + * @connect is ignored. * * Returns: false on error. */ -bool qemu_chr_fe_init(CharFrontend *c, Chardev *be, Error **errp); +bool qemu_chr_fe_init(CharFrontend *c, Chardev *s, Error **errp); +bool qemu_chr_fe_init_ex(CharFrontend *c, 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 45687be005..18ad2e6519 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, CharFrontend) +#define DEFINE_PROP_CHR_NO_CONNECT(_n, _s, _f) \ + DEFINE_PROP(_n, _s, _f, qdev_prop_chr_no_connect, CharFrontend) #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