Bluetooth: Remove _bh locking for AMP Manager
Since all AMP Manager processing is done on work queues no
bottom-half locking is required.
CRs-fixed: 318632
Change-Id: I3a07c412ccf30d62d68cc80124fad5700bcc0917
Signed-off-by: Peter Krystad <pkrystad@codeaurora.org>
diff --git a/net/bluetooth/amp.c b/net/bluetooth/amp.c
index cb43a9c..af8ee26 100644
--- a/net/bluetooth/amp.c
+++ b/net/bluetooth/amp.c
@@ -51,20 +51,20 @@
{
BT_DBG("mgr %p", mgr);
- write_lock_bh(&_mgr_list_lock);
+ write_lock(&_mgr_list_lock);
list_del(&mgr->list);
- write_unlock_bh(&_mgr_list_lock);
+ write_unlock(&_mgr_list_lock);
- read_lock_bh(&mgr->ctx_list_lock);
+ read_lock(&mgr->ctx_list_lock);
while (!list_empty(&mgr->ctx_list)) {
struct amp_ctx *ctx;
ctx = list_first_entry(&mgr->ctx_list, struct amp_ctx, list);
- read_unlock_bh(&mgr->ctx_list_lock);
+ read_unlock(&mgr->ctx_list_lock);
BT_DBG("kill ctx %p", ctx);
kill_ctx(ctx);
- read_lock_bh(&mgr->ctx_list_lock);
+ read_lock(&mgr->ctx_list_lock);
}
- read_unlock_bh(&mgr->ctx_list_lock);
+ read_unlock(&mgr->ctx_list_lock);
kfree(mgr->ctrls);
@@ -76,14 +76,14 @@
struct amp_mgr *mgr;
struct amp_mgr *found = NULL;
- read_lock_bh(&_mgr_list_lock);
+ read_lock(&_mgr_list_lock);
list_for_each_entry(mgr, &_mgr_list, list) {
if ((mgr->a2mp_sock) && (mgr->a2mp_sock->sk == sk)) {
found = mgr;
break;
}
}
- read_unlock_bh(&_mgr_list_lock);
+ read_unlock(&_mgr_list_lock);
return found;
}
@@ -92,17 +92,19 @@
{
struct amp_mgr *mgr;
- write_lock_bh(&_mgr_list_lock);
+ write_lock(&_mgr_list_lock);
list_for_each_entry(mgr, &_mgr_list, list) {
if (mgr->l2cap_conn == conn) {
BT_DBG("conn %p found %p", conn, mgr);
+ write_unlock(&_mgr_list_lock);
goto gc_finished;
}
}
+ write_unlock(&_mgr_list_lock);
mgr = kzalloc(sizeof(*mgr), GFP_ATOMIC);
if (!mgr)
- goto gc_finished;
+ return NULL;
mgr->l2cap_conn = conn;
mgr->next_ident = 1;
@@ -113,12 +115,13 @@
mgr->a2mp_sock = open_fixed_channel(conn->src, conn->dst);
if (!mgr->a2mp_sock) {
kfree(mgr);
- goto gc_finished;
+ return NULL;
}
+ write_lock(&_mgr_list_lock);
list_add(&(mgr->list), &_mgr_list);
+ write_unlock(&_mgr_list_lock);
gc_finished:
- write_unlock_bh(&_mgr_list_lock);
return mgr;
}
@@ -169,9 +172,9 @@
static inline void start_ctx(struct amp_mgr *mgr, struct amp_ctx *ctx)
{
BT_DBG("ctx %p", ctx);
- write_lock_bh(&mgr->ctx_list_lock);
+ write_lock(&mgr->ctx_list_lock);
list_add(&ctx->list, &mgr->ctx_list);
- write_unlock_bh(&mgr->ctx_list_lock);
+ write_unlock(&mgr->ctx_list_lock);
ctx->mgr = mgr;
execute_ctx(ctx, AMP_INIT, 0);
}
@@ -182,9 +185,9 @@
BT_DBG("ctx %p deferred %p", ctx, ctx->deferred);
del_timer(&ctx->timer);
- write_lock_bh(&mgr->ctx_list_lock);
+ write_lock(&mgr->ctx_list_lock);
list_del(&ctx->list);
- write_unlock_bh(&mgr->ctx_list_lock);
+ write_unlock(&mgr->ctx_list_lock);
if (ctx->deferred)
execute_ctx(ctx->deferred, AMP_INIT, 0);
kfree(ctx);
@@ -195,14 +198,14 @@
struct amp_ctx *fnd = NULL;
struct amp_ctx *ctx;
- read_lock_bh(&mgr->ctx_list_lock);
+ read_lock(&mgr->ctx_list_lock);
list_for_each_entry(ctx, &mgr->ctx_list, list) {
if (ctx->type == type) {
fnd = ctx;
break;
}
}
- read_unlock_bh(&mgr->ctx_list_lock);
+ read_unlock(&mgr->ctx_list_lock);
return fnd;
}
@@ -212,14 +215,14 @@
struct amp_ctx *fnd = NULL;
struct amp_ctx *ctx;
- read_lock_bh(&mgr->ctx_list_lock);
+ read_lock(&mgr->ctx_list_lock);
list_for_each_entry(ctx, &mgr->ctx_list, list) {
if ((ctx->type == type) && (ctx != cur)) {
fnd = ctx;
break;
}
}
- read_unlock_bh(&mgr->ctx_list_lock);
+ read_unlock(&mgr->ctx_list_lock);
return fnd;
}
@@ -228,7 +231,7 @@
struct amp_ctx *fnd = NULL;
struct amp_ctx *ctx;
- read_lock_bh(&mgr->ctx_list_lock);
+ read_lock(&mgr->ctx_list_lock);
list_for_each_entry(ctx, &mgr->ctx_list, list) {
if ((ctx->evt_type & AMP_A2MP_RSP) &&
(ctx->rsp_ident == ident)) {
@@ -236,7 +239,7 @@
break;
}
}
- read_unlock_bh(&mgr->ctx_list_lock);
+ read_unlock(&mgr->ctx_list_lock);
return fnd;
}
@@ -246,10 +249,10 @@
struct amp_mgr *mgr;
struct amp_ctx *fnd = NULL;
- read_lock_bh(&_mgr_list_lock);
+ read_lock(&_mgr_list_lock);
list_for_each_entry(mgr, &_mgr_list, list) {
struct amp_ctx *ctx;
- read_lock_bh(&mgr->ctx_list_lock);
+ read_lock(&mgr->ctx_list_lock);
list_for_each_entry(ctx, &mgr->ctx_list, list) {
struct hci_dev *ctx_hdev;
ctx_hdev = hci_dev_get(A2MP_HCI_ID(ctx->id));
@@ -272,9 +275,9 @@
if (fnd)
break;
}
- read_unlock_bh(&mgr->ctx_list_lock);
+ read_unlock(&mgr->ctx_list_lock);
}
- read_unlock_bh(&_mgr_list_lock);
+ read_unlock(&_mgr_list_lock);
return fnd;
}
@@ -371,13 +374,13 @@
{
struct amp_mgr *mgr;
- read_lock_bh(&_mgr_list_lock);
+ read_lock(&_mgr_list_lock);
list_for_each_entry(mgr, &_mgr_list, list) {
if (mgr->discovered)
send_a2mp_cl(mgr, next_ident(mgr),
A2MP_CHANGE_NOTIFY, 0, NULL);
}
- read_unlock_bh(&_mgr_list_lock);
+ read_unlock(&_mgr_list_lock);
}
static inline int discover_req(struct amp_mgr *mgr, struct sk_buff *skb)
@@ -1517,10 +1520,10 @@
struct amp_ctx *ctx = NULL;
BT_DBG("mgr %p", mgr);
- read_lock_bh(&mgr->ctx_list_lock);
+ read_lock(&mgr->ctx_list_lock);
if (!list_empty(&mgr->ctx_list))
ctx = list_first_entry(&mgr->ctx_list, struct amp_ctx, list);
- read_unlock_bh(&mgr->ctx_list_lock);
+ read_unlock(&mgr->ctx_list_lock);
BT_DBG("ctx %p", ctx);
if (ctx)
execute_ctx(ctx, AMP_INIT, NULL);
@@ -1549,7 +1552,7 @@
/* L2CAP-A2MP interface */
-void a2mp_receive(struct sock *sk, struct sk_buff *skb)
+static void a2mp_receive(struct sock *sk, struct sk_buff *skb)
{
struct a2mp_cmd_hdr *hdr = (struct a2mp_cmd_hdr *) skb->data;
int len;