tipc: add lock nesting notation to quiet lockdep warning
authorYing Xue <ying.xue@windriver.com>
Mon, 3 Dec 2012 08:12:07 +0000 (16:12 +0800)
committerPaul Gortmaker <paul.gortmaker@windriver.com>
Fri, 7 Dec 2012 22:23:23 +0000 (17:23 -0500)
TIPC accept() call grabs the socket lock on a newly allocated
socket while holding the socket lock on an old socket. But lockdep
worries that this might be a recursive lock attempt:

  [ INFO: possible recursive locking detected ]
  ---------------------------------------------
  kworker/u:0/6 is trying to acquire lock:
  (sk_lock-AF_TIPC){+.+.+.}, at: [<c8c1226c>] accept+0x15c/0x310 [tipc]

  but task is already holding lock:
  (sk_lock-AF_TIPC){+.+.+.}, at: [<c8c12138>] accept+0x28/0x310 [tipc]

  other info that might help us debug this:
  Possible unsafe locking scenario:

          CPU0
          ----
          lock(sk_lock-AF_TIPC);
          lock(sk_lock-AF_TIPC);

          *** DEADLOCK ***

  May be due to missing lock nesting notation
  [...]

Tell lockdep that this locking is safe by using lock_sock_nested().
This is similar to what was done in commit 5131a184a3458d9 for
SCTP code ("SCTP: lock_sock_nested in sctp_sock_migrate").

Also note that this is isn't something that is seen normally,
as it was uncovered with some experimental work-in-progress
code not yet ready for mainline.  So no need for stable
backports or similar of this commit.

Signed-off-by: Ying Xue <ying.xue@windriver.com>
Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
net/tipc/socket.c

index ef75b6270247b4ecfeddace3b9ba993e718df30b..b5c9795cf151054a208c89e7aee7e6980486b468 100644 (file)
@@ -1543,7 +1543,8 @@ static int accept(struct socket *sock, struct socket *new_sock, int flags)
                u32 new_ref = new_tport->ref;
                struct tipc_msg *msg = buf_msg(buf);
 
-               lock_sock(new_sk);
+               /* we lock on new_sk; but lockdep sees the lock on sk */
+               lock_sock_nested(new_sk, SINGLE_DEPTH_NESTING);
 
                /*
                 * Reject any stray messages received by new socket