[vfio-users] Convenience script for binding to vfio-pci

Andre Richter andre.o.richter at gmail.com
Mon Sep 14 15:24:11 UTC 2015


Hi Alex,

thanks for the quick feedback!
I'll incorporate your changes tomorrow.

2015-09-14 16:51 GMT+02:00 Alex Williamson <alex.williamson at redhat.com>:
> Hi Andre,
>
> On Mon, 2015-09-14 at 14:23 +0000, Andre Richter wrote:
>> Hi,
>>
>> just in case anybody is interested, I want to share a little convenience
>> script of mine:
>>
>> https://github.com/andre-richter/vfio-pci-bind
>>
>> This script takes a Bus:Device:Function string of the form "00:00.0"
>> as command line argument and:
>>
>> 1. Unbinds all devices that are in the same iommu group as the supplied
>> device from their current driver (except PCIe bridges).
>>
>> 2. Binds to vfio-pci:
>>   1. The supplied device.
>>   2. All unbound devices that have the same device_id and vendor_id as the
>> supplied device.
>>   3. All devices that are in the same iommu group.
>>
>> 3. Transfers ownership of the respective iommu groups inside /dev/vfio to
>> $SUDO_USER
>>
>> Script must be executed via sudo!
>
>
> This looks fragile:
>
> unless File.exist?('/sys/bus/pci/devices/0000:00:00.0/iommu/')
>   puts 'No signs of an IOMMU. Check your hardware and/or linux cmdline parameters.'
>   puts 'Use intel_iommu=on or iommu=pt iommu=1'
>   exit
> end
>
> Why not check the iommu link for the device to be attached, or look
> in /sys/class/iommu rather than assume device 0000:00:00.0?
>
> TARGET_DEV_SYSFS_PATH = "/sys/bus/pci/devices/0000:#{bdf}/"
>
> You're assuming domain 0000.

I have never seen a machine with a domain greater than 0000, so I got
lazy there, but ofc you're right, will fix.

>
> # Do not care about bridges
> dev_sysfs_paths.delete_if { |dsp| File.read(dsp + '/class')[0..5] == '0x0604' }
>
> Testing for HEADER_TYPE 0 would be more compatible and match the patch I
> proposed for whitelisting all bridges, not just those w/o a driver or
> bound to pcieport.  Ex
>
>
> if [ $(( 0x$(setpci -s 0000:00:1c.0 0e.b) & 0x7f )) -ne 0 ]; then
>     echo bridge
> fi
>
>
>   # Add id to vfio-pci driver
>   File.write('/sys/bus/pci/drivers/vfio-pci/new_id', devid)
>
> If you used /sys/bus/pci/devices/ssss:bb:dd.f/driver_override you could
> avoid the "feature" of binding all devices with the same vendor:device
> ID.

Actually I was wondering what a reasonable approach is when freeing an
IOMMU group with multiple devices.
Leave the other devices unbound? Bind them to pci-stub? What do you suggest?

>
> # Adjust ownership
> ids = ENV['SUDO_UID'] + ':' + ENV['SUDO_GID']
> Dir.glob('/dev/vfio/[0-9]*').each { |f| `chown #{ids} #{f}` }
>
> Is this changing the ownership of *all* the groups to the current user?
> Why not just the group affected?  Thanks,
>
> Alex
>

Cheers,
Andre




More information about the vfio-users mailing list