net: remove bogus RCU annotations on socket.wq
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>hifive-unleashed-5.1
parent
d46eeeaf99
commit
e6476c2144
|
@ -114,7 +114,7 @@ struct socket {
|
||||||
|
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
struct socket_wq __rcu *wq;
|
struct socket_wq *wq;
|
||||||
|
|
||||||
struct file *file;
|
struct file *file;
|
||||||
struct sock *sk;
|
struct sock *sk;
|
||||||
|
|
|
@ -1788,7 +1788,7 @@ static inline void sock_graft(struct sock *sk, struct socket *parent)
|
||||||
{
|
{
|
||||||
WARN_ON(parent->sk);
|
WARN_ON(parent->sk);
|
||||||
write_lock_bh(&sk->sk_callback_lock);
|
write_lock_bh(&sk->sk_callback_lock);
|
||||||
sk->sk_wq = parent->wq;
|
rcu_assign_pointer(sk->sk_wq, parent->wq);
|
||||||
parent->sk = sk;
|
parent->sk = sk;
|
||||||
sk_set_socket(sk, parent);
|
sk_set_socket(sk, parent);
|
||||||
sk->sk_uid = SOCK_INODE(parent)->i_uid;
|
sk->sk_uid = SOCK_INODE(parent)->i_uid;
|
||||||
|
|
10
net/socket.c
10
net/socket.c
|
@ -251,7 +251,7 @@ static struct inode *sock_alloc_inode(struct super_block *sb)
|
||||||
init_waitqueue_head(&wq->wait);
|
init_waitqueue_head(&wq->wait);
|
||||||
wq->fasync_list = NULL;
|
wq->fasync_list = NULL;
|
||||||
wq->flags = 0;
|
wq->flags = 0;
|
||||||
RCU_INIT_POINTER(ei->socket.wq, wq);
|
ei->socket.wq = wq;
|
||||||
|
|
||||||
ei->socket.state = SS_UNCONNECTED;
|
ei->socket.state = SS_UNCONNECTED;
|
||||||
ei->socket.flags = 0;
|
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)
|
static void sock_destroy_inode(struct inode *inode)
|
||||||
{
|
{
|
||||||
struct socket_alloc *ei;
|
struct socket_alloc *ei;
|
||||||
struct socket_wq *wq;
|
|
||||||
|
|
||||||
ei = container_of(inode, struct socket_alloc, vfs_inode);
|
ei = container_of(inode, struct socket_alloc, vfs_inode);
|
||||||
wq = rcu_dereference_protected(ei->socket.wq, 1);
|
kfree_rcu(ei->socket.wq, rcu);
|
||||||
kfree_rcu(wq, rcu);
|
|
||||||
kmem_cache_free(sock_inode_cachep, ei);
|
kmem_cache_free(sock_inode_cachep, ei);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -603,7 +601,7 @@ static void __sock_release(struct socket *sock, struct inode *inode)
|
||||||
module_put(owner);
|
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__);
|
pr_err("%s: fasync list not empty!\n", __func__);
|
||||||
|
|
||||||
if (!sock->file) {
|
if (!sock->file) {
|
||||||
|
@ -1181,7 +1179,7 @@ static int sock_fasync(int fd, struct file *filp, int on)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
lock_sock(sk);
|
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);
|
fasync_helper(fd, filp, on, &wq->fasync_list);
|
||||||
|
|
||||||
if (!wq->fasync_list)
|
if (!wq->fasync_list)
|
||||||
|
|
Loading…
Reference in New Issue