forked from Minki/linux
net: Convert pernet_subsys, registered from inet_init()
arp_net_ops just addr/removes /proc entry. devinet_ops allocates and frees duplicate of init_net tables and (un)registers sysctl entries. fib_net_ops allocates and frees pernet tables, creates/destroys netlink socket and (un)initializes /proc entries. Foreign pernet_operations do not touch them. ip_rt_proc_ops only modifies pernet /proc entries. xfrm_net_ops creates/destroys /proc entries, allocates/frees pernet statistics, hashes and tables, and (un)initializes sysctl files. These are not touched by foreigh pernet_operations xfrm4_net_ops allocates/frees private pernet memory, and configures sysctls. sysctl_route_ops creates/destroys sysctls. rt_genid_ops only initializes fields of just allocated net. ipv4_inetpeer_ops allocated/frees net private memory. igmp_net_ops just creates/destroys /proc files and socket, noone else interested in. tcp_sk_ops seems to be safe, because tcp_sk_init() does not depend on any other pernet_operations modifications. Iteration over hash table in inet_twsk_purge() is made under RCU lock, and it's safe to iterate the table this way. Removing from the table happen from inet_twsk_deschedule_put(), but this function is safe without any extern locks, as it's synchronized inside itself. There are many examples, it's used in different context. So, it's safe to leave tcp_sk_exit_batch() unlocked. tcp_net_metrics_ops is synchronized on tcp_metrics_lock and safe. udplite4_net_ops only creates/destroys pernet /proc file. icmp_sk_ops creates percpu sockets, not touched by foreign pernet_operations. ipmr_net_ops creates/destroys pernet fib tables, (un)registers fib rules and /proc files. This seem to be safe to execute in parallel with foreign pernet_operations. af_inet_ops just sets up default parameters of newly created net. ipv4_mib_ops creates and destroys pernet percpu statistics. raw_net_ops, tcp4_net_ops, udp4_net_ops, ping_v4_net_ops and ip_proc_ops only create/destroy pernet /proc files. ip4_frags_ops creates and destroys sysctl file. So, it's safe to make the pernet_operations async. Signed-off-by: Kirill Tkhai <ktkhai@virtuozzo.com> Acked-by: Andrei Vagin <avagin@virtuozzo.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
232cf06c61
commit
f84c6821aa
@ -1735,6 +1735,7 @@ static __net_exit void ipv4_mib_exit_net(struct net *net)
|
||||
static __net_initdata struct pernet_operations ipv4_mib_ops = {
|
||||
.init = ipv4_mib_init_net,
|
||||
.exit = ipv4_mib_exit_net,
|
||||
.async = true,
|
||||
};
|
||||
|
||||
static int __init init_ipv4_mibs(void)
|
||||
@ -1788,6 +1789,7 @@ static __net_exit void inet_exit_net(struct net *net)
|
||||
static __net_initdata struct pernet_operations af_inet_ops = {
|
||||
.init = inet_init_net,
|
||||
.exit = inet_exit_net,
|
||||
.async = true,
|
||||
};
|
||||
|
||||
static int __init init_inet_pernet_ops(void)
|
||||
|
@ -1447,6 +1447,7 @@ static void __net_exit arp_net_exit(struct net *net)
|
||||
static struct pernet_operations arp_net_ops = {
|
||||
.init = arp_net_init,
|
||||
.exit = arp_net_exit,
|
||||
.async = true,
|
||||
};
|
||||
|
||||
static int __init arp_proc_init(void)
|
||||
|
@ -2469,6 +2469,7 @@ static __net_exit void devinet_exit_net(struct net *net)
|
||||
static __net_initdata struct pernet_operations devinet_ops = {
|
||||
.init = devinet_init_net,
|
||||
.exit = devinet_exit_net,
|
||||
.async = true,
|
||||
};
|
||||
|
||||
static struct rtnl_af_ops inet_af_ops __read_mostly = {
|
||||
|
@ -1362,6 +1362,7 @@ static void __net_exit fib_net_exit(struct net *net)
|
||||
static struct pernet_operations fib_net_ops = {
|
||||
.init = fib_net_init,
|
||||
.exit = fib_net_exit,
|
||||
.async = true,
|
||||
};
|
||||
|
||||
void __init ip_fib_init(void)
|
||||
|
@ -1257,6 +1257,7 @@ fail:
|
||||
static struct pernet_operations __net_initdata icmp_sk_ops = {
|
||||
.init = icmp_sk_init,
|
||||
.exit = icmp_sk_exit,
|
||||
.async = true,
|
||||
};
|
||||
|
||||
int __init icmp_init(void)
|
||||
|
@ -3028,6 +3028,7 @@ static void __net_exit igmp_net_exit(struct net *net)
|
||||
static struct pernet_operations igmp_net_ops = {
|
||||
.init = igmp_net_init,
|
||||
.exit = igmp_net_exit,
|
||||
.async = true,
|
||||
};
|
||||
#endif
|
||||
|
||||
|
@ -885,6 +885,7 @@ static void __net_exit ipv4_frags_exit_net(struct net *net)
|
||||
static struct pernet_operations ip4_frags_ops = {
|
||||
.init = ipv4_frags_init_net,
|
||||
.exit = ipv4_frags_exit_net,
|
||||
.async = true,
|
||||
};
|
||||
|
||||
void __init ipfrag_init(void)
|
||||
|
@ -3327,6 +3327,7 @@ static void __net_exit ipmr_net_exit(struct net *net)
|
||||
static struct pernet_operations ipmr_net_ops = {
|
||||
.init = ipmr_net_init,
|
||||
.exit = ipmr_net_exit,
|
||||
.async = true,
|
||||
};
|
||||
|
||||
int __init ip_mr_init(void)
|
||||
|
@ -1204,6 +1204,7 @@ static void __net_exit ping_v4_proc_exit_net(struct net *net)
|
||||
static struct pernet_operations ping_v4_net_ops = {
|
||||
.init = ping_v4_proc_init_net,
|
||||
.exit = ping_v4_proc_exit_net,
|
||||
.async = true,
|
||||
};
|
||||
|
||||
int __init ping_proc_init(void)
|
||||
|
@ -549,6 +549,7 @@ static __net_exit void ip_proc_exit_net(struct net *net)
|
||||
static __net_initdata struct pernet_operations ip_proc_ops = {
|
||||
.init = ip_proc_init_net,
|
||||
.exit = ip_proc_exit_net,
|
||||
.async = true,
|
||||
};
|
||||
|
||||
int __init ip_misc_proc_init(void)
|
||||
|
@ -1156,6 +1156,7 @@ static __net_exit void raw_exit_net(struct net *net)
|
||||
static __net_initdata struct pernet_operations raw_net_ops = {
|
||||
.init = raw_init_net,
|
||||
.exit = raw_exit_net,
|
||||
.async = true,
|
||||
};
|
||||
|
||||
int __init raw_proc_init(void)
|
||||
|
@ -417,6 +417,7 @@ static void __net_exit ip_rt_do_proc_exit(struct net *net)
|
||||
static struct pernet_operations ip_rt_proc_ops __net_initdata = {
|
||||
.init = ip_rt_do_proc_init,
|
||||
.exit = ip_rt_do_proc_exit,
|
||||
.async = true,
|
||||
};
|
||||
|
||||
static int __init ip_rt_proc_init(void)
|
||||
@ -2994,6 +2995,7 @@ static __net_exit void sysctl_route_net_exit(struct net *net)
|
||||
static __net_initdata struct pernet_operations sysctl_route_ops = {
|
||||
.init = sysctl_route_net_init,
|
||||
.exit = sysctl_route_net_exit,
|
||||
.async = true,
|
||||
};
|
||||
#endif
|
||||
|
||||
@ -3007,6 +3009,7 @@ static __net_init int rt_genid_init(struct net *net)
|
||||
|
||||
static __net_initdata struct pernet_operations rt_genid_ops = {
|
||||
.init = rt_genid_init,
|
||||
.async = true,
|
||||
};
|
||||
|
||||
static int __net_init ipv4_inetpeer_init(struct net *net)
|
||||
@ -3032,6 +3035,7 @@ static void __net_exit ipv4_inetpeer_exit(struct net *net)
|
||||
static __net_initdata struct pernet_operations ipv4_inetpeer_ops = {
|
||||
.init = ipv4_inetpeer_init,
|
||||
.exit = ipv4_inetpeer_exit,
|
||||
.async = true,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_IP_ROUTE_CLASSID
|
||||
|
@ -2387,6 +2387,7 @@ static void __net_exit tcp4_proc_exit_net(struct net *net)
|
||||
static struct pernet_operations tcp4_net_ops = {
|
||||
.init = tcp4_proc_init_net,
|
||||
.exit = tcp4_proc_exit_net,
|
||||
.async = true,
|
||||
};
|
||||
|
||||
int __init tcp4_proc_init(void)
|
||||
@ -2573,6 +2574,7 @@ static struct pernet_operations __net_initdata tcp_sk_ops = {
|
||||
.init = tcp_sk_init,
|
||||
.exit = tcp_sk_exit,
|
||||
.exit_batch = tcp_sk_exit_batch,
|
||||
.async = true,
|
||||
};
|
||||
|
||||
void __init tcp_v4_init(void)
|
||||
|
@ -1024,6 +1024,7 @@ static void __net_exit tcp_net_metrics_exit_batch(struct list_head *net_exit_lis
|
||||
static __net_initdata struct pernet_operations tcp_net_metrics_ops = {
|
||||
.init = tcp_net_metrics_init,
|
||||
.exit_batch = tcp_net_metrics_exit_batch,
|
||||
.async = true,
|
||||
};
|
||||
|
||||
void __init tcp_metrics_init(void)
|
||||
|
@ -2757,6 +2757,7 @@ static void __net_exit udp4_proc_exit_net(struct net *net)
|
||||
static struct pernet_operations udp4_net_ops = {
|
||||
.init = udp4_proc_init_net,
|
||||
.exit = udp4_proc_exit_net,
|
||||
.async = true,
|
||||
};
|
||||
|
||||
int __init udp4_proc_init(void)
|
||||
|
@ -104,6 +104,7 @@ static void __net_exit udplite4_proc_exit_net(struct net *net)
|
||||
static struct pernet_operations udplite4_net_ops = {
|
||||
.init = udplite4_proc_init_net,
|
||||
.exit = udplite4_proc_exit_net,
|
||||
.async = true,
|
||||
};
|
||||
|
||||
static __init int udplite4_proc_init(void)
|
||||
|
@ -365,6 +365,7 @@ static void __net_exit xfrm4_net_exit(struct net *net)
|
||||
static struct pernet_operations __net_initdata xfrm4_net_ops = {
|
||||
.init = xfrm4_net_init,
|
||||
.exit = xfrm4_net_exit,
|
||||
.async = true,
|
||||
};
|
||||
|
||||
static void __init xfrm4_policy_init(void)
|
||||
|
@ -2982,6 +2982,7 @@ static void __net_exit xfrm_net_exit(struct net *net)
|
||||
static struct pernet_operations __net_initdata xfrm_net_ops = {
|
||||
.init = xfrm_net_init,
|
||||
.exit = xfrm_net_exit,
|
||||
.async = true,
|
||||
};
|
||||
|
||||
void __init xfrm_init(void)
|
||||
|
Loading…
Reference in New Issue
Block a user