On Mon, 24 Jan 2005, Alan Cox wrote:
> 
> Almost every user of tty_ldisc_ref_* doesn't need to lock two objects and
> the code at that layer has no knowledge of pty/tty pairs.

Hmm.. It looks different to me - almost all users of the xxx_ref_wait() 
that act on pty's _do_ seem to use tty->link->ldisc.*()". The one counter- 
example seems to be pty_set_termios().

But I only did a quick grep in drivers/char, so there might be other users 
out there I didn't even think of.

While doing that, I did notice that all the other tty ops do take the 
kernel lock still - both read() and write() do. I wonder if we should just 
make poll() consistent, regardless of other issues (obviously, the nicest 
way to make it consistent would be to remove the kernel lock from the 
read/write paths, but I assume nobody wants to go through the locking).

> I'm dubious this is the actual bug although vhangup on a pty might
> trigger it I guess.

ierdnah - can you verify whether either of my silly patches seems to have 
made any difference? 

And I don't think it can be vhangup - that wouldn't clear the
chars_in_buffer function pointer (it might change it to the 
n_tty_chars_in_buffer or something by resetting to N_TTY).

I'd assume that it's when the other end is changed to using the
"ppp_[sync_]ldisc", both of which do actually have a NULL
"chars_in_buffer". (Alternatively, maybe "chars_in_buffer" isn't actually
NULL at all - the backtrace might be confused by either some really
strange memory corruption or a tail-call to a NULL function pointer by
some other line discipline thing, although quite frankly I think that 
sounds extremely unlikely).

So another potential fix is to just make all tty line disciplines always 
have a valid "chars_in_buffer" pointer. We could even do automatically in 
"tty_set_operations()", ie just do a

        driver->chars_in_buffer = op->chars_in_buffer ? : 
default_chars_in_buffer;

(where the default just returns zero) thing or something.

That would even speed up the normal cases (no need to test the pointer for 
NULL).

                Linus



-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to