From: Alan Stern <stern@rowland.harvard.edu>
To: Roger Quadros <rogerq@ti.com>
Cc: USB mailing list <linux-usb@vger.kernel.org>
Subject: Adding and removing the same gadget multiple times
Date: Tue, 28 Jul 2020 15:32:46 -0400 [thread overview]
Message-ID: <20200728193246.GD1507946@rowland.harvard.edu> (raw)
Roger:
Your commit fac323471df6 ("usb: udc: allow adding and removing the same
gadget device") from a few years ago just caught my eye. (I don't
recall whether I noticed it at the time.)
In any case, we need to talk about it. What you're doing --
unregistering and re-registering the struct device embedded in the
gadget structure -- is strictly forbidden by the kernel's device model.
It's even mentioned specifically in the kerneldoc for device_add().
Now, I guess doing this would be okay _if_ you took care not to
re-register the device until all references to the previous incarnation
have been dropped. In particular, setting the structure's memory to 0
should not be done immediately after calling device_unregister() --
which is what the commit does -- but rather in the release routine.
Do you know which UDC drivers actually do re-register their gadgets? In
particular, do they have their own release routines or do they rely on
the default usb_udc_nop_release() provided by the UDC core? Moving the
memset into that routine ought to be okay; leaving it where it is would
be a time bomb waiting to go off. I'm suprised it hasn't caused
problems already.
Furthermore, drivers that do re-register their gadgets should wait until
gadget->dev.release is NULL, indicating that the release routine has
been called and the memory has been wiped. If they re-register before
that, the re-registration will fail for the same reasons you observed
when you wrote the commit.
Of course, a cleaner alternative would be to allocate the gadget
structure dynamically. Then instead of re-registering the old one, the
driver could allocate a new one and register it instead, with no
concerns about reuse.
Alan Stern
next reply other threads:[~2020-07-28 19:32 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-07-28 19:32 Alan Stern [this message]
2020-07-29 1:47 ` Adding and removing the same gadget multiple times Peter Chen
2020-07-29 14:14 ` Alan Stern
2020-07-29 14:19 ` Greg KH
2020-07-30 2:37 ` Peter Chen
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=20200728193246.GD1507946@rowland.harvard.edu \
--to=stern@rowland.harvard.edu \
--cc=linux-usb@vger.kernel.org \
--cc=rogerq@ti.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).