Messages in this thread Patch in this message | | | Date | Mon, 1 Sep 2008 12:40:18 -0600 | From | Alex Chiang <> | Subject | [PATCH] PCI Hotplug: fakephp: fix deadlock... again |
| |
* Zhao, Yu <yu.zhao@intel.com>: > Just happened to see a change in fakephp when searching usage > of the pci_remove_bus_device(). I couldn't find the original > patches, but this > http://git.kernel.org/?p=linux/kernel/git/jbarnes/pci-2.6.git;a=commitdiff;h=fe99740cac117f208707488c03f3789cf4904957 > shows, the pci_remove_bus_device() was removed while the > remove_slot() was added in disable_slot(), which means: 1) > fakephp can't remove pci_dev anymore; 2) deadlock happens > because remove_slot() tries to remove the sysfs entry calling > itself.
Sorry about introducing this regression. Does the following patch fix it for you?
I've tested it on my system, and I can again use fakephp to remove a device:
sapphire:/sys/bus/pci/slots # echo 0 > fake4/power fakephp: disable_slot - physical_slot = fake4 e1000 0000:01:02.1: PCI INT B disabled GSI 32 (level, low) -> CPU 2 (0x0200) vector 54 unregistered fakephp: Slot already scheduled for removal fakephp: removing slot fake4
We get the "slot already scheduled for removal" because that particular device has 2 functions, and we're creating slots on a per-slot basis now, not a per-function basis.
Although, I wonder, Willy -- is that really the right thing to do? Seems like fakephp would be more useful if we did operate on a per-function basis, and not per-slot. Especially given Yu's work with SR-IOV, where we can apparently have lots of functions per a physical device.
Hm?
Thanks.
/ac
From: Alex Chiang <achiang@hp.com>
PCI Hotplug: fakephp: fix deadlock... again
Commit fe99740cac117f208707488c03f3789cf4904957 (construct one fakephp slot per PCI slot) introduced a regression, causing a deadlock when removing a PCI device.
We also never actually removed the device from the PCI core.
So we:
- remove the device from the PCI core - do not directly call remove_slot() to prevent deadlock
Yu Zhao reported and diagnosed this defect.
Signed-off-by: Alex Chiang <achiang@hp.com> --- diff --git a/drivers/pci/hotplug/fakephp.c b/drivers/pci/hotplug/fakephp.c index 40337a0..146ca9c 100644 --- a/drivers/pci/hotplug/fakephp.c +++ b/drivers/pci/hotplug/fakephp.c @@ -320,15 +320,15 @@ static int disable_slot(struct hotplug_slot *slot) return -ENODEV; } + /* remove the device from the pci core */ + pci_remove_bus_device(dev); + /* queue work item to blow away this sysfs entry and other * parts. */ INIT_WORK(&dslot->remove_work, remove_slot_worker); queue_work(dummyphp_wq, &dslot->remove_work); - /* blow away this sysfs entry and other parts. */ - remove_slot(dslot); - pci_dev_put(dev); } return 0;
| |