Bug in termios

jennifer at oarcorp.com jennifer at oarcorp.com
Thu Oct 19 14:55:06 UTC 2006

I'm rebuilding the system with this changed to a simple binary semaphore in
order to see exactly what breaks.


> On Oct 19, 2006, at 9:28 AM, Joel Sherrill wrote:
>> jennifer at oarcorp.com wrote:
>>> I have a system with 12 serial port.  The driver is configured to be
>>> interrupt driven with one character arrival per interrupt.
>>> Furthermore,
>>> I am using 1 task which is set up to poll the serial ports in raw
>>> mode at
>>> a 10 ms rate and distribute any data that has arrived.  To do this
>>> I have
>>> set VMIN and VTIME to 0.  The problem occurs on high bandwidth
>>> devices
>>> (after they have ran a while), when the device is turned off.
>>> Turning off
>>> the device results in the system locking up for several seconds then
>>> recovering.  Analysis has shown that the read command is locking the
>>> system during this time.  It appears to me that the problem is
>>> happening
>>> is that inside of termios.c in the fillBufferQueue routine.  While
>>> the
>>> device is running there are always characters available so
>>> rawInBuff.Head
>>> and rawInBuffTail are never equal.   Then ccount is always >=  c_cc
>>> [VMIN]
>>> which results in wait being set to 0 and the semaphore never being
>>> decremented even thought it being incremented approximately 20 times
>>> during the 10 ms application task poll rate.  When the serial
>>> device is
>>> turned off and the characters are emptied out of the termios
>>> buffer, this
>>> results in a spinlock of obtaining the rawInBufSemaphore several
>>> hundred
>>> thousand times.
>> I looked at the code and believe this semaphore was intended to be
>> used
>> as a counting
>> semaphore. I think each increment is for an interrupt occurrence --
>> not
>> for a single
>> character. It is simply not decremented via obtain unless a task is
>> willing to block.
>> In Jennifer's case, this is very rare so the count is VERY high
>> when she
>> finally
>> doesn't have any data and has to way.
>> I suggested that this probably needs to be a simple binary
>> semaphore but
>> she had
>> already tried that and it broke something else. She is now trying
>> to do
>> a flush on
>> this semaphore just before checking the buffer counts.
>> Technically, this
>> is a
>> condition mutex and we should be able to get away with that. You don't
>> care about
>> it until there is no data and then you want to block on it until just
>> the next interrupt.
> Right -- which is why I would have thought that a binary semaphore
> would work.    Can you describe what breaks when a binary semaphore
> is used?
> Flushing the semaphore count doesn't sound like a good fix to me.  I
> worry a lot about race conditions with that sort of approach.
>> Eric.. do you see what is going on? I know it has been years but you
>> originally
>> wrote this code.
> Well, I wrote some of it.  All the flow-control stuff is new.
> --
> Eric Norum <norume at aps.anl.gov>
> Advanced Photon Source
> Argonne National Laboratory
> (630) 252-4793

More information about the users mailing list