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 /include | |
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 'include')
-rw-r--r-- | include/linux/init.h | 1 | ||||
-rw-r--r-- | include/net/net_namespace.h | 9 |
2 files changed, 10 insertions, 0 deletions
diff --git a/include/linux/init.h b/include/linux/init.h index 74b1f43bf982..f8d9d0b5cffc 100644 --- a/include/linux/init.h +++ b/include/linux/init.h | |||
@@ -57,6 +57,7 @@ | |||
57 | * The markers follow same syntax rules as __init / __initdata. */ | 57 | * The markers follow same syntax rules as __init / __initdata. */ |
58 | #define __init_refok noinline __attribute__ ((__section__ (".text.init.refok"))) | 58 | #define __init_refok noinline __attribute__ ((__section__ (".text.init.refok"))) |
59 | #define __initdata_refok __attribute__ ((__section__ (".data.init.refok"))) | 59 | #define __initdata_refok __attribute__ ((__section__ (".data.init.refok"))) |
60 | #define __exit_refok noinline __attribute__ ((__section__ (".exit.text.refok"))) | ||
60 | 61 | ||
61 | #ifdef MODULE | 62 | #ifdef MODULE |
62 | #define __exit __attribute__ ((__section__(".exit.text"))) __cold | 63 | #define __exit __attribute__ ((__section__(".exit.text"))) __cold |
diff --git a/include/net/net_namespace.h b/include/net/net_namespace.h index 934c840b5941..93aa87d32804 100644 --- a/include/net/net_namespace.h +++ b/include/net/net_namespace.h | |||
@@ -99,6 +99,15 @@ static inline void release_net(struct net *net) | |||
99 | #define for_each_net(VAR) \ | 99 | #define for_each_net(VAR) \ |
100 | list_for_each_entry(VAR, &net_namespace_list, list) | 100 | list_for_each_entry(VAR, &net_namespace_list, list) |
101 | 101 | ||
102 | #ifdef CONFIG_NET_NS | ||
103 | #define __net_init | ||
104 | #define __net_exit | ||
105 | #define __net_initdata | ||
106 | #else | ||
107 | #define __net_init __init | ||
108 | #define __net_exit __exit_refok | ||
109 | #define __net_initdata __initdata | ||
110 | #endif | ||
102 | 111 | ||
103 | struct pernet_operations { | 112 | struct pernet_operations { |
104 | struct list_head list; | 113 | struct list_head list; |