From a50ac6bfd6042b16e0de4ac3264c407e678c9b10 Mon Sep 17 00:00:00 2001
From: Lukas Wunner <lukas@wunner.de>
Date: Sun, 19 Aug 2018 16:29:00 +0200
Subject: [PATCH] PCI: Simplify disconnected marking
Git-commit: a50ac6bfd6042b16e0de4ac3264c407e678c9b10
Patch-mainline: v4.20-rc1
References: bsc#1161561
Commit 89ee9f768003 ("PCI: Add device disconnected state") iterates over
the devices on a parent bus, marks each as disconnected, then marks
each device's children as disconnected using pci_walk_bus().
The same can be achieved more succinctly by calling pci_walk_bus() on
the parent bus. Moreover, this does not need to wait until acquiring
pci_lock_rescan_remove(), so move it out of that critical section.
The critical section in err.c contains a pci_dev_get() / pci_dev_put()
pair which was apparently copy-pasted from pciehp_pci.c. In the latter
it serves the purpose of holding the struct pci_dev in place until the
Command register is updated. err.c doesn't do anything like that, hence
the pair is unnecessary. Remove it.
Signed-off-by: Lukas Wunner <lukas@wunner.de>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Cc: Keith Busch <keith.busch@intel.com>
Cc: Oza Pawandeep <poza@codeaurora.org>
Cc: Sinan Kaya <okaya@kernel.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Acked-by: Takashi Iwai <tiwai@suse.de>
---
drivers/pci/hotplug/pciehp_pci.c | 9 +++------
drivers/pci/pcie/err.c | 8 ++------
2 files changed, 5 insertions(+), 12 deletions(-)
--- a/drivers/pci/hotplug/pciehp_pci.c
+++ b/drivers/pci/hotplug/pciehp_pci.c
@@ -89,6 +89,9 @@ int pciehp_unconfigure_device(struct slo
__func__, pci_domain_nr(parent), parent->number);
pciehp_get_adapter_status(p_slot, &presence);
+ if (!presence)
+ pci_walk_bus(parent, pci_dev_set_disconnected, NULL);
+
pci_lock_rescan_remove();
/*
@@ -100,12 +103,6 @@ int pciehp_unconfigure_device(struct slo
list_for_each_entry_safe_reverse(dev, temp, &parent->devices,
bus_list) {
pci_dev_get(dev);
- if (!presence) {
- pci_dev_set_disconnected(dev, NULL);
- if (pci_has_subordinate(dev))
- pci_walk_bus(dev->subordinate,
- pci_dev_set_disconnected, NULL);
- }
pci_stop_and_remove_bus_device(dev);
/*
* Ensure that no new Requests will be generated from
--- a/drivers/pci/pcie/err.c
+++ b/drivers/pci/pcie/err.c
@@ -296,17 +296,13 @@ void pcie_do_fatal_recovery(struct pci_d
udev = dev->bus->self;
parent = udev->subordinate;
+ pci_walk_bus(parent, pci_dev_set_disconnected, NULL);
+
pci_lock_rescan_remove();
pci_dev_get(dev);
list_for_each_entry_safe_reverse(pdev, temp, &parent->devices,
bus_list) {
- pci_dev_get(pdev);
- pci_dev_set_disconnected(pdev, NULL);
- if (pci_has_subordinate(pdev))
- pci_walk_bus(pdev->subordinate,
- pci_dev_set_disconnected, NULL);
pci_stop_and_remove_bus_device(pdev);
- pci_dev_put(pdev);
}
result = reset_link(udev, service);