Thread (25 messages) 25 messages, 4 authors, 2012-02-21

Re: [RFCv6 02/14] Bluetooth: Revert to mutexes from RCU list

From: Ulisses Furquim <hidden>
Date: 2012-02-20 18:57:52

Hi Gustavo,

On Mon, Feb 20, 2012 at 3:33 PM, Gustavo Padovan [off-list ref] wrote:
Hi Andrei,

* Emeltchenko Andrei [off-list ref] [2012-02-20 16:21:13 +0200]:
quoted
From: Andrei Emeltchenko <redacted>

Usage of RCU list looks not reasonalbe for a number of reasons:
our code sleep and we have to use socket spinlocks, some parts
of code are updaters thus we need to use mutexes anyway.

Signed-off-by: Andrei Emeltchenko <redacted>
---
 net/bluetooth/l2cap_core.c |  165 ++++++++++++++++++++++++++------------------
 net/bluetooth/l2cap_sock.c |   10 +++
 2 files changed, 108 insertions(+), 67 deletions(-)add an extra blank line here please.
<snip>
quoted
+unlock:
+     mutex_unlock(&conn->chan_lock);
+
+     return err;
 }

 static inline void set_default_fcs(struct l2cap_chan *chan)
@@ -2793,6 +2804,7 @@ static inline int l2cap_config_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr
              return -ENOENT;

      sk = chan->sk;
+     lock_sock(sk);

      if (chan->state != BT_CONFIG && chan->state != BT_CONNECT2) {
              struct l2cap_cmd_rej_cid rej;
@@ -2905,6 +2917,7 @@ static inline int l2cap_config_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr
              return 0;

      sk = chan->sk;
+     lock_sock(sk);

      switch (result) {
      case L2CAP_CONF_SUCCESS:
@@ -3006,11 +3019,16 @@ static inline int l2cap_disconnect_req(struct l2cap_conn *conn, struct l2cap_cmd
      BT_DBG("scid 0x%4.4x dcid 0x%4.4x", scid, dcid);

-     chan = l2cap_get_chan_by_scid(conn, dcid);
-     if (!chan)
+     mutex_lock(&conn->chan_lock);
+
+     chan = __l2cap_get_chan_by_scid(conn, dcid);
+     if (!chan) {
+             mutex_unlock(&conn->chan_lock);
              return 0;
Seems to me we can use l2cap_get_chan_by_scid() here.
It's better if we don't as we'll call l2cap_chan_del() which might
remove chan from conn->chan_l that's protected by conn->chan_lock.
Let's leave it as he sent.
quoted
+     }

      sk = chan->sk;
+     lock_sock(sk);

      rsp.dcid = cpu_to_le16(chan->scid);
      rsp.scid = cpu_to_le16(chan->dcid);
@@ -3022,6 +3040,9 @@ static inline int l2cap_disconnect_req(struct l2cap_conn *conn, struct l2cap_cmd
      release_sock(sk);

      chan->ops->close(chan->data);
+
+     mutex_unlock(&conn->chan_lock);
+
      return 0;
 }
@@ -3037,16 +3058,24 @@ static inline int l2cap_disconnect_rsp(struct l2cap_conn *conn, struct l2cap_cmd
      BT_DBG("dcid 0x%4.4x scid 0x%4.4x", dcid, scid);

-     chan = l2cap_get_chan_by_scid(conn, scid);
-     if (!chan)
+     mutex_lock(&conn->chan_lock);
+
+     chan = __l2cap_get_chan_by_scid(conn, scid);
+     if (!chan) {
+             mutex_unlock(&conn->chan_lock);
              return 0;
Same here.
Same comment above applies here.

Apart from the extra new line that Padovan asked I'm ok with this commit.

Reviewed-by: Ulisses Furquim <redacted>

Regards,

--
Ulisses Furquim
ProFUSION embedded systems
http://profusion.mobi
Mobile: +55 19 9250 0942
Skype: ulissesffs
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help