From: ebiederm@xmission.com (Eric W. Biederman)
To: Jesse Barnes <jbarnes@virtuousgeek.org>, <linux-pci@vger.kernel.org>
Cc: <linux-kernel@vger.kernel.org>
Subject: [PATCH] pcie_portdriver: FIX: pcie_port_device_remove
Date: Fri, 13 Feb 2009 20:23:03 -0800 [thread overview]
Message-ID: <m1ocx5ve8o.fsf@fess.ebiederm.org> (raw)
pcie_port_device_remove currently calls the remove method
of port drivers twice. Ouch!
We don't get the correct interrupt mode unless there is a port device
present.
We are calling device_for_each_child multiple times for no apparent
reason.
So make it simple. Use pcie_port_driver_ext so we always properly
know the interrupt mode the we placed the pci device in. Place
put_device and device_unregister into remove_iter, and throw out the
rest. Only call device_for_each_child once.
The code is simpler and actually works!
Signed-off-by: Eric W. Biederman <ebiederm@aristanetworks.com>
---
drivers/pci/pcie/portdrv_core.c | 31 +++++++------------------------
1 files changed, 7 insertions(+), 24 deletions(-)
diff --git a/drivers/pci/pcie/portdrv_core.c b/drivers/pci/pcie/portdrv_core.c
index 8b3f8c1..c642828 100644
--- a/drivers/pci/pcie/portdrv_core.c
+++ b/drivers/pci/pcie/portdrv_core.c
@@ -326,16 +326,9 @@ int pcie_port_device_resume(struct pci_dev *dev)
static int remove_iter(struct device *dev, void *data)
{
- struct pcie_port_service_driver *service_driver;
-
if (dev->bus == &pcie_port_bus_type) {
- if (dev->driver) {
- service_driver = to_service_driver(dev->driver);
- if (service_driver->remove)
- service_driver->remove(to_pcie_device(dev));
- }
- *(unsigned long*)data = (unsigned long)dev;
- return 1;
+ put_device(dev);
+ device_unregister(dev);
}
return 0;
}
@@ -349,24 +342,14 @@ static int remove_iter(struct device *dev, void *data)
*/
void pcie_port_device_remove(struct pci_dev *dev)
{
- struct device *device;
- unsigned long device_addr;
- int interrupt_mode = PCIE_PORT_INTx_MODE;
- int status;
+ struct pcie_port_device_ext *p_ext = pci_get_drvdata(dev);
+
+ device_for_each_child(&dev->dev, NULL, remove_iter);
- do {
- status = device_for_each_child(&dev->dev, &device_addr, remove_iter);
- if (status) {
- device = (struct device*)device_addr;
- interrupt_mode = (to_pcie_device(device))->interrupt_mode;
- put_device(device);
- device_unregister(device);
- }
- } while (status);
/* Switch to INTx by default if MSI enabled */
- if (interrupt_mode == PCIE_PORT_MSIX_MODE)
+ if (p_ext->interrupt_mode == PCIE_PORT_MSIX_MODE)
pci_disable_msix(dev);
- else if (interrupt_mode == PCIE_PORT_MSI_MODE)
+ else if (p_ext->interrupt_mode == PCIE_PORT_MSI_MODE)
pci_disable_msi(dev);
}
--
1.6.0.6
next reply other threads:[~2009-02-14 4:23 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-02-14 4:23 Eric W. Biederman [this message]
2009-02-19 20:03 ` [PATCH] pcie_portdriver: FIX: pcie_port_device_remove Andrew Morton
2009-02-19 20:55 ` Eric W. Biederman
2009-02-19 21:47 ` Rafael J. Wysocki
2009-02-19 23:30 ` Eric W. Biederman
2009-02-19 23:53 ` Jesse Barnes
2009-02-20 10:53 ` Rafael J. Wysocki
2009-02-21 4:16 ` [PATCH] pcie_portdriver: FIX: pcie_port_device_remove (take 2) Eric W. Biederman
2009-02-24 19:12 ` Jesse Barnes
2009-02-25 4:22 ` Eric W. Biederman
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=m1ocx5ve8o.fsf@fess.ebiederm.org \
--to=ebiederm@xmission.com \
--cc=jbarnes@virtuousgeek.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.