On Wed, Dec 13, 2023 at 12:58 AM Kent Gibson <warthog618@xxxxxxxxx> wrote: > > On Tue, Dec 12, 2023 at 06:09:00PM +0100, Bartosz Golaszewski wrote: [snip] > > > > Patches 2-4 look fine, I was about to review patch 1 in detail but I > > thought I'd just throw this one in here before we commit to a specific > > solution. > > > > For some reason I thought this would not work but I'm now considering > > it as an alternative approach: is there anything wrong with adding > > struct kref to struct line, allocating it separately per-line when > > gpio_chardev_data is created, referencing it from struct linereq when > > the line is being requested, and dropping the reference from > > gpio_chardev_data and linereq when either is being removed? Other than > > the increased number of allocations? > > > > The collection of struct line always has to be global, right, as both > gpio_chardev_data and linereq are ephemeral. e.g. if one process requests > a line and another checks the lineinfo, those will have distinct > gpio_chardev_data. > Strictly speaking at least the supplemental info has to be globally accessible. But I get your point. > But the key issue is that the linereq and struct line lifetimes are > strictly tied - a struct line does not live beyond the containing linereq. I was thinking about decoupling one from the other actually. > Leaving the struct line alive after the linereq is released is just wrong. > The line has been released back to gpiolib so there can be no > supplemental info left. Indeed. > If you want any such info to persist beyond the line release then it > should be located in gpiolib itself, not cdev. > Right, we even zero debounce_period_us anyway on line release - just as if we released struct line. Bart