On Tue, Feb 15, 2005 at 10:58:02PM +0300, Sergey Vlasov wrote:
> On Tue, 15 Feb 2005 11:08:07 -0800 (PST) Linus Torvalds wrote:
> 
> > On Tue, 15 Feb 2005, Andreas Schwab wrote:
> > >
> > > Recent kernel are losing bytes on a pty. 
> > 
> > Great catch.
> > 
> > I think it may be a n_tty line discipline bug, brought on by the fact that
> > the PTY buffering is now 4kB rather than 2kB. 4kB is also the
> > N_TTY_BUF_SIZE, and if n_tty has some off-by-one error, that would explain 
> > it.
> > 
> > Does the problem go away if you change the default value of "chunk" (in 
> > drivers/char/tty_io.c:do_tty_write) from 4096 to 2048? If so, that means 
> > that the pty code has _claimed_ to have written 4kB, and only ever wrote 
> > 4kB-1 bytes. That in turn implies that "ldisc.receive_room()" disagrees 
> > with "ldisc.receive_buf()".
> 
> The problem also goes away after unsetting ECHO on the slave terminal.
> This seems to point to this code in n_tty_receive_char():
> 
>       if (L_ECHO(tty)) {
>               if (tty->read_cnt >= N_TTY_BUF_SIZE-1) {
>                       put_char('\a', tty); /* beep if no space */
>                       return;
>               }
>       .......
>       }
> 
> This code sets the maximum number of buffered characters to
> N_TTY_BUF_SIZE-1, however, put_tty_queue() considers the maximum to be
> N_TTY_BUF_SIZE, and n_tty_receive_room() also returns N_TTY_BUF_SIZE for
> canonical mode if the canon_data buffer is empty - therefore after
> unsetting ECHO bytes are no longer lost.

But all this really is not important, because n_tty_receive_char() can
put more than one char into buffer for a single input char in lots of
cases.  Therefore n_tty_receive_room() can overestimate the available
space at least by 2 times.

Attachment: pgpFTJQt2jdWs.pgp
Description: PGP signature

Reply via email to