Re: [Bug #14388] keyboard under X with 2.6.31

Linus Torvalds
2009-10-13T00:16:29Z

On Mon, 12 Oct 2009, Nix wrote:
> On 12 Oct 2009, Justin P. Mattock uttered the following:
>
> > Not sure where this stands. Right now all three machines I have seem to be having no issues with the kayboard
> > (xserver 1.6.*) I can go and build the latest xserver(1.7) to see if I hit something.
> [...]
> >> Bug-Entry : http://bugzilla.kernel.org/show_bug.cgi?id=14388
> >> Subject : keyboard under X with 2.6.31
> >> Submitter : Frédéric L. W. Meunier <fredlwm@gmail.com>
> >> Date : 2009-10-07 20:19 (5 days old)
> >> First-Bad-Commit: http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=e043e42bdb66885b3ac10d27a01ccb9972e2b0a3
> >> References : http://marc.info/?l=linux-kernel&m=125494753228217&w=4
>
> I have been seeing problems precisely like those described (sometimes
> the keyboard dies, sometimes it gets 'stuck' with a key held down, until
> I switch TTYs, which generally means killing X as I'm not aware of an
> easy way to switch VTs using only the mouse), since I moved to 2.6.31

The particular commit that was bisected to should really not matter for X,
except perhaps from a timing standpoint.

The problem it fixed was in pty's, and X doesn't use them much if at all
(various X _programs_ may, of course, but the symptoms don't sound like
it's just a particular X app that has issues, but more of a generic X
keyboard handling thing)

But for non-pty's, there should be no semantic changes from that commit
outside of some general tty timing differences by doing that
tty_flush_to_ldisc() at new points.

I could fairly easily imagine that some timing difference does expose
another longer-standing problem in either the kernel or X itself. So the
bisection isn't necessarily wrong, it's just not likely telling us what
the real problem is.

Of course, maybe there is some race condition in the tty_buffer.c code. We
_used_ to not call flush_to_ldisc() except through the workqueue code, so
races would not be seen in normal circumstances. Now that flush_to_ldisc()
could easily get called both synchronously from tty_read()/tty_poll(),
while also being hit from the workqueues.

Alan, Ogawa-san, do either of you see some problem in tty_buffer.c,
perhaps?

Linus