aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>2012-01-12 12:06:46 -0500
committerJesse Barnes <jbarnes@virtuousgeek.org>2012-02-14 11:44:48 -0500
commit6fbf9e7a90862988c278462d85ce9684605a52b2 (patch)
treeccc79061bac41537c37f5edc73bdc5bc59005c8a
parent8f0cdddcd3f270901765fc909c3aee37a2091e78 (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>
-rw-r--r--drivers/pci/pci.c25
-rw-r--r--include/linux/pci.h1
2 files changed, 26 insertions, 0 deletions
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index af295bb21d6..053670e09e2 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -3163,6 +3163,31 @@ int __pci_reset_function(struct pci_dev *dev)
3163EXPORT_SYMBOL_GPL(__pci_reset_function); 3163EXPORT_SYMBOL_GPL(__pci_reset_function);
3164 3164
3165/** 3165/**
3166 * __pci_reset_function_locked - reset a PCI device function while holding
3167 * the @dev mutex lock.
3168 * @dev: PCI device to reset
3169 *
3170 * Some devices allow an individual function to be reset without affecting
3171 * other functions in the same device. The PCI device must be responsive
3172 * to PCI config space in order to use this function.
3173 *
3174 * The device function is presumed to be unused and the caller is holding
3175 * the device mutex lock when this function is called.
3176 * Resetting the device will make the contents of PCI configuration space
3177 * random, so any caller of this must be prepared to reinitialise the
3178 * device including MSI, bus mastering, BARs, decoding IO and memory spaces,
3179 * etc.
3180 *
3181 * Returns 0 if the device function was successfully reset or negative if the
3182 * device doesn't support resetting a single function.
3183 */
3184int __pci_reset_function_locked(struct pci_dev *dev)
3185{
3186 return pci_dev_reset(dev, 1);
3187}
3188EXPORT_SYMBOL_GPL(__pci_reset_function_locked);
3189
3190/**
3166 * pci_probe_reset_function - check whether the device can be safely reset 3191 * pci_probe_reset_function - check whether the device can be safely reset
3167 * @dev: PCI device to reset 3192 * @dev: PCI device to reset
3168 * 3193 *
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 4afabb1d2d2..f44276049f4 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);
816int pcie_get_mps(struct pci_dev *dev); 816int pcie_get_mps(struct pci_dev *dev);
817int pcie_set_mps(struct pci_dev *dev, int mps); 817int pcie_set_mps(struct pci_dev *dev, int mps);
818int __pci_reset_function(struct pci_dev *dev); 818int __pci_reset_function(struct pci_dev *dev);
819int __pci_reset_function_locked(struct pci_dev *dev);
819int pci_reset_function(struct pci_dev *dev); 820int pci_reset_function(struct pci_dev *dev);
820void pci_update_resource(struct pci_dev *dev, int resno); 821void pci_update_resource(struct pci_dev *dev, int resno);
821int __must_check pci_assign_resource(struct pci_dev *dev, int i); 822int __must_check pci_assign_resource(struct pci_dev *dev, int i);