So the scm_stat_{add,del} helper can be invoked with no
additional lock held.

This clean-up the code a bit and will make the next
patch easier.

Signed-off-by: Paolo Abeni <[email protected]>
Reviewed-by: Kirill Tkhai <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
(cherry picked from commit 7782040b950b5d0433f734fb2bba8b8b5ed6ce5a)
Signed-off-by: Vasily Averin <[email protected]>
---
 include/net/af_unix.h |  2 +-
 net/unix/af_unix.c    | 21 ++++++---------------
 2 files changed, 7 insertions(+), 16 deletions(-)

diff --git a/include/net/af_unix.h b/include/net/af_unix.h
index a10e2c52bf9b..7e9f8bf14151 100644
--- a/include/net/af_unix.h
+++ b/include/net/af_unix.h
@@ -42,7 +42,7 @@ struct unix_skb_parms {
 } __randomize_layout;
 
 struct scm_stat {
-       u32 nr_fds;
+       atomic_t nr_fds;
 };
 
 #define UNIXCB(skb)    (*(struct unix_skb_parms *)&((skb)->cb))
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
index acd7985d1faa..f0b53ddd76b4 100644
--- a/net/unix/af_unix.c
+++ b/net/unix/af_unix.c
@@ -681,7 +681,8 @@ static void unix_show_fdinfo(struct seq_file *m, struct 
socket *sock)
 
        if (sk) {
                u = unix_sk(sock->sk);
-               seq_printf(m, "scm_fds: %u\n", READ_ONCE(u->scm_stat.nr_fds));
+               seq_printf(m, "scm_fds: %u\n",
+                          atomic_read(&u->scm_stat.nr_fds));
        }
 }
 #else
@@ -1573,10 +1574,8 @@ static void scm_stat_add(struct sock *sk, struct sk_buff 
*skb)
        struct scm_fp_list *fp = UNIXCB(skb).fp;
        struct unix_sock *u = unix_sk(sk);
 
-       lockdep_assert_held(&sk->sk_receive_queue.lock);
-
        if (unlikely(fp && fp->count))
-               u->scm_stat.nr_fds += fp->count;
+               atomic_add(fp->count, &u->scm_stat.nr_fds);
 }
 
 static void scm_stat_del(struct sock *sk, struct sk_buff *skb)
@@ -1584,10 +1583,8 @@ static void scm_stat_del(struct sock *sk, struct sk_buff 
*skb)
        struct scm_fp_list *fp = UNIXCB(skb).fp;
        struct unix_sock *u = unix_sk(sk);
 
-       lockdep_assert_held(&sk->sk_receive_queue.lock);
-
        if (unlikely(fp && fp->count))
-               u->scm_stat.nr_fds -= fp->count;
+               atomic_sub(fp->count, &u->scm_stat.nr_fds);
 }
 
 /*
@@ -1775,10 +1772,8 @@ static int unix_dgram_sendmsg(struct socket *sock, 
struct msghdr *msg,
        if (sock_flag(other, SOCK_RCVTSTAMP))
                __net_timestamp(skb);
        maybe_add_creds(skb, sock, other);
-       spin_lock(&other->sk_receive_queue.lock);
        scm_stat_add(other, skb);
-       __skb_queue_tail(&other->sk_receive_queue, skb);
-       spin_unlock(&other->sk_receive_queue.lock);
+       skb_queue_tail(&other->sk_receive_queue, skb);
        unix_state_unlock(other);
        other->sk_data_ready(other);
        sock_put(other);
@@ -1880,10 +1875,8 @@ static int unix_stream_sendmsg(struct socket *sock, 
struct msghdr *msg,
                        goto pipe_err_free;
 
                maybe_add_creds(skb, sock, other);
-               spin_lock(&other->sk_receive_queue.lock);
                scm_stat_add(other, skb);
-               __skb_queue_tail(&other->sk_receive_queue, skb);
-               spin_unlock(&other->sk_receive_queue.lock);
+               skb_queue_tail(&other->sk_receive_queue, skb);
                unix_state_unlock(other);
                other->sk_data_ready(other);
                sent += size;
@@ -2379,9 +2372,7 @@ static int unix_stream_read_generic(struct 
unix_stream_read_state *state,
                        sk_peek_offset_bwd(sk, chunk);
 
                        if (UNIXCB(skb).fp) {
-                               spin_lock(&sk->sk_receive_queue.lock);
                                scm_stat_del(sk, skb);
-                               spin_unlock(&sk->sk_receive_queue.lock);
                                unix_detach_fds(&scm, skb);
                        }
 
-- 
2.25.1

_______________________________________________
Devel mailing list
[email protected]
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to