diff options
author | Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> | 2012-01-12 12:06:46 -0500 |
---|---|---|
committer | Jesse Barnes <jbarnes@virtuousgeek.org> | 2012-02-14 11:44:48 -0500 |
commit | 6fbf9e7a90862988c278462d85ce9684605a52b2 (patch) | |
tree | ccc79061bac41537c37f5edc73bdc5bc59005c8a /include | |
parent | 8f0cdddcd3f270901765fc909c3aee37a2091e78 (diff) |
PCI: Introduce __pci_reset_function_locked to be used when holding device_lock.
The use case of this is when a driver wants to call FLR when a device
is attached to it using the SysFS "bind" or "unbind" functionality.
The call chain when a user does "bind" looks as so:
echo "0000:01.07.0" > /sys/bus/pci/drivers/XXXX/bind
and ends up calling:
driver_bind:
device_lock(dev); <=== TAKES LOCK
XXXX_probe:
.. pci_enable_device()
...__pci_reset_function(), which calls
pci_dev_reset(dev, 0):
if (!0) {
device_lock(dev) <==== DEADLOCK
The __pci_reset_function_locked function allows the the drivers
'probe' function to call the "pci_reset_function" while still holding
the driver mutex lock.
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/pci.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/include/linux/pci.h b/include/linux/pci.h index 4afabb1d2d27..f44276049f4a 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h | |||
@@ -816,6 +816,7 @@ int pcie_set_readrq(struct pci_dev *dev, int rq); | |||
816 | int pcie_get_mps(struct pci_dev *dev); | 816 | int pcie_get_mps(struct pci_dev *dev); |
817 | int pcie_set_mps(struct pci_dev *dev, int mps); | 817 | int pcie_set_mps(struct pci_dev *dev, int mps); |
818 | int __pci_reset_function(struct pci_dev *dev); | 818 | int __pci_reset_function(struct pci_dev *dev); |
819 | int __pci_reset_function_locked(struct pci_dev *dev); | ||
819 | int pci_reset_function(struct pci_dev *dev); | 820 | int pci_reset_function(struct pci_dev *dev); |
820 | void pci_update_resource(struct pci_dev *dev, int resno); | 821 | void pci_update_resource(struct pci_dev *dev, int resno); |
821 | int __must_check pci_assign_resource(struct pci_dev *dev, int i); | 822 | int __must_check pci_assign_resource(struct pci_dev *dev, int i); |