On July 19, 2022 1:46 pm, Dominik Csapak wrote: > by adding them to their own list, saving the nodes where > they are not allowed, and return those on 'wantarray'
so this seems to be the main place where we benefit from a cluster-wide HW map - but it could just as well be a loop over the node specific config files, possibly after reducing the node list via means of storages.. and, for the call in migrate where we know the target node already we could pass it here to reduce the amount of work we have to do ;) > > Signed-off-by: Dominik Csapak <d.csa...@proxmox.com> > --- > PVE/QemuServer.pm | 36 ++++++++++++++++++++++++++++++++++-- > 1 file changed, 34 insertions(+), 2 deletions(-) > > diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm > index a6ca80d..ea7e213 100644 > --- a/PVE/QemuServer.pm > +++ b/PVE/QemuServer.pm > @@ -2617,6 +2617,21 @@ sub check_local_resources { > my ($conf, $noerr) = @_; > > my @loc_res = (); > + my $mapped_res = []; > + > + my $nodelist = PVE::Cluster::get_nodelist(); > + my $hw_map = PVE::HardwareMap::config(); > + > + my $not_allowed_nodes = { map { $_ => [] } @$nodelist }; > + > + my $add_not_allowed_nodes = sub { > + my ($type, $key, $id) = @_; > + for my $node (@$nodelist) { > + if (!defined($id) || !defined($hw_map->{$type}->{$id}->{$node})) { > + push @{$not_allowed_nodes->{$node}}, $key; > + } > + } > + }; > > push @loc_res, "hostusb" if $conf->{hostusb}; # old syntax > push @loc_res, "hostpci" if $conf->{hostpci}; # old syntax > @@ -2624,7 +2639,24 @@ sub check_local_resources { > push @loc_res, "ivshmem" if $conf->{ivshmem}; > > foreach my $k (keys %$conf) { > - next if $k =~ m/^usb/ && ($conf->{$k} =~ m/^spice(?![^,])/); > + if ($k =~ m/^usb/) { > + my $entry = parse_property_string($usb_fmt, $conf->{$k}); > + my $usb = PVE::QemuServer::USB::parse_usb_device($entry->{host}); > + next if $usb->{spice}; > + if ($usb->{mapped}) { > + $add_not_allowed_nodes->('usb', $k, $entry->{host}); > + push @$mapped_res, $k; > + next; > + } > + } > + if ($k =~ m/^hostpci/) { > + my $entry = parse_property_string('pve-qm-hostpci', $conf->{$k}); > + if ($entry->{host} !~ m/:/) { > + $add_not_allowed_nodes->('pci', $k, $entry->{host}); > + push @$mapped_res, $k; > + next; > + } > + } > # sockets are safe: they will recreated be on the target side > post-migrate > next if $k =~ m/^serial/ && ($conf->{$k} eq 'socket'); > push @loc_res, $k if $k =~ m/^(usb|hostpci|serial|parallel)\d+$/; > @@ -2632,7 +2664,7 @@ sub check_local_resources { > > die "VM uses local resources\n" if scalar @loc_res && !$noerr; > > - return \@loc_res; > + return wantarray ? (\@loc_res, $mapped_res, $not_allowed_nodes) : > \@loc_res; > } > > # check if used storages are available on all nodes (use by migrate) > -- > 2.30.2 > > > > _______________________________________________ > pve-devel mailing list > pve-devel@lists.proxmox.com > https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel > > > _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel