Skip to content

Commit d22015a

Browse files
tavipJohan Hedberg
authored and
Johan Hedberg
committed
Bluetooth: silence lockdep warning
Since bluetooth uses multiple protocols types, to avoid lockdep warnings, we need to use different lockdep classes (one for each protocol type). This is already done in bt_sock_create but it misses a couple of cases when new connections are created. This patch corrects that to fix the following warning: <4>[ 1864.732366] ======================================================= <4>[ 1864.733030] [ INFO: possible circular locking dependency detected ] <4>[ 1864.733544] 3.0.16-mid3-00007-gc9a0f62 #3 <4>[ 1864.733883] ------------------------------------------------------- <4>[ 1864.734408] t.android.btclc/4204 is trying to acquire lock: <4>[ 1864.734869] (rfcomm_mutex){+.+.+.}, at: [<c14970ea>] rfcomm_dlc_close+0x15/0x30 <4>[ 1864.735541] <4>[ 1864.735549] but task is already holding lock: <4>[ 1864.736045] (sk_lock-AF_BLUETOOTH){+.+.+.}, at: [<c1498bf7>] lock_sock+0xa/0xc <4>[ 1864.736732] <4>[ 1864.736740] which lock already depends on the new lock. <4>[ 1864.736750] <4>[ 1864.737428] <4>[ 1864.737437] the existing dependency chain (in reverse order) is: <4>[ 1864.738016] <4>[ 1864.738023] -> #1 (sk_lock-AF_BLUETOOTH){+.+.+.}: <4>[ 1864.738549] [<c1062273>] lock_acquire+0x104/0x140 <4>[ 1864.738977] [<c13d35c1>] lock_sock_nested+0x58/0x68 <4>[ 1864.739411] [<c1493c33>] l2cap_sock_sendmsg+0x3e/0x76 <4>[ 1864.739858] [<c13d06c3>] __sock_sendmsg+0x50/0x59 <4>[ 1864.740279] [<c13d0ea2>] sock_sendmsg+0x94/0xa8 <4>[ 1864.740687] [<c13d0ede>] kernel_sendmsg+0x28/0x37 <4>[ 1864.741106] [<c14969ca>] rfcomm_send_frame+0x30/0x38 <4>[ 1864.741542] [<c1496a2a>] rfcomm_send_ua+0x58/0x5a <4>[ 1864.741959] [<c1498447>] rfcomm_run+0x441/0xb52 <4>[ 1864.742365] [<c104f095>] kthread+0x63/0x68 <4>[ 1864.742742] [<c14d5182>] kernel_thread_helper+0x6/0xd <4>[ 1864.743187] <4>[ 1864.743193] -> #0 (rfcomm_mutex){+.+.+.}: <4>[ 1864.743667] [<c1061ada>] __lock_acquire+0x988/0xc00 <4>[ 1864.744100] [<c1062273>] lock_acquire+0x104/0x140 <4>[ 1864.744519] [<c14d2c70>] __mutex_lock_common+0x3b/0x33f <4>[ 1864.744975] [<c14d303e>] mutex_lock_nested+0x2d/0x36 <4>[ 1864.745412] [<c14970ea>] rfcomm_dlc_close+0x15/0x30 <4>[ 1864.745842] [<c14990d9>] __rfcomm_sock_close+0x5f/0x6b <4>[ 1864.746288] [<c1499114>] rfcomm_sock_shutdown+0x2f/0x62 <4>[ 1864.746737] [<c13d275d>] sys_socketcall+0x1db/0x422 <4>[ 1864.747165] [<c14d42f0>] syscall_call+0x7/0xb Signed-off-by: Octavian Purdila <[email protected]> Acked-by: Marcel Holtmann <[email protected]> Signed-off-by: Johan Hedberg <[email protected]>
1 parent 61e1b4b commit d22015a

File tree

4 files changed

+11
-7
lines changed

4 files changed

+11
-7
lines changed

include/net/bluetooth/bluetooth.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,4 +256,6 @@ void l2cap_exit(void);
256256
int sco_init(void);
257257
void sco_exit(void);
258258

259+
void bt_sock_reclassify_lock(struct sock *sk, int proto);
260+
259261
#endif /* __BLUETOOTH_H */

net/bluetooth/af_bluetooth.c

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -71,19 +71,16 @@ static const char *const bt_slock_key_strings[BT_MAX_PROTO] = {
7171
"slock-AF_BLUETOOTH-BTPROTO_AVDTP",
7272
};
7373

74-
static inline void bt_sock_reclassify_lock(struct socket *sock, int proto)
74+
void bt_sock_reclassify_lock(struct sock *sk, int proto)
7575
{
76-
struct sock *sk = sock->sk;
77-
78-
if (!sk)
79-
return;
80-
76+
BUG_ON(!sk);
8177
BUG_ON(sock_owned_by_user(sk));
8278

8379
sock_lock_init_class_and_name(sk,
8480
bt_slock_key_strings[proto], &bt_slock_key[proto],
8581
bt_key_strings[proto], &bt_lock_key[proto]);
8682
}
83+
EXPORT_SYMBOL(bt_sock_reclassify_lock);
8784

8885
int bt_sock_register(int proto, const struct net_proto_family *ops)
8986
{
@@ -145,7 +142,8 @@ static int bt_sock_create(struct net *net, struct socket *sock, int proto,
145142

146143
if (bt_proto[proto] && try_module_get(bt_proto[proto]->owner)) {
147144
err = bt_proto[proto]->create(net, sock, proto, kern);
148-
bt_sock_reclassify_lock(sock, proto);
145+
if (!err)
146+
bt_sock_reclassify_lock(sock->sk, proto);
149147
module_put(bt_proto[proto]->owner);
150148
}
151149

net/bluetooth/l2cap_sock.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -849,6 +849,8 @@ static struct l2cap_chan *l2cap_sock_new_connection_cb(void *data)
849849
if (!sk)
850850
return NULL;
851851

852+
bt_sock_reclassify_lock(sk, BTPROTO_L2CAP);
853+
852854
l2cap_sock_init(sk, parent);
853855

854856
return l2cap_pi(sk)->chan;

net/bluetooth/rfcomm/sock.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -956,6 +956,8 @@ int rfcomm_connect_ind(struct rfcomm_session *s, u8 channel, struct rfcomm_dlc *
956956
if (!sk)
957957
goto done;
958958

959+
bt_sock_reclassify_lock(sk, BTPROTO_RFCOMM);
960+
959961
rfcomm_sock_init(sk, parent);
960962
bacpy(&bt_sk(sk)->src, &src);
961963
bacpy(&bt_sk(sk)->dst, &dst);

0 commit comments

Comments
 (0)