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. > rc = info->init(pci_dev); > if (rc != 0) > return rc; > -- > 1.6.5.2 > >