[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