Skip to content

Commit

Permalink
Bluetooth: Don't use spin_lock socket lock anymore
Browse files Browse the repository at this point in the history
We now run everything in process context, so the mutex lock is the best
option. But in some places we still need the bh_lock_sock()

Acked-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi>
  • Loading branch information
Gustavo F. Padovan committed Dec 18, 2011
1 parent 721c418 commit aa2ac88
Showing 1 changed file with 20 additions and 46 deletions.
66 changes: 20 additions & 46 deletions net/bluetooth/l2cap_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ static struct l2cap_chan *l2cap_get_chan_by_scid(struct l2cap_conn *conn, u16 ci
read_lock(&conn->chan_lock);
c = __l2cap_get_chan_by_scid(conn, cid);
if (c)
bh_lock_sock(c->sk);
lock_sock(c->sk);
read_unlock(&conn->chan_lock);
return c;
}
Expand All @@ -141,7 +141,7 @@ static inline struct l2cap_chan *l2cap_get_chan_by_ident(struct l2cap_conn *conn
read_lock(&conn->chan_lock);
c = __l2cap_get_chan_by_ident(conn, ident);
if (c)
bh_lock_sock(c->sk);
lock_sock(c->sk);
read_unlock(&conn->chan_lock);
return c;
}
Expand Down Expand Up @@ -889,7 +889,7 @@ static void l2cap_le_conn_ready(struct l2cap_conn *conn)

parent = pchan->sk;

bh_lock_sock(parent);
lock_sock(parent);

/* Check for backlog size */
if (sk_acceptq_is_full(parent)) {
Expand Down Expand Up @@ -922,7 +922,7 @@ static void l2cap_le_conn_ready(struct l2cap_conn *conn)
write_unlock_bh(&conn->chan_lock);

clean:
bh_unlock_sock(parent);
release_sock(parent);
}

static void l2cap_chan_ready(struct sock *sk)
Expand Down Expand Up @@ -1024,9 +1024,9 @@ static void l2cap_conn_del(struct hci_conn *hcon, int err)
/* Kill channels */
list_for_each_entry_safe(chan, l, &conn->chan_l, list) {
sk = chan->sk;
bh_lock_sock(sk);
lock_sock(sk);
l2cap_chan_del(chan, err);
bh_unlock_sock(sk);
release_sock(sk);
chan->ops->close(chan->data);
}

Expand Down Expand Up @@ -2568,7 +2568,7 @@ static inline int l2cap_connect_req(struct l2cap_conn *conn, struct l2cap_cmd_hd

parent = pchan->sk;

bh_lock_sock(parent);
lock_sock(parent);

/* Check if the ACL is secure enough (if not SDP) */
if (psm != cpu_to_le16(0x0001) &&
Expand Down Expand Up @@ -2645,7 +2645,7 @@ static inline int l2cap_connect_req(struct l2cap_conn *conn, struct l2cap_cmd_hd
write_unlock_bh(&conn->chan_lock);

response:
bh_unlock_sock(parent);
release_sock(parent);

sendresp:
rsp.scid = cpu_to_le16(scid);
Expand Down Expand Up @@ -2727,19 +2727,11 @@ static inline int l2cap_connect_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hd
break;

default:
/* don't delete l2cap channel if sk is owned by user */
if (sock_owned_by_user(sk)) {
l2cap_state_change(chan, BT_DISCONN);
__clear_chan_timer(chan);
__set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
break;
}

l2cap_chan_del(chan, ECONNREFUSED);
break;
}

bh_unlock_sock(sk);
release_sock(sk);
return 0;
}

Expand Down Expand Up @@ -2861,7 +2853,7 @@ static inline int l2cap_config_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr
}

unlock:
bh_unlock_sock(sk);
release_sock(sk);
return 0;
}

Expand Down Expand Up @@ -2968,7 +2960,7 @@ static inline int l2cap_config_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr
}

done:
bh_unlock_sock(sk);
release_sock(sk);
return 0;
}

Expand Down Expand Up @@ -2997,17 +2989,8 @@ static inline int l2cap_disconnect_req(struct l2cap_conn *conn, struct l2cap_cmd

sk->sk_shutdown = SHUTDOWN_MASK;

/* don't delete l2cap channel if sk is owned by user */
if (sock_owned_by_user(sk)) {
l2cap_state_change(chan, BT_DISCONN);
__clear_chan_timer(chan);
__set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
bh_unlock_sock(sk);
return 0;
}

l2cap_chan_del(chan, ECONNRESET);
bh_unlock_sock(sk);
release_sock(sk);

chan->ops->close(chan->data);
return 0;
Expand All @@ -3031,17 +3014,8 @@ static inline int l2cap_disconnect_rsp(struct l2cap_conn *conn, struct l2cap_cmd

sk = chan->sk;

/* don't delete l2cap channel if sk is owned by user */
if (sock_owned_by_user(sk)) {
l2cap_state_change(chan, BT_DISCONN);
__clear_chan_timer(chan);
__set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
bh_unlock_sock(sk);
return 0;
}

l2cap_chan_del(chan, 0);
bh_unlock_sock(sk);
release_sock(sk);

chan->ops->close(chan->data);
return 0;
Expand Down Expand Up @@ -4284,7 +4258,7 @@ static inline int l2cap_data_channel(struct l2cap_conn *conn, u16 cid, struct sk

done:
if (sk)
bh_unlock_sock(sk);
release_sock(sk);

return 0;
}
Expand All @@ -4300,7 +4274,7 @@ static inline int l2cap_conless_channel(struct l2cap_conn *conn, __le16 psm, str

sk = chan->sk;

bh_lock_sock(sk);
lock_sock(sk);

BT_DBG("sk %p, len %d", sk, skb->len);

Expand All @@ -4318,7 +4292,7 @@ static inline int l2cap_conless_channel(struct l2cap_conn *conn, __le16 psm, str

done:
if (sk)
bh_unlock_sock(sk);
release_sock(sk);
return 0;
}

Expand All @@ -4333,7 +4307,7 @@ static inline int l2cap_att_channel(struct l2cap_conn *conn, __le16 cid, struct

sk = chan->sk;

bh_lock_sock(sk);
lock_sock(sk);

BT_DBG("sk %p, len %d", sk, skb->len);

Expand All @@ -4351,7 +4325,7 @@ static inline int l2cap_att_channel(struct l2cap_conn *conn, __le16 cid, struct

done:
if (sk)
bh_unlock_sock(sk);
release_sock(sk);
return 0;
}

Expand Down Expand Up @@ -4656,11 +4630,11 @@ static int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 fl
BT_ERR("Frame exceeding recv MTU (len %d, "
"MTU %d)", len,
chan->imtu);
bh_unlock_sock(sk);
release_sock(sk);
l2cap_conn_unreliable(conn, ECOMM);
goto drop;
}
bh_unlock_sock(sk);
release_sock(sk);
}

/* Allocate skb for the complete frame (with header) */
Expand Down

0 comments on commit aa2ac88

Please sign in to comment.