On Wed, 2015-09-09 at 16:56 +1000, Daniel Axtens wrote: > Ahaha so I was wrong, device_add does grab a reference. > > > Currently, cxl_probe(pdev): > > 1) calls pci_dev_get(pdev) > > 2) calls cxl_adapter_init > > a) init calls cxl_adapter_alloc, which creates a struct cxl, > > conventionally called adapter. This struct contains a > > device entry, adapter->dev. > > > > b) init calls cxl_configure_adapter, where we set > > adapter->dev.parent = &dev->dev (here dev is the pci dev) > > > > So at this point, the cxl adapter's device's parent is the pci device > > that I want to be refcounted. > > > > c) init calls cxl_register_adapter (which inexplicably is in file.c) > > > > *) cxl_register_adapter calls device_register(&adapter->dev) > > > > So now we're in device_register, where dev is the adapter device, and we > > want to know if the PCI device is safe after we return. > > > > device_register(&adapter->dev) calls device_initialize() and then > > device_add(). > > > > device_add() does a get_device(). That ends up being a kobject_get() on > > the adapter device kobj, which will increment the kref on the adapter > > device. > > I was right up to this point, but I didn't read enough of device_add. > > device_add explicitly grabs the device's parent, and calls get_device on > it: > > parent = get_device(dev->parent); > > So it turns out we *are* protected against the device disappearing, my > patch is correct and I don't need a v2. > > Thanks to Ian for making me recheck device_add :)
Thanks for digging into it. Do you mind massaging that explanation into something I can put into the changelog? cheers _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev