From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id 78CEF1FF141 for ; Mon, 13 Apr 2026 10:12:15 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id E13031AFBB; Mon, 13 Apr 2026 10:13:02 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kgncengiz.com; s=google; t=1776065702; x=1776670502; darn=lists.proxmox.com; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=H545Vedugrxy8b6Eks9WxljQ7tmcWKkvX0auv0NySnA=; b=k4zxAGDn6U7upQtjGgoqLMrMge4B00UID+VY5dhQbZJ4dskJkM1C5G9Lp0haMGDL9b Lav7Ig1eqbL9c6BuQp9mTIZRKS/rgO4fkhmyQ2Uj1V3YqXygpNNoUJNL2zZvV/ozl8FU fktgvYK/4M85WW1ssDOizTK7mPauxFnml0H0Rj2gMIXxwqDaCwLWKbz8wSJueU0C6OSv V+7oqO0uPyg6FTfCLHyao40nuokgVD3ekH1l2bOnBpvMB99OzjiOIRRkUVUPoh2y/ePC qflO5q4nVRZ8pGBAEImKuQblYTjVbvNdllCH5ftK6UvzixYbOR942xIkntFZ9ZtwHyEm oUvw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776065702; x=1776670502; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=H545Vedugrxy8b6Eks9WxljQ7tmcWKkvX0auv0NySnA=; b=THY9OEY7VbrVH8REdo46zMjxC0c692nDokEcMbo+hy0QGgsBk98tFeRLlvsXmjUBPG c4PFepLtL1W42+bX9wcQlCGwi/emj1k7osjqNp5ve81/HtZ0m1ssXGf3vcywl1WRE2Af iMVFDXL4ra2LJAHjmTpLN/anm/Bl59yo5fK/m+Z6i7pj1ivE+4GLBWzpkkmSrZl5zMoy TT8oI354szh9DtJWWe9q4YS+NssFS37kSxOcs/dVe+5vYCbagNaFq+xLwwAyI1DjtA4t z2KG1w9YaZpZ9Hqu1AXJBTptU1zeNLeBBwnxS9umWkpc6PiINgPRb618kJZiLPCDB8OP 1rww== X-Gm-Message-State: AOJu0Yxc3u7IphqU1HxB6aGFV4eNksOm4gILP5uRfohISmvmpm9KespS WYR73ilO+qyGH1Y48IXDmLh66ikP5iOjQgOb/SMetwT///VoGTwLe0kMmsbxuHZO2cg7jgdYa9p pRTqPjq4= X-Gm-Gg: AeBDiesyDT72F32lnZ1wtD22U8R/B6F/NjMw2Cdkxh61HuYepmwLyPMblhGw8kMNCgl rI341dyT9XLFC4AL4ZgKGu9BObNxm7kWVT8U4WPOrLRWSjJ3rrqoAUB6s2bh9tGDlIkWzvZDzmm pBO/NgxXkDZuZc7nkaTcrfXQhreHElklxr5jfevoyrxUyDwil0Zvyb1EbMTdzUY/jDj/C9oeKkX MeuTSXxNjbNzYwMM+a39IdYKMg/o0377PEP5GftbwDmsEWaV44bdeZLaJ6J4Sv6gX9O1RkQaAf4 Ej0iys/u4ugrG5fLANmcgLkYEcyKudmlNXT/bQEtBMUW29sE61HHVRTygPGTEJwVM5bbQkmp06s 73ekRtbhMmjJsvvLs3qnx0BVWAvCPahxFB28x4ixBESfNYP7x1DMgi/hhOwaawhnImzSvZtIFfJ ixYh2iykLWV4gZBwWmtDsjW/xMXhU9KeGyFwF2v3lbFZDrK1K83Vebh9rf8HMX0o5q9N8Jxeq67 YVS80ZY78r7 X-Received: by 2002:a17:906:f5a5:b0:b9d:ec73:ce9f with SMTP id a640c23a62f3a-b9dec73cec1mr77912566b.35.1776065700462; Mon, 13 Apr 2026 00:35:00 -0700 (PDT) From: =?UTF-8?q?Ka=C4=9Fan=20Cengiz?= To: pve-devel@lists.proxmox.com Subject: [PATCH qemu-server] net: add initial vhost-user support Date: Mon, 13 Apr 2026 10:34:50 +0300 Message-ID: <20260413073450.503199-1-kagancengiz@kgncengiz.com> X-Mailer: git-send-email 2.53.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 BAYES_00 -1.9 Bayes spam probability is 0 to 1% DKIM_SIGNED 0.1 Message has a DKIM or DK signature, not necessarily valid DKIM_VALID -0.1 Message has at least one valid DKIM or DK signature DKIM_VALID_AU -0.1 Message has a valid DKIM or DK signature from author's domain DKIM_VALID_EF -0.1 Message has a valid DKIM or DK signature from envelope-from domain DMARC_PASS -0.1 DMARC pass policy RCVD_IN_DNSWL_NONE -0.0001 Sender listed at https://www.dnswl.org/, no trust SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record X-MailFrom: kagancengiz@kgncengiz.com X-Mailman-Rule-Hits: nonmember-moderation X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation Message-ID-Hash: JQUYKHGQSH6CWX5V437FYJ5OXA5OFC2U X-Message-ID-Hash: JQUYKHGQSH6CWX5V437FYJ5OXA5OFC2U X-Mailman-Approved-At: Mon, 13 Apr 2026 10:13:09 +0200 CC: =?UTF-8?q?Ka=C4=9Fan=20Cengiz?= X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox VE development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: Add support for vhost-user network backends to qemu-server. It expects unix sockets to be present at /run/vhost-user/{bridge}.sock. This is the initial backend implementation. API and GUI support will be added in follow-up patches. Signed-off-by: Kağan Cengiz --- src/PVE/QemuServer.pm | 18 +++++++++++++++++- src/PVE/QemuServer/Network.pm | 8 ++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/PVE/QemuServer.pm b/src/PVE/QemuServer.pm index 2a469fff..27c88379 100644 --- a/src/PVE/QemuServer.pm +++ b/src/PVE/QemuServer.pm @@ -1358,7 +1358,7 @@ sub print_netdevice_full { print "netdev $netid: not adding 'host_mtu' parameter for migration compat\n" if $migration_skip_host_mtu; - if ($net->{model} eq 'virtio' && $net->{bridge} && !$migration_skip_host_mtu) { + if ($net->{model} eq 'virtio' && $net->{bridge} && !$migration_skip_host_mtu && !$net->{vhostuser}) { my $bridge_mtu = PVE::Network::read_bridge_mtu($net->{bridge}); if ($host_mtu_migration) { @@ -1446,6 +1446,11 @@ sub print_netdev_full { my $netdev = ""; my $script = $hotplug ? "pve-bridge-hotplug" : "pve-bridge"; + if ($net->{vhostuser}) { + my $queues = $net->{queues} || 1; + return "type=vhost-user,id=$netid,chardev=char$netid,vhostforce=on,queues=$queues"; + } + if ($net->{bridge}) { $netdev = "type=tap,id=$netid,ifname=${ifname},script=/usr/libexec/qemu-server/$script" . ",downscript=/usr/libexec/qemu-server/pve-bridgedown$vhostparam"; @@ -3664,6 +3669,17 @@ sub config_to_command { $d->{bootindex} = $bootorder->{$netname} if $bootorder->{$netname}; + if ($d->{vhostuser}) { + my $vhost_user_dir = "/run/vhost-user"; + my $socket_path = "$vhost_user_dir/$d->{bridge}.sock"; + + if (! -e $socket_path) { + die "network device '$netname' - vhost-user socket not found: $socket_path\n"; + } + + push @$devices, '-chardev', "socket,id=char$netname,path=$socket_path"; + } + my $netdevfull = print_netdev_full($vmid, $conf, $arch, $d, $netname); push @$devices, '-netdev', $netdevfull; diff --git a/src/PVE/QemuServer/Network.pm b/src/PVE/QemuServer/Network.pm index eb8222e8..cf889f0c 100644 --- a/src/PVE/QemuServer/Network.pm +++ b/src/PVE/QemuServer/Network.pm @@ -71,6 +71,12 @@ my $net_fmt = { optional => 1, }, ), + vhostuser => { + type => 'boolean', + description => "Use vhost-user for networking. Requires a vhost-user compatible bridge.", + optional => 1, + default => 0, + }, queues => { type => 'integer', minimum => 0, @@ -258,6 +264,8 @@ sub add_nets_bridge_fdb { # NOTE: expect setups with learning off to *not* use auto-random-generation of MAC on start my $net = parse_net($conf->{$opt}, 1) or next; + next if $net->{vhostuser}; + my $mac = $net->{macaddr}; if (!$mac) { log_warn( -- 2.53.0