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

Reply via email to