linux-pci.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Bjorn Helgaas <bhelgaas@google.com>
To: linux-pci@vger.kernel.org
Cc: linux-pcmcia@lists.infradead.org, Yinghai Lu <yinghai@kernel.org>,
	Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>
Subject: [PATCH v2 08/16] PCI: Stop and remove devices in one pass
Date: Fri, 17 Aug 2012 17:36:26 -0600	[thread overview]
Message-ID: <20120817233626.10973.57304.stgit@bhelgaas.mtv.corp.google.com> (raw)
In-Reply-To: <20120817233100.10973.59521.stgit@bhelgaas.mtv.corp.google.com>

Previously, when we removed a PCI device, we made two passes over the
hierarchy rooted at the device.  In the first pass, we stopped all
the devices, and in the second, we removed them.

This patch combines the two passes into one so that we remove a device as
soon as it and all its children have been stopped.

Note that we previously stopped devices in reverse order and removed them
in forward order.  Now we stop and remove them in reverse order.

Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
---
 drivers/pci/remove.c |   42 +++++++-----------------------------------
 1 files changed, 7 insertions(+), 35 deletions(-)

diff --git a/drivers/pci/remove.c b/drivers/pci/remove.c
index 30d002e..3828104 100644
--- a/drivers/pci/remove.c
+++ b/drivers/pci/remove.c
@@ -78,8 +78,6 @@ void pci_remove_bus(struct pci_bus *pci_bus)
 }
 EXPORT_SYMBOL(pci_remove_bus);
 
-static void pci_stop_bus_device(struct pci_dev *dev);
-
 /**
  * pci_stop_and_remove_bus_device - remove a PCI device and any children
  * @dev: the device to remove
@@ -92,38 +90,8 @@ static void pci_stop_bus_device(struct pci_dev *dev);
  * device lists, remove the /proc entry, and notify userspace
  * (/sbin/hotplug).
  */
-static void __pci_remove_bus_device(struct pci_dev *dev)
-{
-	struct pci_bus *bus = dev->subordinate;
-	struct pci_dev *child, *tmp;
-
-	if (bus) {
-		list_for_each_entry_safe(child, tmp, &bus->devices, bus_list)
-			__pci_remove_bus_device(child);
-
-		pci_remove_bus(bus);
-		dev->subordinate = NULL;
-	}
-
-	pci_destroy_dev(dev);
-}
-
 void pci_stop_and_remove_bus_device(struct pci_dev *dev)
 {
-	pci_stop_bus_device(dev);
-	__pci_remove_bus_device(dev);
-}
-
-/**
- * pci_stop_bus_device - stop a PCI device and any children
- * @dev: the device to stop
- *
- * Stop a PCI device (detach the driver, remove from the global list
- * and so on). This also stop any subordinate buses and children in a
- * depth-first manner.
- */
-static void pci_stop_bus_device(struct pci_dev *dev)
-{
 	struct pci_bus *bus = dev->subordinate;
 	struct pci_dev *child, *tmp;
 
@@ -133,12 +101,16 @@ static void pci_stop_bus_device(struct pci_dev *dev)
 	 * iterator.  Therefore, iterate in reverse so we remove the VFs
 	 * first, then the PF.
 	 */
-	if (bus)
+	if (bus) {
 		list_for_each_entry_safe_reverse(child, tmp,
 						 &bus->devices, bus_list)
-			pci_stop_bus_device(child);
+			pci_stop_and_remove_bus_device(child);
+
+		pci_remove_bus(bus);
+		dev->subordinate = NULL;
+	}
 
 	pci_stop_dev(dev);
+	pci_destroy_dev(dev);
 }
-
 EXPORT_SYMBOL(pci_stop_and_remove_bus_device);


  parent reply	other threads:[~2012-08-17 23:36 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-08-17 23:35 [PATCH v2 00/16] Clean up drivers/pci/remove.c Bjorn Helgaas
2012-08-17 23:35 ` [PATCH v2 01/16] PCI: acpiphp: Stop disabling bridges on remove Bjorn Helgaas
2012-08-17 23:35 ` [PATCH v2 02/16] PCI: acpiphp: Use common pci_stop_and_remove_bus_device() Bjorn Helgaas
2012-08-17 23:36 ` [PATCH v2 03/16] pcmcia: " Bjorn Helgaas
2012-08-18  0:58   ` Yinghai Lu
2012-08-20 14:46     ` Bjorn Helgaas
2012-08-17 23:36 ` [PATCH v2 04/16] PCI: Don't export stop_bus_device and remove_bus_device interfaces Bjorn Helgaas
2012-08-17 23:36 ` [PATCH v2 05/16] PCI: Remove pci_stop_and_remove_behind_bridge() Bjorn Helgaas
2012-08-17 23:36 ` [PATCH v2 06/16] PCI: Use list_for_each_entry() for bus->devices traversal Bjorn Helgaas
2012-08-17 23:36 ` [PATCH v2 07/16] PCI: Fold stop and remove helpers into their callers Bjorn Helgaas
2012-08-17 23:36 ` Bjorn Helgaas [this message]
2012-08-18  1:21   ` [PATCH v2 08/16] PCI: Stop and remove devices in one pass Yinghai Lu
2012-08-20 15:27     ` Bjorn Helgaas
2012-08-21  5:39       ` Yinghai Lu
2012-08-22 17:40         ` Bjorn Helgaas
2012-08-17 23:36 ` [PATCH v2 09/16] PCI: Remove unused, commented-out, code Bjorn Helgaas
2012-08-17 23:36 ` [PATCH v2 10/16] PCI: Rename local variables to conventional names Bjorn Helgaas
2012-08-17 23:36 ` [PATCH v2 11/16] PCI: Leave normal LIST_POISON in deleted list entries Bjorn Helgaas
2012-08-17 23:36 ` [PATCH v2 12/16] frv/PCI: Use list_for_each_entry() for bus->devices traversal Bjorn Helgaas
2012-08-17 23:36 ` [PATCH v2 13/16] parisc/PCI: Enable PERR/SERR on all devices Bjorn Helgaas
2012-08-17 23:36 ` [PATCH v2 14/16] parisc/PCI: Use list_for_each_entry() for bus->devices traversal Bjorn Helgaas
2012-08-17 23:37 ` [PATCH v2 15/16] sgi-agp: " Bjorn Helgaas
2012-08-17 23:37 ` [PATCH v2 16/16] PCI: Remove unused pci_dev_b() Bjorn Helgaas
2012-08-20  4:58 ` [PATCH v2 00/16] Clean up drivers/pci/remove.c Yijing Wang
2012-08-20 15:40   ` Bjorn Helgaas
2012-08-21  3:45     ` Yijing Wang
2012-08-22 17:26       ` Bjorn Helgaas
2012-08-24 21:25 ` Bjorn Helgaas

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20120817233626.10973.57304.stgit@bhelgaas.mtv.corp.google.com \
    --to=bhelgaas@google.com \
    --cc=kaneshige.kenji@jp.fujitsu.com \
    --cc=linux-pci@vger.kernel.org \
    --cc=linux-pcmcia@lists.infradead.org \
    --cc=yinghai@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).