Skip to content
  • Lukas Wunner's avatar
    Bluetooth: hci_serdev: Init hci_uart proto_lock to avoid oops · 4a53c4e8
    Lukas Wunner authored
    commit d73e1728 upstream.
    
    John Stultz reports a boot time crash with the HiKey board (which uses
    hci_serdev) occurring in hci_uart_tx_wakeup().  That function is
    contained in hci_ldisc.c, but also called from the newer hci_serdev.c.
    It acquires the proto_lock in struct hci_uart and it turns out that we
    forgot to init the lock in the serdev code path, thus causing the crash.
    
    John bisected the crash to commit 67d2f878 ("Bluetooth: hci_ldisc:
    Allow sleeping while proto locks are held"), but the issue was present
    before and the commit merely exposed it.  (Perhaps by luck, the crash
    did not occur with rwlocks.)
    
    Init the proto_lock in the serdev code path to avoid the oops.
    
    Stack trace for posterity:
    
    Unable to handle kernel read from unreadable memory at 406f127000
    [000000406f127000] user address but active_mm is swapper
    Internal error: Oops: 96000005 [#1] PREEMPT SMP
    Hardware name: HiKey Development Board (DT)
    Call trace:
     hci_uart_tx_wakeup+0x38/0x148
     hci_uart_send_frame+0x28/0x38
     hci_send_frame+0x64/0xc0
     hci_cmd_work+0x98/0x110
     process_one_work+0x134/0x330
     worker_thread+0x130/0x468
     kthread+0xf8/0x128
     ret_from_fork+0x10/0x18
    
    Link: https://lkml.org/lkml/2017/11/15/908
    
    
    Reported-and-tested-by: default avatarJohn Stultz <john.stultz@linaro.org>
    Cc: Ronald Tschalär <ronald@innovation.ch>
    Cc: Rob Herring <rob.herring@linaro.org>
    Cc: Sumit Semwal <sumit.semwal@linaro.org>
    Signed-off-by: default avatarLukas Wunner <lukas@wunner.de>
    Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
    Signed-off-by: default avatarAmit Pundir <amit.pundir@linaro.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    4a53c4e8