[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