instead of parsing the config again when trying to reserver/prepare the pci devices. also split the preparing into non-mdev devices and mdev devices, this will come in handy later.
Signed-off-by: Dominik Csapak <d.csa...@proxmox.com> --- PVE/QemuServer.pm | 20 +++++--------------- PVE/QemuServer/PCI.pm | 8 +++++++- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm index b3c3ce0..050e5c2 100644 --- a/PVE/QemuServer.pm +++ b/PVE/QemuServer.pm @@ -3687,7 +3687,7 @@ sub config_to_command { my $bootorder = device_bootorder($conf); # host pci device passthrough - my ($kvm_off, $gpu_passthrough, $legacy_igd) = PVE::QemuServer::PCI::print_hostpci_devices( + my ($kvm_off, $gpu_passthrough, $legacy_igd, $pci_devices) = PVE::QemuServer::PCI::print_hostpci_devices( $vmid, $conf, $devices, $vga, $winversion, $q35, $bridges, $arch, $machine_type, $bootorder); # usb devices @@ -4103,7 +4103,7 @@ sub config_to_command { push @$cmd, @$aa; } - return wantarray ? ($cmd, $vollist, $spice_port) : $cmd; + return wantarray ? ($cmd, $vollist, $spice_port, $pci_devices) : $cmd; } sub check_rng_source { @@ -5493,7 +5493,7 @@ sub vm_start_nolock { print "Resuming suspended VM\n"; } - my ($cmd, $vollist, $spice_port) = config_to_command($storecfg, $vmid, + my ($cmd, $vollist, $spice_port, $pci_devices) = config_to_command($storecfg, $vmid, $conf, $defaults, $forcemachine, $forcecpu, $params->{'pbs-backing'}); my $migration_ip; @@ -5578,17 +5578,7 @@ sub vm_start_nolock { my $start_timeout = $params->{timeout} // config_aware_timeout($conf, $resume); - my $pci_devices = {}; # host pci devices - for (my $i = 0; $i < $PVE::QemuServer::PCI::MAX_HOSTPCI_DEVICES; $i++) { - my $dev = $conf->{"hostpci$i"} or next; - $pci_devices->{$i} = parse_hostpci($dev); - } - - # do not reserve pciid for mediated devices, sysfs will error out for duplicate assignment - my $real_pci_devices = [ grep { !(defined($_->{mdev}) && scalar($_->{pciid}->@*) == 1) } values $pci_devices->%* ]; - - # map to a flat list of pci ids - my $pci_id_list = [ map { $_->{id} } map { $_->{pciid}->@* } $real_pci_devices->@* ]; + my $pci_id_list = [ map { $_->{used}->@* } values %$pci_devices ]; # reserve all PCI IDs before actually doing anything with them PVE::QemuServer::PCI::reserve_pci_usage($pci_id_list, $vmid, $start_timeout); @@ -5596,7 +5586,7 @@ sub vm_start_nolock { eval { my $uuid; for my $id (sort keys %$pci_devices) { - my $d = $pci_devices->{$id}; + my $d = $pci_devices->{$id}->{device}; for my $dev ($d->{pciid}->@*) { my $info = PVE::QemuServer::PCI::prepare_pci_device($vmid, $dev->{id}, $id, $d->{mdev}); diff --git a/PVE/QemuServer/PCI.pm b/PVE/QemuServer/PCI.pm index 7406246..b5284ef 100644 --- a/PVE/QemuServer/PCI.pm +++ b/PVE/QemuServer/PCI.pm @@ -422,12 +422,17 @@ sub print_hostpci_devices { my $kvm_off = 0; my $gpu_passthrough = 0; my $legacy_igd = 0; + my $parsed_devices = {}; my $pciaddr; for (my $i = 0; $i < $MAX_HOSTPCI_DEVICES; $i++) { my $id = "hostpci$i"; my $d = parse_hostpci($conf->{$id}); next if !$d; + $parsed_devices->{$i} = { + device => $d, + used => [], + }; if (my $pcie = $d->{pcie}) { die "q35 machine model is not enabled" if !$q35; @@ -449,6 +454,7 @@ sub print_hostpci_devices { } my $pcidevices = $d->{pciid}; + $parsed_devices->{$i}->{used} = $pcidevices; my $multifunction = @$pcidevices > 1; if ($d->{'legacy-igd'}) { @@ -503,7 +509,7 @@ sub print_hostpci_devices { } } - return ($kvm_off, $gpu_passthrough, $legacy_igd); + return ($kvm_off, $gpu_passthrough, $legacy_igd, $parsed_devices); } sub prepare_pci_device { -- 2.30.2 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel