mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-26 12:34:41 +08:00
net: drop nopreempt requirement on sock_prot_inuse_add()
[ Upstream commitb3cb764aa1
] This is distracting really, let's make this simpler, because many callers had to take care of this by themselves, even if on x86 this adds more code than really needed. Signed-off-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net> Stable-dep-of:a9bf9c7dc6
("af_unix: Annotate data-race of sk->sk_state in unix_stream_connect().") Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
aa4ed1e0f6
commit
c8f2ebbb0e
@ -1464,11 +1464,11 @@ proto_memory_pressure(struct proto *prot)
|
||||
struct prot_inuse {
|
||||
int val[PROTO_INUSE_NR];
|
||||
};
|
||||
/* Called with local bh disabled */
|
||||
|
||||
static inline void sock_prot_inuse_add(const struct net *net,
|
||||
const struct proto *prot, int val)
|
||||
{
|
||||
__this_cpu_add(net->core.prot_inuse->val[prot->inuse_idx], val);
|
||||
this_cpu_add(net->core.prot_inuse->val[prot->inuse_idx], val);
|
||||
}
|
||||
int sock_prot_inuse_get(struct net *net, struct proto *proto);
|
||||
int sock_inuse_get(struct net *net);
|
||||
|
@ -174,8 +174,8 @@ static int raw_hash(struct sock *sk)
|
||||
{
|
||||
write_lock_bh(&raw_lock);
|
||||
sk_add_node(sk, &raw_head);
|
||||
sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
|
||||
write_unlock_bh(&raw_lock);
|
||||
sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -458,8 +458,8 @@ static int dgram_hash(struct sock *sk)
|
||||
{
|
||||
write_lock_bh(&dgram_lock);
|
||||
sk_add_node(sk, &dgram_head);
|
||||
sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
|
||||
write_unlock_bh(&dgram_lock);
|
||||
sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -99,8 +99,8 @@ int raw_hash_sk(struct sock *sk)
|
||||
|
||||
write_lock_bh(&h->lock);
|
||||
sk_add_node(sk, head);
|
||||
sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
|
||||
write_unlock_bh(&h->lock);
|
||||
sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -471,10 +471,10 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
|
||||
|
||||
if (sk->sk_protocol == IPPROTO_TCP) {
|
||||
struct inet_connection_sock *icsk = inet_csk(sk);
|
||||
local_bh_disable();
|
||||
|
||||
sock_prot_inuse_add(net, sk->sk_prot, -1);
|
||||
sock_prot_inuse_add(net, &tcp_prot, 1);
|
||||
local_bh_enable();
|
||||
|
||||
sk->sk_prot = &tcp_prot;
|
||||
icsk->icsk_af_ops = &ipv4_specific;
|
||||
sk->sk_socket->ops = &inet_stream_ops;
|
||||
@ -485,10 +485,10 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
|
||||
|
||||
if (sk->sk_protocol == IPPROTO_UDPLITE)
|
||||
prot = &udplite_prot;
|
||||
local_bh_disable();
|
||||
|
||||
sock_prot_inuse_add(net, sk->sk_prot, -1);
|
||||
sock_prot_inuse_add(net, prot, 1);
|
||||
local_bh_enable();
|
||||
|
||||
sk->sk_prot = prot;
|
||||
sk->sk_socket->ops = &inet_dgram_ops;
|
||||
sk->sk_family = PF_INET;
|
||||
|
@ -711,9 +711,7 @@ static int netlink_create(struct net *net, struct socket *sock, int protocol,
|
||||
if (err < 0)
|
||||
goto out_module;
|
||||
|
||||
local_bh_disable();
|
||||
sock_prot_inuse_add(net, &netlink_proto, 1);
|
||||
local_bh_enable();
|
||||
|
||||
nlk = nlk_sk(sock->sk);
|
||||
nlk->module = module;
|
||||
@ -813,9 +811,7 @@ static int netlink_release(struct socket *sock)
|
||||
netlink_table_ungrab();
|
||||
}
|
||||
|
||||
local_bh_disable();
|
||||
sock_prot_inuse_add(sock_net(sk), &netlink_proto, -1);
|
||||
local_bh_enable();
|
||||
call_rcu(&nlk->rcu, deferred_put_nlk_sk);
|
||||
return 0;
|
||||
}
|
||||
|
@ -3092,9 +3092,7 @@ static int packet_release(struct socket *sock)
|
||||
sk_del_node_init_rcu(sk);
|
||||
mutex_unlock(&net->packet.sklist_lock);
|
||||
|
||||
preempt_disable();
|
||||
sock_prot_inuse_add(net, sk->sk_prot, -1);
|
||||
preempt_enable();
|
||||
|
||||
spin_lock(&po->bind_lock);
|
||||
unregister_prot_hook(sk, false);
|
||||
@ -3361,9 +3359,7 @@ static int packet_create(struct net *net, struct socket *sock, int protocol,
|
||||
sk_add_node_tail_rcu(sk, &net->packet.sklist);
|
||||
mutex_unlock(&net->packet.sklist_lock);
|
||||
|
||||
preempt_disable();
|
||||
sock_prot_inuse_add(net, &packet_proto, 1);
|
||||
preempt_enable();
|
||||
|
||||
return 0;
|
||||
out2:
|
||||
|
@ -5073,12 +5073,9 @@ static int sctp_init_sock(struct sock *sk)
|
||||
|
||||
SCTP_DBG_OBJCNT_INC(sock);
|
||||
|
||||
local_bh_disable();
|
||||
sk_sockets_allocated_inc(sk);
|
||||
sock_prot_inuse_add(net, sk->sk_prot, 1);
|
||||
|
||||
local_bh_enable();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -5104,10 +5101,8 @@ static void sctp_destroy_sock(struct sock *sk)
|
||||
list_del(&sp->auto_asconf_list);
|
||||
}
|
||||
sctp_endpoint_free(sp->ep);
|
||||
local_bh_disable();
|
||||
sk_sockets_allocated_dec(sk);
|
||||
sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1);
|
||||
local_bh_enable();
|
||||
}
|
||||
|
||||
/* Triggered when there are no references on the socket anymore */
|
||||
|
@ -88,8 +88,8 @@ int smc_hash_sk(struct sock *sk)
|
||||
|
||||
write_lock_bh(&h->lock);
|
||||
sk_add_node(sk, head);
|
||||
sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
|
||||
write_unlock_bh(&h->lock);
|
||||
sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -515,9 +515,7 @@ static void unix_sock_destructor(struct sock *sk)
|
||||
unix_release_addr(u->addr);
|
||||
|
||||
atomic_long_dec(&unix_nr_socks);
|
||||
local_bh_disable();
|
||||
sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1);
|
||||
local_bh_enable();
|
||||
#ifdef UNIX_REFCNT_DEBUG
|
||||
pr_debug("UNIX %p is destroyed, %ld are still alive.\n", sk,
|
||||
atomic_long_read(&unix_nr_socks));
|
||||
@ -890,9 +888,7 @@ static struct sock *unix_create1(struct net *net, struct socket *sock, int kern,
|
||||
memset(&u->scm_stat, 0, sizeof(struct scm_stat));
|
||||
unix_insert_socket(unix_sockets_unbound(sk), sk);
|
||||
|
||||
local_bh_disable();
|
||||
sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
|
||||
local_bh_enable();
|
||||
|
||||
return sk;
|
||||
|
||||
|
@ -842,9 +842,7 @@ static int xsk_release(struct socket *sock)
|
||||
sk_del_node_init_rcu(sk);
|
||||
mutex_unlock(&net->xdp.lock);
|
||||
|
||||
local_bh_disable();
|
||||
sock_prot_inuse_add(net, sk->sk_prot, -1);
|
||||
local_bh_enable();
|
||||
|
||||
xsk_delete_from_maps(xs);
|
||||
mutex_lock(&xs->mutex);
|
||||
@ -1465,9 +1463,7 @@ static int xsk_create(struct net *net, struct socket *sock, int protocol,
|
||||
sk_add_node_rcu(sk, &net->xdp.list);
|
||||
mutex_unlock(&net->xdp.lock);
|
||||
|
||||
local_bh_disable();
|
||||
sock_prot_inuse_add(net, &xsk_proto, 1);
|
||||
local_bh_enable();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user