* [PATCH 2/2] move unneeded data to initdata section
@ 2007-11-07 12:01 Denis V. Lunev
2007-11-13 11:24 ` David Miller
2007-11-15 14:32 ` Eric W. Biederman
0 siblings, 2 replies; 9+ messages in thread
From: Denis V. Lunev @ 2007-11-07 12:01 UTC (permalink / raw)
To: davem; +Cc: devel, containers, netdev, clg, benjamin.thery
This patch reverts Eric's commit 2b008b0a8e96b726c603c5e1a5a7a509b5f61e35
It diets .text & .data section of the kernel if CONFIG_NET_NS is not set.
This is safe after list operations cleanup.
Signed-of-by: Denis V. Lunev <den@openvz.org>
--- ./drivers/net/loopback.c.reversed 2007-10-30 14:45:07.000000000 +0300
+++ ./drivers/net/loopback.c 2007-11-01 17:30:55.000000000 +0300
@@ -284,7 +284,7 @@ static __net_exit void loopback_net_exit
unregister_netdev(dev);
}
-static struct pernet_operations loopback_net_ops = {
+static struct pernet_operations __net_initdata loopback_net_ops = {
.init = loopback_net_init,
.exit = loopback_net_exit,
};
--- ./fs/proc/proc_net.c.reversed 2007-10-30 14:45:07.000000000 +0300
+++ ./fs/proc/proc_net.c 2007-11-01 17:30:57.000000000 +0300
@@ -185,7 +185,7 @@ static __net_exit void proc_net_ns_exit(
kfree(net->proc_net_root);
}
-static struct pernet_operations proc_net_ns_ops = {
+static struct pernet_operations __net_initdata proc_net_ns_ops = {
.init = proc_net_ns_init,
.exit = proc_net_ns_exit,
};
--- ./include/net/net_namespace.h.reversed 2007-10-30 14:45:07.000000000 +0300
+++ ./include/net/net_namespace.h 2007-11-01 17:30:58.000000000 +0300
@@ -102,9 +102,11 @@ static inline void release_net(struct ne
#ifdef CONFIG_NET_NS
#define __net_init
#define __net_exit
+#define __net_initdata
#else
#define __net_init __init
#define __net_exit __exit_refok
+#define __net_initdata __initdata
#endif
struct pernet_operations {
--- ./net/core/dev.c.reversed 2007-10-30 14:45:08.000000000 +0300
+++ ./net/core/dev.c 2007-11-01 17:30:58.000000000 +0300
@@ -2676,7 +2676,7 @@ static void __net_exit dev_proc_net_exit
proc_net_remove(net, "dev");
}
-static struct pernet_operations dev_proc_ops = {
+static struct pernet_operations __net_initdata dev_proc_ops = {
.init = dev_proc_net_init,
.exit = dev_proc_net_exit,
};
@@ -4336,7 +4336,7 @@ static void __net_exit netdev_exit(struc
kfree(net->dev_index_head);
}
-static struct pernet_operations netdev_net_ops = {
+static struct pernet_operations __net_initdata netdev_net_ops = {
.init = netdev_init,
.exit = netdev_exit,
};
@@ -4367,7 +4367,7 @@ static void __net_exit default_device_ex
rtnl_unlock();
}
-static struct pernet_operations default_device_ops = {
+static struct pernet_operations __net_initdata default_device_ops = {
.exit = default_device_exit,
};
--- ./net/core/dev_mcast.c.reversed 2007-10-30 14:45:08.000000000 +0300
+++ ./net/core/dev_mcast.c 2007-11-01 17:31:00.000000000 +0300
@@ -285,7 +285,7 @@ static void __net_exit dev_mc_net_exit(s
proc_net_remove(net, "dev_mcast");
}
-static struct pernet_operations dev_mc_net_ops = {
+static struct pernet_operations __net_initdata dev_mc_net_ops = {
.init = dev_mc_net_init,
.exit = dev_mc_net_exit,
};
--- ./net/netlink/af_netlink.c.reversed 2007-10-30 14:45:08.000000000 +0300
+++ ./net/netlink/af_netlink.c 2007-11-01 17:31:01.000000000 +0300
@@ -1888,7 +1888,7 @@ static void __net_exit netlink_net_exit(
#endif
}
-static struct pernet_operations netlink_net_ops = {
+static struct pernet_operations __net_initdata netlink_net_ops = {
.init = netlink_net_init,
.exit = netlink_net_exit,
};
^ permalink raw reply [flat|nested] 9+ messages in thread* Re: [PATCH 2/2] move unneeded data to initdata section
2007-11-07 12:01 [PATCH 2/2] move unneeded data to initdata section Denis V. Lunev
@ 2007-11-13 11:24 ` David Miller
2007-11-15 14:32 ` Eric W. Biederman
1 sibling, 0 replies; 9+ messages in thread
From: David Miller @ 2007-11-13 11:24 UTC (permalink / raw)
To: den; +Cc: devel, containers, netdev, clg, benjamin.thery
From: "Denis V. Lunev" <den@openvz.org>
Date: Wed, 7 Nov 2007 15:01:00 +0300
> This patch reverts Eric's commit 2b008b0a8e96b726c603c5e1a5a7a509b5f61e35
>
> It diets .text & .data section of the kernel if CONFIG_NET_NS is not set.
> This is safe after list operations cleanup.
>
> Signed-of-by: Denis V. Lunev <den@openvz.org>
Applied, thanks Denis.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/2] move unneeded data to initdata section
2007-11-07 12:01 [PATCH 2/2] move unneeded data to initdata section Denis V. Lunev
2007-11-13 11:24 ` David Miller
@ 2007-11-15 14:32 ` Eric W. Biederman
2007-11-15 14:42 ` Denis V. Lunev
1 sibling, 1 reply; 9+ messages in thread
From: Eric W. Biederman @ 2007-11-15 14:32 UTC (permalink / raw)
To: Denis V. Lunev; +Cc: davem, containers, netdev, clg, benjamin.thery
"Denis V. Lunev" <den@openvz.org> writes:
> This patch reverts Eric's commit 2b008b0a8e96b726c603c5e1a5a7a509b5f61e35
>
> It diets .text & .data section of the kernel if CONFIG_NET_NS is not set.
> This is safe after list operations cleanup.
Ok. This patch is technically safe because none of the touched
code can live in a module and so we never touch the exit code path.
However in the general case and as a code idiom this __net_initdata
on struct pernet_operations is fundamentally horribly broken.
Look at what happens if we use this idiom in module. There
is only one definition of __initdata ".init.data". The module
loader places all sections that begin with .init in a region of
memory that will be discarded after module initialization.
So in register_pernet_operations we pass in the a pointer to struct
pernet_operations and call the init method. Later when we remove the
module we again pass in the pointer to struct pernet_operations which
lived in an init section so it has been discarded. We dereference
that pointer to find the exit method and KABOOM!!!!
So I'm still opposed to __net_initdata on the grounds that at best
it is like putting our head under a guillotine and reaching up and
sawing at the row that holds the blade up with a pocket knife. It is
a think rope and a puny knife so you are safe for a while....
Eric
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/2] move unneeded data to initdata section
2007-11-15 14:32 ` Eric W. Biederman
@ 2007-11-15 14:42 ` Denis V. Lunev
2007-11-15 15:14 ` Sam Ravnborg
0 siblings, 1 reply; 9+ messages in thread
From: Denis V. Lunev @ 2007-11-15 14:42 UTC (permalink / raw)
To: Eric W. Biederman
Cc: Denis V. Lunev, davem, containers, netdev, clg, benjamin.thery
Eric W. Biederman wrote:
> "Denis V. Lunev" <den@openvz.org> writes:
>
>> This patch reverts Eric's commit 2b008b0a8e96b726c603c5e1a5a7a509b5f61e35
>>
>> It diets .text & .data section of the kernel if CONFIG_NET_NS is not set.
>> This is safe after list operations cleanup.
>
> Ok. This patch is technically safe because none of the touched
> code can live in a module and so we never touch the exit code path.
>
> However in the general case and as a code idiom this __net_initdata
> on struct pernet_operations is fundamentally horribly broken.
>
> Look at what happens if we use this idiom in module. There
> is only one definition of __initdata ".init.data". The module
> loader places all sections that begin with .init in a region of
> memory that will be discarded after module initialization.
nothing is discarded after module load. Though, I can be wrong. Could
you point me to the exact place?
Regards,
Den
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/2] move unneeded data to initdata section
2007-11-15 14:42 ` Denis V. Lunev
@ 2007-11-15 15:14 ` Sam Ravnborg
2007-11-15 18:19 ` Eric W. Biederman
0 siblings, 1 reply; 9+ messages in thread
From: Sam Ravnborg @ 2007-11-15 15:14 UTC (permalink / raw)
To: Denis V. Lunev
Cc: Eric W. Biederman, Denis V. Lunev, davem, containers, netdev, clg,
benjamin.thery
On Thu, Nov 15, 2007 at 05:42:04PM +0300, Denis V. Lunev wrote:
> Eric W. Biederman wrote:
> > "Denis V. Lunev" <den@openvz.org> writes:
> >
> >> This patch reverts Eric's commit 2b008b0a8e96b726c603c5e1a5a7a509b5f61e35
> >>
> >> It diets .text & .data section of the kernel if CONFIG_NET_NS is not set.
> >> This is safe after list operations cleanup.
> >
> > Ok. This patch is technically safe because none of the touched
> > code can live in a module and so we never touch the exit code path.
> >
> > However in the general case and as a code idiom this __net_initdata
> > on struct pernet_operations is fundamentally horribly broken.
> >
> > Look at what happens if we use this idiom in module. There
> > is only one definition of __initdata ".init.data". The module
> > loader places all sections that begin with .init in a region of
> > memory that will be discarded after module initialization.
>
> nothing is discarded after module load. Though, I can be wrong. Could
> you point me to the exact place?
If __initdata is not discarded after module load then we should do it.
There is no reason to waste __initdata RAM when the module is loaded.
Sam
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/2] move unneeded data to initdata section
2007-11-15 15:14 ` Sam Ravnborg
@ 2007-11-15 18:19 ` Eric W. Biederman
2007-11-15 18:43 ` Sam Ravnborg
0 siblings, 1 reply; 9+ messages in thread
From: Eric W. Biederman @ 2007-11-15 18:19 UTC (permalink / raw)
To: Sam Ravnborg
Cc: Denis V. Lunev, Denis V. Lunev, davem, containers, netdev, clg,
benjamin.thery
Sam Ravnborg <sam@ravnborg.org> writes:
> On Thu, Nov 15, 2007 at 05:42:04PM +0300, Denis V. Lunev wrote:
>>
>> nothing is discarded after module load. Though, I can be wrong. Could
>> you point me to the exact place?
> If __initdata is not discarded after module load then we should do it.
> There is no reason to waste __initdata RAM when the module is loaded.
Down at the bottom of sys_init_module we have:
/* Drop initial reference. */
module_put(mod);
unwind_remove_table(mod->unwind_info, 1);
module_free(mod, mod->module_init);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
mod->module_init = NULL;
mod->init_size = 0;
mod->init_text_size = 0;
mutex_unlock(&module_mutex);
return 0;
Which frees the memory for the .init sections.
Eric
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/2] move unneeded data to initdata section
2007-11-15 18:19 ` Eric W. Biederman
@ 2007-11-15 18:43 ` Sam Ravnborg
[not found] ` <20071115184334.GC23914-QabhHTsIXMSnlFQ6Q1D1Y0B+6BGkLq7r@public.gmane.org>
0 siblings, 1 reply; 9+ messages in thread
From: Sam Ravnborg @ 2007-11-15 18:43 UTC (permalink / raw)
To: Eric W. Biederman
Cc: Denis V. Lunev, Denis V. Lunev, davem, containers, netdev, clg,
benjamin.thery
On Thu, Nov 15, 2007 at 11:19:26AM -0700, Eric W. Biederman wrote:
> Sam Ravnborg <sam@ravnborg.org> writes:
>
> > On Thu, Nov 15, 2007 at 05:42:04PM +0300, Denis V. Lunev wrote:
> >>
> >> nothing is discarded after module load. Though, I can be wrong. Could
> >> you point me to the exact place?
> > If __initdata is not discarded after module load then we should do it.
> > There is no reason to waste __initdata RAM when the module is loaded.
>
> Down at the bottom of sys_init_module we have:
>
> /* Drop initial reference. */
> module_put(mod);
> unwind_remove_table(mod->unwind_info, 1);
>
> module_free(mod, mod->module_init);
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> mod->module_init = NULL;
> mod->init_size = 0;
> mod->init_text_size = 0;
> mutex_unlock(&module_mutex);
>
> return 0;
>
> Which frees the memory for the .init sections.
Thanks for clarifying this Eric - should have looked myself..
Sam
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2007-11-15 19:32 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-11-07 12:01 [PATCH 2/2] move unneeded data to initdata section Denis V. Lunev
2007-11-13 11:24 ` David Miller
2007-11-15 14:32 ` Eric W. Biederman
2007-11-15 14:42 ` Denis V. Lunev
2007-11-15 15:14 ` Sam Ravnborg
2007-11-15 18:19 ` Eric W. Biederman
2007-11-15 18:43 ` Sam Ravnborg
[not found] ` <20071115184334.GC23914-QabhHTsIXMSnlFQ6Q1D1Y0B+6BGkLq7r@public.gmane.org>
2007-11-15 19:17 ` Denis V. Lunev
2007-11-15 19:34 ` Sam Ravnborg
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).