From: Lee Jones <lee@kernel.org>
To: Alan Stern <stern@rowland.harvard.edu>
Cc: John Keeping <john@metanate.com>,
Greg KH <gregkh@linuxfoundation.org>,
balbi@kernel.org, linux-kernel@vger.kernel.org,
linux-usb@vger.kernel.org
Subject: Re: [PATCH 1/1] usb: gadget: f_hid: Conduct proper refcounting on shared f_hidg pointer
Date: Mon, 21 Nov 2022 12:30:45 +0000 [thread overview]
Message-ID: <Y3tvdYKifmMKDhk8@google.com> (raw)
In-Reply-To: <Y3qSImZkZwCG1kA1@rowland.harvard.edu>
On Sun, 20 Nov 2022, Alan Stern wrote:
> On Sun, Nov 20, 2022 at 05:22:19PM +0000, John Keeping wrote:
> > On Fri, Nov 18, 2022 at 04:07:24PM -0500, Alan Stern wrote:
> > > On Fri, Nov 18, 2022 at 04:37:32PM +0000, John Keeping wrote:
> > > > I don't think it's at all simple to fix this - I posted a series
> > > > addressing the lifetime issues here a few years ago but didn't chase it
> > > > up and there was no feedback:
> > > >
> > > > https://lore.kernel.org/linux-usb/20191028114228.3679219-1-john@metanate.com/
> > > >
> > > > That includes a patch to remove the embedded struct cdev and manage its
> > > > lifetime separately, which I think is needed as there are two different
> > > > struct device objects here and we cannot tie their lifetimes together.
> > >
> > > I still don't have a clear picture of what the real problem is. Lee's
> > > original patch description just said "external references are presently
> > > not tracked", with no details about what those external references are.
> > > Why not add just proper cdev_get() and cdev_put() calls to whatever code
> > > handles those external references, so that they _are_ tracked?
> > >
> > > What are the two different struct device objects? Why do their
> > > lifetimes need to be tied together? If you do need to tie their
> > > lifetimes somehow, why not simply make one of them (the one which is
> > > logically allowed to be shorter-lived) hold a reference to the other?
> >
> > The problem is that we have a struct cdev embedded in f_hidg but the
> > lifetime of f_hidg is not tied to any kobject so we can't solve this in
> > the right way by setting the parent kobject of the cdev.
> >
> > While refcounting struct f_hidg is necessary, it's not sufficient
> > because the only way to keep it alive long enough for the final
> > kobject_put() on the embedded cdev is to tie the lifetime to a kobject
> > of its own and there is no suitable object as this is not the model
> > followed by gadget function instances.
>
> I see. The solution is simple: Embed a struct device in struct f_hidg,
> and call cdev_device_add() to add the device and the cdev. This will
> automatically make the device the parent of the cdev, so the device's
> refcount won't go to 0 until the cdev's refcount does. Then you can tie
> the f_hidg's lifetime to the device's, so the device's release routine
> can safely deallocate the entire f_hidg structure.
>
> The parent of the new struct device should be set to &gadget->dev. If
> you can't think of a better name for the device, you could simply append
> ":I" to the parent's name, where I is the interface number, or even
> append ":C.I" where C is the config number (like we do on the host
> side).
Thanks for the suggestions Alan.
Not long finished speaking with Greg about this. He seems okay with
the approach. I'll knock something together and get a "v1" (*wink*)
out shortly.
--
Lee Jones [李琼斯]
next prev parent reply other threads:[~2022-11-21 12:32 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-11-17 12:08 [PATCH 1/1] usb: gadget: f_hid: Conduct proper refcounting on shared f_hidg pointer Lee Jones
2022-11-17 12:50 ` Greg KH
2022-11-17 13:26 ` Lee Jones
2022-11-17 17:38 ` Greg KH
2022-11-17 12:50 ` Greg KH
2022-11-17 13:46 ` Lee Jones
2022-11-17 16:47 ` Alan Stern
2022-11-18 8:54 ` Lee Jones
2022-11-18 15:59 ` Alan Stern
2022-11-18 16:37 ` John Keeping
2022-11-18 21:07 ` Alan Stern
2022-11-20 17:22 ` John Keeping
2022-11-20 20:46 ` Alan Stern
2022-11-21 12:30 ` Lee Jones [this message]
2022-11-21 12:38 ` John Keeping
2022-11-21 16:18 ` Alan Stern
2022-11-21 18:54 ` John Keeping
2022-11-21 19:17 ` Alan Stern
2022-11-22 11:52 ` John Keeping
2022-11-22 8:31 ` Lee Jones
2022-11-22 11:55 ` John Keeping
-- strict thread matches above, loose matches on Subject: below --
2022-10-17 11:27 Lee Jones
2022-10-22 12:52 ` Greg Kroah-Hartman
2022-10-24 7:17 ` Lee Jones
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Y3tvdYKifmMKDhk8@google.com \
--to=lee@kernel.org \
--cc=balbi@kernel.org \
--cc=gregkh@linuxfoundation.org \
--cc=john@metanate.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=stern@rowland.harvard.edu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.