| From dc2a0e20fbc85a71c63aa4330b496fda33f6bf80 Mon Sep 17 00:00:00 2001 |
| From: Gustavo Padovan <gustavo.padovan@collabora.co.uk> |
| Date: Tue, 20 Nov 2012 23:25:54 -0200 |
| Subject: Bluetooth: Add missing lock nesting notation |
| |
| From: Gustavo Padovan <gustavo.padovan@collabora.co.uk> |
| |
| commit dc2a0e20fbc85a71c63aa4330b496fda33f6bf80 upstream. |
| |
| This patch fixes the following report, it happens when accepting rfcomm |
| connections: |
| |
| [ 228.165378] ============================================= |
| [ 228.165378] [ INFO: possible recursive locking detected ] |
| [ 228.165378] 3.7.0-rc1-00536-gc1d5dc4 #120 Tainted: G W |
| [ 228.165378] --------------------------------------------- |
| [ 228.165378] bluetoothd/1341 is trying to acquire lock: |
| [ 228.165378] (sk_lock-AF_BLUETOOTH-BTPROTO_RFCOMM){+.+...}, at: |
| [<ffffffffa0000aa0>] bt_accept_dequeue+0xa0/0x180 [bluetooth] |
| [ 228.165378] |
| [ 228.165378] but task is already holding lock: |
| [ 228.165378] (sk_lock-AF_BLUETOOTH-BTPROTO_RFCOMM){+.+...}, at: |
| [<ffffffffa0205118>] rfcomm_sock_accept+0x58/0x2d0 [rfcomm] |
| [ 228.165378] |
| [ 228.165378] other info that might help us debug this: |
| [ 228.165378] Possible unsafe locking scenario: |
| [ 228.165378] |
| [ 228.165378] CPU0 |
| [ 228.165378] ---- |
| [ 228.165378] lock(sk_lock-AF_BLUETOOTH-BTPROTO_RFCOMM); |
| [ 228.165378] lock(sk_lock-AF_BLUETOOTH-BTPROTO_RFCOMM); |
| [ 228.165378] |
| [ 228.165378] *** DEADLOCK *** |
| [ 228.165378] |
| [ 228.165378] May be due to missing lock nesting notation |
| |
| Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| net/bluetooth/rfcomm/sock.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/net/bluetooth/rfcomm/sock.c |
| +++ b/net/bluetooth/rfcomm/sock.c |
| @@ -467,7 +467,7 @@ static int rfcomm_sock_accept(struct soc |
| long timeo; |
| int err = 0; |
| |
| - lock_sock(sk); |
| + lock_sock_nested(sk, SINGLE_DEPTH_NESTING); |
| |
| if (sk->sk_type != SOCK_STREAM) { |
| err = -EINVAL; |
| @@ -504,7 +504,7 @@ static int rfcomm_sock_accept(struct soc |
| |
| release_sock(sk); |
| timeo = schedule_timeout(timeo); |
| - lock_sock(sk); |
| + lock_sock_nested(sk, SINGLE_DEPTH_NESTING); |
| } |
| __set_current_state(TASK_RUNNING); |
| remove_wait_queue(sk_sleep(sk), &wait); |