All of lore.kernel.org
 help / color / mirror / Atom feed
* [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

* Re: [PATCH 2/2] move unneeded data to initdata section
       [not found]           ` <20071115184334.GC23914-QabhHTsIXMSnlFQ6Q1D1Y0B+6BGkLq7r@public.gmane.org>
@ 2007-11-15 19:17             ` Denis V. Lunev
  2007-11-15 19:34               ` Sam Ravnborg
  0 siblings, 1 reply; 9+ messages in thread
From: Denis V. Lunev @ 2007-11-15 19:17 UTC (permalink / raw)
  To: Sam Ravnborg
  Cc: netdev-u79uwXL29TY76Z2rM5mHXA, clg-NmTC/0ZBporQT0dZR+AlfA,
	Eric W. Biederman, containers-qjLDD68F18O7TbgM5vRIOg,
	Denis V. Lunev, davem-fT/PcQaiUtIeIZ0/mPfg9Q,
	benjamin.thery-6ktuUTfB/bM

[-- Attachment #1: Type: text/plain, Size: 1089 bytes --]

Sam Ravnborg wrote:
> On Thu, Nov 15, 2007 at 11:19:26AM -0700, Eric W. Biederman wrote:
>> Sam Ravnborg <sam-uyr5N9Q2VtJg9hUCZPvPmw@public.gmane.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..

clear :) I was wrong... Thank you for pointing this out.

will you mind against this?

[-- Attachment #2: 1.diff --]
[-- Type: text/plain, Size: 534 bytes --]

diff --git a/include/net/net_namespace.h b/include/net/net_namespace.h
index 5dd6d90..d136707 100644
--- a/include/net/net_namespace.h
+++ b/include/net/net_namespace.h
@@ -119,10 +119,14 @@ static inline struct net *maybe_get_net(struct net *net)
 #ifdef CONFIG_NET_NS
 #define __net_init
 #define __net_exit
-#define __net_initdata
 #else
 #define __net_init	__init
 #define __net_exit	__exit_refok
+#endif
+
+#if defined(CONFIG_NET_NS) || defined(MODULE)
+#define __net_initdata
+#else
 #define __net_initdata	__initdata
 #endif
 

[-- Attachment #3: Type: text/plain, Size: 206 bytes --]

_______________________________________________
Containers mailing list
Containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org
https://lists.linux-foundation.org/mailman/listinfo/containers

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH 2/2] move unneeded data to initdata section
  2007-11-15 19:17             ` Denis V. Lunev
@ 2007-11-15 19:34               ` Sam Ravnborg
  0 siblings, 0 replies; 9+ messages in thread
From: Sam Ravnborg @ 2007-11-15 19:34 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 10:17:14PM +0300, Denis V. Lunev wrote:
> 
> will you mind against this?

> diff --git a/include/net/net_namespace.h b/include/net/net_namespace.h
> index 5dd6d90..d136707 100644
> --- a/include/net/net_namespace.h
> +++ b/include/net/net_namespace.h
> @@ -119,10 +119,14 @@ static inline struct net *maybe_get_net(struct net *net)
>  #ifdef CONFIG_NET_NS
>  #define __net_init
>  #define __net_exit
> -#define __net_initdata
>  #else
>  #define __net_init	__init
>  #define __net_exit	__exit_refok
> +#endif
> +
> +#if defined(CONFIG_NET_NS) || defined(MODULE)
> +#define __net_initdata
> +#else
>  #define __net_initdata	__initdata
>  #endif
  
n principle I am against this approach.
__initdata is far too overloaded with different stuff.

A much more preferred approach should be to create new sections
named for example .init.data.net and .init.data.net.module

And then in include/asm-generic/vmlinux.lds.h decide the
location of these sections.

On top of this we would have to teach modpost about these new sections.
But the advantage of this approach is that the section mismatch
checks are *independent* of the module being a MODULE or build-in.
The check will still happen.

In this way we avoid the situation where a warning only pops up
in certain configurations.

To do so will obviously require a bit more linker script
consolidation but if you or some else could step in a do this
it would be great!

	Sam

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2007-11-15 19:34 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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.