public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
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
> 


  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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox