On Thu, Apr 18, 2024 at 09:46:18PM +0200, Arnd Bergmann wrote: > On Thu, Apr 18, 2024, at 17:15, Heiko Carstens wrote: > > That doesn't answer my question what prevents the release function > > from being called after the module has been unloaded. > > > > At least back then when the code was added it was a real bug. > > I think the way this should work is to have the allocation and > the release function in the iucv bus driver, with a function > roughly like > > struct device *iucv_alloc_device(char *name, > const struct attribute_group *attrs, > void *priv) > { > dev = kzalloc(sizeof(struct device), GFP_KERNEL); > if (!dev) > return NULL; > > dev_set_name(dev, "%s", name); > dev->bus = &iucv_bus; > dev->parent = iucv_root; > dev->groups = attrs; > dev_set_drvdata(dev, priv); > dev->release = iucv_free_dev; > > return dev; > } > > Now the release function cannot go away as long as any module > is loaded that links against it, and those modules cannot > go away as long as the devices are in use. > > I don't remember how iucv works, but if there is a way to > detect which system services exist, then the actual device > creation should also be separate from the driver using those > services, with another driver responsible for enumerating > the existing services and creating those devices. So, I finally had a deeper look at this, and it looks like the comment that says that the release function can be called after the module is unloaded is not correct (anymore?). I couldn't find any put_device() calls where not also the module reference count is increased. So I guess Nathan's patches are just fine. However given your above suggestion, I implemented an iucv_alloc_device() function to get rid of quite some code duplication, and the casts as well. I'll send the series for review.