On 10.12.2009, at 13:08, Michael S. Tsirkin wrote: > On Thu, Dec 10, 2009 at 11:11:06AM +0100, Gerd Hoffmann wrote: >> Current PCI code will simply hw_error() and thus abort in case no free >> PCI slot is available or the requested PCI slot is already in use by >> another device. For the hotplug case this behavior is not acceptable. >> This patch makes qemu pass up the error properly, so the calling code >> can decide whenever it wants to exit with an error (on startup) or >> whenever it wants to continue (hotplug). >> >> Signed-off-by: Gerd Hoffmann <kra...@redhat.com> > > > Good stuff. However > >> --- >> hw/pci.c | 11 +++++++++-- >> 1 files changed, 9 insertions(+), 2 deletions(-) >> >> diff --git a/hw/pci.c b/hw/pci.c >> index 4f662b7..404eead 100644 >> --- a/hw/pci.c >> +++ b/hw/pci.c >> @@ -580,11 +580,13 @@ static PCIDevice *do_pci_register_device(PCIDevice >> *pci_dev, PCIBus *bus, >> if (!bus->devices[devfn]) >> goto found; >> } >> - hw_error("PCI: no devfn available for %s, all in use\n", name); >> + qemu_error("PCI: no devfn available for %s, all in use\n", name); >> + return NULL; >> found: ; >> } else if (bus->devices[devfn]) { >> - hw_error("PCI: devfn %d not available for %s, in use by %s\n", >> devfn, >> + qemu_error("PCI: devfn %d not available for %s, in use by %s\n", >> devfn, >> name, bus->devices[devfn]->name); >> + return NULL; >> } >> pci_dev->bus = bus; >> pci_dev->devfn = devfn; >> @@ -625,6 +627,9 @@ PCIDevice *pci_register_device(PCIBus *bus, const char >> *name, >> pci_dev = do_pci_register_device(pci_dev, bus, name, devfn, >> config_read, config_write, >> PCI_HEADER_TYPE_NORMAL); >> + if (pci_dev == NULL) { >> + hw_error("PCI: can't register device\n"); >> + } > > Can you please use !pci_dev for these checks? > >> return pci_dev; >> } >> static target_phys_addr_t pci_to_cpu_addr(target_phys_addr_t addr) >> @@ -1376,6 +1381,8 @@ static int pci_qdev_init(DeviceState *qdev, DeviceInfo >> *base) >> pci_dev = do_pci_register_device(pci_dev, bus, base->name, devfn, >> info->config_read, info->config_write, >> info->header_type); >> + if (pci_dev == NULL) >> + return -1; > > And here too.
OMG! Broken coding style! :) Alex