From d197fc802bfce41803016e78fc07c47bba421158 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Mon, 26 Nov 2012 11:33:57 -0800 Subject: [PATCH] remove queue-3.6/pci-pm-fix-deadlock-when-unbinding-device-if-parent-in-d3cold.patch It's doubtfull that this is the correct patch here for the 3.6-stable tree --- ...unbinding-device-if-parent-in-d3cold.patch | 156 ------------------ queue-3.6/series | 1 - 2 files changed, 157 deletions(-) delete mode 100644 queue-3.6/pci-pm-fix-deadlock-when-unbinding-device-if-parent-in-d3cold.patch diff --git a/queue-3.6/pci-pm-fix-deadlock-when-unbinding-device-if-parent-in-d3cold.patch b/queue-3.6/pci-pm-fix-deadlock-when-unbinding-device-if-parent-in-d3cold.patch deleted file mode 100644 index 9b2faf31fa9..00000000000 --- a/queue-3.6/pci-pm-fix-deadlock-when-unbinding-device-if-parent-in-d3cold.patch +++ /dev/null @@ -1,156 +0,0 @@ -From 90b5c1d7c45eeb622302680ff96ed30c1a2b6f0e Mon Sep 17 00:00:00 2001 -From: Huang Ying -Date: Wed, 24 Oct 2012 14:54:13 +0800 -Subject: PCI/PM: Fix deadlock when unbinding device if parent in D3cold - -From: Huang Ying - -commit 90b5c1d7c45eeb622302680ff96ed30c1a2b6f0e upstream. - -If a PCI device and its parents are put into D3cold, unbinding the -device will trigger deadlock as follow: - -- driver_unbind - - device_release_driver - - device_lock(dev) <--- previous lock here - - __device_release_driver - - pm_runtime_get_sync - ... - - rpm_resume(dev) - - rpm_resume(dev->parent) - ... - - pci_pm_runtime_resume - ... - - pci_set_power_state - - __pci_start_power_transition - - pci_wakeup_bus(dev->parent->subordinate) - - pci_walk_bus - - device_lock(dev) <--- deadlock here - - -If we do not do device_lock in pci_walk_bus, we can avoid deadlock. -Device_lock in pci_walk_bus is introduced in commit: -d71374dafbba7ec3f67371d3b7e9f6310a588808, corresponding email thread -is: https://lkml.org/lkml/2006/5/26/38. The patch author Zhang Yanmin -said device_lock is added to pci_walk_bus because: - - Some error handling functions call pci_walk_bus. For example, PCIe - aer. Here we lock the device, so the driver wouldn't detach from the - device, as the cb might call driver's callback function. - -So I fixed the deadlock as follows: - -- remove device_lock from pci_walk_bus -- add device_lock into callback if callback will call driver's callback - -I checked pci_walk_bus users one by one, and found only PCIe aer needs -device lock. - -Signed-off-by: Huang Ying -Signed-off-by: Bjorn Helgaas -Acked-by: Rafael J. Wysocki -CC: Zhang Yanmin -Signed-off-by: Greg Kroah-Hartman - ---- - drivers/pci/bus.c | 3 --- - drivers/pci/pcie/aer/aerdrv_core.c | 20 ++++++++++++++++---- - 2 files changed, 16 insertions(+), 7 deletions(-) - ---- a/drivers/pci/bus.c -+++ b/drivers/pci/bus.c -@@ -316,10 +316,7 @@ void pci_walk_bus(struct pci_bus *top, i - } else - next = dev->bus_list.next; - -- /* Run device routines with the device locked */ -- device_lock(&dev->dev); - retval = cb(dev, userdata); -- device_unlock(&dev->dev); - if (retval) - break; - } ---- a/drivers/pci/pcie/aer/aerdrv_core.c -+++ b/drivers/pci/pcie/aer/aerdrv_core.c -@@ -244,6 +244,7 @@ static int report_error_detected(struct - struct aer_broadcast_data *result_data; - result_data = (struct aer_broadcast_data *) data; - -+ device_lock(&dev->dev); - dev->error_state = result_data->state; - - if (!dev->driver || -@@ -262,12 +263,14 @@ static int report_error_detected(struct - dev->driver ? - "no AER-aware driver" : "no driver"); - } -- return 0; -+ goto out; - } - - err_handler = dev->driver->err_handler; - vote = err_handler->error_detected(dev, result_data->state); - result_data->result = merge_result(result_data->result, vote); -+out: -+ device_unlock(&dev->dev); - return 0; - } - -@@ -278,14 +281,17 @@ static int report_mmio_enabled(struct pc - struct aer_broadcast_data *result_data; - result_data = (struct aer_broadcast_data *) data; - -+ device_lock(&dev->dev); - if (!dev->driver || - !dev->driver->err_handler || - !dev->driver->err_handler->mmio_enabled) -- return 0; -+ goto out; - - err_handler = dev->driver->err_handler; - vote = err_handler->mmio_enabled(dev); - result_data->result = merge_result(result_data->result, vote); -+out: -+ device_unlock(&dev->dev); - return 0; - } - -@@ -296,14 +302,17 @@ static int report_slot_reset(struct pci_ - struct aer_broadcast_data *result_data; - result_data = (struct aer_broadcast_data *) data; - -+ device_lock(&dev->dev); - if (!dev->driver || - !dev->driver->err_handler || - !dev->driver->err_handler->slot_reset) -- return 0; -+ goto out; - - err_handler = dev->driver->err_handler; - vote = err_handler->slot_reset(dev); - result_data->result = merge_result(result_data->result, vote); -+out: -+ device_unlock(&dev->dev); - return 0; - } - -@@ -311,15 +320,18 @@ static int report_resume(struct pci_dev - { - struct pci_error_handlers *err_handler; - -+ device_lock(&dev->dev); - dev->error_state = pci_channel_io_normal; - - if (!dev->driver || - !dev->driver->err_handler || - !dev->driver->err_handler->resume) -- return 0; -+ goto out; - - err_handler = dev->driver->err_handler; - err_handler->resume(dev); -+out: -+ device_unlock(&dev->dev); - return 0; - } - diff --git a/queue-3.6/series b/queue-3.6/series index 6e19104b2cd..12439937d5b 100644 --- a/queue-3.6/series +++ b/queue-3.6/series @@ -4,7 +4,6 @@ xfs-drop-buffer-io-reference-when-a-bad-bio-is-built.patch mac80211-sync-acccess-to-tx_filtered-ps_tx_buf-queues.patch mac80211-don-t-send-null-data-packet-when-not-associated.patch mac80211-call-skb_dequeue-ieee80211_free_txskb-instead-of-__skb_queue_purge.patch -pci-pm-fix-deadlock-when-unbinding-device-if-parent-in-d3cold.patch pci-pm-resume-device-before-shutdown.patch pci-pm-fix-proc-config-reg-access-for-d3cold-and-bridge-suspending.patch fanotify-fix-missing-break.patch -- 2.47.3