From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34039) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aAc3J-0002KG-H1 for qemu-devel@nongnu.org; Sun, 20 Dec 2015 06:21:26 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aAc3G-0003fi-9i for qemu-devel@nongnu.org; Sun, 20 Dec 2015 06:21:25 -0500 Received: from mx1.redhat.com ([209.132.183.28]:45189) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aAc3G-0003fc-1w for qemu-devel@nongnu.org; Sun, 20 Dec 2015 06:21:22 -0500 References: <1450436632-23980-1-git-send-email-caoj.fnst@cn.fujitsu.com> <1450436632-23980-4-git-send-email-caoj.fnst@cn.fujitsu.com> <56768170.2080602@gmail.com> <56768766.1040300@cn.fujitsu.com> From: Marcel Apfelbaum Message-ID: <56768F2B.5030104@redhat.com> Date: Sun, 20 Dec 2015 13:21:15 +0200 MIME-Version: 1.0 In-Reply-To: <56768766.1040300@cn.fujitsu.com> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 3/5] PXB: convert to realize() List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Cao jin , qemu-devel@nongnu.org Cc: ehabkost@redhat.com, "Michael S. Tsirkin" , Markus Armbruster , pbonzini@redhat.com, leon.alrae@imgtec.com, =?UTF-8?Q?Andreas_F=c3=a4rber?= , aurelien@aurel32.net, rth@twiddle.net On 12/20/2015 12:48 PM, Cao jin wrote: > Hi, > > On 12/20/2015 06:22 PM, Marcel Apfelbaum wrote: >> >> Hi, >> >> On 12/18/2015 01:03 PM, Cao jin wrote: >>> Signed-off-by: Cao jin >>> --- >>> hw/pci-bridge/pci_expander_bridge.c | 24 ++++++++++++++---------- >>> 1 file changed, 14 insertions(+), 10 deletions(-) >>> >>> diff --git a/hw/pci-bridge/pci_expander_bridge.c >>> b/hw/pci-bridge/pci_expander_bridge.c >>> index 57f8a37..cc975f6 100644 >>> --- a/hw/pci-bridge/pci_expander_bridge.c >>> +++ b/hw/pci-bridge/pci_expander_bridge.c >>> @@ -145,19 +145,19 @@ static const TypeInfo pxb_host_info = { >>> * Returns 0 on successs, -1 if i440fx host was not >>> * found or the bus number is already in use. >>> */ >>> -static int pxb_register_bus(PCIDevice *dev, PCIBus *pxb_bus) >>> +static int pxb_register_bus(PCIDevice *dev, PCIBus *pxb_bus, Error >>> **errp) >> >> If you add an err parameter, maybe the function should return void. >> > > Ok, will modify it in V2. Actually, both style are fine with me:) > >> >>> { >>> PCIBus *bus = dev->bus; >>> int pxb_bus_num = pci_bus_num(pxb_bus); >>> >>> if (bus->parent_dev) { >>> - error_report("PXB devices can be attached only to root bus."); >>> + error_setg(errp, "PXB devices can be attached only to root >>> bus."); >>> return -1; >>> } >>> >>> QLIST_FOREACH(bus, &bus->child, sibling) { >>> if (pci_bus_num(bus) == pxb_bus_num) { >>> - error_report("Bus %d is already in use.", pxb_bus_num); >>> + error_setg(errp, "Bus %d is already in use.", pxb_bus_num); >>> return -1; >>> } >>> } >>> @@ -193,7 +193,7 @@ static gint pxb_compare(gconstpointer a, >>> gconstpointer b) >>> 0; >>> } >>> >>> -static int pxb_dev_initfn(PCIDevice *dev) >>> +static void pxb_dev_realize(PCIDevice *dev, Error **errp) >>> { >>> PXBDev *pxb = PXB_DEV(dev); >>> DeviceState *ds, *bds; >>> @@ -202,8 +202,8 @@ static int pxb_dev_initfn(PCIDevice *dev) >>> >>> if (pxb->numa_node != NUMA_NODE_UNASSIGNED && >>> pxb->numa_node >= nb_numa_nodes) { >>> - error_report("Illegal numa node %d.", pxb->numa_node); >>> - return -EINVAL; >>> + error_setg(errp, "Illegal numa node %d.", pxb->numa_node); >>> + return; >>> } >>> >>> if (dev->qdev.id && *dev->qdev.id) { >>> @@ -225,8 +225,8 @@ static int pxb_dev_initfn(PCIDevice *dev) >>> >>> PCI_HOST_BRIDGE(ds)->bus = bus; >>> >>> - if (pxb_register_bus(dev, bus)) { >>> - return -EINVAL; >>> + if (pxb_register_bus(dev, bus, errp)) { >>> + goto err_register_bus; >>> } >>> >>> qdev_init_nofail(ds); >>> @@ -237,7 +237,11 @@ static int pxb_dev_initfn(PCIDevice *dev) >>> pci_config_set_class(dev->config, PCI_CLASS_BRIDGE_HOST); >>> >>> pxb_dev_list = g_list_insert_sorted(pxb_dev_list, pxb, >>> pxb_compare); >>> - return 0; >>> + >>> +err_register_bus: >>> + object_unref(OBJECT(ds)); >>> + object_unref(OBJECT(bds)); >>> + object_unref(OBJECT(bus)); >> >> >> The order should be in the reverse order of creation: >> bds, bus, ds >> > > Ok, I can do that. But it seems the order here doesn`t matter? Is there dependency among these three? Yes, there is a dependency: At first the pxb host (ds) is created, then the bus (bus) is created as host's child (see pci_bus_new) and in the end a pci bridge (bds) is attached to the bus (see qdev_create). By the way, indeed you should call object_unparent at least for the pxb_host(ds), but you may want to check the others parent relationship as well. > >> >>> } >>> >>> static void pxb_dev_exitfn(PCIDevice *pci_dev) >>> @@ -259,7 +263,7 @@ static void pxb_dev_class_init(ObjectClass *klass, >>> void *data) >>> DeviceClass *dc = DEVICE_CLASS(klass); >>> PCIDeviceClass *k = PCI_DEVICE_CLASS(klass); >>> >>> - k->init = pxb_dev_initfn; >>> + k->realize = pxb_dev_realize; >>> k->exit = pxb_dev_exitfn; >> >> If init is converted to realize, maybe the exit should be converted to >> unrealize? >> > > Yup, I agree with you from the point that the names should be antonym. But it seems there is no PCIDeviceClass.unrealize:( You are right. The pci_qdev_unrealize ultimately calls exit. But the same goes for init, pci_qdev_realize calls for pc->realize. This is the reason I chose to use init/exit instead of the strange realize/exit. But since the intention is to get rid of init, I am not against it. > > And I am also not aware why there is no comment for .exit while there is for .init. It is appreciated if somebody could tell me the history O:-) I'll add Markus, Andreas and Michael (the PCI maintainer), maybe they have a better insight to this. On the other hand you should continue with the patch and leave the "unrealize" until we'll know more :) Thanks, Marcel > >> >> Thanks, >> Marcel >> >>> k->vendor_id = PCI_VENDOR_ID_REDHAT; >>> k->device_id = PCI_DEVICE_ID_REDHAT_PXB; >>> >> >> >> >> . >> >