Re: [PATCHv2 0/3] Bluetooth: Change socket lock to l2cap_chan lock

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Ulisses,

On Wed, Feb 22, 2012 at 10:30:40AM -0200, Ulisses Furquim wrote:
> Hi Andrei,
> 
> On Wed, Feb 22, 2012 at 8:43 AM, Andrei Emeltchenko
> <Andrei.Emeltchenko.news@xxxxxxxxx> wrote:
> > From: Andrei Emeltchenko <andrei.emeltchenko@xxxxxxxxx>
> >
> > Changing socket lock to L2CAP chan lock in L2CAP code. Needed for implementing
> > protocols above L2CAP without creating sockets.
> >
> > Changes:
> >        * PATCHv2: Rebase remaining parts against latest tree and merge all
> >        patches dealing with converting sk lock to chan lock together following
> >        recommendation from Ulisses and Gustavo.
> >        * PATCHv1: Added extra line (per Gustavo comment)
> >        * RFCv6: Same code but patches 2,3 and 4 from RFCv5 are merged together
> >        following recommendations from review.
> >        * RFCv5: Fixed locking bug in l2cap_data_channel, added locks in
> >        l2cap_sock_shutdown function, fixed several styles issues.
> >        * RFCv4: Better split patches so they looks more clear and obvious,
> >        taking coments about naming change and delete unused vars. See diff change
> >        from the previous version below:
> >        * RFCv3: Split the big patch to several small (I believe logical) chunks,
> >        remove unneded locks from cleanup_listen, use the same arguments for
> >        locked/unlocked socket error functions.
> >        * RFCv2: Convert l2cap channel list back to mutex from RCU list.
> >
> > Andrei Emeltchenko (3):
> >  Bluetooth: Add unlocked __l2cap_chan_add function
> >  Bluetooth: Change sk lock to chan lock in L2CAP core
> >  Bluetooth: Remove socket lock check
> >
> >  net/bluetooth/l2cap_core.c |  173 +++++++++++++++++++++++++++-----------------
> >  net/bluetooth/l2cap_sock.c |   28 +++++--
> >  2 files changed, 125 insertions(+), 76 deletions(-)
> 
> I'm mostly ok with the patches. However, have you seen my questions on
> reply to PATCHv1 08/14? Please, check that. Thanks.

Sorry missed those comments.

In a case of:
<------8<---------------------------------------------------------------------
|  > @@ -440,10 +444,12 @@ void l2cap_chan_close(struct l2cap_chan *chan, int
|  > reason)
|  >
|  >        switch (chan->state) {
|  >        case BT_LISTEN:
|  > +               lock_sock(sk);
|  >                l2cap_chan_cleanup_listen(sk);
|  >
|  >                __l2cap_state_change(chan, BT_CLOSED);
|  >                sock_set_flag(sk, SOCK_ZAPPED);
|  > +               release_sock(sk);
|  >                break;
|  >
|  >        case BT_CONNECTED:
|
|  Do we need to lock sock around l2cap_chan_cleanup_listen() as well?
|  l2cap_chan_close() will call l2cap_chan_del() which now does
|  lock_sock/release_sock, right?
<------8<---------------------------------------------------------------------

Those are different socks. We take parent sk lock here.

concerning:

<------8<------------------------------------------------------------------
|  > @@ -714,6 +722,7 @@ static inline int l2cap_mode_supported(__u8 mode,
|  > __u32 feat_mask)
|  >
|  >  static void l2cap_send_disconn_req(struct l2cap_conn *conn, struct
|  >  l2cap_chan *chan, int err)
|  >  {
|  > +       struct sock *sk = chan->sk;
|  >        struct l2cap_disconn_req req;
|  >
|  >        if (!conn)
|  > @@ -730,8 +739,10 @@ static void l2cap_send_disconn_req(struct
|  > l2cap_conn *conn, struct l2cap_chan *c
|  >        l2cap_send_cmd(conn, l2cap_get_ident(conn),
|  >                        L2CAP_DISCONN_REQ, sizeof(req), &req);
|  >
|  > +       lock_sock(sk);
|  >        __l2cap_state_change(chan, BT_DISCONN);
|  >        __l2cap_chan_set_err(chan, err);
|  > +       release_sock(sk);
|  >  }
|  >
|  >  /* ---- L2CAP connections ---- */
|
|  It seems we didn't have any locking around these before. Why? Do we
|  really need it now?
<------8<------------------------------------------------------------------

The locks were in the functions invoking l2cap_send_disconn_req.

Otherwise would following changes be OK?

diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
index 60d3276..56a85c0 100644
--- a/net/bluetooth/l2cap_core.c
+++ b/net/bluetooth/l2cap_core.c
@@ -363,8 +363,6 @@ void l2cap_chan_add(struct l2cap_conn *conn, struct
l2cap_chan *chan)
        mutex_unlock(&conn->chan_lock);
 }
 
-/* Delete channel.
- * Must be called on the locked socket. */
 static void l2cap_chan_del(struct l2cap_chan *chan, int err)
 {
        struct sock *sk = chan->sk;
diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c
index ae15d7a..efe391e 100644
--- a/net/bluetooth/l2cap_sock.c
+++ b/net/bluetooth/l2cap_sock.c
@@ -812,6 +812,7 @@ static int l2cap_sock_shutdown(struct socket *sock,
int how)
 
        if (conn)
                mutex_lock(&conn->chan_lock);
+
        l2cap_chan_lock(chan);
        lock_sock(sk);
 
@@ -835,6 +836,7 @@ static int l2cap_sock_shutdown(struct socket *sock,
int how)
 
        release_sock(sk);
        l2cap_chan_unlock(chan);
+
        if (conn)
                mutex_unlock(&conn->chan_lock);
 

Best regards 
Andrei Emeltchenko 
--
To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux