* Zhao, Yu <yu.zhao@xxxxxxxxx>: > 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@xxxxxx> 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@xxxxxx> --- 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; -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html