From: Bob Bell <bbell@users.sourceforge.net>
To: Theodore Ts'o <tytso@mit.edu>
Cc: linux-serial@vger.kernel.org
Subject: Re: Serial driver related problems on Linux
Date: Thu, 17 Mar 2005 13:07:03 -0500 [thread overview]
Message-ID: <20050317180703.GA30572@newbie.macroped.net> (raw)
In-Reply-To: <20050315021128.GC15418@thunk.org>
[-- Attachment #1: Type: text/plain, Size: 1896 bytes --]
On Mon, Mar 14, 2005 at 09:11:28PM -0500, Theodore Ts'o <tytso@mit.edu> wrote:
> On Thu, Mar 10, 2005 at 10:41:27AM -0500, Bob Bell wrote:
> > The user-visible symptoms of this problem are that after typing in a
> > username and hitting enter, the serial login prompt hangs. I've traced
> > this hang to an ioctl in the login code (TCSETSF, a result of calling
> > tcsetattr(,TCSAFLUSH,)). I've further traced that ioctl to being stuck
> > in tty_wait_until_sent().
>
> It's possible this was caused by a lost transmitter interrupt, so the
> transmit queue never drained; it's also possible that some UART's are
> wired to not signal a transmitter interrupt while the serial port is
> flow controlled. In order to figure out what is going on, you'd have
> to add debugging logic into the interrupt handler as well (i.e.,
> #define SERIAL_DEBUG_INTR).
I've #defined SERIAL_DEBUG_INTR as you indicated. In order to minimize
the impact that might cause, I also #defined printk() to be equivalent
to my debugging routine, dbg_addmsg(). The following was captured
starting after I typing in my username, but before I hit enter:
rs_interrupt_single(4)...status = 61...DR0d:61...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
<7>ttyS wait until sent...
<7>waiting ttyS...(1)
rs_interrupt_single(4)...status = 0...IIR = c1...end.
[ the preceding line repeats another 28x, about once every 10 seconds ]
<7>waiting ttyS...(62)
<7>waiting on ttyS interrupted
I've attached a complete log, starting at boot time, as
log_complete.out. I've also attached my updated patch to the Linux
kernel that I used to capture the debugging output, just for
completeness.
Thanks for the guidance. I'm not sure what this output demonstrates,
but I hope it gets us at least one step closer to the cause...
--
Bob Bell <bbell@users.sourceforge.net>
[-- Attachment #2: log_complete.out --]
[-- Type: text/plain, Size: 34293 bytes --]
<6>Serial driver version 5.05c (2001-07-08) with MANY_PORTS SHARE_IRQ SERIAL_PCI enabled
<6>ttyS00 at 0x03f8 (irq = 4) is a 16550A
<7>ttyS wait until sent...
<7>waiting ttyS...(0)
done waiting ttyS...(0)
In rs_wait_until_sent(6) check=1...jiff=1799...lsr = 96 (jiff=1799)...done
In rs_wait_until_sent(3) check=1...jiff=1799...lsr = 96 (jiff=1799)...done
<7>ttyS wait until sent...
<7>waiting ttyS...(0)
done waiting ttyS...(0)
In rs_wait_until_sent(6) check=1...jiff=1799...lsr = 96 (jiff=1799)...done
<7>ttyS wait until sent...
<7>waiting ttyS...(0)
done waiting ttyS...(0)
In rs_wait_until_sent(6) check=1...jiff=1799...lsr = 96 (jiff=1799)...done
In rs_wait_until_sent(3) check=1...jiff=1799...lsr = 96 (jiff=1799)...done
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
<7>ttyS wait until sent...
<7>waiting ttyS...(0)
done waiting ttyS...(0)
In rs_wait_until_sent(6) check=1...jiff=1802...lsr = 0 (jiff=1802)...lsr = 96 (jiff=1803)...done
In rs_wait_until_sent(3) check=1...jiff=1803...lsr = 96 (jiff=1803)...done
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
<7>ttyS wait until sent...
<7>waiting ttyS...(4)
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
<7>waiting ttyS...(0)
done waiting ttyS...(0)
In rs_wait_until_sent(6) check=1...jiff=1804...lsr = 0 (jiff=1804)...lsr = 0 (jiff=1805)...lsr = 96 (jiff=1806)...done
In rs_wait_until_sent(3) check=1...jiff=1806...lsr = 96 (jiff=1806)...done
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
<7>ttyS wait until sent...
<7>waiting ttyS...(0)
done waiting ttyS...(0)
In rs_wait_until_sent(6) check=1...jiff=1806...lsr = 0 (jiff=1806)...lsr = 96 (jiff=1807)...done
In rs_wait_until_sent(3) check=1...jiff=1807...lsr = 96 (jiff=1807)...done
<7>ttyS wait until sent...
<7>waiting ttyS...(0)
done waiting ttyS...(0)
In rs_wait_until_sent(6) check=1...jiff=1809...lsr = 96 (jiff=1809)...done
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
<7>ttyS wait until sent...
<7>waiting ttyS...(0)
done waiting ttyS...(0)
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
<7>ttyS wait until sent...
<7>waiting ttyS...(0)
done waiting ttyS...(0)
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
<7>ttyS wait until sent...
<7>waiting ttyS...(0)
done waiting ttyS...(0)
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 61...DR0d:61...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 61...DR72:61...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 61...DR6f:61...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 61...DR6f:61...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 61...DR74:61...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
rs_interrupt_single(4)...status = 60...IIR = c1...end.
rs_interrupt_single(4)...status = 61...DR0d:61...IIR = c1...end.
rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
<7>ttyS wait until sent...
<7>waiting ttyS...(1)
rs_interrupt_single(4)...status = 0...IIR = c1...end.
rs_interrupt_single(4)...status = 0...IIR = c1...end.
rs_interrupt_single(4)...status = 0...IIR = c1...end.
rs_interrupt_single(4)...status = 0...IIR = c1...end.
rs_interrupt_single(4)...status = 0...IIR = c1...end.
rs_interrupt_single(4)...status = 0...IIR = c1...end.
rs_interrupt_single(4)...status = 0...IIR = c1...end.
rs_interrupt_single(4)...status = 0...IIR = c1...end.
rs_interrupt_single(4)...status = 0...IIR = c1...end.
rs_interrupt_single(4)...status = 0...IIR = c1...end.
rs_interrupt_single(4)...status = 0...IIR = c1...end.
rs_interrupt_single(4)...status = 0...IIR = c1...end.
rs_interrupt_single(4)...status = 0...IIR = c1...end.
rs_interrupt_single(4)...status = 0...IIR = c1...end.
rs_interrupt_single(4)...status = 0...IIR = c1...end.
rs_interrupt_single(4)...status = 0...IIR = c1...end.
rs_interrupt_single(4)...status = 0...IIR = c1...end.
rs_interrupt_single(4)...status = 0...IIR = c1...end.
rs_interrupt_single(4)...status = 0...IIR = c1...end.
rs_interrupt_single(4)...status = 0...IIR = c1...end.
rs_interrupt_single(4)...status = 0...IIR = c1...end.
rs_interrupt_single(4)...status = 0...IIR = c1...end.
rs_interrupt_single(4)...status = 0...IIR = c1...end.
rs_interrupt_single(4)...status = 0...IIR = c1...end.
rs_interrupt_single(4)...status = 0...IIR = c1...end.
rs_interrupt_single(4)...status = 0...IIR = c1...end.
rs_interrupt_single(4)...status = 0...IIR = c1...end.
rs_interrupt_single(4)...status = 0...IIR = c1...end.
rs_interrupt_single(4)...status = 0...IIR = c1...end.
rs_interrupt_single(4)...status = 0...IIR = c1...end.
<7>waiting ttyS...(62)
<7>waiting on ttyS interrupted
[-- Attachment #3: linux.tty_debug.2.patch --]
[-- Type: text/plain, Size: 4411 bytes --]
diff -rup --exclude '*SCCS*' --exclude BitKeeper linux.orig/drivers/char/serial.c linux/drivers/char/serial.c
--- linux.orig/drivers/char/serial.c Wed Mar 9 17:47:18 2005
+++ linux/drivers/char/serial.c Thu Mar 17 12:04:54 2005
@@ -140,10 +140,10 @@ static char *serial_revdate = "2001-07-0
/* Set of debugging defines */
-#undef SERIAL_DEBUG_INTR
+#define SERIAL_DEBUG_INTR
#undef SERIAL_DEBUG_OPEN
#undef SERIAL_DEBUG_FLOW
-#undef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT
+#define SERIAL_DEBUG_RS_WAIT_UNTIL_SENT
#undef SERIAL_DEBUG_PCI
#undef SERIAL_DEBUG_AUTOCONF
@@ -265,6 +265,10 @@ static int serial_refcount;
static struct timer_list serial_timer;
+extern pid_t watched_pid;
+extern void dbg_addmsg(char *fmt, ...);
+#define printk(...) dbg_addmsg(__VA_ARGS__)
+
/* serial subtype definitions */
#ifndef SERIAL_TYPE_NORMAL
#define SERIAL_TYPE_NORMAL 1
@@ -927,7 +931,7 @@ static void rs_interrupt_single(int irq,
((iir & UART_IIR_ID) == UART_IIR_THRI))
transmit_chars(info, 0);
if (pass_counter++ > RS_ISR_PASS_LIMIT) {
-#if SERIAL_DEBUG_INTR
+#ifdef SERIAL_DEBUG_INTR
printk("rs_single loop break.\n");
#endif
break;
@@ -2942,12 +2946,12 @@ static void rs_wait_until_sent(struct tt
if (!timeout || timeout > 2*info->timeout)
timeout = 2*info->timeout;
#ifdef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT
- printk("In rs_wait_until_sent(%d) check=%lu...", timeout, char_time);
- printk("jiff=%lu...", jiffies);
+ if (tty->driver.type != TTY_DRIVER_TYPE_PTY) printk("In rs_wait_until_sent(%d) check=%lu...", timeout, char_time);
+ if (tty->driver.type != TTY_DRIVER_TYPE_PTY) printk("jiff=%lu...", jiffies);
#endif
while (!((lsr = serial_inp(info, UART_LSR)) & UART_LSR_TEMT)) {
#ifdef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT
- printk("lsr = %d (jiff=%lu)...", lsr, jiffies);
+ if (tty->driver.type != TTY_DRIVER_TYPE_PTY) printk("lsr = %d (jiff=%lu)...", lsr, jiffies);
#endif
set_current_state(TASK_INTERRUPTIBLE);
schedule_timeout(char_time);
@@ -2957,7 +2961,7 @@ static void rs_wait_until_sent(struct tt
break;
}
#ifdef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT
- printk("lsr = %d (jiff=%lu)...done\n", lsr, jiffies);
+ if (tty->driver.type != TTY_DRIVER_TYPE_PTY) printk("lsr = %d (jiff=%lu)...done\n", lsr, jiffies);
#endif
}
diff -rup --exclude '*SCCS*' --exclude BitKeeper linux.orig/drivers/char/tty_ioctl.c linux/drivers/char/tty_ioctl.c
--- linux.orig/drivers/char/tty_ioctl.c Wed Mar 9 17:47:18 2005
+++ linux/drivers/char/tty_ioctl.c Thu Mar 17 12:04:56 2005
@@ -25,7 +25,21 @@
#include <asm/uaccess.h>
#include <asm/system.h>
-#undef TTY_DEBUG_WAIT_UNTIL_SENT
+char dbg_msgbuf[1024*256] = { '\0' };
+char *dbg_msgcur = dbg_msgbuf;
+void dbg_addmsg(char *fmt, ...) {
+ va_list args;
+ va_start(args, fmt);
+ dbg_msgcur += vsprintf(dbg_msgcur, fmt, args);
+ va_end(args);
+ if (dbg_msgcur >= (dbg_msgbuf + sizeof(dbg_msgbuf))) {
+ panic("debug message buffer overflow");
+ }
+}
+
+
+#define TTY_DEBUG_WAIT_UNTIL_SENT
+#define printk(...) dbg_addmsg(__VA_ARGS__)
#undef DEBUG
@@ -43,7 +57,7 @@ void tty_wait_until_sent(struct tty_stru
#ifdef TTY_DEBUG_WAIT_UNTIL_SENT
char buf[64];
- printk(KERN_DEBUG "%s wait until sent...\n", tty_name(tty, buf));
+ if (tty->driver.type != TTY_DRIVER_TYPE_PTY) printk(KERN_DEBUG "%s wait until sent...\n", tty_name(tty, buf));
#endif
if (!tty->driver.chars_in_buffer)
return;
@@ -52,16 +66,21 @@ void tty_wait_until_sent(struct tty_stru
timeout = MAX_SCHEDULE_TIMEOUT;
do {
#ifdef TTY_DEBUG_WAIT_UNTIL_SENT
- printk(KERN_DEBUG "waiting %s...(%d)\n", tty_name(tty, buf),
+ if (tty->driver.type != TTY_DRIVER_TYPE_PTY) printk(KERN_DEBUG "waiting %s...(%d)\n", tty_name(tty, buf),
tty->driver.chars_in_buffer(tty));
#endif
set_current_state(TASK_INTERRUPTIBLE);
- if (signal_pending(current))
+ if (signal_pending(current)) {
+ if (tty->driver.type != TTY_DRIVER_TYPE_PTY) printk(KERN_DEBUG "waiting on %s interrupted\n", tty_name(tty, buf));
goto stop_waiting;
+ }
if (!tty->driver.chars_in_buffer(tty))
break;
timeout = schedule_timeout(timeout);
} while (timeout);
+#ifdef TTY_DEBUG_WAIT_UNTIL_SENT
+ if (tty->driver.type != TTY_DRIVER_TYPE_PTY) printk("done waiting %s...(%d)\n", tty_name(tty, buf), tty->driver.chars_in_buffer(tty));
+#endif
if (tty->driver.wait_until_sent)
tty->driver.wait_until_sent(tty, timeout);
stop_waiting:
next prev parent reply other threads:[~2005-03-17 18:07 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-03-10 15:41 Serial driver related problems on Linux Bob Bell
2005-03-15 2:11 ` Theodore Ts'o
2005-03-17 18:07 ` Bob Bell [this message]
2005-03-30 12:49 ` Bob Bell
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=20050317180703.GA30572@newbie.macroped.net \
--to=bbell@users.sourceforge.net \
--cc=linux-serial@vger.kernel.org \
--cc=tytso@mit.edu \
/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.