• Mika Westerberg's avatar
    serial: mrst_max3110: initialize waitqueue earlier · 9c00c6e7
    Mika Westerberg authored
    The driver went to initialize its waitqueue at the start of the main processing
    thread. However, it is possible that this thread is not scheduled on a CPU
    before the write function is called which leads to a following error:
    
     BUG: spinlock bad magic on CPU#1, swapper/1
      lock: f5f3ebdc, .magic: 00000000, .owner: <none>/-1, .owner_cpu: 0
     Pid: 1, comm: swapper Not tainted 3.0.0-rc2+ #67
     Call Trace:
      [<c1289663>] spin_bug+0xa3/0xf0
      [<c12897ad>] do_raw_spin_lock+0x7d/0x150
      [<c1490006>] ? init_idle+0x8d/0x20c
      [<c14963de>] _raw_spin_lock_irqsave+0x4e/0x60
      [<c102f2bb>] ? __wake_up+0x1b/0x50
      [<c102f2bb>] __wake_up+0x1b/0x50
      [<c12d03bc>] ? uart_console_write+0x4c/0x60
      [<c12d36c0>] ? serial_m3110_enable_ms+0x10/0x10
      [<c12d3715>] serial_m3110_con_write+0x55/0x60
      [<c1041575>] __call_console_drivers+0x75/0x90
      [<c10415d9>] _call_console_drivers+0x49/0x80
      [<c1041baa>] console_unlock+0xca/0x1f0
      [<c10420ef>] vprintk+0x18f/0x4f0
      [<c10787cb>] ? trace_hardirqs_on+0xb/0x10
      [<c14928a3>] printk+0x18/0x1a
      [<c1042730>] register_console+0x2e0/0x350
      [<c12d098e>] uart_add_one_port+0x33e/0x3d0
      [<c10787cb>] ? trace_hardirqs_on+0xb/0x10
      [<c103e10b>] ? try_to_wake_up+0x18b/0x250
      [<c1485ba6>] serial_m3110_probe+0x1c2/0x1df
      [<c12d3d20>] ? serial_m3110_suspend+0x40/0x40
      [<c1303db7>] spi_drv_probe+0x17/0x20
      ...
    
    We fix this by initializing the waitqueue before the main thread is created.
    Signed-off-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
    Signed-off-by: default avatarAlan Cox <alan@linux.intel.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
    9c00c6e7
mrst_max3110.c 20.2 KB