diff options
author | Pavel Emelyanov <xemul@openvz.org> | 2007-10-08 23:38:39 -0400 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2007-10-10 19:54:58 -0400 |
commit | 4665079cbb2a3e17de82f2ab2940b9f97f37d65e (patch) | |
tree | 8e51e9b9e6155eaeccf28783620a07b20a067d8d /net | |
parent | d62a38d1ab350f787e4941e42a3d3e97971e38f5 (diff) |
[NETNS]: Move some code into __init section when CONFIG_NET_NS=n
With the net namespaces many code leaved the __init section,
thus making the kernel occupy more memory than it did before.
Since we have a config option that prohibits the namespace
creation, the functions that initialize/finalize some netns
stuff are simply not needed and can be freed after the boot.
Currently, this is almost not noticeable, since few calls
are no longer in __init, but when the namespaces will be
merged it will be possible to free more code. I propose to
use the __net_init, __net_exit and __net_initdata "attributes"
for functions/variables that are not used if the CONFIG_NET_NS
is not set to save more space in memory.
The exiting functions cannot just reside in the __exit section,
as noticed by David, since the init section will have
references on it and the compilation will fail due to modpost
checks. These references can exist, since the init namespace
never dies and the exit callbacks are never called. So I
introduce the __exit_refok attribute just like it is already
done with the __init_refok.
Signed-off-by: Pavel Emelyanov <xemul@openvz.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/core/dev.c | 16 | ||||
-rw-r--r-- | net/core/dev_mcast.c | 6 | ||||
-rw-r--r-- | net/netlink/af_netlink.c | 6 |
3 files changed, 14 insertions, 14 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index 1aa07047826e..e7e728aea9f3 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -2611,7 +2611,7 @@ static const struct file_operations ptype_seq_fops = { | |||
2611 | }; | 2611 | }; |
2612 | 2612 | ||
2613 | 2613 | ||
2614 | static int dev_proc_net_init(struct net *net) | 2614 | static int __net_init dev_proc_net_init(struct net *net) |
2615 | { | 2615 | { |
2616 | int rc = -ENOMEM; | 2616 | int rc = -ENOMEM; |
2617 | 2617 | ||
@@ -2636,7 +2636,7 @@ out_dev: | |||
2636 | goto out; | 2636 | goto out; |
2637 | } | 2637 | } |
2638 | 2638 | ||
2639 | static void dev_proc_net_exit(struct net *net) | 2639 | static void __net_exit dev_proc_net_exit(struct net *net) |
2640 | { | 2640 | { |
2641 | wext_proc_exit(net); | 2641 | wext_proc_exit(net); |
2642 | 2642 | ||
@@ -2645,7 +2645,7 @@ static void dev_proc_net_exit(struct net *net) | |||
2645 | proc_net_remove(net, "dev"); | 2645 | proc_net_remove(net, "dev"); |
2646 | } | 2646 | } |
2647 | 2647 | ||
2648 | static struct pernet_operations dev_proc_ops = { | 2648 | static struct pernet_operations __net_initdata dev_proc_ops = { |
2649 | .init = dev_proc_net_init, | 2649 | .init = dev_proc_net_init, |
2650 | .exit = dev_proc_net_exit, | 2650 | .exit = dev_proc_net_exit, |
2651 | }; | 2651 | }; |
@@ -4278,7 +4278,7 @@ static struct hlist_head *netdev_create_hash(void) | |||
4278 | } | 4278 | } |
4279 | 4279 | ||
4280 | /* Initialize per network namespace state */ | 4280 | /* Initialize per network namespace state */ |
4281 | static int netdev_init(struct net *net) | 4281 | static int __net_init netdev_init(struct net *net) |
4282 | { | 4282 | { |
4283 | INIT_LIST_HEAD(&net->dev_base_head); | 4283 | INIT_LIST_HEAD(&net->dev_base_head); |
4284 | rwlock_init(&dev_base_lock); | 4284 | rwlock_init(&dev_base_lock); |
@@ -4299,18 +4299,18 @@ err_name: | |||
4299 | return -ENOMEM; | 4299 | return -ENOMEM; |
4300 | } | 4300 | } |
4301 | 4301 | ||
4302 | static void netdev_exit(struct net *net) | 4302 | static void __net_exit netdev_exit(struct net *net) |
4303 | { | 4303 | { |
4304 | kfree(net->dev_name_head); | 4304 | kfree(net->dev_name_head); |
4305 | kfree(net->dev_index_head); | 4305 | kfree(net->dev_index_head); |
4306 | } | 4306 | } |
4307 | 4307 | ||
4308 | static struct pernet_operations netdev_net_ops = { | 4308 | static struct pernet_operations __net_initdata netdev_net_ops = { |
4309 | .init = netdev_init, | 4309 | .init = netdev_init, |
4310 | .exit = netdev_exit, | 4310 | .exit = netdev_exit, |
4311 | }; | 4311 | }; |
4312 | 4312 | ||
4313 | static void default_device_exit(struct net *net) | 4313 | static void __net_exit default_device_exit(struct net *net) |
4314 | { | 4314 | { |
4315 | struct net_device *dev, *next; | 4315 | struct net_device *dev, *next; |
4316 | /* | 4316 | /* |
@@ -4336,7 +4336,7 @@ static void default_device_exit(struct net *net) | |||
4336 | rtnl_unlock(); | 4336 | rtnl_unlock(); |
4337 | } | 4337 | } |
4338 | 4338 | ||
4339 | static struct pernet_operations default_device_ops = { | 4339 | static struct pernet_operations __net_initdata default_device_ops = { |
4340 | .exit = default_device_exit, | 4340 | .exit = default_device_exit, |
4341 | }; | 4341 | }; |
4342 | 4342 | ||
diff --git a/net/core/dev_mcast.c b/net/core/dev_mcast.c index 896b0ca5aed7..15241cf48af8 100644 --- a/net/core/dev_mcast.c +++ b/net/core/dev_mcast.c | |||
@@ -273,19 +273,19 @@ static const struct file_operations dev_mc_seq_fops = { | |||
273 | 273 | ||
274 | #endif | 274 | #endif |
275 | 275 | ||
276 | static int dev_mc_net_init(struct net *net) | 276 | static int __net_init dev_mc_net_init(struct net *net) |
277 | { | 277 | { |
278 | if (!proc_net_fops_create(net, "dev_mcast", 0, &dev_mc_seq_fops)) | 278 | if (!proc_net_fops_create(net, "dev_mcast", 0, &dev_mc_seq_fops)) |
279 | return -ENOMEM; | 279 | return -ENOMEM; |
280 | return 0; | 280 | return 0; |
281 | } | 281 | } |
282 | 282 | ||
283 | static void dev_mc_net_exit(struct net *net) | 283 | static void __net_exit dev_mc_net_exit(struct net *net) |
284 | { | 284 | { |
285 | proc_net_remove(net, "dev_mcast"); | 285 | proc_net_remove(net, "dev_mcast"); |
286 | } | 286 | } |
287 | 287 | ||
288 | static struct pernet_operations dev_mc_net_ops = { | 288 | static struct pernet_operations __net_initdata dev_mc_net_ops = { |
289 | .init = dev_mc_net_init, | 289 | .init = dev_mc_net_init, |
290 | .exit = dev_mc_net_exit, | 290 | .exit = dev_mc_net_exit, |
291 | }; | 291 | }; |
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 46eb5ea1fbd7..3ef32825da71 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c | |||
@@ -1924,7 +1924,7 @@ static struct net_proto_family netlink_family_ops = { | |||
1924 | .owner = THIS_MODULE, /* for consistency 8) */ | 1924 | .owner = THIS_MODULE, /* for consistency 8) */ |
1925 | }; | 1925 | }; |
1926 | 1926 | ||
1927 | static int netlink_net_init(struct net *net) | 1927 | static int __net_init netlink_net_init(struct net *net) |
1928 | { | 1928 | { |
1929 | #ifdef CONFIG_PROC_FS | 1929 | #ifdef CONFIG_PROC_FS |
1930 | if (!proc_net_fops_create(net, "netlink", 0, &netlink_seq_fops)) | 1930 | if (!proc_net_fops_create(net, "netlink", 0, &netlink_seq_fops)) |
@@ -1933,14 +1933,14 @@ static int netlink_net_init(struct net *net) | |||
1933 | return 0; | 1933 | return 0; |
1934 | } | 1934 | } |
1935 | 1935 | ||
1936 | static void netlink_net_exit(struct net *net) | 1936 | static void __net_exit netlink_net_exit(struct net *net) |
1937 | { | 1937 | { |
1938 | #ifdef CONFIG_PROC_FS | 1938 | #ifdef CONFIG_PROC_FS |
1939 | proc_net_remove(net, "netlink"); | 1939 | proc_net_remove(net, "netlink"); |
1940 | #endif | 1940 | #endif |
1941 | } | 1941 | } |
1942 | 1942 | ||
1943 | static struct pernet_operations netlink_net_ops = { | 1943 | static struct pernet_operations __net_initdata netlink_net_ops = { |
1944 | .init = netlink_net_init, | 1944 | .init = netlink_net_init, |
1945 | .exit = netlink_net_exit, | 1945 | .exit = netlink_net_exit, |
1946 | }; | 1946 | }; |