Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753275AbbHQCqs (ORCPT ); Sun, 16 Aug 2015 22:46:48 -0400 Received: from TYO202.gate.nec.co.jp ([210.143.35.52]:46933 "EHLO tyo202.gate.nec.co.jp" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752613AbbHQCqp convert rfc822-to-8bit (ORCPT ); Sun, 16 Aug 2015 22:46:45 -0400 From: Taichi Kageyama To: "gregkh@linuxfoundation.org" , "tglx@linutronix.de" , "peter@hurleysoftware.com" CC: Taichi Kageyama , "linux-serial@vger.kernel.org" , "linux-kernel@vger.kernel.org" , "jslaby@suse.cz" , "prarit@redhat.com" , Naoya Horiguchi , "jiang.liu@linux.intel.com" Subject: [PATCH v4] serial: 8250: Fix autoconfig_irq() to avoid race conditions Thread-Topic: [PATCH v4] serial: 8250: Fix autoconfig_irq() to avoid race conditions Thread-Index: AQHQ2JbHwXvM2nPwZUCke0E5Fd8WGg== Date: Mon, 17 Aug 2015 02:45:29 +0000 Message-ID: <1439779518-31560-1-git-send-email-t-kageyama@cp.jp.nec.com> Accept-Language: en-US, ja-JP Content-Language: ja-JP X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.34.108.75] Content-Type: text/plain; charset="iso-2022-jp" Content-Transfer-Encoding: 8BIT MIME-Version: 1.0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2866 Lines: 77 The following race conditions can happen when a serial port is used as console. Case1: CPU_B is used to detect an interrupt from a serial port, but it can have interrupts disabled during the waiting time. Case2: CPU_B clears UART_IER just after CPU_A sets UART_IER and then a serial port may not make an interrupt. Case3: CPU_A sets UART_IER just after CPU_B clears UART_IER. This is an unexpected behavior for serial8250_console_write(). CPU_A [autoconfig_irq] | CPU_B [serial8250_console_write] ----------------------------|--------------------------------------- | probe_irq_on() | spin_lock_irqsave(&port->lock,) serial_outp(,UART_IER,0x0f) | serial_out(,UART_IER,0) udelay(20); | uart_console_write() probe_irq_off() | | spin_unlock_irqrestore(&port->lock,) Case1 and 2 can make autoconfig_irq() failed. In these cases, the console doesn't work in interrupt mode and "input overrun" (which can make operation mistakes) can happen on some systems. Especially in the Case1, It is known that the problem happens with high rate every boot once it occurs because the boot sequence is always almost same. port mutex makes sure that the autoconfig operation is exclusive of any other concurrent HW access except by the console operation. console lock is required in autoconfig_irq(). Signed-off-by: Taichi Kageyama Cc: Naoya Horiguchi Reviewed-by: Peter Hurley --- Changes in v4: - Rebased on the top of tty-next - The file name was changed from 8250_core.c to 8250_port.c Changes in v3: - Removed RFC tag Changes in v2: - Updated commit log - Rebased on v4.2-rc4 drivers/tty/serial/8250/8250_port.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git tty-next.org/drivers/tty/serial/8250/8250_port.c tty-next.work/drivers/tty/serial/8250/8250_port.c index 54e6c8d..9300b59 100644 --- tty-next.org/drivers/tty/serial/8250/8250_port.c +++ tty-next.work/drivers/tty/serial/8250/8250_port.c @@ -1238,6 +1238,9 @@ static void autoconfig_irq(struct uart_8250_port *up) inb_p(ICP); } + if (uart_console(port)) + console_lock(); + /* forget possible initially masked and pending IRQ */ probe_irq_off(probe_irq_on()); save_mcr = serial_in(up, UART_MCR); @@ -1269,6 +1272,9 @@ static void autoconfig_irq(struct uart_8250_port *up) if (port->flags & UPF_FOURPORT) outb_p(save_ICP, ICP); + if (uart_console(port)) + console_unlock(); + port->irq = (irq > 0) ? irq : 0; } -- 2.4.6 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/