mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 04:02:20 +00:00
af_unix: Remove U_LOCK_DIAG.
sk_diag_dump_icons() acquires embryo's lock by unix_state_lock_nested() to fetch its peer. The embryo's ->peer is set to NULL only when its parent listener is close()d. Then, unix_release_sock() is called for each embryo after unlinking skb by skb_dequeue(). In sk_diag_dump_icons(), we hold the parent's recvq lock, so we need not acquire unix_state_lock_nested(), and peer is always non-NULL. Let's remove unnecessary unix_state_lock_nested() and non-NULL test for peer. Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
parent
b380b18102
commit
c4da4661d9
@ -98,7 +98,6 @@ struct unix_sock {
|
||||
#define unix_state_unlock(s) spin_unlock(&unix_sk(s)->lock)
|
||||
enum unix_socket_lock_class {
|
||||
U_LOCK_NORMAL,
|
||||
U_LOCK_DIAG, /* used while dumping icons, see sk_diag_dump_icons(). */
|
||||
U_LOCK_GC_LISTENER, /* used for listening socket while determining gc
|
||||
* candidates to close a small race window.
|
||||
*/
|
||||
|
@ -73,20 +73,9 @@ static int sk_diag_dump_icons(struct sock *sk, struct sk_buff *nlskb)
|
||||
|
||||
buf = nla_data(attr);
|
||||
i = 0;
|
||||
skb_queue_walk(&sk->sk_receive_queue, skb) {
|
||||
struct sock *req, *peer;
|
||||
skb_queue_walk(&sk->sk_receive_queue, skb)
|
||||
buf[i++] = sock_i_ino(unix_peer(skb->sk));
|
||||
|
||||
req = skb->sk;
|
||||
/*
|
||||
* The state lock is outer for the same sk's
|
||||
* queue lock. With the other's queue locked it's
|
||||
* OK to lock the state.
|
||||
*/
|
||||
unix_state_lock_nested(req, U_LOCK_DIAG);
|
||||
peer = unix_sk(req)->peer;
|
||||
buf[i++] = (peer ? sock_i_ino(peer) : 0);
|
||||
unix_state_unlock(req);
|
||||
}
|
||||
spin_unlock(&sk->sk_receive_queue.lock);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user