From: Peter Hurley <peter@hurleysoftware.com>
To: Alan Stern <stern@rowland.harvard.edu>
Cc: Johan Hovold <jhovold@gmail.com>,
Greg KH <gregkh@linuxfoundation.org>,
linux-usb@vger.kernel.org, linux-serial@vger.kernel.org
Subject: Re: USB: serial: port lifetimes (was: Re: USB Ooops PL2303 when unplug while use (linux v3.7.3))
Date: Fri, 22 Feb 2013 13:21:24 -0500 [thread overview]
Message-ID: <1361557284.5752.25.camel@thor.lan> (raw)
In-Reply-To: <Pine.LNX.4.44L0.1302221218270.1365-100000@iolanthe.rowland.org>
On Fri, 2013-02-22 at 12:35 -0500, Alan Stern wrote:
> On Fri, 22 Feb 2013, Johan Hovold wrote:
>
> > > > So we end up with an unregistered device still possibly referenced by
> > > > tty instead, and I suspect we can't do much else than deal with any
> > > > post-disconnect callbacks. [ These should be few, especially with my
> > > > latest TTY-patches applied. ]
> > > >
> > > > Alan, do you see any way around this? It's not possible (or desirable)
> > > > to pin the parent device (interface) until the last reference is
> > > > dropped, is it?
> > >
> > > On the contrary, it is customary to pin data structures until the last
> > > reference to them is gone. That's what krefs are for.
> >
> > I was referring to the usb device in the device hierarchy, which
> > apparently is not pinned despite the outstanding reference we have in
> > struct usb_serial.
>
> Are you talking about the usb_device or the usb_interface? The
> usb_serial structure _does_ pin the usb_device structure. But it
> doesn't pin the usb_interface. I don't know why things were done this
> way; maybe it's a mistake.
>
> Anyway, keeping a pointer to a non-pinned data structure after
> unregistration is okay, provided you know you will never dereference
> the pointer. If you don't know this in the case of the usb_interface,
> pinning is acceptable -- depending on _how_ the usb_interface is
> accessed. For example, no URBs should be submitted for any of the
> interface's endpoints.
>
> > There is an unconditional call to device_del in usb_disconnect which
> > unlinks the parent usb device from the device hierarchy resulting in the
> > broken devpaths above if we do not unregister the usb-serial port (and
> > tty device) in disconnect.
>
> Sure. But unregistering is different from deallocation. It's not
> clear what your point is.
>
> > > On the other hand, the port private data was owned entirely by the
> > > serial sub-driver. Neither the serial core nor the tty layer is able
> > > to use it meaningfully -- they don't even know what type of structure
> > > it is.
> > >
> > > Therefore freeing the structure when the port is removed should be
> > > harmless -- unless the subdriver is called after the structure is
> > > deallocated.
> >
> > Which could happen (and is happening), unless we defer port unregister
> > until the last tty reference is dropped -- but then we get the broken
> > uevents.
>
> Unregistration should not be deferred. We mustn't have those broken
> devpaths.
>
> > > This means there still is one bug remaining. In
> > > usb_serial_device_remove(), the call to tty_unregister_device() should
> > > occur _before_ the call to driver->port_remove(), not _after_. Do you
> > > think changing the order cause any new problems?
> >
> > Yes, Peter noticed that one too. Changing the order shouldn't cause any
> > new issues as far as I can see. I'll cook up a patch for this one as
> > well, but just to be clear: this is not directly related to the problem
> > discussed above as there may be outstanding tty references long after
> > both functions return (not that anyone has claimed anything else).
>
> This is related to the problem of the port's private data being
> accessed after it is deallocated. The only way that can happen is if
> the tty layer calls the subdriver after the private data structure is
> freed -- and you said above that this does happen.
>
> But if change things so that the structure isn't freed until after the
> port is unregistered from the tty layer, this would mean that the tty
> layer is trying to do stuff to an unregistered port. That would be a
> bug in the tty layer.
>
> I'm not saying such bugs don't exist. However, if they do exist then
> the tty layer needs to be fixed, not the usb-serial layer.
ISTM the usb_serial_port private data should not be freed until
port_release().
If usb traffic isn't halted until port_release() ...
static void port_release(struct device *dev)
{
struct usb_serial_port *port = to_usb_serial_port(dev);
int i;
dev_dbg(dev, "%s\n", __func__);
/*
* Stop all the traffic before cancelling the work, so that
* nobody will restart it by calling usb_serial_port_softint.
*/
====> kill_traffic(port);
cancel_work_sync(&port->work);
then what happens here if ->port_remove() has already been called?
static void garmin_write_bulk_callback(struct urb *urb)
{
struct usb_serial_port *port = urb->context;
if (port) {
struct garmin_data *garmin_data_p =
usb_get_serial_port_data(port);
if (GARMIN_LAYERID_APPL == getLayerId(urb->transfer_buffer)) {
====> if (garmin_data_p->mode == MODE_GARMIN_SERIAL) {
gsp_send_ack(garmin_data_p,
((__u8 *)urb->transfer_buffer)[4]);
}
next prev parent reply other threads:[~2013-02-22 18:21 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <510B2C09.7020700@gtsys.com.hk>
2013-02-13 14:25 ` USB Ooops PL2303 when unplug while use (linux v3.7.3) Johan Hovold
2013-02-13 14:28 ` [PATCH] USB: serial: fix null-pointer dereferences on disconnect Johan Hovold
[not found] ` <1360765731-23164-1-git-send-email-jhovold-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2013-02-13 14:34 ` Felipe Balbi
2013-02-13 14:48 ` Johan Hovold
2013-02-13 16:41 ` Greg KH
2013-02-13 16:53 ` [PATCH resend] " Johan Hovold
2013-02-13 17:27 ` [RFC 0/4] tty: port hangup and close issues Johan Hovold
2013-02-13 17:27 ` [RFC 1/4] tty: clean up port shutdown Johan Hovold
2013-02-13 17:27 ` [RFC 2/4] tty: fix DTR/RTS not being dropped on hang up Johan Hovold
[not found] ` <1360776446-31371-3-git-send-email-jhovold-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2013-02-13 18:06 ` [RFC v2 " Johan Hovold
2013-02-13 19:32 ` [RFC " Peter Hurley
[not found] ` <1360783973.8499.48.camel-AsKIXgLx6sE@public.gmane.org>
2013-02-14 1:11 ` Peter Hurley
[not found] ` <1360804273.3385.23.camel-AsKIXgLx6sE@public.gmane.org>
2013-02-14 9:04 ` Johan Hovold
2013-02-13 17:27 ` [RFC 3/4] tty: clean up port drain-delay handling Johan Hovold
2013-02-14 1:39 ` Peter Hurley
2013-02-14 9:12 ` Johan Hovold
2013-02-13 17:27 ` [RFC 4/4] tty: fix close of uninitialised ports Johan Hovold
2013-02-13 17:36 ` [RFC 0/4] tty: port hangup and close issues Alan Cox
[not found] ` <20130213173630.63e29b47-+KEw/ACL1GZE/aiTQr5FLb0Ud+EcFu5g@public.gmane.org>
2013-02-13 18:05 ` Johan Hovold
[not found] ` <1360776446-31371-1-git-send-email-jhovold-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2013-02-20 16:02 ` [PATCH 0/4] TTY: port hangup and close fixes Johan Hovold
2013-02-20 16:02 ` [PATCH 1/4] TTY: clean up port shutdown Johan Hovold
2013-02-20 16:02 ` [PATCH 2/4] TTY: fix DTR not being dropped on hang up Johan Hovold
2013-02-23 14:18 ` Peter Hurley
2013-02-26 10:59 ` Johan Hovold
2013-02-20 16:02 ` [PATCH 3/4] TTY: clean up port drain-delay handling Johan Hovold
[not found] ` <1361376172-31860-1-git-send-email-jhovold-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2013-02-20 16:02 ` [PATCH 4/4] TTY: fix close of uninitialised ports Johan Hovold
2013-02-21 1:53 ` [PATCH 0/4] TTY: port hangup and close fixes Peter Hurley
2013-02-13 18:40 ` USB Ooops PL2303 when unplug while use (linux v3.7.3) Peter Hurley
[not found] ` <1360780808.8499.43.camel-AsKIXgLx6sE@public.gmane.org>
2013-02-14 17:43 ` Johan Hovold
2013-02-22 10:03 ` USB: serial: port lifetimes (was: Re: USB Ooops PL2303 when unplug while use (linux v3.7.3)) Johan Hovold
2013-02-22 15:17 ` Alan Stern
2013-02-22 17:11 ` Johan Hovold
2013-02-22 17:35 ` Alan Stern
[not found] ` <Pine.LNX.4.44L0.1302221218270.1365-100000-IYeN2dnnYyZXsRXLowluHWD2FQJk+8+b@public.gmane.org>
2013-02-22 17:44 ` Greg KH
2013-02-22 18:21 ` Peter Hurley [this message]
[not found] ` <1361557284.5752.25.camel-AsKIXgLx6sE@public.gmane.org>
2013-02-22 18:57 ` Alan Stern
2013-02-23 16:05 ` Johan Hovold
2013-02-23 16:23 ` Johan Hovold
2013-02-23 16:34 ` Johan Hovold
2013-02-23 17:31 ` Alan Stern
2013-02-23 18:12 ` Johan Hovold
2013-02-23 21:20 ` Alan Stern
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=1361557284.5752.25.camel@thor.lan \
--to=peter@hurleysoftware.com \
--cc=gregkh@linuxfoundation.org \
--cc=jhovold@gmail.com \
--cc=linux-serial@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 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).