From nobody Mon Feb 9 17:38:08 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=fail(p=none dis=none) header.from=smartx.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1751642588812643.4701623271252; Fri, 4 Jul 2025 08:23:08 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id C50791476; Fri, 4 Jul 2025 11:23:07 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id A7069154D; Fri, 4 Jul 2025 11:20:40 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 58B701443; Fri, 4 Jul 2025 11:20:29 -0400 (EDT) Received: from mail-pl1-f175.google.com (mail-pl1-f175.google.com [209.85.214.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id BCB45140D for ; Fri, 4 Jul 2025 11:20:28 -0400 (EDT) Received: by mail-pl1-f175.google.com with SMTP id d9443c01a7336-23526264386so10458985ad.2 for ; Fri, 04 Jul 2025 08:20:28 -0700 (PDT) Received: from Hyman-Dev-Euler.zelin.local ([45.8.186.102]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-23c84350221sm23628205ad.83.2025.07.04.08.20.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 04 Jul 2025 08:20:27 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=smartx-com.20230601.gappssmtp.com; s=20230601; t=1751642428; x=1752247228; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=92Pt2wovbBql184ns0bfSnntEXnUQMoEZs0RbaqnT9g=; b=oO36GbHusvTpuIeqIqQyA7tVFwfWAi7bUa/vk5gjKuGlti/Dl8LmMENxw0OZkyN1+g bVDiZAOzNOez0hdllH9PEeQAo69rOWmro1gZAfcJqyYJkOKdOHLmvJ4ZabFXxc+lZk/m tViQSmV0ccr+ZcLFUGoIKyYsPTNofiUINjNLyG+P8kVDIG1fRcURijfjA24PNda2fv+I QX5dEkl0Dh1ehsMoFaM5ONsthjWQzPQpp74PBbCj27m5I/0qKMajixylm1oZl86FadLG Dx8f+3+St4FqhX2J2ovUBuEYt3oYudbc2YJwqZr3D9c6MtzAuXzlaaFW7rslJvWWcNfs Wfjw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751642428; x=1752247228; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=92Pt2wovbBql184ns0bfSnntEXnUQMoEZs0RbaqnT9g=; b=Mq3vaJUDo3wDOJN5KCrVN9RcIIbSUs7nTzmQhHnVy7HELhRLuhxuQ0NHIyv3fat07e pKN13uFDS/RetFzXxi8s556KGyiH+R8Mg3qKj4TYCv806kxhg3Fu2mnePSYKBR69cvmV O4iRwdTRKzjQFpIrwKwd29jVTgzuG2X1z7uDkGnH5n1N6igpCwD7zJPX5zSqipsVfzpt vTc7e2VqhmAPx/GtHvBKJ9GSQ1M+3l6PnevWqrjiEo3NoyA1/ve6gFOM1Az2rWrhtIso UfwnIw1tpC294kDDmf1lQo6xiaPbiXs9xbuumTRZcJow5J02bhfn3pLdx3wI/TY4qHH/ cZQA== X-Gm-Message-State: AOJu0YwhJ4RfxUQVE/uvMRDEN96Raygl4RQlbtyq15EVdbGVX2BWJhT7 2O9f2+hTmYP2Bx98HNkF9h7zeWyogRQYWi5tyS5iP4OzkFyYPtnsiAniaX269/ErtCEgurwwzk6 Votag56735g== X-Gm-Gg: ASbGncve/QKT1Ky4M4PConZBJXX6bnwBdvnk9cCSt6FapNSD/p/WKTRxLtY39v/4Oyc fYx4PVTSouRfFQk+D2dAmLrlTx+nLM8Fq8qQ8RVoN/0oVjdBFyjcaadSqW+5gcgp9Jc0V+lsgDM XrwnsgrC7wjhr10rrDJCOxwo2Ynoy3HEht9X6drH6SauCT8pJNiiQm3o7dxT4LrD3WJAiu0859N FNOvvD95pGlCDmq7kwUq9qwdWWVDkbLL2opsgdG+ScGyd94eJm5gis3SV9E9d7F2roJp1294UuK tE4Mpf2WmdboJLTT/AaH/mMEnvA3igHZl9lpURStwAKZTPPetj68n/V2Dc8hdTG5vCuQLM07j5w DsqWyLXsb X-Google-Smtp-Source: AGHT+IFzgE0NWatQXQgM6vz8RG7lfkxeUFlThQDE7d7Vet0LfkB8msZiZe1Z6Oq6bybDD/lCPXnIaA== X-Received: by 2002:a17:903:1b4d:b0:23a:bc47:381f with SMTP id d9443c01a7336-23c8759dbb3mr42791105ad.36.1751642427705; Fri, 04 Jul 2025 08:20:27 -0700 (PDT) From: yong.huang@smartx.com To: devel@lists.libvirt.org Subject: [RFC 4/4] qemu: Implement automatic attachment of the vhostuser port Date: Fri, 4 Jul 2025 22:57:59 +0800 Message-Id: X-Mailer: git-send-email 2.27.0 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: H2IAONXNRQVPJ7OVJAJPB73ZNNAIQRSJ X-Message-ID-Hash: H2IAONXNRQVPJ7OVJAJPB73ZNNAIQRSJ X-MailFrom: yong.huang@smartx.com X-Mailman-Rule-Hits: nonmember-moderation X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0 CC: yong.huang@smartx.com X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1751642589024116600 Content-Type: text/plain; charset="utf-8" From: Hyman Huang Add logic for automatic attachment and detachment of the vhostuser port within the vhostuser interface lifecycle. --- src/qemu/qemu_command.c | 3 +++ src/qemu/qemu_hotplug.c | 4 ++++ src/qemu/qemu_interface.c | 46 +++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_interface.h | 3 +++ src/qemu/qemu_process.c | 4 ++++ 5 files changed, 60 insertions(+) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 202f2dfaca..0370749fc7 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -8883,6 +8883,9 @@ qemuBuildInterfaceCommandLine(virQEMUDriver *driver, if (qemuInterfaceVhostuserConnect(cmd, net, qemuCaps) < 0) goto cleanup; =20 + if (qemuInterfaceVhostUserAddPort(def, net) < 0) + goto cleanup; + if (net->backend.type !=3D VIR_DOMAIN_NET_BACKEND_PASST && virNetDevOpenvswitchGetVhostuserIfname(net->data.vhostuser->da= ta.nix.path, net->data.vhostuser->da= ta.nix.listen, diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 67a2464ce4..b6a028700c 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1305,6 +1305,10 @@ qemuDomainAttachNetDevice(virQEMUDriver *driver, if (qemuSecuritySetNetdevLabel(driver, vm, net) < 0) goto cleanup; teardownlabel =3D true; + + if (qemuInterfaceVhostUserAddPort(vm->def, net) < 0) + goto cleanup; + break; =20 case VIR_DOMAIN_NET_TYPE_USER: diff --git a/src/qemu/qemu_interface.c b/src/qemu/qemu_interface.c index 23a23d201a..8518ddd8bd 100644 --- a/src/qemu/qemu_interface.c +++ b/src/qemu/qemu_interface.c @@ -215,3 +215,49 @@ qemuInterfaceOpenVhostNet(virDomainObj *vm, virDomainAuditNetDevice(vm->def, net, vhostnet_path, vhostfdSize); return 0; } + +/** + * qemuInterfaceVhostUserAddPort: + * @def: domain definition + * @net: network definition + * + * Called *only* called if actualType is VIR_DOMAIN_NET_TYPE_VHOSTUSER + * + * Returns 0 in case of success or -1 on failure + */ +int +qemuInterfaceVhostUserAddPort(virDomainDefPtr def, + virDomainNetDefPtr net) +{ + virDomainChrSourceDefPtr src =3D net->data.vhostuser; + virNetDevVhostUserIface iface =3D { + .client =3D src->data.nix.listen ? true : false, + .path =3D src->data.nix.path, + }; + + if (net->backend.type !=3D VIR_DOMAIN_NET_BACKEND_OPENVSWITCH || + !net->backend.data.openvswitch.autoiface) + return 0; + + if (!net->backend.data.openvswitch.bridge || + !net->backend.data.openvswitch.iface) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("No interface or bridge name found")); + return -1; + } + + if (virNetDevOpenvswitchAddPort(net->backend.data.openvswitch.bridge, + net->backend.data.openvswitch.iface, + &net->mac, def->uuid, + virDomainNetGetActualVirtPortProfile(n= et), + virDomainNetGetActualVlan(net), + &iface) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Failed to attach vhost user port '%1$s' to bridg= e '%2$s'"), + net->backend.data.openvswitch.iface, + net->backend.data.openvswitch.bridge); + return -1; + } + + return 0; +} diff --git a/src/qemu/qemu_interface.h b/src/qemu/qemu_interface.h index d9deca0094..2f8e93b56e 100644 --- a/src/qemu/qemu_interface.h +++ b/src/qemu/qemu_interface.h @@ -37,3 +37,6 @@ int qemuInterfaceOpenVhostNet(virDomainObj *def, =20 int qemuInterfacePrepareSlirp(virQEMUDriver *driver, virDomainNetDef *net); + +int qemuInterfaceVhostUserAddPort(virDomainDefPtr def, + virDomainNetDefPtr net); diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 82cab3f76e..c17108fafc 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -5885,6 +5885,10 @@ qemuProcessPrepareDomainNetwork(virDomainObj *vm) /* some extra setup of internal data for passt vhostuser m= ode */ qemuPasstPrepareVhostUser(vm, net); } + + if (qemuInterfaceVhostUserAddPort(def, net) < 0) + return -1; + break; =20 case VIR_DOMAIN_NET_TYPE_DIRECT: --=20 2.27.0