From mboxrd@z Thu Jan 1 00:00:00 1970 From: Taichi Kageyama Subject: [PATCH 1/2] serial: 8250: Fix autoconfig_irq() to avoid race conditions Date: Fri, 5 Jun 2015 09:57:40 +0000 Message-ID: <55717294.8020905@cp.jp.nec.com> References: <55717224.9060104@cp.jp.nec.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <55717224.9060104@cp.jp.nec.com> Content-Language: ja-JP Content-ID: Sender: linux-kernel-owner@vger.kernel.org To: "gregkh@linuxfoundation.org" Cc: "linux-serial@vger.kernel.org" , "jslaby@suse.cz" , "linux-kernel@vger.kernel.org" , "prarit@redhat.com" , Naoya Horiguchi List-Id: linux-serial@vger.kernel.org VGhlIGZvbGxvd2luZyByYWNlIGNvbmRpdGlvbnMgY2FuIGhhcHBlbiBpZiBhIHNlcmlhbCBpcyB1 c2VkIGFzIGNvbnNvbGUuDQogIENhc2UxLiBDUFVfQiBoYW5kbGVzIGFuIGludGVycnVwdCBmcm9t IGEgc2VyaWFsDQogICAgYXV0b2NvbmZpZ19pcnEoKSBmYWlscyB3aGV0aGVyIHRoZSBpbnRlcnJ1 cHQgaXMgcmFpc2VkIG9yIG5vdA0KICAgIGlmIENQVV9CIGlzIGRpc2FibGVkIHRvIGhhbmRsZSBp bnRlcnJ1cHRzIGZvciBsb25nZXIgdGhhbiBpdCBleHBlY3RzLg0KICBDYXNlMi4gQ1BVX0IgY2xl YXJzIFVBUlRfSUVSIGp1c3QgYWZ0ZXIgQ1BVX0Egc2V0cyBVQVJUX0lFUg0KICAgIEEgc2VyaWFs IG1heSBub3QgbWFrZSBhbiBpbnRlcnJ1cHQuDQogICAgYXV0b2NvbmZpZ19pcnEoKSBjYW4gZmFp bCBpZiB0aGUgaW50ZXJydXB0IGlzIG5vdCByYWlzZWQuDQogIENhc2UzLiBDUFVfQSBzZXRzIFVB UlRfSUVSIGp1c3QgYWZ0ZXIgQ1BVX0IgY2xlYXJzIFVBUlRfSUVSDQogICAgVGhpcyBpcyBhbiB1 bmV4cGVjdGVkIGJlaGF2aW9yIGZvciB1YXJ0X2NvbnNvbGVfd3JpdGUoKS4NCg0KICBDUFVfQSBb YXV0b2NvbmZpZ19pcnFdICAgICAgQ1BVX0IgW3NlcmlhbDgyNTBfY29uc29sZV93cml0ZV0NCiAg LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0NCiAgcHJvYmVfaXJxX29uKCkgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZl KCZwb3J0LT5sb2NrLCkNCiAgc2VyaWFsX291dHAoLFVBUlRfSUVSLDB4MGYpIHNlcmlhbF9vdXQo LFVBUlRfSUVSLDApDQogIHVkZWxheSgyMCk7ICAgICAgICAgICAgICAgICB1YXJ0X2NvbnNvbGVf d3JpdGUoKQ0KICBwcm9iZV9pcnFfb2ZmKCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssKQ0KICAtLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpJZiBh dXRvY29uZmlnX2lycSgpIGZhaWxzLCB0aGUgY29uc29sZSBkb2Vzbid0IHdvcmsgaW4gaW50ZXJy dXB0IG1vZGUsDQp0aGUgbW9kZSBjYW5ub3QgYmUgY2hhbmdlZCBhbnltb3JlLCBhbmQgImlucHV0 IG92ZXJydW4iDQood2hpY2ggY2FuIG1ha2Ugb3BlcmF0aW9uIG1pc3Rha2VzKSBoYXBwZW5zIGVh c2lseS4NClRoaXMgcHJvYmxlbSBoYXBwZW5zIHdpdGggaGlnaCByYXRlIGV2ZXJ5IGJvb3Qgb25j ZSBpdCBvY2N1cnMNCmJlY2F1c2UgdGhlIGJvb3Qgc2VxdWVuY2UgaXMgYWx3YXlzIGFsbW9zdCBz YW1lLg0KDQpTaWduZWQtb2ZmLWJ5OiBUYWljaGkgS2FnZXlhbWEgPHQta2FnZXlhbWFAY3AuanAu bmVjLmNvbT4NCkNjOiBOYW95YSBIb3JpZ3VjaGkgPG4taG9yaWd1Y2hpQGFoLmpwLm5lYy5jb20+ DQotLS0NCiAgZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9jb3JlLmMgfCAgICA2ICsrKysr Kw0KICAxIGZpbGVzIGNoYW5nZWQsIDYgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkNCg0K ZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfY29yZS5jIGIvZHJpdmVy cy90dHkvc2VyaWFsLzgyNTAvODI1MF9jb3JlLmMNCmluZGV4IDQ1MDZlNDAuLjZiZjMxZjIgMTAw NjQ0DQotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX2NvcmUuYw0KKysrIGIvZHJp dmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9jb3JlLmMNCkBAIC0xMzA5LDYgKzEzMDksOSBAQCBz dGF0aWMgdm9pZCBhdXRvY29uZmlnX2lycShzdHJ1Y3QgdWFydF84MjUwX3BvcnQgKnVwKQ0KICAJ dW5zaWduZWQgbG9uZyBpcnFzOw0KICAJaW50IGlycTsNCg0KKwlpZiAodWFydF9jb25zb2xlKHBv cnQpKQ0KKwkJY29uc29sZV9sb2NrKCk7DQorDQogIAlpZiAocG9ydC0+ZmxhZ3MgJiBVUEZfRk9V UlBPUlQpIHsNCiAgCQlJQ1AgPSAocG9ydC0+aW9iYXNlICYgMHhmZTApIHwgMHgxZjsNCiAgCQlz YXZlX0lDUCA9IGluYl9wKElDUCk7DQpAQCAtMTM0Nyw2ICsxMzUwLDkgQEAgc3RhdGljIHZvaWQg YXV0b2NvbmZpZ19pcnEoc3RydWN0IHVhcnRfODI1MF9wb3J0ICp1cCkNCiAgCWlmIChwb3J0LT5m bGFncyAmIFVQRl9GT1VSUE9SVCkNCiAgCQlvdXRiX3Aoc2F2ZV9JQ1AsIElDUCk7DQoNCisJaWYg KHVhcnRfY29uc29sZShwb3J0KSkNCisJCWNvbnNvbGVfdW5sb2NrKCk7DQorDQogIAlwb3J0LT5p cnEgPSAoaXJxID4gMCkgPyBpcnEgOiAwOw0KICB9DQoNCi0tIA0KMS43LjENCg0K From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932627AbbFEKLd (ORCPT ); Fri, 5 Jun 2015 06:11:33 -0400 Received: from TYO200.gate.nec.co.jp ([210.143.35.50]:60622 "EHLO tyo200.gate.nec.co.jp" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754211AbbFEKK1 (ORCPT ); Fri, 5 Jun 2015 06:10:27 -0400 From: Taichi Kageyama To: "gregkh@linuxfoundation.org" CC: "linux-serial@vger.kernel.org" , "jslaby@suse.cz" , "linux-kernel@vger.kernel.org" , "prarit@redhat.com" , Naoya Horiguchi Subject: [PATCH 1/2] serial: 8250: Fix autoconfig_irq() to avoid race conditions Thread-Topic: [PATCH 1/2] serial: 8250: Fix autoconfig_irq() to avoid race conditions Thread-Index: AQHQn3YPfR1JLIP5kUuZc3LH0ejwmg== Date: Fri, 5 Jun 2015 09:57:40 +0000 Message-ID: <55717294.8020905@cp.jp.nec.com> References: <55717224.9060104@cp.jp.nec.com> In-Reply-To: <55717224.9060104@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.73] Content-Type: text/plain; charset="utf-8" Content-ID: MIME-Version: 1.0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from base64 to 8bit by nfs id t55ABcvJ010007 The following race conditions can happen if a serial is used as console. Case1. CPU_B handles an interrupt from a serial autoconfig_irq() fails whether the interrupt is raised or not if CPU_B is disabled to handle interrupts for longer than it expects. Case2. CPU_B clears UART_IER just after CPU_A sets UART_IER A serial may not make an interrupt. autoconfig_irq() can fail if the interrupt is not raised. Case3. CPU_A sets UART_IER just after CPU_B clears UART_IER This is an unexpected behavior for uart_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,) ----------------------------------------------------------------- If autoconfig_irq() fails, the console doesn't work in interrupt mode, the mode cannot be changed anymore, and "input overrun" (which can make operation mistakes) happens easily. This problem happens with high rate every boot once it occurs because the boot sequence is always almost same. Signed-off-by: Taichi Kageyama Cc: Naoya Horiguchi --- drivers/tty/serial/8250/8250_core.c | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) diff --git a/drivers/tty/serial/8250/8250_core.c b/drivers/tty/serial/8250/8250_core.c index 4506e40..6bf31f2 100644 --- a/drivers/tty/serial/8250/8250_core.c +++ b/drivers/tty/serial/8250/8250_core.c @@ -1309,6 +1309,9 @@ static void autoconfig_irq(struct uart_8250_port *up) unsigned long irqs; int irq; + if (uart_console(port)) + console_lock(); + if (port->flags & UPF_FOURPORT) { ICP = (port->iobase & 0xfe0) | 0x1f; save_ICP = inb_p(ICP); @@ -1347,6 +1350,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; } -- 1.7.1 {.n++%ݶw{.n+{G{ayʇڙ,jfhz_(階ݢj"mG?&~iOzv^m ?I