On 2018-09-25 12:31 p.m., Bart Van Assche wrote: > On Tue, 2018-09-25 at 12:15 -0600, Logan Gunthorpe wrote: >> On 2018-09-25 11:29 a.m., Bart Van Assche wrote: >>> On Tue, 2018-09-25 at 10:22 -0600, Logan Gunthorpe wrote: >>>> @@ -83,9 +132,14 @@ static int pci_p2pdma_setup(struct pci_dev *pdev) >>>> >>>> pdev->p2pdma = p2p; >>>> >>>> + error = sysfs_create_group(&pdev->dev.kobj, &p2pmem_group); >>>> + if (error) >>>> + goto out_pool_destroy; >>>> + >>>> return 0; >>>> >>>> out_pool_destroy: >>>> + pdev->p2pdma = NULL; >>>> gen_pool_destroy(p2p->pool); >>>> out: >>>> devm_kfree(&pdev->dev, p2p); >>> >>> This doesn't look right to me. Shouldn't devm_remove_action() be called instead >>> of devm_kfree() if sysfs_create_group() fails? >> >> That makes no sense to me. We are reversing a devm_kzalloc() not a >> custom action.... > > In case what I wrote was not clear: both devm_kzalloc() and > devm_add_action_or_reset() have to be reversed if sysfs_create_group() fails. > devm_add_action_or_reset() calls devres_add(). The latter function adds an > element to the dev->devres_head list. So I think that only calling devm_kfree() > if sysfs_create_group() fails will lead to corruption of the dev->devres_head > list. I don't see how it would corrupt the list. devres_remove() uses list_del_init() which doesn't require that you only remove the tail from the list... The way I read the code, you can remove any devm action at any time. Logan