[PATCH] cxl: Fix unbalanced pci_dev_get in cxl_probe
Michael Ellerman
mpe at ellerman.id.au
Mon Sep 14 20:16:53 AEST 2015
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
More information about the Linuxppc-dev
mailing list