[pve-devel] [PATCH common v2 2/2] sysfstools: fix regression on binding to vfio-pci

Stoiko Ivanov s.ivanov at proxmox.com
Fri Nov 8 11:26:06 CET 2024


On Fri,  8 Nov 2024 10:32:59 +0100
Dominik Csapak <d.csapak at proxmox.com> wrote:

> when starting a vm with passthrough, we have to bind all normal pci
> devices to vfio-pci. This happens by
> 
> * unbinding from current driver
> * telling vfio-pci the 'vendorid modelid' combo to it know this device
s/to it know/so it knows/ ?
>   class can use the driver (by writing to 'new_id')
> * actually binding the device to vfio-pci
> 
> if there are multiple devices of the same 'vendorid modelid' class on
> the host (and passed through), only the first write to 'new_id' is
> successful, all subsequent ones return EEXIST.
> 
> This could happen e.g. for setups with multiple GPUs that have the same
> audio chip.
> 
> To fix this, ignore the EEXIST error for this write to new_id
> 
> Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
> ---
>  src/PVE/SysFSTools.pm | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/src/PVE/SysFSTools.pm b/src/PVE/SysFSTools.pm
> index 156fee6..569693e 100644
> --- a/src/PVE/SysFSTools.pm
> +++ b/src/PVE/SysFSTools.pm
> @@ -4,6 +4,7 @@ use strict;
>  use warnings;
>  
>  use IO::File;
> +use POSIX qw(EEXIST);
>  
>  use PVE::Tools qw(file_read_firstline dir_glob_foreach);
>  
> @@ -317,7 +318,7 @@ sub pci_dev_bind_to_vfio {
>      return 1 if -d $testdir;
>  
>      my $data = "$dev->{vendor} $dev->{device}";
> -    return undef if !file_write("$vfio_basedir/new_id", $data);
> +    return undef if !file_write("$vfio_basedir/new_id", $data, [EEXIST]);
>  
>      my $fn = "$pcisysfs/devices/$name/driver/unbind";
>      if (!file_write($fn, $name)) {





More information about the pve-devel mailing list