From dd49b5972e691ab15a15d518abc2196c0f8d8eb9 Mon Sep 17 00:00:00 2001 From: Rabin Vincent Date: Tue, 31 Jan 2012 14:36:37 +0530 Subject: tty: serial: amba-pl011: use pm_runtime_irq_safe() PL011 should use pm_runtime_irq_safe() since it calls the pm_runtime routines with interrupts disabled. Found via lockdep: ================================= [ INFO: inconsistent lock state ] 3.0.8+ #1187 --------------------------------- inconsistent {IN-HARDIRQ-W} -> {HARDIRQ-ON-W} usage. kworker/u:0/5 [HC0[0]:SC0[0]:HE1:SE1] takes: (&port_lock_key){?.....}, at: [] pl011_clock_on+0xc/0xc4 {IN-HARDIRQ-W} state was registered at: [] mark_irqflags+0x68/0x170 [] __lock_acquire+0x598/0x788 [] lock_acquire+0x10c/0x130 [] _raw_spin_lock_irqsave+0x5c/0x98 [] pl011_int+0x10/0x128 [] handle_irq_event_percpu+0x98/0x1f4 [] handle_irq_event+0x3c/0x5c [] handle_fasteoi_irq+0xc8/0x100 [] generic_handle_irq+0x28/0x30 [] asm_do_IRQ+0x78/0xb8 [] __irq_svc+0x50/0xf4 [] _raw_spin_unlock_irq+0x28/0x54 [] uart_carrier_raised+0x3c/0x44 [] tty_port_carrier_raised+0x1c/0x20 [] tty_port_block_til_ready+0x220/0x2cc [] tty_open+0x1f0/0x32c [] chrdev_open+0x20c/0x238 [] __dentry_open+0x220/0x338 [] nameidata_to_filp+0x50/0x5c [] do_last+0x43c/0x4c4 [] path_openat+0xb8/0x37c [] do_filp_open+0x30/0x7c [] do_sys_open+0xd8/0x170 [] ret_fast_syscall+0x0/0x3c irq event stamp: 60637 hardirqs last enabled at (60636): [] mutex_lock_nested+0x364/0x3c8 hardirqs last disabled at (60637): [] _raw_spin_lock_irqsave+0x1c/0x98 softirqs last enabled at (60509): [] irq_exit+0x5c/0xc0 softirqs last disabled at (60490): [] irq_exit+0x5c/0xc0 other info that might help us debug this: Possible unsafe locking scenario: CPU0 ---- lock(&port_lock_key); lock(&port_lock_key); *** DEADLOCK *** 7 locks held by kworker/u:0/5: #0: ((hdev->name)){.+.+.+}, at: [] process_one_work+0x1cc/0x4c8 #1: ((&hdev->power_on)){+.+.+.}, at: [] process_one_work+0x1cc/0x4c8 #2: (&hdev->req_lock){+.+.+.}, at: [] hci_dev_open+0x28/0x334 #3: (&main_info->man_mutex#2){+.+.+.}, at: [] cg2900_open+0xa8/0x49c #4: (&(uart_info->sleep_state_lock)){+.+.+.}, at: [] uart_set_chip_power+0x64/0x228 #5: (&tty->termios_mutex){+.+...}, at: [] cg2900_hci_uart_set_baudrate+0x34/0x8c #6: (&port_lock_key){?.....}, at: [] pl011_clock_on+0xc/0xc4 stack backtrace: [] (unwind_backtrace+0x0/0xec) from [] (print_usage_bug+0x184/0x1c4) [] (print_usage_bug+0x184/0x1c4) from [] (mark_lock_irq+0xbc/0x280) [] (mark_lock_irq+0xbc/0x280) from [] (mark_lock+0x2c8/0x3f8) [] (mark_lock+0x2c8/0x3f8) from [] (mark_held_locks+0x5c/0x80) [] (mark_held_locks+0x5c/0x80) from [] (trace_hardirqs_on_caller+0x138/0x18c) [] (trace_hardirqs_on_caller+0x138/0x18c) from [] (_raw_spin_unlock_irq+0x24/0x54) [] (_raw_spin_unlock_irq+0x24/0x54) from [] (rpm_callback+0x3c/0x5c) [] (rpm_callback+0x3c/0x5c) from [] (rpm_resume+0x2ec/0x3c0) [] (rpm_resume+0x2ec/0x3c0) from [] (__pm_runtime_resume+0x48/0x60) [] (__pm_runtime_resume+0x48/0x60) from [] (pl011_clock_on+0x34/0xc4) [] (pl011_clock_on+0x34/0xc4) from [] (pl011_set_termios+0x28/0x308) [] (pl011_set_termios+0x28/0x308) from [] (uart_change_speed+0x90/0x94) [] (uart_change_speed+0x90/0x94) from [] (uart_set_termios+0x68/0x1b4) [] (uart_set_termios+0x68/0x1b4) from [] (cg2900_hci_uart_set_baudrate+0x78/0x8c) [] (cg2900_hci_uart_set_baudrate+0x78/0x8c) from [] (uart_set_chip_power+0x100/0x228) [] (uart_set_chip_power+0x100/0x228) from [] (cg2900_open+0x228/0x49c) [] (cg2900_open+0x228/0x49c) from [] (btcg2900_open+0x84/0x188) [] (btcg2900_open+0x84/0x188) from [] (hci_dev_open+0x94/0x334) [] (hci_dev_open+0x94/0x334) from [] (hci_power_on+0x14/0x6c) [] (hci_power_on+0x14/0x6c) from [] (process_one_work+0x2ac/0x4c8) [] (process_one_work+0x2ac/0x4c8) from [] (worker_thread+0x144/0x234) [] (worker_thread+0x144/0x234) from [] (kthread+0x80/0x88) [] (kthread+0x80/0x88) from [] (kernel_thread_exit+0x0/0x8) Change-Id: I8b05184e348656a0d422b5b68267ee03246c6563 Signed-off-by: Rabin Vincent ST-Ericsson ID: 413918 ST-Ericsson Linux next: NA ST-Ericsson FOSS-OUT ID: Trivial Change-Id: Id5a17f56dfa1b1b8c469237be5b9c236ad212137 Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/47173 Reviewed-by: QABUILD Tested-by: Rabin VINCENT Reviewed-by: Jonas ABERG Reviewed-by: Rabin VINCENT --- drivers/tty/serial/amba-pl011.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/tty/serial/amba-pl011.c b/drivers/tty/serial/amba-pl011.c index 5bbd97e61ff..bed430df99e 100644 --- a/drivers/tty/serial/amba-pl011.c +++ b/drivers/tty/serial/amba-pl011.c @@ -2308,6 +2308,8 @@ static int pl011_probe(struct amba_device *dev, const struct amba_id *id) amba_set_drvdata(dev, uap); + pm_runtime_irq_safe(&dev->dev); + pl011_clock_control_init(uap); ret = uart_add_one_port(&amba_reg, &uap->port); -- cgit v1.2.3