From 4522ae6006883f207d26ee782f79d2e163e271af Mon Sep 17 00:00:00 2001 From: Alex Lyn Date: Wed, 8 Jul 2026 14:58:25 +0800 Subject: [PATCH] runtime-rs: Fix Clh network hotplug queue pair-to-virtqueue conversion The network hotplug (handle_network_device) passed `queue_num`, a queue pair count, straight as `num_queues`, while cloud-hypervisor's virtio-net expects a raw virtqueue count. With the default network_queues=1 this hit "Number of queues (1) to virtio_net should be higher than 2" on the post-start netdev add, failing sandbox start. Convert the pair count to the raw queue count (queue_num.max(1) * 2), matching the coldplug path which already does network_queues_pairs * 2. Signed-off-by: Alex Lyn --- src/runtime-rs/crates/hypervisor/src/ch/inner_device.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/runtime-rs/crates/hypervisor/src/ch/inner_device.rs b/src/runtime-rs/crates/hypervisor/src/ch/inner_device.rs index cc7885c8bb..2413f67c23 100644 --- a/src/runtime-rs/crates/hypervisor/src/ch/inner_device.rs +++ b/src/runtime-rs/crates/hypervisor/src/ch/inner_device.rs @@ -317,8 +317,11 @@ impl CloudHypervisorInner { // When using fds to pass the tap device to cloud-hypervisor, tap and id fields should be None clh_net_config.tap = None; clh_net_config.id = None; + // The `config.num_queues` is a queue *pair* count (1 RX + 1 TX per pair). + // Convert pairs into the actual queue count. + clh_net_config.num_queues = netdev.config.queue_num.max(1) * 2; - let files = open_named_tuntap(&netdev.config.host_dev_name, netdev.config.queue_num as u32) + let files = open_named_tuntap(&netdev.config.host_dev_name, netdev.config.queue_num.max(1) as u32) .context("open named tuntap")?; let fds = files.iter().map(|f| f.as_raw_fd()).collect();