]> git.proxmox.com Git - qemu-server.git/blobdiff - PVE/QemuServer.pm
virtio-net: increase defaults rx|tx-queue-size to 1024
[qemu-server.git] / PVE / QemuServer.pm
index ed42bd95f352c787af6eb61b3aad8d35b70b8c4a..51e9a5198fb64a46abfc47c995a2abfd46a7e967 100644 (file)
@@ -1748,7 +1748,7 @@ sub print_pbs_blockdev {
 }
 
 sub print_netdevice_full {
-    my ($vmid, $conf, $net, $netid, $bridges, $use_old_bios_files, $arch, $machine_type) = @_;
+    my ($vmid, $conf, $net, $netid, $bridges, $use_old_bios_files, $arch, $machine_type, $machine_version) = @_;
 
     my $device = $net->{model};
     if ($net->{model} eq 'virtio') {
@@ -1762,7 +1762,15 @@ sub print_netdevice_full {
        # and out of each queue plus one config interrupt and control vector queue
        my $vectors = $net->{queues} * 2 + 2;
        $tmpstr .= ",vectors=$vectors,mq=on";
+       if (min_version($machine_version, 7, 1)) {
+           $tmpstr .= ",packed=on";
+       }
+    }
+
+    if (min_version($machine_version, 7, 1) && $net->{model} eq 'virtio'){
+       $tmpstr .= ",rx_queue_size=1024,tx_queue_size=1024";
     }
+
     $tmpstr .= ",bootindex=$net->{bootindex}" if $net->{bootindex} ;
 
     if (my $mtu = $net->{mtu}) {
@@ -1941,14 +1949,14 @@ sub parse_numa {
 
 # netX: e1000=XX:XX:XX:XX:XX:XX,bridge=vmbr0,rate=<mbps>
 sub parse_net {
-    my ($data) = @_;
+    my ($data, $disable_mac_autogen) = @_;
 
     my $res = eval { parse_property_string($net_fmt, $data) };
     if ($@) {
        warn $@;
        return;
     }
-    if (!defined($res->{macaddr})) {
+    if (!defined($res->{macaddr}) && !$disable_mac_autogen) {
        my $dc = PVE::Cluster::cfs_read_file('datacenter.cfg');
        $res->{macaddr} = PVE::Tools::random_ether_addr($dc->{mac_prefix});
     }
@@ -4038,6 +4046,7 @@ sub config_to_command {
        next if !$conf->{$netname};
        my $d = parse_net($conf->{$netname});
        next if !$d;
+       # save the MAC addr here (could be auto-gen. in some odd setups) for FDB registering later?
 
        $use_virtio = 1 if $d->{model} eq 'virtio';
 
@@ -4047,7 +4056,7 @@ sub config_to_command {
        push @$devices, '-netdev', $netdevfull;
 
        my $netdevicefull = print_netdevice_full(
-           $vmid, $conf, $d, $netname, $bridges, $use_old_bios_files, $arch, $machine_type);
+           $vmid, $conf, $d, $netname, $bridges, $use_old_bios_files, $arch, $machine_type, $machine_version);
 
        push @$devices, '-device', $netdevicefull;
     }
@@ -4279,11 +4288,12 @@ sub vm_deviceplug {
        return if !qemu_netdevadd($vmid, $conf, $arch, $device, $deviceid);
 
        my $machine_type = PVE::QemuServer::Machine::qemu_machine_pxe($vmid, $conf);
+       my $machine_version = PVE::QemuServer::Machine::extract_version($machine_type);
        my $use_old_bios_files = undef;
        ($use_old_bios_files, $machine_type) = qemu_use_old_bios_files($machine_type);
 
        my $netdevicefull = print_netdevice_full(
-           $vmid, $conf, $device, $deviceid, undef, $use_old_bios_files, $arch, $machine_type);
+           $vmid, $conf, $device, $deviceid, undef, $use_old_bios_files, $arch, $machine_type, $machine_version);
        qemu_deviceadd($vmid, $netdevicefull);
        eval {
            qemu_deviceaddverify($vmid, $deviceid);
@@ -8316,19 +8326,43 @@ sub check_volume_storage_type {
 sub add_nets_bridge_fdb {
     my ($conf, $vmid) = @_;
 
-    foreach my $opt (keys %$conf) {
-       if ($opt =~  m/^net(\d+)$/) {
-           my $net = parse_net($conf->{$opt});
-           next if !$net;
-           next if !$net->{macaddr};
+    for my $opt (keys %$conf) {
+       next if $opt !~ m/^net(\d+)$/;
+       my $iface = "tap${vmid}i$1";
+       # 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;
+
+       my $mac = $net->{macaddr};
+       if (!$mac) {
+           log_warn("MAC learning disabled, but vNIC '$iface' has no static MAC to add to forwarding DB!")
+               if !file_read_firstline("/sys/class/net/$iface/brport/learning");
+           next;
+       }
 
-           my $iface = "tap${vmid}i$1";
-           if ($have_sdn) {
-               PVE::Network::SDN::Zones::add_bridge_fdb($iface, $net->{macaddr}, $net->{bridge}, $net->{firewall});
-           } else {
-               PVE::Network::add_bridge_fdb($iface, $net->{macaddr}, $net->{firewall});
-           }
+       if ($have_sdn) {
+           PVE::Network::SDN::Zones::add_bridge_fdb($iface, $mac, $net->{bridge}, $net->{firewall});
+       } else {
+           PVE::Network::add_bridge_fdb($iface, $mac, $net->{firewall});
        }
     }
 }
+
+sub del_nets_bridge_fdb {
+    my ($conf, $vmid) = @_;
+
+    for my $opt (keys %$conf) {
+       next if $opt !~ m/^net(\d+)$/;
+       my $iface = "tap${vmid}i$1";
+
+       my $net = parse_net($conf->{$opt}) or next;
+       my $mac = $net->{macaddr} or next;
+
+       if ($have_sdn) {
+           PVE::Network::SDN::Zones::del_bridge_fdb($iface, $mac, $net->{bridge}, $net->{firewall});
+       } else {
+           PVE::Network::del_bridge_fdb($iface, $mac, $net->{firewall});
+       }
+    }
+}
+
 1;