From a9410357d2cb6cb945cb1e4558c5d5c44d936efe Mon Sep 17 00:00:00 2001 From: Alexandre Derumier Date: Tue, 10 Jun 2014 08:30:31 +0200 Subject: [PATCH] add virtio-net multiqueue support this a new option queue=(\d+) to net interface Allow to use more than 1 cpu for network stream, so this can improve network bandwidth, when vhost-net cpu is the bottleneck http://www.linux-kvm.org/page/Multiqueue#Enable_MQ_feature -netdev tap,vhost=on,queues=N -device virtio-net-pci,mq=on,vectors=2N+2 host requirement ---------------- this require host kernel >= 3.8 (or qemu die at start) linux guest requirement ----------------------- kernel >= 3.8 manual enabling multiqueue windows guest requierement -------------------------- recent virtio-net driver Signed-off-by: Alexandre Derumier --- PVE/QemuServer.pm | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm index e1b85c30..3b3c0ab8 100644 --- a/PVE/QemuServer.pm +++ b/PVE/QemuServer.pm @@ -478,7 +478,7 @@ my $nic_model_list_txt = join(' ', sort @$nic_model_list); my $netdesc = { optional => 1, type => 'string', format => 'pve-qm-net', - typetext => "MODEL=XX:XX:XX:XX:XX:XX [,bridge=][,rate=][,tag=][,firewall=0|1]", + typetext => "MODEL=XX:XX:XX:XX:XX:XX [,bridge=][,queues=][,rate=][,tag=][,firewall=0|1]", description => <{queues} && $net->{queues} > 1 && $net->{model} eq 'virtio'){ + #Consider we have N queues, the number of vectors needed is 2*N + 2 (plus one config interrupt and control vq) + my $vectors = $net->{queues} * 2 + 2; + $tmpstr .= ",vectors=$vectors,mq=on"; + } $tmpstr .= ",bootindex=$net->{bootindex}" if $net->{bootindex} ; return $tmpstr; } @@ -1215,11 +1220,17 @@ sub print_netdev_full { my $vmname = $conf->{name} || "vm$vmid"; + my $netdev = ""; + if ($net->{bridge}) { - return "type=tap,id=$netid,ifname=${ifname},script=/var/lib/qemu-server/pve-bridge,downscript=/var/lib/qemu-server/pve-bridgedown$vhostparam"; + $netdev = "type=tap,id=$netid,ifname=${ifname},script=/var/lib/qemu-server/pve-bridge,downscript=/var/lib/qemu-server/pve-bridgedown$vhostparam"; } else { - return "type=user,id=$netid,hostname=$vmname"; + $netdev = "type=user,id=$netid,hostname=$vmname"; } + + $netdev .= ",queues=$net->{queues}" if ($net->{queues} && $net->{model} eq 'virtio'); + + return $netdev; } sub drive_is_cdrom { @@ -1273,6 +1284,8 @@ sub parse_net { $res->{macaddr} = $mac; } elsif ($kvp =~ m/^bridge=(\S+)$/) { $res->{bridge} = $1; + } elsif ($kvp =~ m/^queues=(\d+)$/) { + $res->{queues} = $1; } elsif ($kvp =~ m/^rate=(\d+(\.\d+)?)$/) { $res->{rate} = $1; } elsif ($kvp =~ m/^tag=(\d+)$/) {