Commit 62803fec authored by David S. Miller's avatar David S. Miller

Merge branch 'inuse-cleanups'

Eric Dumazet says:

====================
net: prot_inuse and sock_inuse cleanups

Small series cleaning and optimizing sock_prot_inuse_add()
and sock_inuse_add().
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents abc3342a b3cb764a
...@@ -12,7 +12,6 @@ struct netns_core { ...@@ -12,7 +12,6 @@ struct netns_core {
int sysctl_somaxconn; int sysctl_somaxconn;
#ifdef CONFIG_PROC_FS #ifdef CONFIG_PROC_FS
int __percpu *sock_inuse;
struct prot_inuse __percpu *prot_inuse; struct prot_inuse __percpu *prot_inuse;
#endif #endif
}; };
......
...@@ -1429,13 +1429,32 @@ proto_memory_pressure(struct proto *prot) ...@@ -1429,13 +1429,32 @@ proto_memory_pressure(struct proto *prot)
#ifdef CONFIG_PROC_FS #ifdef CONFIG_PROC_FS
/* Called with local bh disabled */ #define PROTO_INUSE_NR 64 /* should be enough for the first time */
void sock_prot_inuse_add(struct net *net, struct proto *prot, int inc); struct prot_inuse {
int all;
int val[PROTO_INUSE_NR];
};
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);
}
static inline void sock_inuse_add(const struct net *net, int val)
{
this_cpu_add(net->core.prot_inuse->all, val);
}
int sock_prot_inuse_get(struct net *net, struct proto *proto); int sock_prot_inuse_get(struct net *net, struct proto *proto);
int sock_inuse_get(struct net *net); int sock_inuse_get(struct net *net);
#else #else
static inline void sock_prot_inuse_add(struct net *net, struct proto *prot, static inline void sock_prot_inuse_add(const struct net *net,
int inc) const struct proto *prot, int val)
{
}
static inline void sock_inuse_add(const struct net *net, int val)
{ {
} }
#endif #endif
......
...@@ -144,8 +144,6 @@ ...@@ -144,8 +144,6 @@
static DEFINE_MUTEX(proto_list_mutex); static DEFINE_MUTEX(proto_list_mutex);
static LIST_HEAD(proto_list); static LIST_HEAD(proto_list);
static void sock_inuse_add(struct net *net, int val);
/** /**
* sk_ns_capable - General socket capability test * sk_ns_capable - General socket capability test
* @sk: Socket to use a capability on or through * @sk: Socket to use a capability on or through
...@@ -3536,19 +3534,8 @@ void sk_get_meminfo(const struct sock *sk, u32 *mem) ...@@ -3536,19 +3534,8 @@ void sk_get_meminfo(const struct sock *sk, u32 *mem)
} }
#ifdef CONFIG_PROC_FS #ifdef CONFIG_PROC_FS
#define PROTO_INUSE_NR 64 /* should be enough for the first time */
struct prot_inuse {
int val[PROTO_INUSE_NR];
};
static DECLARE_BITMAP(proto_inuse_idx, PROTO_INUSE_NR); static DECLARE_BITMAP(proto_inuse_idx, PROTO_INUSE_NR);
void sock_prot_inuse_add(struct net *net, struct proto *prot, int val)
{
__this_cpu_add(net->core.prot_inuse->val[prot->inuse_idx], val);
}
EXPORT_SYMBOL_GPL(sock_prot_inuse_add);
int sock_prot_inuse_get(struct net *net, struct proto *prot) int sock_prot_inuse_get(struct net *net, struct proto *prot)
{ {
int cpu, idx = prot->inuse_idx; int cpu, idx = prot->inuse_idx;
...@@ -3561,17 +3548,12 @@ int sock_prot_inuse_get(struct net *net, struct proto *prot) ...@@ -3561,17 +3548,12 @@ int sock_prot_inuse_get(struct net *net, struct proto *prot)
} }
EXPORT_SYMBOL_GPL(sock_prot_inuse_get); EXPORT_SYMBOL_GPL(sock_prot_inuse_get);
static void sock_inuse_add(struct net *net, int val)
{
this_cpu_add(*net->core.sock_inuse, val);
}
int sock_inuse_get(struct net *net) int sock_inuse_get(struct net *net)
{ {
int cpu, res = 0; int cpu, res = 0;
for_each_possible_cpu(cpu) for_each_possible_cpu(cpu)
res += *per_cpu_ptr(net->core.sock_inuse, cpu); res += per_cpu_ptr(net->core.prot_inuse, cpu)->all;
return res; return res;
} }
...@@ -3583,22 +3565,12 @@ static int __net_init sock_inuse_init_net(struct net *net) ...@@ -3583,22 +3565,12 @@ static int __net_init sock_inuse_init_net(struct net *net)
net->core.prot_inuse = alloc_percpu(struct prot_inuse); net->core.prot_inuse = alloc_percpu(struct prot_inuse);
if (net->core.prot_inuse == NULL) if (net->core.prot_inuse == NULL)
return -ENOMEM; return -ENOMEM;
net->core.sock_inuse = alloc_percpu(int);
if (net->core.sock_inuse == NULL)
goto out;
return 0; return 0;
out:
free_percpu(net->core.prot_inuse);
return -ENOMEM;
} }
static void __net_exit sock_inuse_exit_net(struct net *net) static void __net_exit sock_inuse_exit_net(struct net *net)
{ {
free_percpu(net->core.prot_inuse); free_percpu(net->core.prot_inuse);
free_percpu(net->core.sock_inuse);
} }
static struct pernet_operations net_inuse_ops = { static struct pernet_operations net_inuse_ops = {
...@@ -3644,9 +3616,6 @@ static inline void release_proto_idx(struct proto *prot) ...@@ -3644,9 +3616,6 @@ static inline void release_proto_idx(struct proto *prot)
{ {
} }
static void sock_inuse_add(struct net *net, int val)
{
}
#endif #endif
static void tw_prot_cleanup(struct timewait_sock_ops *twsk_prot) static void tw_prot_cleanup(struct timewait_sock_ops *twsk_prot)
......
...@@ -174,8 +174,8 @@ static int raw_hash(struct sock *sk) ...@@ -174,8 +174,8 @@ static int raw_hash(struct sock *sk)
{ {
write_lock_bh(&raw_lock); write_lock_bh(&raw_lock);
sk_add_node(sk, &raw_head); sk_add_node(sk, &raw_head);
sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
write_unlock_bh(&raw_lock); write_unlock_bh(&raw_lock);
sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
return 0; return 0;
} }
...@@ -453,8 +453,8 @@ static int dgram_hash(struct sock *sk) ...@@ -453,8 +453,8 @@ static int dgram_hash(struct sock *sk)
{ {
write_lock_bh(&dgram_lock); write_lock_bh(&dgram_lock);
sk_add_node(sk, &dgram_head); sk_add_node(sk, &dgram_head);
sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
write_unlock_bh(&dgram_lock); write_unlock_bh(&dgram_lock);
sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
return 0; return 0;
} }
......
...@@ -99,8 +99,8 @@ int raw_hash_sk(struct sock *sk) ...@@ -99,8 +99,8 @@ int raw_hash_sk(struct sock *sk)
write_lock_bh(&h->lock); write_lock_bh(&h->lock);
sk_add_node(sk, head); sk_add_node(sk, head);
sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
write_unlock_bh(&h->lock); write_unlock_bh(&h->lock);
sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
return 0; return 0;
} }
......
...@@ -471,10 +471,10 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname, ...@@ -471,10 +471,10 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
if (sk->sk_protocol == IPPROTO_TCP) { if (sk->sk_protocol == IPPROTO_TCP) {
struct inet_connection_sock *icsk = inet_csk(sk); 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, sk->sk_prot, -1);
sock_prot_inuse_add(net, &tcp_prot, 1); sock_prot_inuse_add(net, &tcp_prot, 1);
local_bh_enable();
sk->sk_prot = &tcp_prot; sk->sk_prot = &tcp_prot;
icsk->icsk_af_ops = &ipv4_specific; icsk->icsk_af_ops = &ipv4_specific;
sk->sk_socket->ops = &inet_stream_ops; sk->sk_socket->ops = &inet_stream_ops;
...@@ -485,10 +485,10 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname, ...@@ -485,10 +485,10 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
if (sk->sk_protocol == IPPROTO_UDPLITE) if (sk->sk_protocol == IPPROTO_UDPLITE)
prot = &udplite_prot; prot = &udplite_prot;
local_bh_disable();
sock_prot_inuse_add(net, sk->sk_prot, -1); sock_prot_inuse_add(net, sk->sk_prot, -1);
sock_prot_inuse_add(net, prot, 1); sock_prot_inuse_add(net, prot, 1);
local_bh_enable();
sk->sk_prot = prot; sk->sk_prot = prot;
sk->sk_socket->ops = &inet_dgram_ops; sk->sk_socket->ops = &inet_dgram_ops;
sk->sk_family = PF_INET; sk->sk_family = PF_INET;
......
...@@ -1534,9 +1534,7 @@ int mptcp_subflow_create_socket(struct sock *sk, struct socket **new_sock) ...@@ -1534,9 +1534,7 @@ int mptcp_subflow_create_socket(struct sock *sk, struct socket **new_sock)
*/ */
sf->sk->sk_net_refcnt = 1; sf->sk->sk_net_refcnt = 1;
get_net(net); get_net(net);
#ifdef CONFIG_PROC_FS sock_inuse_add(net, 1);
this_cpu_add(*net->core.sock_inuse, 1);
#endif
err = tcp_set_ulp(sf->sk, "mptcp"); err = tcp_set_ulp(sf->sk, "mptcp");
release_sock(sf->sk); release_sock(sf->sk);
......
...@@ -707,9 +707,7 @@ static int netlink_create(struct net *net, struct socket *sock, int protocol, ...@@ -707,9 +707,7 @@ static int netlink_create(struct net *net, struct socket *sock, int protocol,
if (err < 0) if (err < 0)
goto out_module; goto out_module;
local_bh_disable();
sock_prot_inuse_add(net, &netlink_proto, 1); sock_prot_inuse_add(net, &netlink_proto, 1);
local_bh_enable();
nlk = nlk_sk(sock->sk); nlk = nlk_sk(sock->sk);
nlk->module = module; nlk->module = module;
...@@ -809,9 +807,7 @@ static int netlink_release(struct socket *sock) ...@@ -809,9 +807,7 @@ static int netlink_release(struct socket *sock)
netlink_table_ungrab(); netlink_table_ungrab();
} }
local_bh_disable();
sock_prot_inuse_add(sock_net(sk), &netlink_proto, -1); sock_prot_inuse_add(sock_net(sk), &netlink_proto, -1);
local_bh_enable();
call_rcu(&nlk->rcu, deferred_put_nlk_sk); call_rcu(&nlk->rcu, deferred_put_nlk_sk);
return 0; return 0;
} }
......
...@@ -3102,9 +3102,7 @@ static int packet_release(struct socket *sock) ...@@ -3102,9 +3102,7 @@ static int packet_release(struct socket *sock)
sk_del_node_init_rcu(sk); sk_del_node_init_rcu(sk);
mutex_unlock(&net->packet.sklist_lock); mutex_unlock(&net->packet.sklist_lock);
preempt_disable();
sock_prot_inuse_add(net, sk->sk_prot, -1); sock_prot_inuse_add(net, sk->sk_prot, -1);
preempt_enable();
spin_lock(&po->bind_lock); spin_lock(&po->bind_lock);
unregister_prot_hook(sk, false); unregister_prot_hook(sk, false);
...@@ -3368,9 +3366,7 @@ static int packet_create(struct net *net, struct socket *sock, int protocol, ...@@ -3368,9 +3366,7 @@ static int packet_create(struct net *net, struct socket *sock, int protocol,
sk_add_node_tail_rcu(sk, &net->packet.sklist); sk_add_node_tail_rcu(sk, &net->packet.sklist);
mutex_unlock(&net->packet.sklist_lock); mutex_unlock(&net->packet.sklist_lock);
preempt_disable();
sock_prot_inuse_add(net, &packet_proto, 1); sock_prot_inuse_add(net, &packet_proto, 1);
preempt_enable();
return 0; return 0;
out2: out2:
......
...@@ -5068,12 +5068,9 @@ static int sctp_init_sock(struct sock *sk) ...@@ -5068,12 +5068,9 @@ static int sctp_init_sock(struct sock *sk)
SCTP_DBG_OBJCNT_INC(sock); SCTP_DBG_OBJCNT_INC(sock);
local_bh_disable();
sk_sockets_allocated_inc(sk); sk_sockets_allocated_inc(sk);
sock_prot_inuse_add(net, sk->sk_prot, 1); sock_prot_inuse_add(net, sk->sk_prot, 1);
local_bh_enable();
return 0; return 0;
} }
...@@ -5099,10 +5096,8 @@ static void sctp_destroy_sock(struct sock *sk) ...@@ -5099,10 +5096,8 @@ static void sctp_destroy_sock(struct sock *sk)
list_del(&sp->auto_asconf_list); list_del(&sp->auto_asconf_list);
} }
sctp_endpoint_free(sp->ep); sctp_endpoint_free(sp->ep);
local_bh_disable();
sk_sockets_allocated_dec(sk); sk_sockets_allocated_dec(sk);
sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1); sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1);
local_bh_enable();
} }
/* Triggered when there are no references on the socket anymore */ /* Triggered when there are no references on the socket anymore */
......
...@@ -89,8 +89,8 @@ int smc_hash_sk(struct sock *sk) ...@@ -89,8 +89,8 @@ int smc_hash_sk(struct sock *sk)
write_lock_bh(&h->lock); write_lock_bh(&h->lock);
sk_add_node(sk, head); sk_add_node(sk, head);
sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
write_unlock_bh(&h->lock); write_unlock_bh(&h->lock);
sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
return 0; return 0;
} }
......
...@@ -522,9 +522,7 @@ static void unix_sock_destructor(struct sock *sk) ...@@ -522,9 +522,7 @@ static void unix_sock_destructor(struct sock *sk)
unix_release_addr(u->addr); unix_release_addr(u->addr);
atomic_long_dec(&unix_nr_socks); atomic_long_dec(&unix_nr_socks);
local_bh_disable();
sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1); sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1);
local_bh_enable();
#ifdef UNIX_REFCNT_DEBUG #ifdef UNIX_REFCNT_DEBUG
pr_debug("UNIX %p is destroyed, %ld are still alive.\n", sk, pr_debug("UNIX %p is destroyed, %ld are still alive.\n", sk,
atomic_long_read(&unix_nr_socks)); atomic_long_read(&unix_nr_socks));
...@@ -889,9 +887,7 @@ static struct sock *unix_create1(struct net *net, struct socket *sock, int kern, ...@@ -889,9 +887,7 @@ static struct sock *unix_create1(struct net *net, struct socket *sock, int kern,
memset(&u->scm_stat, 0, sizeof(struct scm_stat)); memset(&u->scm_stat, 0, sizeof(struct scm_stat));
unix_insert_socket(unix_sockets_unbound(sk), sk); unix_insert_socket(unix_sockets_unbound(sk), sk);
local_bh_disable();
sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1); sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
local_bh_enable();
return sk; return sk;
......
...@@ -794,9 +794,7 @@ static int xsk_release(struct socket *sock) ...@@ -794,9 +794,7 @@ static int xsk_release(struct socket *sock)
sk_del_node_init_rcu(sk); sk_del_node_init_rcu(sk);
mutex_unlock(&net->xdp.lock); mutex_unlock(&net->xdp.lock);
local_bh_disable();
sock_prot_inuse_add(net, sk->sk_prot, -1); sock_prot_inuse_add(net, sk->sk_prot, -1);
local_bh_enable();
xsk_delete_from_maps(xs); xsk_delete_from_maps(xs);
mutex_lock(&xs->mutex); mutex_lock(&xs->mutex);
...@@ -1396,9 +1394,7 @@ static int xsk_create(struct net *net, struct socket *sock, int protocol, ...@@ -1396,9 +1394,7 @@ static int xsk_create(struct net *net, struct socket *sock, int protocol,
sk_add_node_rcu(sk, &net->xdp.list); sk_add_node_rcu(sk, &net->xdp.list);
mutex_unlock(&net->xdp.lock); mutex_unlock(&net->xdp.lock);
local_bh_disable();
sock_prot_inuse_add(net, &xsk_proto, 1); sock_prot_inuse_add(net, &xsk_proto, 1);
local_bh_enable();
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment