From nobody Fri Nov 14 18:26:43 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=1760455727; cv=none; d=zohomail.com; s=zohoarc; b=Mx52ZHYpEi4DLLagjEQ6VzWI2ZtbGOq0I87PPd1rdpfOZddbPjPbV1jhH1wtekZMmsqdMaqGzNJ0c04fdP5/R8JGW9IIsR+X5NPcgAS2TEob32MBbpfBBiA/L6E6MfhJ5Pf30JwIO3X05ThbYCNJZTQrsqknJrqm7OGCSVtMouU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1760455727; 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=fnCkxRskN7fs8VljK/f4zQaOaW5Noz406YBxaatHCQA5qrYiSfzgyUJqbsd1sNd1n+vs0Uw8qxCLMN3GntFbl9U6aSKPhxoGUnZud4qDAQ0yH29nESfawrbBDMUYNM/1b0cn9cIfPRbBbTcC6uuyEqvV7Qx4EO1j6403I4susqk= 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 1760455726594896.5803849924542; Tue, 14 Oct 2025 08:28:46 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1v8gvr-00071N-2m; Tue, 14 Oct 2025 11:27:23 -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 1v8gvp-00070T-4F for qemu-devel@nongnu.org; Tue, 14 Oct 2025 11:27:21 -0400 Received: from forwardcorp1d.mail.yandex.net ([2a02:6b8:c41:1300: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 1v8gvh-0007gY-P4 for qemu-devel@nongnu.org; Tue, 14 Oct 2025 11:27:20 -0400 Received: from mail-nwsmtp-smtp-corp-main-56.klg.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-56.klg.yp-c.yandex.net [IPv6:2a02:6b8:c42:65a0:0:640:e1de:0]) by forwardcorp1d.mail.yandex.net (Yandex) with ESMTPS id 25820807E0; Tue, 14 Oct 2025 18:27:10 +0300 (MSK) Received: from vsementsov-lin.. (unknown [2a02:6bf:8080:a8a::1:35]) by mail-nwsmtp-smtp-corp-main-56.klg.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id 7RRbiX2F1mI0-aefZtJT6; Tue, 14 Oct 2025 18:27:09 +0300 Precedence: bulk X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1760455629; bh=vEFpAi/SJoZ1FyW5/cNP/W5tIquHEsUoHiATdJxF5jc=; h=Cc:Message-ID:References:Date:In-Reply-To:Subject:To:From; b=Y4pK4YBBbm94+UiPl8OOprviCzSXsgOPaQ0G2UIaCI7qj6jDfAI1Snvw+Kvlwll4V JVjIvEdXIbiiTJdPagr9lcrwU5FCDw4bHIEmJI4WkqcjmwvBdTMk4/x7q7qrpSzSLT PR8NxbD/KZL+dL0qCAO2q7qD6UBZRz+Vtq4PkgpE= Authentication-Results: mail-nwsmtp-smtp-corp-main-56.klg.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 v3 1/7] chardev/char-socket: simplify reconnect-ms handling Date: Tue, 14 Oct 2025 18:26:38 +0300 Message-ID: <20251014152644.954762-2-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20251014152644.954762-1-vsementsov@yandex-team.ru> References: <20251014152644.954762-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:c41:1300:1:45:d181:df01; 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, 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: 1760455729127158500 We pass it to qmp_chardev_open_socket_client() only to write to s->reconnect_time_ms. Let's simply set this field earlier, together with other options. Signed-off-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Marc-Andr=C3=A9 Lureau --- chardev/char-socket.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/chardev/char-socket.c b/chardev/char-socket.c index 62852e3caf..f3bc6290d2 100644 --- a/chardev/char-socket.c +++ b/chardev/char-socket.c @@ -1274,18 +1274,16 @@ skip_listen: =20 =20 static int qmp_chardev_open_socket_client(Chardev *chr, - int64_t reconnect_ms, Error **errp) { SocketChardev *s =3D SOCKET_CHARDEV(chr); =20 - if (reconnect_ms > 0) { - s->reconnect_time_ms =3D reconnect_ms; + if (s->reconnect_time_ms > 0) { tcp_chr_connect_client_async(chr); return 0; - } else { - return tcp_chr_connect_client_sync(chr, errp); } + + return tcp_chr_connect_client_sync(chr, errp); } =20 =20 @@ -1378,7 +1376,6 @@ static void qmp_chardev_open_socket(Chardev *chr, bool is_tn3270 =3D sock->has_tn3270 ? sock->tn3270 : false; bool is_waitconnect =3D sock->has_wait ? sock->wait : false; bool is_websock =3D sock->has_websocket ? sock->websocket : false; - int64_t reconnect_ms =3D sock->has_reconnect_ms ? sock->reconnect_ms := 0; SocketAddress *addr; =20 s->is_listen =3D is_listen; @@ -1386,6 +1383,8 @@ static void qmp_chardev_open_socket(Chardev *chr, s->is_tn3270 =3D is_tn3270; s->is_websock =3D is_websock; s->do_nodelay =3D do_nodelay; + s->reconnect_time_ms =3D sock->has_reconnect_ms ? sock->reconnect_ms := 0; + if (sock->tls_creds) { Object *creds; creds =3D object_resolve_path_component( @@ -1450,7 +1449,7 @@ static void qmp_chardev_open_socket(Chardev *chr, return; } } else { - if (qmp_chardev_open_socket_client(chr, reconnect_ms, errp) < 0) { + if (qmp_chardev_open_socket_client(chr, errp) < 0) { return; } } --=20 2.48.1 From nobody Fri Nov 14 18:26:43 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=1760455681; cv=none; d=zohomail.com; s=zohoarc; b=M5gt6Ms08H9K+cZiKNvHQkCaTzTa3zGi+UWOdlyB2JEH+P1wK2XH/GfNtR41YmMGvaFWjinRXtdPYWuXK8wSDHIerdUmonJIvzd9RTZNTIgk9e+eUAfTgRRAXb2tlJzqyynpLElmfLvKb5bjPW8CMvD+UAboBiArDf2sT7c9px8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1760455681; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=rSiygVaq/OKk7hWJBukWMBPr1Huyh4D+DvkeSRa44cU=; b=d00XvNTZFa8DLeiFCSUPGpXSJsOEW65PL22dI+9i+ixfdFka3GCFP4Sz7IbKrVeSI1ChcFTyukvpMdLbt24UrijQFh+v5IuMFfMWPweBiyPQx7khIxCIp0tf5XhRKt3MgI1b6xLRA6HkQPCwJNbgPLApSXArbjeStR8LKn7oX8I= 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 1760455680731815.2765846690146; Tue, 14 Oct 2025 08:28:00 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1v8gvs-00071z-8b; Tue, 14 Oct 2025 11:27:24 -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 1v8gvn-0006zL-Bn for qemu-devel@nongnu.org; Tue, 14 Oct 2025 11:27:19 -0400 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 1v8gvh-0007gb-IS for qemu-devel@nongnu.org; Tue, 14 Oct 2025 11:27:19 -0400 Received: from mail-nwsmtp-smtp-corp-main-56.klg.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-56.klg.yp-c.yandex.net [IPv6:2a02:6b8:c42:65a0:0:640:e1de:0]) by forwardcorp1d.mail.yandex.net (Yandex) with ESMTPS id C4548807EF; Tue, 14 Oct 2025 18:27:10 +0300 (MSK) Received: from vsementsov-lin.. (unknown [2a02:6bf:8080:a8a::1:35]) by mail-nwsmtp-smtp-corp-main-56.klg.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id 7RRbiX2F1mI0-xxrvWLqr; Tue, 14 Oct 2025 18:27:10 +0300 Precedence: bulk X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1760455630; bh=rSiygVaq/OKk7hWJBukWMBPr1Huyh4D+DvkeSRa44cU=; h=Cc:Message-ID:References:Date:In-Reply-To:Subject:To:From; b=mZr/U4DvV/aGe66l0G2jtO2LMa4acpzQbnbbi4t0Xhclb6mgBx5R+1TcW62e07zQl u2RoaA61LuuD4pIu8881GQx392+9SztnlDasXCQkEhoxQ3q0eo7iCwcB/93My+BB4Y f2TCaP6Ksy7EJX2fDjTcifeedi58UdMLodKw54Sk= Authentication-Results: mail-nwsmtp-smtp-corp-main-56.klg.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 v3 2/7] chardev/char: split chardev_init_logfd() out of qemu_char_open() Date: Tue, 14 Oct 2025 18:26:39 +0300 Message-ID: <20251014152644.954762-3-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20251014152644.954762-1-vsementsov@yandex-team.ru> References: <20251014152644.954762-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_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @yandex-team.ru) X-ZM-MESSAGEID: 1760455687442158500 We are going to share new chardev_init_logfd() with further alternative initialization interface. Let qemu_char_open() be a wrapper for .open(), and its artifacts (handle be_opened if was not set to false by backend, and filename). Signed-off-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Marc-Andr=C3=A9 Lureau --- chardev/char.c | 50 ++++++++++++++++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 18 deletions(-) diff --git a/chardev/char.c b/chardev/char.c index a43b7e5481..4a531265c1 100644 --- a/chardev/char.c +++ b/chardev/char.c @@ -250,22 +250,6 @@ static void qemu_char_open(Chardev *chr, ChardevBacken= d *backend, bool *be_opened, Error **errp) { ChardevClass *cc =3D CHARDEV_GET_CLASS(chr); - /* Any ChardevCommon member would work */ - ChardevCommon *common =3D backend ? backend->u.null.data : NULL; - - if (common && common->logfile) { - int flags =3D O_WRONLY; - if (common->has_logappend && - common->logappend) { - flags |=3D O_APPEND; - } else { - flags |=3D O_TRUNC; - } - chr->logfd =3D qemu_create(common->logfile, flags, 0666, errp); - if (chr->logfd < 0) { - return; - } - } =20 if (cc->open) { cc->open(chr, backend, be_opened, errp); @@ -1000,6 +984,29 @@ void qemu_chr_set_feature(Chardev *chr, return set_bit(feature, chr->features); } =20 +static bool chardev_init_common(Chardev *chr, ChardevBackend *backend, + Error **errp) +{ + /* Any ChardevCommon member would work */ + ChardevCommon *common =3D backend ? backend->u.null.data : NULL; + + if (common && common->logfile) { + int flags =3D O_WRONLY; + if (common->has_logappend && + common->logappend) { + flags |=3D O_APPEND; + } else { + flags |=3D O_TRUNC; + } + chr->logfd =3D qemu_create(common->logfile, flags, 0666, errp); + if (chr->logfd < 0) { + return false; + } + } + + return true; +} + static Chardev *chardev_new(const char *id, const char *typename, ChardevBackend *backend, GMainContext *gcontext, @@ -1020,11 +1027,14 @@ static Chardev *chardev_new(const char *id, const c= har *typename, chr->label =3D g_strdup(id); chr->gcontext =3D gcontext; =20 + if (!chardev_init_common(chr, backend, errp)) { + goto fail; + } + qemu_char_open(chr, backend, &be_opened, &local_err); if (local_err) { error_propagate(errp, local_err); - object_unref(obj); - return NULL; + goto fail; } =20 if (!chr->filename) { @@ -1035,6 +1045,10 @@ static Chardev *chardev_new(const char *id, const ch= ar *typename, } =20 return chr; + +fail: + object_unref(obj); + return NULL; } =20 Chardev *qemu_chardev_new(const char *id, const char *typename, --=20 2.48.1 From nobody Fri Nov 14 18:26:43 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=1760455767; cv=none; d=zohomail.com; s=zohoarc; b=fk+0rmYwjMJj8FF1Az4R5i4EfjIRzlyFSh8HYgm5CmWJ7WBrroj4ZdCgAQAZqZNIwwBsfVxYKYNDNhMWCclHgkzRK5BjqU3sUdIollFNFMDXlzoK2+c/9NiW85u4qzpKidHjAmt5XUBaZj0u7wQ81knilm2BM50ZkDYGEQpsVuk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1760455767; 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=vusX7oQS6Rb/UOLs/e5Ea6mc9zWDZ4KZAFEbrB85u9Q=; b=C2V5TPXb7ZVNAtlHA0DV1ayD4SYR5px00EarAf0QDn+yNIULjtzBrWTEwq21bqsfFjfAQt3nRNGgBeyb898gk4xmQjoDvQY9Xgqt6KzhRXlk8iv2pKfvgtlTfn6EGQ7DdNyVYYSTouLG5EC3KWmGZK2xtPfrJNbioh0UojYQ4SQ= 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 1760455767260596.0972417892165; Tue, 14 Oct 2025 08:29:27 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1v8gvp-00070C-Ey; Tue, 14 Oct 2025 11:27:21 -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 1v8gvm-0006z6-TQ for qemu-devel@nongnu.org; Tue, 14 Oct 2025 11:27:18 -0400 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 1v8gvk-0007gf-2o for qemu-devel@nongnu.org; Tue, 14 Oct 2025 11:27:18 -0400 Received: from mail-nwsmtp-smtp-corp-main-56.klg.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-56.klg.yp-c.yandex.net [IPv6:2a02:6b8:c42:65a0:0:640:e1de:0]) by forwardcorp1d.mail.yandex.net (Yandex) with ESMTPS id 8C7B9807F8; Tue, 14 Oct 2025 18:27:11 +0300 (MSK) Received: from vsementsov-lin.. (unknown [2a02:6bf:8080:a8a::1:35]) by mail-nwsmtp-smtp-corp-main-56.klg.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id 7RRbiX2F1mI0-X0gO0Ur1; Tue, 14 Oct 2025 18:27:11 +0300 Precedence: bulk X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1760455631; bh=vusX7oQS6Rb/UOLs/e5Ea6mc9zWDZ4KZAFEbrB85u9Q=; h=Message-ID:Date:In-Reply-To:Cc:Subject:References:To:From; b=e14FhsBVss3hVUBDcvxD8Op9X6ohNgahC8RInTbdS+0W/KFt8/br4HgIZcFgNqJe2 MBVS0lOBNC4gfXsY0qrhF0qYPoOhnet9aDUPOVUEkx2qOYsE/lXnoezdhvOyHHGshZ X50msJYW4uEBWDRMJ6KEqhXaN4e79cet9UAvrUwc= Authentication-Results: mail-nwsmtp-smtp-corp-main-56.klg.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 v3 3/7] chardev/char: qemu_char_open(): add return value Date: Tue, 14 Oct 2025 18:26:40 +0300 Message-ID: <20251014152644.954762-4-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20251014152644.954762-1-vsementsov@yandex-team.ru> References: <20251014152644.954762-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_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @yandex-team.ru) X-ZM-MESSAGEID: 1760455769603154100 Content-Type: text/plain; charset="utf-8" Accordingly with recommendations in include/qapi/error.h accompany errp by boolean return value and get rid of error propagation. Signed-off-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Markus Armbruster --- chardev/char.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/chardev/char.c b/chardev/char.c index 4a531265c1..c874a2d31e 100644 --- a/chardev/char.c +++ b/chardev/char.c @@ -246,14 +246,20 @@ int qemu_chr_add_client(Chardev *s, int fd) CHARDEV_GET_CLASS(s)->chr_add_client(s, fd) : -1; } =20 -static void qemu_char_open(Chardev *chr, ChardevBackend *backend, +static bool qemu_char_open(Chardev *chr, ChardevBackend *backend, bool *be_opened, Error **errp) { + ERRP_GUARD(); ChardevClass *cc =3D CHARDEV_GET_CLASS(chr); =20 if (cc->open) { cc->open(chr, backend, be_opened, errp); + if (*errp) { + return false; + } } + + return true; } =20 static void char_init(Object *obj) @@ -1015,7 +1021,6 @@ static Chardev *chardev_new(const char *id, const cha= r *typename, { Object *obj; Chardev *chr =3D NULL; - Error *local_err =3D NULL; bool be_opened =3D true; =20 assert(g_str_has_prefix(typename, "chardev-")); @@ -1031,9 +1036,7 @@ static Chardev *chardev_new(const char *id, const cha= r *typename, goto fail; } =20 - qemu_char_open(chr, backend, &be_opened, &local_err); - if (local_err) { - error_propagate(errp, local_err); + if (!qemu_char_open(chr, backend, &be_opened, errp)) { goto fail; } =20 --=20 2.48.1 From nobody Fri Nov 14 18:26:43 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=1760455738; cv=none; d=zohomail.com; s=zohoarc; b=Pehwbd2uaPdjUX/nOH4g7cwS3goBm0FxQehHxFrRWvq6AxBJS5t8smyIyZ7yXClj0EKJUX6RhCi0AkdWrjZ+QBPVea1WbdCjaDiL8joktZON6vWeNNJxQk3beZ57OL9lNuXfxPeFnos0pnHAFGUT+x36tbx2TpLXBkxPpQ6IxKU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1760455738; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=mAcgyU8pWURnH1Cci2ISyWqlwVQRNioOv0+KYPy8xKQ=; b=nI5gdKhNlOFKoMCmGd6yrUH6qWxcAdwjaivwofc7Ot0TqGdv48hjzsjaBT8YHWI28qm2EaK0wiTTDiacpCEnN5IKLnKZU7Z9lnXq2HhulvdamIVTDjNLiT2oGQJGwGs5pvS78+37KZXwXGrvuvCwBzULjkzL0e9NZb1emccEhf4= 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 1760455737835289.9863424249843; Tue, 14 Oct 2025 08:28:57 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1v8gvq-00070l-56; Tue, 14 Oct 2025 11:27:22 -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 1v8gvn-0006zT-HI for qemu-devel@nongnu.org; Tue, 14 Oct 2025 11:27:19 -0400 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 1v8gvh-0007gn-QF for qemu-devel@nongnu.org; Tue, 14 Oct 2025 11:27:19 -0400 Received: from mail-nwsmtp-smtp-corp-main-56.klg.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-56.klg.yp-c.yandex.net [IPv6:2a02:6b8:c42:65a0:0:640:e1de:0]) by forwardcorp1d.mail.yandex.net (Yandex) with ESMTPS id 4CFD080834; Tue, 14 Oct 2025 18:27:12 +0300 (MSK) Received: from vsementsov-lin.. (unknown [2a02:6bf:8080:a8a::1:35]) by mail-nwsmtp-smtp-corp-main-56.klg.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id 7RRbiX2F1mI0-0gdxmUKb; Tue, 14 Oct 2025 18:27:11 +0300 Precedence: bulk X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1760455631; bh=mAcgyU8pWURnH1Cci2ISyWqlwVQRNioOv0+KYPy8xKQ=; h=Cc:Message-ID:References:Date:In-Reply-To:Subject:To:From; b=ynbI6ORmwGGjvn9nTwxEEjAOCzX296fVLL+i8GIC5YAvRo95bP2UmN6C0gx8GYmC2 l0DJcI6MSiTgjC6tzBolaGqV71c7CTuvd+Cwa0wTw78OlH44e0/GJ5jV2+bYniGFrC Hf/ZV2pzjqqCzV5rmwWUV0E0lwR+XCLge7zVemPs= Authentication-Results: mail-nwsmtp-smtp-corp-main-56.klg.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 v3 4/7] chardev/char: move filename and be_opened handling to qemu_char_open() Date: Tue, 14 Oct 2025 18:26:41 +0300 Message-ID: <20251014152644.954762-5-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20251014152644.954762-1-vsementsov@yandex-team.ru> References: <20251014152644.954762-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_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @yandex-team.ru) X-ZM-MESSAGEID: 1760455741824154100 Absent filename and necessity to send CHR_EVENT_OPENED are artifacts of .open(). Handle them in qemu_char_open(). Signed-off-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Marc-Andr=C3=A9 Lureau --- chardev/char.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/chardev/char.c b/chardev/char.c index c874a2d31e..27290e26fb 100644 --- a/chardev/char.c +++ b/chardev/char.c @@ -247,18 +247,27 @@ int qemu_chr_add_client(Chardev *s, int fd) } =20 static bool qemu_char_open(Chardev *chr, ChardevBackend *backend, - bool *be_opened, Error **errp) + const char *default_filename, Error **errp) { ERRP_GUARD(); ChardevClass *cc =3D CHARDEV_GET_CLASS(chr); + bool be_opened =3D true; =20 if (cc->open) { - cc->open(chr, backend, be_opened, errp); + cc->open(chr, backend, &be_opened, errp); if (*errp) { return false; } } =20 + if (!chr->filename) { + chr->filename =3D g_strdup(default_filename); + } + + if (be_opened) { + qemu_chr_be_event(chr, CHR_EVENT_OPENED); + } + return true; } =20 @@ -1021,7 +1030,6 @@ static Chardev *chardev_new(const char *id, const cha= r *typename, { Object *obj; Chardev *chr =3D NULL; - bool be_opened =3D true; =20 assert(g_str_has_prefix(typename, "chardev-")); assert(id); @@ -1036,17 +1044,10 @@ static Chardev *chardev_new(const char *id, const c= har *typename, goto fail; } =20 - if (!qemu_char_open(chr, backend, &be_opened, errp)) { + if (!qemu_char_open(chr, backend, typename + 8, errp)) { goto fail; } =20 - if (!chr->filename) { - chr->filename =3D g_strdup(typename + 8); - } - if (be_opened) { - qemu_chr_be_event(chr, CHR_EVENT_OPENED); - } - return chr; =20 fail: --=20 2.48.1 From nobody Fri Nov 14 18:26:43 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=1760455770; cv=none; d=zohomail.com; s=zohoarc; b=nZpyRxeMl497HYuxFPwXfFPrYJszkZTzbwEvIhVFRK6cJE+B49gSkvhuhuN5ttjdOgPh90tvlB60qOxccqTqlBAKacjpRAf2hOtkV4Lp3/JGVlMGqQfZGwqgQTdtmOBwlUCjGid56r946YaDvsvPWfyfqDr/UC1otNvkN0MFGIU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1760455770; 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=e7yXNIFXohwZf1oeg5G5audWTehOW7zR4XPHuWfXKaU=; b=gYoMz0MZxSvVNv1LMIQS1npoc0Ip7NXg3S1cPPaKlUiglzTDBd27gg/7zn7zojMy4bTUWs1WNxQbYGFZ3/TOEIrOtzr1/XRzdJ1crbZcecxUFvqQrAnKpp0EM67JyKqRy2g6MMUcCGA0lIgMm1b1CNRI+kwnBkb3tbixv18uStI= 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 1760455770815457.35590334108485; Tue, 14 Oct 2025 08:29:30 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1v8gvp-00070V-KO; Tue, 14 Oct 2025 11:27:21 -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 1v8gvm-0006yv-1Y for qemu-devel@nongnu.org; Tue, 14 Oct 2025 11:27:18 -0400 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 1v8gvj-0007gt-Sw for qemu-devel@nongnu.org; Tue, 14 Oct 2025 11:27:17 -0400 Received: from mail-nwsmtp-smtp-corp-main-56.klg.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-56.klg.yp-c.yandex.net [IPv6:2a02:6b8:c42:65a0:0:640:e1de:0]) by forwardcorp1d.mail.yandex.net (Yandex) with ESMTPS id 0B198807DB; Tue, 14 Oct 2025 18:27:13 +0300 (MSK) Received: from vsementsov-lin.. (unknown [2a02:6bf:8080:a8a::1:35]) by mail-nwsmtp-smtp-corp-main-56.klg.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id 7RRbiX2F1mI0-jNHSANgp; Tue, 14 Oct 2025 18:27:12 +0300 Precedence: bulk X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1760455632; bh=e7yXNIFXohwZf1oeg5G5audWTehOW7zR4XPHuWfXKaU=; h=Cc:Message-ID:References:Date:In-Reply-To:Subject:To:From; b=WV5e/Sb9Wp9A5HD5tPfeNne2HzEblegOj4LnA9dL5+bZLoHEBjk54/RrpbXdDqSKX ESfW5LT6h/0Y4hFhLYw6hAoM06lHJimu2GOwPJiZ2XAI8MsQx1ognQ7g7gqSllwajk hV5fD3JAa6ZAWezm3CDAav1GptMwDD1FV8+hBDC8= Authentication-Results: mail-nwsmtp-smtp-corp-main-56.klg.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 v3 5/7] chardev/char: introduce .init() + .connect() initialization interface Date: Tue, 14 Oct 2025 18:26:42 +0300 Message-ID: <20251014152644.954762-6-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20251014152644.954762-1-vsementsov@yandex-team.ru> References: <20251014152644.954762-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_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @yandex-team.ru) X-ZM-MESSAGEID: 1760455773686158500 We'll need a possibility to postpone connect step to later point in time to implement backend-transfer migration feature for vhost-user-blk in further commits. Let's start with new char interface for backends. .init() takes QAPI parameters and should parse them, called early .connect() should actually establish a connection, and postponed to the point of attaching to frontend. Called at later point, either at time of attaching frontend, either from qemu_chr_wait_connected(). Signed-off-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Marc-Andr=C3=A9 Lureau --- chardev/char-fe.c | 4 ++++ chardev/char.c | 39 +++++++++++++++++++++++++++++++++++++-- include/chardev/char.h | 22 +++++++++++++++++++++- 3 files changed, 62 insertions(+), 3 deletions(-) diff --git a/chardev/char-fe.c b/chardev/char-fe.c index 158a5f4f55..973fed5bea 100644 --- a/chardev/char-fe.c +++ b/chardev/char-fe.c @@ -193,6 +193,10 @@ bool qemu_chr_fe_init(CharBackend *b, Chardev *s, Erro= r **errp) { unsigned int tag =3D 0; =20 + if (!qemu_chr_connect(s, errp)) { + return false; + } + if (s) { if (CHARDEV_IS_MUX(s)) { MuxChardev *d =3D MUX_CHARDEV(s); diff --git a/chardev/char.c b/chardev/char.c index 27290e26fb..409f3aac1c 100644 --- a/chardev/char.c +++ b/chardev/char.c @@ -33,6 +33,7 @@ #include "qapi/error.h" #include "qapi/qapi-commands-char.h" #include "qapi/qmp/qerror.h" +#include "qom/object.h" #include "system/replay.h" #include "qemu/help_option.h" #include "qemu/module.h" @@ -338,10 +339,29 @@ static bool qemu_chr_is_busy(Chardev *s) } } =20 +bool qemu_chr_connect(Chardev *chr, Error **errp) +{ + ChardevClass *cc =3D CHARDEV_GET_CLASS(chr); + + if (chr->connect_postponed) { + assert(cc->connect); + chr->connect_postponed =3D false; + if (!cc->connect(chr, errp)) { + return false; + } + } + + return true; +} + int qemu_chr_wait_connected(Chardev *chr, Error **errp) { ChardevClass *cc =3D CHARDEV_GET_CLASS(chr); =20 + if (!qemu_chr_connect(chr, errp)) { + return -1; + } + if (cc->chr_wait_connected) { return cc->chr_wait_connected(chr, errp); } @@ -1030,6 +1050,7 @@ static Chardev *chardev_new(const char *id, const cha= r *typename, { Object *obj; Chardev *chr =3D NULL; + ChardevClass *cc; =20 assert(g_str_has_prefix(typename, "chardev-")); assert(id); @@ -1044,8 +1065,22 @@ static Chardev *chardev_new(const char *id, const ch= ar *typename, goto fail; } =20 - if (!qemu_char_open(chr, backend, typename + 8, errp)) { - goto fail; + cc =3D CHARDEV_GET_CLASS(chr); + + if (cc->init) { + assert(!cc->open); + assert(cc->connect); + + if (!cc->init(chr, backend, errp)) { + goto fail; + } + assert(chr->filename); + + chr->connect_postponed =3D true; + } else { + if (!qemu_char_open(chr, backend, typename + 8, errp)) { + goto fail; + } } =20 return chr; diff --git a/include/chardev/char.h b/include/chardev/char.h index 429852f8d9..ebadaf3482 100644 --- a/include/chardev/char.h +++ b/include/chardev/char.h @@ -63,6 +63,7 @@ struct Chardev { CharBackend *be; char *label; char *filename; + bool connect_postponed; int logfd; int be_open; /* used to coordinate the chardev-change special-case: */ @@ -225,6 +226,7 @@ QemuOpts *qemu_chr_parse_compat(const char *label, cons= t char *filename, bool permit_mux_mon); int qemu_chr_write(Chardev *s, const uint8_t *buf, int len, bool write_all= ); #define qemu_chr_write_all(s, buf, len) qemu_chr_write(s, buf, len, true) +bool qemu_chr_connect(Chardev *chr, Error **errp); int qemu_chr_wait_connected(Chardev *chr, Error **errp); =20 #define TYPE_CHARDEV "chardev" @@ -259,10 +261,28 @@ 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 and open/starts the backend, + * mutual exclusive with .init. .connect must not be defined when + * .open is defined. + */ void (*open)(Chardev *chr, ChardevBackend *backend, bool *be_opened, Error **errp); =20 + /* + * Called after construction, create the backend, mutual exclusive + * with .open, and must be accompanied by .connect. + * Must set chr-filename. + */ + bool (*init)(Chardev *chr, ChardevBackend *backend, + Error **errp); + + /* + * Called after .init(), open/starts the backend, mutual exclusive + * with .open. Must send CHR_EVENT_OPENED. + */ + bool (*connect)(Chardev *chr, Error **errp); + /* write buf to the backend */ int (*chr_write)(Chardev *s, const uint8_t *buf, int len); =20 --=20 2.48.1 From nobody Fri Nov 14 18:26:43 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=1760455736; cv=none; d=zohomail.com; s=zohoarc; b=ZKVF6hbNP1JmrZmrXGc3QDPT+9eI9xNfO7FjwGyDKna2kfBuPCjBJcZUxeMQi4+vufS/BwenkKiiQK76WICdU3QQv+7CxK03FbGlxi/b9DzKpR889etsHB/ek3qIlpunY+udLZKse4Iz2Mz9FEFAX4O6/rbbA4sC5s3JjPhm40o= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1760455736; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=kLc6+dIxyVu7x/mPWVadbK6vGVZkf5Pe36ikeBhkrU4=; b=OqHi5OJ/38iWqvyP+xsNryO5rs3LrkthfFeANSbOtEhR0wHokn6Vy6345ncmDiv0x2gZR7+EdCpXtFjF4EgHO5Py9dpmyy5uqv6rZ2e/oFz/w85Y930x8On3GqCk+jixJHBxEd6rfhEbCSF488GFAWls97bjAyJc+Frw9K6osm8= 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 1760455735944391.53746976133766; Tue, 14 Oct 2025 08:28:55 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1v8gvq-00070m-8R; Tue, 14 Oct 2025 11:27:22 -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 1v8gvo-0006zq-2C for qemu-devel@nongnu.org; Tue, 14 Oct 2025 11:27:20 -0400 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 1v8gvk-0007h4-B1 for qemu-devel@nongnu.org; Tue, 14 Oct 2025 11:27:19 -0400 Received: from mail-nwsmtp-smtp-corp-main-56.klg.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-56.klg.yp-c.yandex.net [IPv6:2a02:6b8:c42:65a0:0:640:e1de:0]) by forwardcorp1d.mail.yandex.net (Yandex) with ESMTPS id D13E88084D; Tue, 14 Oct 2025 18:27:13 +0300 (MSK) Received: from vsementsov-lin.. (unknown [2a02:6bf:8080:a8a::1:35]) by mail-nwsmtp-smtp-corp-main-56.klg.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id 7RRbiX2F1mI0-EqRQsU5b; Tue, 14 Oct 2025 18:27:13 +0300 Precedence: bulk X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1760455633; bh=kLc6+dIxyVu7x/mPWVadbK6vGVZkf5Pe36ikeBhkrU4=; h=Cc:Message-ID:References:Date:In-Reply-To:Subject:To:From; b=UvUEVbdZvOh6XFjBuXoQ32yY7QwyJhKaw5zljhzZhzmqllcxym0TONvUOUVceS0eA OO5H585+Lm3nbUMamwJuPK/isN/+1cJPg6eAnhd9KU8Qu7XkQ/k9vmil+YkCZTuFC4 0QhZ01LE7FWa/PeM0Bu6lddUObf0ixFIyDdOEWk4= Authentication-Results: mail-nwsmtp-smtp-corp-main-56.klg.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 v3 6/7] chardev/char-socket: move to .init + .connect api Date: Tue, 14 Oct 2025 18:26:43 +0300 Message-ID: <20251014152644.954762-7-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20251014152644.954762-1-vsementsov@yandex-team.ru> References: <20251014152644.954762-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_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @yandex-team.ru) X-ZM-MESSAGEID: 1760455741960154100 Move char-socket to new API. This will help to realize backend-transfer feature for vhost-user-blk. With this commit qemu_chr_fe_init() starts to do connecting, so we should handle its errors instead of passing &error_abort. Also, move qemu_chr_fe_init() in test-char.c, to trigger connect before trying to get address. Signed-off-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Marc-Andr=C3=A9 Lureau --- chardev/char-socket.c | 55 ++++++++++++++++++++--------------- chardev/char.c | 7 +++-- include/chardev/char-socket.h | 1 + tests/unit/test-char.c | 14 ++++----- ui/dbus-chardev.c | 12 ++++++-- 5 files changed, 54 insertions(+), 35 deletions(-) diff --git a/chardev/char-socket.c b/chardev/char-socket.c index f3bc6290d2..0a5738c158 100644 --- a/chardev/char-socket.c +++ b/chardev/char-socket.c @@ -1287,6 +1287,25 @@ static int qmp_chardev_open_socket_client(Chardev *c= hr, } =20 =20 +static bool char_socket_connect(Chardev *chr, Error **errp) +{ + SocketChardev *s =3D SOCKET_CHARDEV(chr); + + if (s->is_listen) { + if (qmp_chardev_open_socket_server(chr, s->is_telnet || s->is_tn32= 70, + s->is_waitconnect, errp) < 0) { + return false; + } + } else { + if (qmp_chardev_open_socket_client(chr, errp) < 0) { + return false; + } + } + + return true; +} + + static bool qmp_chardev_validate_socket(ChardevSocket *sock, SocketAddress *addr, Error **errp) @@ -1363,10 +1382,9 @@ static bool qmp_chardev_validate_socket(ChardevSocke= t *sock, } =20 =20 -static void qmp_chardev_open_socket(Chardev *chr, - ChardevBackend *backend, - bool *be_opened, - Error **errp) +static bool char_socket_init(Chardev *chr, + ChardevBackend *backend, + Error **errp) { SocketChardev *s =3D SOCKET_CHARDEV(chr); ChardevSocket *sock =3D backend->u.socket.data; @@ -1374,7 +1392,6 @@ static void qmp_chardev_open_socket(Chardev *chr, bool is_listen =3D sock->has_server ? sock->server : true; bool is_telnet =3D sock->has_telnet ? sock->telnet : false; bool is_tn3270 =3D sock->has_tn3270 ? sock->tn3270 : false; - bool is_waitconnect =3D sock->has_wait ? sock->wait : false; bool is_websock =3D sock->has_websocket ? sock->websocket : false; SocketAddress *addr; =20 @@ -1383,6 +1400,7 @@ static void qmp_chardev_open_socket(Chardev *chr, s->is_tn3270 =3D is_tn3270; s->is_websock =3D is_websock; s->do_nodelay =3D do_nodelay; + s->is_waitconnect =3D sock->has_wait ? sock->wait : false; s->reconnect_time_ms =3D sock->has_reconnect_ms ? sock->reconnect_ms := 0; =20 if (sock->tls_creds) { @@ -1392,7 +1410,7 @@ static void qmp_chardev_open_socket(Chardev *chr, if (!creds) { error_setg(errp, "No TLS credentials with id '%s'", sock->tls_creds); - return; + return false; } s->tls_creds =3D (QCryptoTLSCreds *) object_dynamic_cast(creds, @@ -1400,7 +1418,7 @@ static void qmp_chardev_open_socket(Chardev *chr, if (!s->tls_creds) { error_setg(errp, "Object with id '%s' is not TLS credentials", sock->tls_creds); - return; + return false; } object_ref(OBJECT(s->tls_creds)); if (!qcrypto_tls_creds_check_endpoint(s->tls_creds, @@ -1408,7 +1426,7 @@ static void qmp_chardev_open_socket(Chardev *chr, ? QCRYPTO_TLS_CREDS_ENDPOINT_SER= VER : QCRYPTO_TLS_CREDS_ENDPOINT_CLI= ENT, errp)) { - return; + return false; } } s->tls_authz =3D g_strdup(sock->tls_authz); @@ -1416,7 +1434,7 @@ static void qmp_chardev_open_socket(Chardev *chr, s->addr =3D addr =3D socket_address_flatten(sock->addr); =20 if (!qmp_chardev_validate_socket(sock, addr, errp)) { - return; + return false; } =20 qemu_chr_set_feature(chr, QEMU_CHAR_FEATURE_RECONNECTABLE); @@ -1433,26 +1451,14 @@ static void qmp_chardev_open_socket(Chardev *chr, */ if (!chr->handover_yank_instance) { if (!yank_register_instance(CHARDEV_YANK_INSTANCE(chr->label), err= p)) { - return; + return false; } } s->registered_yank =3D true; =20 - /* be isn't opened until we get a connection */ - *be_opened =3D false; - update_disconnected_filename(s); =20 - if (s->is_listen) { - if (qmp_chardev_open_socket_server(chr, is_telnet || is_tn3270, - is_waitconnect, errp) < 0) { - return; - } - } else { - if (qmp_chardev_open_socket_client(chr, errp) < 0) { - return; - } - } + return true; } =20 static void qemu_chr_parse_socket(QemuOpts *opts, ChardevBackend *backend, @@ -1576,7 +1582,8 @@ static void char_socket_class_init(ObjectClass *oc, c= onst void *data) cc->supports_yank =3D true; =20 cc->parse =3D qemu_chr_parse_socket; - cc->open =3D qmp_chardev_open_socket; + cc->init =3D char_socket_init; + cc->connect =3D char_socket_connect; cc->chr_wait_connected =3D tcp_chr_wait_connected; cc->chr_write =3D tcp_chr_write; cc->chr_sync_read =3D tcp_chr_sync_read; diff --git a/chardev/char.c b/chardev/char.c index 409f3aac1c..b68d44e394 100644 --- a/chardev/char.c +++ b/chardev/char.c @@ -1222,12 +1222,15 @@ ChardevReturn *qmp_chardev_change(const char *id, C= hardevBackend *backend, } =20 chr->be =3D NULL; - qemu_chr_fe_init(be, chr_new, &error_abort); + if (!qemu_chr_fe_init(be, chr_new, errp)) { + object_unref(OBJECT(chr_new)); + return NULL; + } =20 if (be->chr_be_change(be->opaque) < 0) { error_setg(errp, "Chardev '%s' change failed", chr_new->label); chr_new->be =3D NULL; - qemu_chr_fe_init(be, chr, &error_abort); + qemu_chr_fe_init(be, chr, NULL); if (closed_sent) { qemu_chr_be_event(chr, CHR_EVENT_OPENED); } diff --git a/include/chardev/char-socket.h b/include/chardev/char-socket.h index d6d13ad37f..0109727eaa 100644 --- a/include/chardev/char-socket.h +++ b/include/chardev/char-socket.h @@ -68,6 +68,7 @@ struct SocketChardev { bool is_listen; bool is_telnet; bool is_tn3270; + bool is_waitconnect; GSource *telnet_source; TCPChardevTelnetInit *telnet_init; =20 diff --git a/tests/unit/test-char.c b/tests/unit/test-char.c index f30a39f61f..5c9482a478 100644 --- a/tests/unit/test-char.c +++ b/tests/unit/test-char.c @@ -845,6 +845,7 @@ static void char_websock_test(void) 0xef, 0xaa, 0xc5, 0x97, /* Masking key */ 0xec, 0x42 /* Status code */ }; =20 + qemu_chr_fe_init(&be, chr, &error_abort); addr =3D object_property_get_qobject(OBJECT(chr), "addr", &error_abort= ); qdict =3D qobject_to(QDict, addr); port =3D qdict_get_str(qdict, "port"); @@ -852,7 +853,6 @@ static void char_websock_test(void) handshake_port =3D g_strdup_printf(handshake, port, port); qobject_unref(qdict); =20 - qemu_chr_fe_init(&be, chr, &error_abort); qemu_chr_fe_set_handlers(&be, websock_server_can_read, websock_server_= read, NULL, NULL, chr, NULL, true); =20 @@ -1216,6 +1216,8 @@ static void char_socket_server_test(gconstpointer opa= que) g_assert_nonnull(chr); g_assert(!object_property_get_bool(OBJECT(chr), "connected", &error_ab= ort)); =20 + qemu_chr_fe_init(&be, chr, &error_abort); + qaddr =3D object_property_get_qobject(OBJECT(chr), "addr", &error_abor= t); g_assert_nonnull(qaddr); =20 @@ -1224,8 +1226,6 @@ static void char_socket_server_test(gconstpointer opa= que) visit_free(v); qobject_unref(qaddr); =20 - qemu_chr_fe_init(&be, chr, &error_abort); - reconnect: data.event =3D -1; data.be =3D &be; @@ -1417,6 +1417,8 @@ static void char_socket_client_test(gconstpointer opa= que) qemu_opts_del(opts); g_assert_nonnull(chr); =20 + qemu_chr_fe_init(&be, chr, &error_abort); + if (config->reconnect) { /* * If reconnect is set, the connection will be @@ -1431,8 +1433,6 @@ static void char_socket_client_test(gconstpointer opa= que) &error_abort)); } =20 - qemu_chr_fe_init(&be, chr, &error_abort); - reconnect: data.event =3D -1; data.be =3D &be; @@ -1550,6 +1550,8 @@ static void char_socket_server_two_clients_test(gcons= tpointer opaque) g_assert_nonnull(chr); g_assert(!object_property_get_bool(OBJECT(chr), "connected", &error_ab= ort)); =20 + qemu_chr_fe_init(&be, chr, &error_abort); + qaddr =3D object_property_get_qobject(OBJECT(chr), "addr", &error_abor= t); g_assert_nonnull(qaddr); =20 @@ -1558,8 +1560,6 @@ static void char_socket_server_two_clients_test(gcons= tpointer opaque) visit_free(v); qobject_unref(qaddr); =20 - qemu_chr_fe_init(&be, chr, &error_abort); - qemu_chr_fe_set_handlers(&be, char_socket_can_read, char_socket_discar= d_read, count_closed_event, NULL, &closed, NULL, true); diff --git a/ui/dbus-chardev.c b/ui/dbus-chardev.c index d05dddaf81..23cf9d6ee9 100644 --- a/ui/dbus-chardev.c +++ b/ui/dbus-chardev.c @@ -210,8 +210,14 @@ dbus_chr_open(Chardev *chr, ChardevBackend *backend, if (*errp) { return; } - CHARDEV_CLASS(object_class_by_name(TYPE_CHARDEV_SOCKET))->open( - chr, be, be_opened, errp); + if (!CHARDEV_CLASS(object_class_by_name(TYPE_CHARDEV_SOCKET))->init( + chr, be, errp)) { + return; + } + if (!CHARDEV_CLASS(object_class_by_name(TYPE_CHARDEV_SOCKET))->connect( + chr, errp)) { + return; + } } =20 static void @@ -276,6 +282,8 @@ char_dbus_class_init(ObjectClass *oc, const void *data) =20 cc->parse =3D dbus_chr_parse; cc->open =3D dbus_chr_open; + cc->init =3D NULL; + cc->connect =3D NULL; cc->chr_set_fe_open =3D dbus_chr_set_fe_open; cc->chr_set_echo =3D dbus_chr_set_echo; klass->parent_chr_be_event =3D cc->chr_be_event; --=20 2.48.1 From nobody Fri Nov 14 18:26:43 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=1760455697; cv=none; d=zohomail.com; s=zohoarc; b=JEHUOGl2M2Gu5JXssW5BXUfRE7LKtE67QtVr7YSaovjHmoAzvh85mUz4AHQepRdRW11o7n/lW67b86x0TmAo5lQgw+J08cSskvZI52MEdfM9zxJG8x+1R53DI3F80O3gSf/nqEMibVQytoyVN2JXZk2nxP359zjYif5cu+6pP64= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1760455697; 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=bC9Y5ShAH+SVjgWS9ppwse+2lSNdalehyTgtqyTpO3c=; b=YSmOC/CtfNktu/fq/5zlKsAJ4EDPtI1dW0+rh3k40ivNbLVC7vWIjtMRglWybvgJaSCRBMuFkMSW3i9mrT/qMb54Uup4TKxO34q15Cwyl6qKaZL5gmQ3ZdE64o3GVqQn34FmbYN/Al4MKroIhJ+h4ahH+yNnMZyDQzQJNpFPzMA= 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 1760455696835282.46302052394697; Tue, 14 Oct 2025 08:28:16 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1v8gvs-00071v-5N; Tue, 14 Oct 2025 11:27:24 -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 1v8gvo-00070H-OB for qemu-devel@nongnu.org; Tue, 14 Oct 2025 11:27:21 -0400 Received: from forwardcorp1d.mail.yandex.net ([2a02:6b8:c41:1300: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 1v8gvk-0007h8-JT for qemu-devel@nongnu.org; Tue, 14 Oct 2025 11:27:20 -0400 Received: from mail-nwsmtp-smtp-corp-main-56.klg.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-56.klg.yp-c.yandex.net [IPv6:2a02:6b8:c42:65a0:0:640:e1de:0]) by forwardcorp1d.mail.yandex.net (Yandex) with ESMTPS id 80FC18084E; Tue, 14 Oct 2025 18:27:14 +0300 (MSK) Received: from vsementsov-lin.. (unknown [2a02:6bf:8080:a8a::1:35]) by mail-nwsmtp-smtp-corp-main-56.klg.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id 7RRbiX2F1mI0-jg6F337t; Tue, 14 Oct 2025 18:27:13 +0300 Precedence: bulk X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1760455633; bh=bC9Y5ShAH+SVjgWS9ppwse+2lSNdalehyTgtqyTpO3c=; h=Message-ID:Date:In-Reply-To:Cc:Subject:References:To:From; b=wQ9jpq/Kh5qDfoNBc2PSAge5/tQBQhq9s9A3LvR6asBB+qz/veeWbjGA48qGRUSeP Uc857nts+vuWC22I8IxH/TsKohGi3vWcEiue2h0+9GD0/EhIV7HGqi5d10BaJ4J+nN n6TeALriqQbGq7NmOgQANi8mk9AX7szZHGXyC41k= Authentication-Results: mail-nwsmtp-smtp-corp-main-56.klg.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 v3 7/7] chardev: introduce DEFINE_PROP_CHR_NO_CONNECT Date: Tue, 14 Oct 2025 18:26:44 +0300 Message-ID: <20251014152644.954762-8-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20251014152644.954762-1-vsementsov@yandex-team.ru> References: <20251014152644.954762-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:c41:1300:1:45:d181:df01; 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, 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: 1760455699444158500 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. With this patch, we only provide new macro, to define chardev property, later it will be used in vhost-user-blk instead of DEFINE_PROP_CHR. Then, vhost-user-blk will call qemu_chr_connect() by hand when needed (for example through qemu_chr_fe_wait_connected(), which is already called in vhost_user_blk_realize_connect()). Signed-off-by: Vladimir Sementsov-Ogievskiy --- chardev/char-fe.c | 10 ++++++++-- hw/core/qdev-properties-system.c | 26 +++++++++++++++++++++++--- include/chardev/char-fe.h | 6 +++++- include/hw/qdev-properties-system.h | 3 +++ 4 files changed, 39 insertions(+), 6 deletions(-) diff --git a/chardev/char-fe.c b/chardev/char-fe.c index 973fed5bea..a0218393e4 100644 --- a/chardev/char-fe.c +++ b/chardev/char-fe.c @@ -189,11 +189,12 @@ bool qemu_chr_fe_backend_open(CharBackend *be) return be->chr && be->chr->be_open; } =20 -bool qemu_chr_fe_init(CharBackend *b, Chardev *s, Error **errp) +bool qemu_chr_fe_init_ex(CharBackend *b, Chardev *s, bool connect, + Error **errp) { unsigned int tag =3D 0; =20 - if (!qemu_chr_connect(s, errp)) { + if (connect && !qemu_chr_connect(s, errp)) { return false; } =20 @@ -218,6 +219,11 @@ bool qemu_chr_fe_init(CharBackend *b, Chardev *s, Erro= r **errp) return true; } =20 +bool qemu_chr_fe_init(CharBackend *b, Chardev *s, Error **errp) +{ + return qemu_chr_fe_init_ex(b, s, true, errp); +} + void qemu_chr_fe_deinit(CharBackend *b, bool del) { assert(b); diff --git a/hw/core/qdev-properties-system.c b/hw/core/qdev-properties-sys= tem.c index 1f810b7ddf..6a0572ca03 100644 --- a/hw/core/qdev-properties-system.c +++ b/hw/core/qdev-properties-system.c @@ -266,8 +266,8 @@ static void get_chr(Object *obj, Visitor *v, const char= *name, void *opaque, g_free(p); } =20 -static void set_chr(Object *obj, Visitor *v, const char *name, void *opaqu= e, - Error **errp) +static void do_set_chr(Object *obj, Visitor *v, const char *name, void *op= aque, + bool connect, Error **errp) { ERRP_GUARD(); const Property *prop =3D opaque; @@ -297,13 +297,25 @@ static void set_chr(Object *obj, Visitor *v, const ch= ar *name, void *opaque, if (s =3D=3D NULL) { error_setg(errp, "Property '%s.%s' can't find value '%s'", object_get_typename(obj), name, str); - } else if (!qemu_chr_fe_init(be, s, errp)) { + } else if (!qemu_chr_fe_init_ex(be, s, connect, errp)) { error_prepend(errp, "Property '%s.%s' can't take value '%s': ", object_get_typename(obj), name, str); } g_free(str); } =20 +static void set_chr(Object *obj, Visitor *v, const char *name, void *opaqu= e, + Error **errp) +{ + do_set_chr(obj, v, name, opaque, true, errp); +} + +static void set_chr_no_connect(Object *obj, Visitor *v, const char *name, + void *opaque, Error **errp) +{ + do_set_chr(obj, v, name, opaque, false, errp); +} + static void release_chr(Object *obj, const char *name, void *opaque) { const Property *prop =3D opaque; @@ -320,6 +332,14 @@ const PropertyInfo qdev_prop_chr =3D { .release =3D release_chr, }; =20 +const PropertyInfo qdev_prop_chr_no_connect =3D { + .type =3D "str", + .description =3D "ID of a chardev to use as a backend", + .get =3D get_chr, + .set =3D set_chr_no_connect, + .release =3D release_chr, +}; + /* --- mac address --- */ =20 /* diff --git a/include/chardev/char-fe.h b/include/chardev/char-fe.h index 8ef05b3dd0..32013623b3 100644 --- a/include/chardev/char-fe.h +++ b/include/chardev/char-fe.h @@ -25,15 +25,19 @@ struct CharBackend { }; =20 /** - * qemu_chr_fe_init: + * qemu_chr_fe_init(_ex): * * Initializes a front end for the given CharBackend and * Chardev. Call qemu_chr_fe_deinit() to remove the association and * release the driver. + * Call qemu_chr_connect(), except for the case when connect=3Dfalse + * parameter set for _ex() version. * * Returns: false on error. */ bool qemu_chr_fe_init(CharBackend *b, Chardev *s, Error **errp); +bool qemu_chr_fe_init_ex(CharBackend *b, Chardev *s, bool connect, + Error **errp); =20 /** * qemu_chr_fe_deinit: diff --git a/include/hw/qdev-properties-system.h b/include/hw/qdev-properti= es-system.h index 9601a11a09..41f68f60b9 100644 --- a/include/hw/qdev-properties-system.h +++ b/include/hw/qdev-properties-system.h @@ -7,6 +7,7 @@ bool qdev_prop_sanitize_s390x_loadparm(uint8_t *loadparm, c= onst char *str, Error **errp); =20 extern const PropertyInfo qdev_prop_chr; +extern const PropertyInfo qdev_prop_chr_no_connect; extern const PropertyInfo qdev_prop_macaddr; extern const PropertyInfo qdev_prop_reserved_region; extern const PropertyInfo qdev_prop_multifd_compression; @@ -39,6 +40,8 @@ extern const PropertyInfo qdev_prop_virtio_gpu_output_lis= t; =20 #define DEFINE_PROP_CHR(_n, _s, _f) \ DEFINE_PROP(_n, _s, _f, qdev_prop_chr, CharBackend) +#define DEFINE_PROP_CHR_NO_CONNECT(_n, _s, _f) \ + DEFINE_PROP(_n, _s, _f, qdev_prop_chr_no_connect, CharBackend) #define DEFINE_PROP_NETDEV(_n, _s, _f) \ DEFINE_PROP(_n, _s, _f, qdev_prop_netdev, NICPeers) #define DEFINE_PROP_DRIVE(_n, _s, _f) \ --=20 2.48.1