• Jason Gunthorpe's avatar
    PCI/IOV: Add pci_iov_get_pf_drvdata() to allow VF reaching the drvdata of a PF · a7e9f240
    Jason Gunthorpe authored
    There are some cases where a SR-IOV VF driver will need to reach into and
    interact with the PF driver. This requires accessing the drvdata of the PF.
    
    Provide a function pci_iov_get_pf_drvdata() to return this PF drvdata in a
    safe way. Normally accessing a drvdata of a foreign struct device would be
    done using the device_lock() to protect against device driver
    probe()/remove() races.
    
    However, due to the design of pci_enable_sriov() this will result in a
    ABBA deadlock on the device_lock as the PF's device_lock is held during PF
    sriov_configure() while calling pci_enable_sriov() which in turn holds the
    VF's device_lock while calling VF probe(), and similarly for remove.
    
    This means the VF driver can never obtain the PF's device_lock.
    
    Instead use the implicit locking created by pci_enable/disable_sriov(). A
    VF driver can access its PF drvdata only while its own driver is attached,
    and the PF driver can control access to its own drvdata based on when it
    calls pci_enable/disable_sriov().
    
    To use this API the PF driver will setup the PF drvdata in the probe()
    function. pci_enable_sriov() is only called from sriov_configure() which
    cannot happen until probe() completes, ensuring no VF races with drvdata
    setup.
    
    For removal, the PF driver must call pci_disable_sriov() in its remove
    function before destroying any of the drvdata. This ensures that all VF
    drivers are unbound before returning, fencing concurrent access to the
    drvdata.
    
    The introduction of a new function to do this access makes clear the
    special locking scheme and the documents the requirements on the PF/VF
    drivers using this.
    
    Link: https://lore.kernel.org/all/20220224142024.147653-5-yishaih@nvidia.comSigned-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
    Acked-by: default avatarBjorn Helgaas <bhelgaas@google.com>
    Signed-off-by: default avatarYishai Hadas <yishaih@nvidia.com>
    Signed-off-by: default avatarLeon Romanovsky <leonro@nvidia.com>
    a7e9f240
pci.h 89.6 KB