Re: [PATCH] cxl: Fix unbalanced pci_dev_get in cxl_probe
From: Michael Ellerman <mpe@ellerman.id.au>
Date: 2015-09-14 10:16:54
On Wed, 2015-09-09 at 16:56 +1000, Daniel Axtens wrote:
Ahaha so I was wrong, device_add does grab a reference.quoted
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