Bluetooth: switch to lock_sock in RFCOMM
Other than rfcomm_sk_state_change and rfcomm_connect_ind, functions in RFCOMM use lock_sock to lock the socket. Since bh_lock_sock and spin_lock_bh do not provide synchronization with lock_sock, these calls should be changed to lock_sock. This is now safe to do because packet processing is now done in a workqueue instead of a tasklet, so bh_lock_sock/spin_lock_bh are no longer necessary to synchronise between user contexts and SOFTIRQ processing. Signed-off-by: Desmond Cheong Zhi Xi <desmondcheongzx@gmail.com> Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This commit is contained in:
parent
3f2c89fb46
commit
b7ce436a5d
1 changed files with 4 additions and 4 deletions
|
@ -70,7 +70,7 @@ static void rfcomm_sk_state_change(struct rfcomm_dlc *d, int err)
|
||||||
|
|
||||||
BT_DBG("dlc %p state %ld err %d", d, d->state, err);
|
BT_DBG("dlc %p state %ld err %d", d, d->state, err);
|
||||||
|
|
||||||
spin_lock_bh(&sk->sk_lock.slock);
|
lock_sock(sk);
|
||||||
|
|
||||||
if (err)
|
if (err)
|
||||||
sk->sk_err = err;
|
sk->sk_err = err;
|
||||||
|
@ -91,7 +91,7 @@ static void rfcomm_sk_state_change(struct rfcomm_dlc *d, int err)
|
||||||
sk->sk_state_change(sk);
|
sk->sk_state_change(sk);
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_unlock_bh(&sk->sk_lock.slock);
|
release_sock(sk);
|
||||||
|
|
||||||
if (parent && sock_flag(sk, SOCK_ZAPPED)) {
|
if (parent && sock_flag(sk, SOCK_ZAPPED)) {
|
||||||
/* We have to drop DLC lock here, otherwise
|
/* We have to drop DLC lock here, otherwise
|
||||||
|
@ -974,7 +974,7 @@ int rfcomm_connect_ind(struct rfcomm_session *s, u8 channel, struct rfcomm_dlc *
|
||||||
if (!parent)
|
if (!parent)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
bh_lock_sock(parent);
|
lock_sock(parent);
|
||||||
|
|
||||||
/* Check for backlog size */
|
/* Check for backlog size */
|
||||||
if (sk_acceptq_is_full(parent)) {
|
if (sk_acceptq_is_full(parent)) {
|
||||||
|
@ -1001,7 +1001,7 @@ int rfcomm_connect_ind(struct rfcomm_session *s, u8 channel, struct rfcomm_dlc *
|
||||||
result = 1;
|
result = 1;
|
||||||
|
|
||||||
done:
|
done:
|
||||||
bh_unlock_sock(parent);
|
release_sock(parent);
|
||||||
|
|
||||||
if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(parent)->flags))
|
if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(parent)->flags))
|
||||||
parent->sk_state_change(parent);
|
parent->sk_state_change(parent);
|
||||||
|
|
Loading…
Add table
Reference in a new issue