OSDN Git Service

net: remove bogus RCU annotations on socket.wq
authorChristoph Hellwig <hch@lst.de>
Mon, 30 Jul 2018 07:45:07 +0000 (09:45 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 31 Jul 2018 19:40:22 +0000 (12:40 -0700)
We never use RCU protection for it, just a lot of cargo-cult
rcu_deference_protects calls.

Note that we do keep the kfree_rcu call for it, as the references through
struct sock are RCU protected and thus might require a grace period before
freeing.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Acked-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/net.h
include/net/sock.h
net/socket.c

index 6554d3b..e093067 100644 (file)
@@ -114,7 +114,7 @@ struct socket {
 
        unsigned long           flags;
 
-       struct socket_wq __rcu  *wq;
+       struct socket_wq        *wq;
 
        struct file             *file;
        struct sock             *sk;
index 2afea5d..433f45f 100644 (file)
@@ -1788,7 +1788,7 @@ static inline void sock_graft(struct sock *sk, struct socket *parent)
 {
        WARN_ON(parent->sk);
        write_lock_bh(&sk->sk_callback_lock);
-       sk->sk_wq = parent->wq;
+       rcu_assign_pointer(sk->sk_wq, parent->wq);
        parent->sk = sk;
        sk_set_socket(sk, parent);
        sk->sk_uid = SOCK_INODE(parent)->i_uid;
index 5b7df66..475247e 100644 (file)
@@ -251,7 +251,7 @@ static struct inode *sock_alloc_inode(struct super_block *sb)
        init_waitqueue_head(&wq->wait);
        wq->fasync_list = NULL;
        wq->flags = 0;
-       RCU_INIT_POINTER(ei->socket.wq, wq);
+       ei->socket.wq = wq;
 
        ei->socket.state = SS_UNCONNECTED;
        ei->socket.flags = 0;
@@ -265,11 +265,9 @@ static struct inode *sock_alloc_inode(struct super_block *sb)
 static void sock_destroy_inode(struct inode *inode)
 {
        struct socket_alloc *ei;
-       struct socket_wq *wq;
 
        ei = container_of(inode, struct socket_alloc, vfs_inode);
-       wq = rcu_dereference_protected(ei->socket.wq, 1);
-       kfree_rcu(wq, rcu);
+       kfree_rcu(ei->socket.wq, rcu);
        kmem_cache_free(sock_inode_cachep, ei);
 }
 
@@ -603,7 +601,7 @@ static void __sock_release(struct socket *sock, struct inode *inode)
                module_put(owner);
        }
 
-       if (rcu_dereference_protected(sock->wq, 1)->fasync_list)
+       if (sock->wq->fasync_list)
                pr_err("%s: fasync list not empty!\n", __func__);
 
        if (!sock->file) {
@@ -1181,7 +1179,7 @@ static int sock_fasync(int fd, struct file *filp, int on)
                return -EINVAL;
 
        lock_sock(sk);
-       wq = rcu_dereference_protected(sock->wq, lockdep_sock_is_held(sk));
+       wq = sock->wq;
        fasync_helper(fd, filp, on, &wq->fasync_list);
 
        if (!wq->fasync_list)