From: Stas Sergeev <stsp@aknet.ru>
To: Linux kernel <linux-kernel@vger.kernel.org>
Subject: lockup when accessing serial port (and fix)
Date: Mon, 07 Feb 2005 23:30:37 +0300 [thread overview]
Message-ID: <4207CFED.8020509@aknet.ru> (raw)
[-- Attachment #1: Type: text/plain, Size: 1029 bytes --]
Hello.
When I am trying to use the serial
port, I am getting the machine lockup.
This started to happen sometime in a
2.6.9 era I think, and is not fixed
in the latest 2.6.11 pre's.
The bug looks trivial, unless I am
missing something. "port.lock" is
acquired in serial8250_interrupt()
and later in uart_start(), and that's
where the system is dead.
The calltrace is as follows:
serial8250_interrupt->!spin_lock(port.lock)!->serial8250_handle_port->
receive_chars->tty_flip_buffer_push->flush_to_ldisc->n_tty_receive_buf->
uart_flush_chars->uart_start->!spin_lock(port.lock)!->deadlock:(
Attached is a quick works-for-me fix
that just releases the lock at one
point. Can someone please have a look
into it and see if the other ser drivers
needs the same (or another) treatment?
Well, I can understand that the legacy
ser ports may not be too popular these
days, but then it is a local DoS, so it
may still be worth having a look.
I'll very much appreciate if the serial
port is to work again. I am still using
it, really! :)
[-- Attachment #2: ser_lock.diff --]
[-- Type: text/x-patch, Size: 841 bytes --]
--- linux-2.6.10/drivers/serial/au1x00_uart.c 2004-12-31 10:16:15.000000000 +0300
+++ linux-2.6.10/drivers/serial/au1x00_uart.c 2005-02-07 15:42:42.000000000 +0300
@@ -320,7 +320,9 @@
ignore_char:
*status = serial_inp(up, UART_LSR);
} while ((*status & UART_LSR_DR) && (max_count-- > 0));
+ spin_unlock(&up->port.lock);
tty_flip_buffer_push(tty);
+ spin_lock(&up->port.lock);
}
static _INLINE_ void transmit_chars(struct uart_8250_port *up)
--- linux-2.6.10/drivers/serial/8250.c 2005-02-07 13:47:57.000000000 +0300
+++ linux-2.6.10/drivers/serial/8250.c 2005-02-07 15:43:47.000000000 +0300
@@ -1059,7 +1059,9 @@
ignore_char:
lsr = serial_inp(up, UART_LSR);
} while ((lsr & UART_LSR_DR) && (max_count-- > 0));
+ spin_unlock(&up->port.lock);
tty_flip_buffer_push(tty);
+ spin_lock(&up->port.lock);
*status = lsr;
}
next reply other threads:[~2005-02-07 20:29 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-02-07 20:30 Stas Sergeev [this message]
2005-02-21 15:03 ` lockup when accessing serial port (and fix) Alan Cox
2005-02-21 17:12 ` Russell King
2005-02-21 17:41 ` Stas Sergeev
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=4207CFED.8020509@aknet.ru \
--to=stsp@aknet.ru \
--cc=linux-kernel@vger.kernel.org \
/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.