linux-stable/drivers/vfio
Jason Gunthorpe b4f53fe23e vfio/pci: Fix vf_token mechanism when device-specific VF drivers are used
[ Upstream commit 1ef3342a93 ]

get_pf_vdev() tries to check if a PF is a VFIO PF by looking at the driver:

       if (pci_dev_driver(physfn) != pci_dev_driver(vdev->pdev)) {

However now that we have multiple VF and PF drivers this is no longer
reliable.

This means that security tests realted to vf_token can be skipped by
mixing and matching different VFIO PCI drivers.

Instead of trying to use the driver core to find the PF devices maintain a
linked list of all PF vfio_pci_core_device's that we have called
pci_enable_sriov() on.

When registering a VF just search the list to see if the PF is present and
record the match permanently in the struct. PCI core locking prevents a PF
from passing pci_disable_sriov() while VF drivers are attached so the VFIO
owned PF becomes a static property of the VF.

In common cases where vfio does not own the PF the global list remains
empty and the VF's pointer is statically NULL.

This also fixes a lockdep splat from recursive locking of the
vfio_group::device_lock between vfio_device_get_from_name() and
vfio_device_get_from_dev(). If the VF and PF share the same group this
would deadlock.

Fixes: ff53edf6d6 ("vfio/pci: Split the pci_driver code out of vfio_pci_core.c")
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Link: https://lore.kernel.org/r/0-v3-876570980634+f2e8-vfio_vf_token_jgg@nvidia.com
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2022-04-20 09:36:18 +02:00
..
fsl-mc bus: fsl-mc: fsl-mc-allocator: Rework MSI handling 2021-12-16 22:16:41 +01:00
mdev vfio: simplify iommu group allocation for mediated devices 2021-09-30 12:46:44 -06:00
pci vfio/pci: Fix vf_token mechanism when device-specific VF drivers are used 2022-04-20 09:36:18 +02:00
platform vfio: Move vfio_iommu_group_get() to vfio_register_group_dev() 2021-09-30 12:46:43 -06:00
Kconfig vfio: Use kconfig if XX/endif blocks instead of repeating 'depends on' 2021-08-26 10:36:51 -06:00
Makefile
vfio.c vfio: remove all kernel-doc notation 2021-11-30 11:41:43 -07:00
vfio.h vfio: clean up the check for mediated device in vfio_iommu_type1 2021-09-30 12:46:44 -06:00
vfio_iommu_spapr_tce.c vfio/spapr_tce: reject mediated devices 2021-09-30 12:46:44 -06:00
vfio_iommu_type1.c vfio/iommu_type1: replace kfree with kvfree 2021-12-21 12:30:34 -07:00
vfio_spapr_eeh.c
virqfd.c vfio/virqfd: Drain events from eventfd in virqfd_wakeup() 2020-11-15 09:49:10 -05:00