• Luiz Augusto von Dentz's avatar
    Bluetooth: ISO: Fix possible circular locking dependency · 506d9b40
    Luiz Augusto von Dentz authored
    This attempts to fix the following trace:
    
    iso-tester/52 is trying to acquire lock:
    ffff8880024e0070 (&hdev->lock){+.+.}-{3:3}, at:
    iso_sock_listen+0x29e/0x440
    
    but task is already holding lock:
    ffff888001978130 (sk_lock-AF_BLUETOOTH-BTPROTO_ISO){+.+.}-{0:0}, at:
    iso_sock_listen+0x8b/0x440
    
    which lock already depends on the new lock.
    
    the existing dependency chain (in reverse order) is:
    
    -> #2 (sk_lock-AF_BLUETOOTH-BTPROTO_ISO){+.+.}-{0:0}:
           lock_acquire+0x176/0x3d0
           lock_sock_nested+0x32/0x80
           iso_connect_cfm+0x1a3/0x630
           hci_cc_le_setup_iso_path+0x195/0x340
           hci_cmd_complete_evt+0x1ae/0x500
           hci_event_packet+0x38e/0x7c0
           hci_rx_work+0x34c/0x980
           process_one_work+0x5a5/0x9a0
           worker_thread+0x89/0x6f0
           kthread+0x14e/0x180
           ret_from_fork+0x22/0x30
    
    -> #1 (hci_cb_list_lock){+.+.}-{3:3}:
           lock_acquire+0x176/0x3d0
           __mutex_lock+0x13b/0xf50
           hci_le_remote_feat_complete_evt+0x17e/0x320
           hci_event_packet+0x38e/0x7c0
           hci_rx_work+0x34c/0x980
           process_one_work+0x5a5/0x9a0
           worker_thread+0x89/0x6f0
           kthread+0x14e/0x180
           ret_from_fork+0x22/0x30
    
    -> #0 (&hdev->lock){+.+.}-{3:3}:
           check_prev_add+0xfc/0x1190
           __lock_acquire+0x1e27/0x2750
           lock_acquire+0x176/0x3d0
           __mutex_lock+0x13b/0xf50
           iso_sock_listen+0x29e/0x440
           __sys_listen+0xe6/0x160
           __x64_sys_listen+0x25/0x30
           do_syscall_64+0x42/0x90
           entry_SYSCALL_64_after_hwframe+0x62/0xcc
    
    other info that might help us debug this:
    
    Chain exists of:
      &hdev->lock --> hci_cb_list_lock --> sk_lock-AF_BLUETOOTH-BTPROTO_ISO
    
     Possible unsafe locking scenario:
    
           CPU0                    CPU1
           ----                    ----
      lock(sk_lock-AF_BLUETOOTH-BTPROTO_ISO);
                                   lock(hci_cb_list_lock);
                                   lock(sk_lock-AF_BLUETOOTH-BTPROTO_ISO);
      lock(&hdev->lock);
    
     *** DEADLOCK ***
    
    1 lock held by iso-tester/52:
     #0: ffff888001978130 (sk_lock-AF_BLUETOOTH-BTPROTO_ISO){+.+.}-{0:0}, at:
     iso_sock_listen+0x8b/0x440
    
    Fixes: f764a6c2 ("Bluetooth: ISO: Add broadcast support")
    Signed-off-by: default avatarLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
    506d9b40
iso.c 36.7 KB