On Fri, Feb 27, 2026 at 04:42:09PM +0100, Bartosz Golaszewski wrote: > On Fri, Feb 27, 2026 at 11:06 AM Johan Hovold <[email protected]> wrote:
> > It seems all that is needed is to decouple the struct i2c_adapter from > > the driver data and have core manage the lifetime of the former using > > the reference count of the embedded struct device. > This is a weird pattern you sometimes see where a driver allocates > something and passes the ownership to the subsystem. It's not weird at all, this is the standard way to handle this. We have these things called reference counts for a reason. > This often > causes confusion among driver authors, who logically assume that if > you allocate something, you are responsible for freeing it.Since this > is C and not Rust (where such things are tracked by the compiler), I > strongly believe we should strive to keep ownership consistent: the > driver should free resources it allocated within the bounds of the > lifetime of the device it controls. The subsystem should manage the > data it allocated - in this case the i2c adapter struct device. Drivers are responsible for dropping *their* reference, it doesn't mean that the resource is necessarily freed immediately as someone else may be holding a reference. Anyone surprised by this should not be doing kernel development. > I know there are a lot of places where this is done in the kernel but > let's not introduce new ones. This is a bad pattern. No, it's not. It's literally the standard way of doing this. > But even if you decided this is the way to go, I fail to see how it > would be easier than what I'm trying to do. You would have to modify > *all* I2C bus drivers as opposed to only modifying those that access > the underlying struct device. Or am I missing something? Yes, you have to update the allocation and replace container_of() with dev_get_drvdata() but it's a straight-forward transformation that brings the i2c subsystem more in line with the driver model (unlike whatever it is you're trying to do). Johan
