tcp: md5: correct a RCU lockdep splat
authorEric Dumazet <eric.dumazet@gmail.com>
Wed, 7 Mar 2012 04:45:43 +0000 (04:45 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 7 Mar 2012 20:13:42 +0000 (15:13 -0500)
commit a8afca0329 (tcp: md5: protects md5sig_info with RCU) added a
lockdep splat in tcp_md5_do_lookup() in case a timer fires a tcp
retransmit.

At this point, socket lock is owned by the sofirq handler, not the user,
so we should adjust a bit the lockdep condition, as we dont hold
rcu_read_lock().

Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Reported-by: Valdis Kletnieks <valdis.kletnieks@vt.edu>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/tcp_ipv4.c

index 94abee8cf563d68184db984004caf75a91fa4dcc..507924b640ef2bbc758e54e6ae874418f54bf84d 100644 (file)
@@ -927,7 +927,8 @@ struct tcp_md5sig_key *tcp_md5_do_lookup(struct sock *sk,
 
        /* caller either holds rcu_read_lock() or socket lock */
        md5sig = rcu_dereference_check(tp->md5sig_info,
-                                      sock_owned_by_user(sk));
+                                      sock_owned_by_user(sk) ||
+                                      lockdep_is_held(&sk->sk_lock.slock));
        if (!md5sig)
                return NULL;
 #if IS_ENABLED(CONFIG_IPV6)