From: Ryan Reading <rreading@msm.umr.edu>
To: linux-kernel@vger.kernel.org
Subject: Re: 2.4.27 Potential race in n_tty.c:write_chan()
Date: Sun, 05 Dec 2004 23:42:22 -0500 [thread overview]
Message-ID: <1102308142.1882.31.camel@localhost> (raw)
In-Reply-To: <1102286420.3386.20.camel@at2.pipehead.org>
On Sun, 2004-12-05 at 17:40, Paul Fulghum wrote:
> On Sun, 2004-12-05 at 15:54 -0500, Ryan Reading wrote:
> > So when write_chan() calls usb_driver::write(), typically the driver
> > calls usb_submit_urb(). The write() call then returns immediately
> > indicating that all of the data has been written (assuming it is
less
> > than the USB packets size). The driver however is still waiting for
an
> > interrupt to complete the write and wakeup the current kernel path.
If
> > write_chan() is called again and the interrupt is received within
the
> > window I outlined above, the current_state will be reset to
TASK_RUNNING
> > before the next usb_driver::write() is ever called! If this
happens, it
> > seems that we would lose synchronisity and potentially lock the
kernel
> > path.
>
> The line discipline write routine is serialized
> on a per tty basis in do_tty_write() of tty_io.c
> using tty->atomic_write semaphore, so you will not
> reenter write_chan() for a particular tty instance.
Per tty instance this is true, but this is not the case for multiple
userland::write() calls.
> Even if this were not the case, if the task state
> changes to TASK_RUNNING inside the window
> you describe, the only thing that happens is the loop
> executes again. The driver must decide if it can accept
> more data or not and return the appropriate value.
>
> There is no potential for deadlock.
Yes this does seem to be true. However, it can throw a driver into a
wierd state if this happens. Ideally the driver should be able to
recover. I'm not sure if we can guarantee that user_land protocol could
recover though, especially if write()s aren't guaranteed to complete
successfully.
> > It is also my understanding that the usb interrupt is generated from
the
> > ACK/NAK of the original usb_submit_urb(). If the driver is
returning
> > immediately without waiting on the interrupt and schedule() is never
> > being called, there is no guarantee that the write() happened
> > successfully (although we return that it has). It seems if a driver
> > wanted to guarantee this, it would have to artificially wait of the
> > interrupt before returning.
>
> True, but this is a matter of layering.
>
> The line discipline knows nothing about the driver's concept
> of write completion apart from the driver's write method
> return value. If it is critical for the write not to complete
> until the URB is sent, it is up to the driver to block
> and return the appropriate return value.
I guess my biggest concern here is the definition of the
tty_driver::write() interface. Should a driver be able to rely on the
schedule() call to complete its write? It seems that since the driver
is responsible for waking up the tty->write_wait, it should be able to
rely on the schedule() call. However in this implementation it cannot
which I'm sure is for performance reasons. Because of this, I don't
think the USB layer should be interacting with the tty layer in this
fashion.
So for this implementation of write_chan(), the tty_driver::write()
interface should note that the driver needs only to wakeup the
tty->write_wait iff it does not write all of the requested data in this
call. Is this a fair assessment and can this be depended on for future
implementations?
Anyway, part of this discussion needs to happen on the USB mailing list
since the usb-skeleton driver outlines this method of interacting with
the tty layer. Given the current implementation I don't think the
usb-skeleton is correct.
Thanks for your help.
-- Ryan
> --
> Paul Fulghum
> paulkf@microgate.com
>
next prev parent reply other threads:[~2004-12-06 4:42 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-12-05 20:54 2.4.27 Potential race in n_tty.c:write_chan() Ryan Reading
2004-12-05 22:40 ` Paul Fulghum
2004-12-06 4:42 ` Ryan Reading [this message]
[not found] ` <1102307945.1876.27.camel@localhost>
2004-12-06 14:15 ` Paul Fulghum
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=1102308142.1882.31.camel@localhost \
--to=rreading@msm.umr.edu \
--cc=linux-kernel@vger.kernel.org \
/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.