From nobody Fri Nov 14 17:03:07 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=1761926467; cv=none; d=zohomail.com; s=zohoarc; b=d+KhDKgCztB4SSyYWGb57GZpIWXoFHic1wsKGKhl3qITnR7e3B7uN+rVNKHTKpwq6neyybcYzC4KISwJpLbnKv4uKq/nrYJYKbWTHEF0Nlhc9Ac793S0Ng6xVqoasjxNa/0TXaTpeMIRdMOtP+/OWfYsfFcHBblCXglfWol1pbU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1761926467; 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=AYgShq3aPmPbP9FJZig0kWyZYXo6UjLIcaVBW7eliJVkez3kNPnYfiZPTor6GBdLDGP6eGmj9ONAqTKt0U1A6MQX9wBjum0E66AIX9sEGqmddtzmqWr7JulS8dJMvENXZJvdUrEf/lrRvDpb8pMr7cmwQ17fQOvslDl+Qg5xzbQ= 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 1761926466889331.5400974893778; Fri, 31 Oct 2025 09:01:06 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vErXP-00076W-MM; Fri, 31 Oct 2025 11:59:40 -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 1vErXH-00074S-41 for qemu-devel@nongnu.org; Fri, 31 Oct 2025 11:59:31 -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 1vErXC-0005zc-K3 for qemu-devel@nongnu.org; Fri, 31 Oct 2025 11:59:30 -0400 Received: from mail-nwsmtp-smtp-corp-canary-81.sas.yp-c.yandex.net (mail-nwsmtp-smtp-corp-canary-81.sas.yp-c.yandex.net [IPv6:2a02:6b8:c10:49f:0:640:b99a:0]) by forwardcorp1b.mail.yandex.net (Yandex) with ESMTPS id B9663807E3; Fri, 31 Oct 2025 18:59:19 +0300 (MSK) Received: from vsementsov-lin.. (unknown [2a02:6bf:8080:546::1:17]) by mail-nwsmtp-smtp-corp-canary-81.sas.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id Fxip9o0FqiE0-TwTehFjH; Fri, 31 Oct 2025 18:59:19 +0300 Precedence: bulk X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1761926359; bh=vEFpAi/SJoZ1FyW5/cNP/W5tIquHEsUoHiATdJxF5jc=; h=Cc:Message-ID:References:Date:In-Reply-To:Subject:To:From; b=hF1bS4YV5TCTxrccSEq00j59kAqw4+UZf4UOArAIKMLEN8FskyvUKkFoIMoNfFKxI pmaZKU8IMkYyTddn0zGLzENxfSP1JCNbxw1aVo38B3zvp+IhIS15ly6jp2HrWX5hYo NAurDsZdmcTefr3nysyh+kJmjVkoiHBaSiYHzOuY= Authentication-Results: mail-nwsmtp-smtp-corp-canary-81.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 v5 1/7] chardev/char-socket: simplify reconnect-ms handling Date: Fri, 31 Oct 2025 18:59:08 +0300 Message-ID: <20251031155914.189112-2-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20251031155914.189112-1-vsementsov@yandex-team.ru> References: <20251031155914.189112-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: 1761926472099154100 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:07 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=1761926503; cv=none; d=zohomail.com; s=zohoarc; b=McBdrxRIE3G/z2Hdoh9Dt3wJHG5/fxAHD1nMLt0suFO9zZ5TAZ2/vtWtM+7seEDU4Ak3HkWN0pnT15QxlsdVO6MoJymZR2xhW9J+mcDqDokWAyckKLMPXr7EfwL8YkIcmQSZnpR3NFa0YPtrsF9UIDUAdW0rG4AKnD6JYGGM/CM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1761926503; 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=I1ULKo5UL2voPi6qYxkl3ZTcioqUwpDgJaRBiWXGok3Quz3Td4cuyY4ntjeObjpGvI853bXufN9DrR37+KBlNtXN7lgerR06R65S6JDJ+XV+ky1FzrNH+cjNnrl83IeUD5fDvzqN10RA2FLL3ti+ymENrli221KktNo1BS1vVxM= 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 1761926503380592.4441236890469; Fri, 31 Oct 2025 09:01:43 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vErXV-00078O-1V; Fri, 31 Oct 2025 11:59:45 -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 1vErXL-00075v-Ux for qemu-devel@nongnu.org; Fri, 31 Oct 2025 11:59:36 -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 1vErXC-0005zh-Bu for qemu-devel@nongnu.org; Fri, 31 Oct 2025 11:59:34 -0400 Received: from mail-nwsmtp-smtp-corp-canary-81.sas.yp-c.yandex.net (mail-nwsmtp-smtp-corp-canary-81.sas.yp-c.yandex.net [IPv6:2a02:6b8:c10:49f:0:640:b99a:0]) by forwardcorp1b.mail.yandex.net (Yandex) with ESMTPS id AF81E80825; Fri, 31 Oct 2025 18:59:20 +0300 (MSK) Received: from vsementsov-lin.. (unknown [2a02:6bf:8080:546::1:17]) by mail-nwsmtp-smtp-corp-canary-81.sas.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id Fxip9o0FqiE0-3NuanIde; Fri, 31 Oct 2025 18:59:20 +0300 Precedence: bulk X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1761926360; bh=hth7YYgv5oIa1kzM1USTJdXw0rOKTSihTZikQSyHH3w=; h=Cc:Message-ID:References:Date:In-Reply-To:Subject:To:From; b=nyZAZlJfkGT1ltOzJXEi0070ua6GvTp4IBBPTyNbFzRwfDbZv17OGhV7PCi8XC2Ys DzHu804SLMAJL36mCquZT1jh8wTuCzcZD3w2mYc6w6PhFOV15zan3wYpxuNoMtBgad 1idq4G6VGI8HK5j+2MVpePu9y1cxFJ/owkImD+1A= Authentication-Results: mail-nwsmtp-smtp-corp-canary-81.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 v5 2/7] chardev/char: split chardev_init_common() out of qemu_char_open() Date: Fri, 31 Oct 2025 18:59:09 +0300 Message-ID: <20251031155914.189112-3-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20251031155914.189112-1-vsementsov@yandex-team.ru> References: <20251031155914.189112-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: 1761926509256154100 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:07 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=1761926477; cv=none; d=zohomail.com; s=zohoarc; b=gUIW7BBuBh04Dna2Q4Z9IIaU3lDSRSPs2xYcI23u4ElCdKAqqj6qhucMbbn1X1FqRnJ/YloPcLQ4AQxjJKrJzn3/AZhzym102z9T6e3Cesn4dKduGsQxcYZfvLUuDGCRtgBIBwuqynvhyUdrKq8ru0g2cm1duNLXEl3j26s2FUg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1761926477; 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=dUmdOOcVZM4a4ptIkocMEtitREBiSxhGhd4qPGtKmkS2lYXa7IqgigLYp2zwyYarvI2R60PfekllOVz4cYpJmeZEdfVkAk5dFnF8fE2NVc1eXDQ2Tm9q0Hx5nqgIrraJFppwUQMDO0ddyfdKtdwJKxzj2L6DvJaMDhA93eeKVME= 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 1761926477319365.2319994637452; Fri, 31 Oct 2025 09:01:17 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vErXY-00079l-O8; Fri, 31 Oct 2025 11:59:48 -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 1vErXJ-00074w-6h for qemu-devel@nongnu.org; Fri, 31 Oct 2025 11:59:34 -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 1vErXG-0005zo-2R for qemu-devel@nongnu.org; Fri, 31 Oct 2025 11:59:32 -0400 Received: from mail-nwsmtp-smtp-corp-canary-81.sas.yp-c.yandex.net (mail-nwsmtp-smtp-corp-canary-81.sas.yp-c.yandex.net [IPv6:2a02:6b8:c10:49f:0:640:b99a:0]) by forwardcorp1b.mail.yandex.net (Yandex) with ESMTPS id A730580830; Fri, 31 Oct 2025 18:59:21 +0300 (MSK) Received: from vsementsov-lin.. (unknown [2a02:6bf:8080:546::1:17]) by mail-nwsmtp-smtp-corp-canary-81.sas.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id Fxip9o0FqiE0-dwLOF0QJ; Fri, 31 Oct 2025 18:59:21 +0300 Precedence: bulk X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1761926361; bh=OyEDQt/UD/uta2M4iXMXqAM/L/B3XLaYf2JW8GQOWMM=; h=Message-ID:Date:In-Reply-To:Cc:Subject:References:To:From; b=QosOKBdWcx17sQoKweIrEcUlvmFu5nGybttqbC1MK4OgZS2XwT3YyMo3tnx4wwOPQ rSO11vtDUZSZI57eEMyuOpjYw8DEwW/yoMvvsnoRDe/JfwL9CpZi6/RuV/yo79k7FK ql4suh7DLHnyiFRA8dDYS3qcR/x0JVEe57D5gv8M= Authentication-Results: mail-nwsmtp-smtp-corp-canary-81.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 v5 3/7] chardev/char: qemu_char_open(): add return value Date: Fri, 31 Oct 2025 18:59:10 +0300 Message-ID: <20251031155914.189112-4-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20251031155914.189112-1-vsementsov@yandex-team.ru> References: <20251031155914.189112-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: 1761926479205154100 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:07 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=1761926808; cv=none; d=zohomail.com; s=zohoarc; b=diTMwpyqiNltcBpsQb0PhX5S35iqXBgDDGgGTSE3ZJEoYjh6lWWYMK3sUzLfLf2gqu+BBMrWAvtOLsqXe3ikSiGlmz03s2pAIgilKULkXae59gs2Gg2oCjfkcsgzp4dGsJHmNmvBu7qJuMTXqX/FJS+SB22RTekDfnfoNha9AxI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1761926808; 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=H6hcwneeX/+0mcDs7CYlMrF7VvZTleC7nOR1z78c4mYi2iNeDc/KMYuSFOUulIfbqCT9bOIlHNN6Zw8JO1i03frfaIlBrP+fivSSFybMF/SXoMDZ/sezSx0zip2ZrRYdyWSDD1L3MktwMUyroIcoMH9EVve8dQ4e47z7spYvZvA= 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 1761926807857685.113054393086; Fri, 31 Oct 2025 09:06:47 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vErXd-0007B8-8z; Fri, 31 Oct 2025 11:59:53 -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 1vErXS-00077z-9w for qemu-devel@nongnu.org; Fri, 31 Oct 2025 11:59:42 -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 1vErXG-0005zp-3H for qemu-devel@nongnu.org; Fri, 31 Oct 2025 11:59:40 -0400 Received: from mail-nwsmtp-smtp-corp-canary-81.sas.yp-c.yandex.net (mail-nwsmtp-smtp-corp-canary-81.sas.yp-c.yandex.net [IPv6:2a02:6b8:c10:49f:0:640:b99a:0]) by forwardcorp1b.mail.yandex.net (Yandex) with ESMTPS id BC149806C1; Fri, 31 Oct 2025 18:59:22 +0300 (MSK) Received: from vsementsov-lin.. (unknown [2a02:6bf:8080:546::1:17]) by mail-nwsmtp-smtp-corp-canary-81.sas.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id Fxip9o0FqiE0-YPIAS6Mu; Fri, 31 Oct 2025 18:59:22 +0300 Precedence: bulk X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1761926362; bh=vY0OE5QMEqzOyQE29iXX8SgUTFf8mtXdoyKSkyX34oo=; h=Cc:Message-ID:References:Date:In-Reply-To:Subject:To:From; b=MiJI5MtN+5sLgcvaYur4m//+guUtiklooZ3wwWsWYaqwUrUWbkSh85MeadhvMJX7Z KGzzgyIyNBk6PqVHT8FSpnotaYjv+J8k94lrd0kWuE7/VnNMG9mL22uCQrz1pu6++T tK6xZoCTqqShHvio2CQqAAXt+mBOmxpNoeKEypks= Authentication-Results: mail-nwsmtp-smtp-corp-canary-81.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 v5 4/7] chardev/char: move filename and be_opened handling to qemu_char_open() Date: Fri, 31 Oct 2025 18:59:11 +0300 Message-ID: <20251031155914.189112-5-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20251031155914.189112-1-vsementsov@yandex-team.ru> References: <20251031155914.189112-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_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: 1761926811787158501 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:07 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=1761926536; cv=none; d=zohomail.com; s=zohoarc; b=LYDunb9wRjlkS8v8k/P2mNQ9LSIudZhDj9ZtFw9AD0EOzrk1dHD7d82g7RY7/M7ESnzbNSbzajJ0gqPF5UTPi5eTelk523i1hkIEz+1vp68n7W4LLUFRsFZGZK0n6Gb7d4+Nknb4d6Os0dv6oqLbT06N9znb+z0lV1uVhtmK7XU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1761926536; 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=K896VjWcrOPIeJ05AQfDV1xDA9uM8UKPhfeRgDqDo1E=; b=d3hJ+PR2w1Kx0GGhG9beX3Te5BFaIuGHkDxvZ20zm8zo+FJ4914+Amw/cLYa96MW2IQt/pTb7f6ppYok4Rds/6siCQ5txQMl1kZtph6JvsSy+zB9wCVedbhpcs6y4+jUqHX/PezCCbDuWSJRJU4QnHbit3+P0T4FFaKyv+XhaiY= 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 1761926536687383.2764794525042; Fri, 31 Oct 2025 09:02:16 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vErXd-0007Ac-1s; Fri, 31 Oct 2025 11:59:54 -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 1vErXN-00076V-Bo for qemu-devel@nongnu.org; Fri, 31 Oct 2025 11:59:37 -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 1vErXG-0005zy-3Z for qemu-devel@nongnu.org; Fri, 31 Oct 2025 11:59:37 -0400 Received: from mail-nwsmtp-smtp-corp-canary-81.sas.yp-c.yandex.net (mail-nwsmtp-smtp-corp-canary-81.sas.yp-c.yandex.net [IPv6:2a02:6b8:c10:49f:0:640:b99a:0]) by forwardcorp1b.mail.yandex.net (Yandex) with ESMTPS id 14EF28088A; Fri, 31 Oct 2025 18:59:24 +0300 (MSK) Received: from vsementsov-lin.. (unknown [2a02:6bf:8080:546::1:17]) by mail-nwsmtp-smtp-corp-canary-81.sas.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id Fxip9o0FqiE0-bF6TNGtS; Fri, 31 Oct 2025 18:59:23 +0300 Precedence: bulk X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1761926363; bh=K896VjWcrOPIeJ05AQfDV1xDA9uM8UKPhfeRgDqDo1E=; h=Cc:Message-ID:References:Date:In-Reply-To:Subject:To:From; b=TovYVN1YSWFtnx8HZ+/ALzZ2+Ye/bQ1/EvHSVOTCGrhGtYskXuF/kxnKmR0AJ/2dF r9uWSZOpFWiAFRPB3NNF0eJflxiHPXx+1QCQYVPMsZT+XKZSjNyrC0X/6aM/+XSXs5 XITv8Lv1POGl3EkEGEWGJHtDYqE5pdnGlcr41LoY= Authentication-Results: mail-nwsmtp-smtp-corp-canary-81.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 v5 5/7] chardev/char: introduce .init() + .connect() initialization interface Date: Fri, 31 Oct 2025 18:59:12 +0300 Message-ID: <20251031155914.189112-6-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20251031155914.189112-1-vsementsov@yandex-team.ru> References: <20251031155914.189112-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: 1761926539863154100 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..c67b4d640f 100644 --- a/chardev/char-fe.c +++ b/chardev/char-fe.c @@ -193,6 +193,10 @@ bool qemu_chr_fe_init(CharFrontend *c, Chardev *s, Err= or **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 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:07 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=1761926648; cv=none; d=zohomail.com; s=zohoarc; b=et5vPp0GShdfsvKBTeTZjy9pFuCG4yC/cZqJ6Vdt7K+/loiWlHj8tybI4QAs7X3teU+LK4j62hu51lDNJx+2mSUdh4AjP2VVbejGVzWrsN6KJZxYBoAAVrFeUCQk/V6qtRJrVqN4mKrTEiSJcRM/0+n5Ki7nkbxZT2fWKq2EUAU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1761926648; 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=lj+6b98ZtuqMrGU7pO6omKJPP09lupqPvxR7P6umg/9skHkS6pe/wDl9Jl6e6x/xhjLPK4daQuCY4FrdWlalnFQyEoj7Eyg4EXfrRzSOpKjstSBHZIjSMNj5zKOnCmBYvxeM/QO2qJuSaN8r3sX21oVJndQOAwPvRmSDbbCORME= 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 1761926648356233.6194463133412; Fri, 31 Oct 2025 09:04:08 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vErXZ-0007A5-0m; Fri, 31 Oct 2025 11:59:49 -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 1vErXO-00077h-9Z for qemu-devel@nongnu.org; Fri, 31 Oct 2025 11:59:40 -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 1vErXF-000604-6i for qemu-devel@nongnu.org; Fri, 31 Oct 2025 11:59:38 -0400 Received: from mail-nwsmtp-smtp-corp-canary-81.sas.yp-c.yandex.net (mail-nwsmtp-smtp-corp-canary-81.sas.yp-c.yandex.net [IPv6:2a02:6b8:c10:49f:0:640:b99a:0]) by forwardcorp1b.mail.yandex.net (Yandex) with ESMTPS id 7955B80873; Fri, 31 Oct 2025 18:59:25 +0300 (MSK) Received: from vsementsov-lin.. (unknown [2a02:6bf:8080:546::1:17]) by mail-nwsmtp-smtp-corp-canary-81.sas.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id Fxip9o0FqiE0-I59YcE8G; Fri, 31 Oct 2025 18:59:24 +0300 Precedence: bulk X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1761926364; bh=xYy79KhJdbRf73qAJW7T8dFetl8fZysPsUK+12kaI4g=; h=Cc:Message-ID:References:Date:In-Reply-To:Subject:To:From; b=w2kyCkujbYf1gsxGwhoCUj4IeJXfptDSY0TgHZPPDP5UT3oBXu5gBhdk4JJqKvJiS +MTTWv2iM7DySHX2IAVH5q7m/a5I6X3DssBnkT6x/bYWKNH1pXzT1xxrX6s+3lfOlc Auwnf90pv84oSl3lWBcIhWS9KuWfCDVFNaiZtWE8= Authentication-Results: mail-nwsmtp-smtp-corp-canary-81.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 v5 6/7] chardev/char-socket: move to .init + .connect api Date: Fri, 31 Oct 2025 18:59:13 +0300 Message-ID: <20251031155914.189112-7-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20251031155914.189112-1-vsementsov@yandex-team.ru> References: <20251031155914.189112-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_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_PASS=-0.001, T_SPF_HELO_TEMPERROR=0.01 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: 1761926651542154100 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:07 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=1761926537; cv=none; d=zohomail.com; s=zohoarc; b=X2grh0gnOprBsYRDGd/iyLYIGJzLLZnzNJLyk+X5q55MyU1oqwj1u8AhErEoFp5rIJKZC8XyRTfNqAbm8yYmxvk3H/znXucXE47FX1Sa9gKpL00+ATnfil6SIqrt7X1vhqxh8F3zWYBF/xA9Mt1vNeghSleSttzSQl+MkCEEW+g= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1761926537; 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=wzMooQb9vJAU0bDLitNNnQXteL2SWP+Iv5C59eOY8sE=; b=PinYMOnKDEYzjWtPwipyHDgxvqquQbNfNncTik51dihK9lZfBiAzv5Nd1w/kBm0RErW8QoV7xFOwjGEyBxt64THwkhAfs+Q3x5X70g+J5iJqnj9TUkV6kVAaZGJ3DIA0+n4JF50SQV7K3+yrc1WitwPb/4bGO0Sai9zpGsVL/5w= 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 1761926537346344.95138932317457; Fri, 31 Oct 2025 09:02:17 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vErXb-0007A8-4a; Fri, 31 Oct 2025 11:59:52 -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 1vErXV-00078o-Hk for qemu-devel@nongnu.org; Fri, 31 Oct 2025 11:59:47 -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 1vErXG-00060F-UR for qemu-devel@nongnu.org; Fri, 31 Oct 2025 11:59:43 -0400 Received: from mail-nwsmtp-smtp-corp-canary-81.sas.yp-c.yandex.net (mail-nwsmtp-smtp-corp-canary-81.sas.yp-c.yandex.net [IPv6:2a02:6b8:c10:49f:0:640:b99a:0]) by forwardcorp1b.mail.yandex.net (Yandex) with ESMTPS id 0659D80886; Fri, 31 Oct 2025 18:59:27 +0300 (MSK) Received: from vsementsov-lin.. (unknown [2a02:6bf:8080:546::1:17]) by mail-nwsmtp-smtp-corp-canary-81.sas.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id Fxip9o0FqiE0-73lyTnh2; Fri, 31 Oct 2025 18:59: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=1761926366; bh=wzMooQb9vJAU0bDLitNNnQXteL2SWP+Iv5C59eOY8sE=; h=Message-ID:Date:In-Reply-To:Cc:Subject:References:To:From; b=U4t5IE3AouIWCCSorTL5SuC0ZKqmbRO/+24EOwSIh4GKklNoPVa4CfAV8Pff31ZzI BOB10uFaOoUO3+r218INiTEV2c5v2jchEH459gw5FGRa2sMxLx7gZ/ulYCn+VzZLcY GZ4uAz/CyYKyTstszlG3YllH9hLYRiXmuQzYW/PU= Authentication-Results: mail-nwsmtp-smtp-corp-canary-81.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 v5 7/7] chardev: introduce DEFINE_PROP_CHR_NO_CONNECT Date: Fri, 31 Oct 2025 18:59:14 +0300 Message-ID: <20251031155914.189112-8-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20251031155914.189112-1-vsementsov@yandex-team.ru> References: <20251031155914.189112-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_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, T_SPF_TEMPERROR=0.01 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: 1761926540114154100 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 | 8 ++++++-- include/hw/qdev-properties-system.h | 3 +++ 4 files changed, 59 insertions(+), 10 deletions(-) diff --git a/chardev/char-fe.c b/chardev/char-fe.c index c67b4d640f..1132ec0501 100644 --- a/chardev/char-fe.c +++ b/chardev/char-fe.c @@ -189,15 +189,26 @@ 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 (!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(CharFrontend *c, Chardev *s, Err= or **errp) } else { s->fe =3D c; } + } else { + /* + * connect=3Dfalse comes only from DEFINE_PROP_CHR_NO_CONNECT, + * through do_set_chr, which provides chardev ptr. + */ + assert(connect); } =20 c->fe_is_open =3D false; @@ -218,6 +235,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 13cc91680b..00f4b19238 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..f3df57afa1 100644 --- a/include/chardev/char-fe.h +++ b/include/chardev/char-fe.h @@ -25,14 +25,18 @@ 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. * * 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 5c6cc5eae8..a0b14a2f77 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