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

Reply via email to