linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/4] kernel: constructor support
@ 2009-02-03 12:46 Peter Oberparleiter
  2009-02-04  2:54 ` Rusty Russell
  0 siblings, 1 reply; 22+ messages in thread
From: Peter Oberparleiter @ 2009-02-03 12:46 UTC (permalink / raw)
  To: linux-kernel
  Cc: Andrew Morton, Andi Kleen, Huang Ying, Sam Ravnborg,
	Rusty Russell, Jeff Dike

From: Peter Oberparleiter <oberpar@linux.vnet.ibm.com>

Call constructors (gcc-generated initcall-like functions) during
kernel start and module load. Constructors are e.g. used for gcov data
initialization.

Disable constructor support for usermode Linux to prevent conflicts
with the host glibc.

Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com>

---
 include/asm-generic/vmlinux.lds.h |   11 ++++++++++-
 include/linux/init.h              |    2 ++
 include/linux/module.h            |    6 ++++++
 init/Kconfig                      |    5 +++++
 init/main.c                       |   13 +++++++++++++
 kernel/module.c                   |   16 ++++++++++++++++
 6 files changed, 52 insertions(+), 1 deletion(-)

Index: linux-2.6.29-rc3/include/asm-generic/vmlinux.lds.h
===================================================================
--- linux-2.6.29-rc3.orig/include/asm-generic/vmlinux.lds.h
+++ linux-2.6.29-rc3/include/asm-generic/vmlinux.lds.h
@@ -301,6 +301,14 @@
 /* Section used for early init (in .S files) */
 #define HEAD_TEXT  *(.head.text)
 
+#ifdef CONFIG_CONSTRUCTORS
+#define KERNEL_CTORS()	VMLINUX_SYMBOL(__ctors_start) = .; \
+			*(.ctors)			   \
+			VMLINUX_SYMBOL(__ctors_end) = .;
+#else
+#define KERNEL_CTORS()
+#endif
+
 /* init and exit section handling */
 #define INIT_DATA							\
 	*(.init.data)							\
@@ -317,7 +325,8 @@
 	. = ALIGN(8);							\
 	VMLINUX_SYMBOL(__start___verbose) = .;                          \
 	*(__verbose)                                                    \
-	VMLINUX_SYMBOL(__stop___verbose) = .;
+	VMLINUX_SYMBOL(__stop___verbose) = .;				\
+	KERNEL_CTORS()
 
 #define INIT_TEXT							\
 	*(.init.text)							\
Index: linux-2.6.29-rc3/include/linux/init.h
===================================================================
--- linux-2.6.29-rc3.orig/include/linux/init.h
+++ linux-2.6.29-rc3/include/linux/init.h
@@ -142,6 +142,8 @@ typedef void (*exitcall_t)(void);
 extern initcall_t __con_initcall_start[], __con_initcall_end[];
 extern initcall_t __security_initcall_start[], __security_initcall_end[];
 
+typedef void (*ctorcall_t)(void);
+
 /* Defined in init/main.c */
 extern int do_one_initcall(initcall_t fn);
 extern char __initdata boot_command_line[];
Index: linux-2.6.29-rc3/include/linux/module.h
===================================================================
--- linux-2.6.29-rc3.orig/include/linux/module.h
+++ linux-2.6.29-rc3/include/linux/module.h
@@ -347,6 +347,12 @@ struct module
 	/* Reference counts */
 	struct module_ref ref[NR_CPUS];
 #endif
+
+#ifdef CONFIG_CONSTRUCTORS
+	/* Constructor functions. */
+	ctorcall_t *ctors;
+	unsigned int num_ctors;
+#endif
 };
 #ifndef MODULE_ARCH_INIT
 #define MODULE_ARCH_INIT {}
Index: linux-2.6.29-rc3/init/main.c
===================================================================
--- linux-2.6.29-rc3.orig/init/main.c
+++ linux-2.6.29-rc3/init/main.c
@@ -686,6 +686,18 @@ asmlinkage void __init start_kernel(void
 	rest_init();
 }
 
+/* Call all constructor functions linked into the kernel. */
+static void __init do_ctors(void)
+{
+#ifdef CONFIG_CONSTRUCTORS
+	extern ctorcall_t __ctors_start[], __ctors_end[];
+	ctorcall_t *call;
+
+	for (call = __ctors_start; call < __ctors_end; call++)
+		(*call)();
+#endif
+}
+
 int initcall_debug;
 core_param(initcall_debug, initcall_debug, bool, 0644);
 
@@ -765,6 +777,7 @@ static void __init do_basic_setup(void)
 	usermodehelper_init();
 	driver_init();
 	init_irq_proc();
+	do_ctors();
 	do_initcalls();
 }
 
Index: linux-2.6.29-rc3/kernel/module.c
===================================================================
--- linux-2.6.29-rc3.orig/kernel/module.c
+++ linux-2.6.29-rc3/kernel/module.c
@@ -2145,6 +2145,10 @@ static noinline struct module *load_modu
 					sizeof(*mod->tracepoints),
 					&mod->num_tracepoints);
 #endif
+#ifdef CONFIG_CONSTRUCTORS
+	mod->ctors = section_objs(hdr, sechdrs, secstrings, "ctors",
+				  sizeof(*mod->ctors), &mod->num_ctors);
+#endif
 
 #ifdef CONFIG_MODVERSIONS
 	if ((mod->num_syms && !mod->crcs)
@@ -2295,6 +2299,17 @@ static noinline struct module *load_modu
 	goto free_hdr;
 }
 
+/* Call module constructors. */
+static void do_mod_ctors(struct module *mod)
+{
+#ifdef CONFIG_CONSTRUCTORS
+	unsigned long i;
+
+	for (i = 0; i < mod->num_ctors; i++)
+		mod->ctors[i]();
+#endif
+}
+
 /* This is where the real work happens */
 SYSCALL_DEFINE3(init_module, void __user *, umod,
 		unsigned long, len, const char __user *, uargs)
@@ -2323,6 +2338,7 @@ SYSCALL_DEFINE3(init_module, void __user
 	blocking_notifier_call_chain(&module_notify_list,
 			MODULE_STATE_COMING, mod);
 
+	do_mod_ctors(mod);
 	/* Start the module */
 	if (mod->init != NULL)
 		ret = do_one_initcall(mod->init);
Index: linux-2.6.29-rc3/init/Kconfig
===================================================================
--- linux-2.6.29-rc3.orig/init/Kconfig
+++ linux-2.6.29-rc3/init/Kconfig
@@ -16,6 +16,11 @@ config DEFCONFIG_LIST
 	default "$ARCH_DEFCONFIG"
 	default "arch/$ARCH/defconfig"
 
+config CONSTRUCTORS
+	bool
+	depends on !UML
+	default y
+
 menu "General setup"
 
 config EXPERIMENTAL





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

* Re: [PATCH 1/4] kernel: constructor support
  2009-02-03 12:46 [PATCH 1/4] kernel: constructor support Peter Oberparleiter
@ 2009-02-04  2:54 ` Rusty Russell
  2009-02-04 15:05   ` Peter Oberparleiter
  0 siblings, 1 reply; 22+ messages in thread
From: Rusty Russell @ 2009-02-04  2:54 UTC (permalink / raw)
  To: Peter Oberparleiter
  Cc: linux-kernel, Andrew Morton, Andi Kleen, Huang Ying, Sam Ravnborg,
	Jeff Dike

On Tuesday 03 February 2009 23:16:33 Peter Oberparleiter wrote:
> From: Peter Oberparleiter <oberpar@linux.vnet.ibm.com>
> 
> Call constructors (gcc-generated initcall-like functions) during
> kernel start and module load. Constructors are e.g. used for gcov data
> initialization.
...
> +#ifdef CONFIG_CONSTRUCTORS
> +	mod->ctors = section_objs(hdr, sechdrs, secstrings, "ctors",
> +				  sizeof(*mod->ctors), &mod->num_ctors);
> +#endif

This looks horribly like untested code: shouldn't that be ".ctors"?

Rusty.

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

* Re: [PATCH 1/4] kernel: constructor support
  2009-02-04  2:54 ` Rusty Russell
@ 2009-02-04 15:05   ` Peter Oberparleiter
  2009-02-04 23:23     ` Rusty Russell
  0 siblings, 1 reply; 22+ messages in thread
From: Peter Oberparleiter @ 2009-02-04 15:05 UTC (permalink / raw)
  To: Rusty Russell
  Cc: linux-kernel, Andrew Morton, Andi Kleen, Huang Ying, Sam Ravnborg,
	Jeff Dike

Rusty Russell wrote:
> On Tuesday 03 February 2009 23:16:33 Peter Oberparleiter wrote:
>> +#ifdef CONFIG_CONSTRUCTORS
>> +	mod->ctors = section_objs(hdr, sechdrs, secstrings, "ctors",
>> +				  sizeof(*mod->ctors), &mod->num_ctors);
>> +#endif
> 
> This looks horribly like untested code: shouldn't that be ".ctors"?

You're right - this must have slipped in with last minute changes.
Sorry about that. See fixed patch below (tested successfully with
modules on s390).

From: Peter Oberparleiter <oberpar@linux.vnet.ibm.com>

Call constructors (gcc-generated initcall-like functions) during
kernel start and module load. Constructors are e.g. used for gcov data
initialization.

Disable constructor support for usermode Linux to prevent conflicts
with host glibc.

Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com>

---
 include/asm-generic/vmlinux.lds.h |   11 ++++++++++-
 include/linux/init.h              |    2 ++
 include/linux/module.h            |    6 ++++++
 init/Kconfig                      |    5 +++++
 init/main.c                       |   13 +++++++++++++
 kernel/module.c                   |   16 ++++++++++++++++
 6 files changed, 52 insertions(+), 1 deletion(-)

Index: linux-2.6.29-rc3/include/asm-generic/vmlinux.lds.h
===================================================================
--- linux-2.6.29-rc3.orig/include/asm-generic/vmlinux.lds.h
+++ linux-2.6.29-rc3/include/asm-generic/vmlinux.lds.h
@@ -301,6 +301,14 @@
 /* Section used for early init (in .S files) */
 #define HEAD_TEXT  *(.head.text)
 
+#ifdef CONFIG_CONSTRUCTORS
+#define KERNEL_CTORS()	VMLINUX_SYMBOL(__ctors_start) = .; \
+			*(.ctors)			   \
+			VMLINUX_SYMBOL(__ctors_end) = .;
+#else
+#define KERNEL_CTORS()
+#endif
+
 /* init and exit section handling */
 #define INIT_DATA							\
 	*(.init.data)							\
@@ -317,7 +325,8 @@
 	. = ALIGN(8);							\
 	VMLINUX_SYMBOL(__start___verbose) = .;                          \
 	*(__verbose)                                                    \
-	VMLINUX_SYMBOL(__stop___verbose) = .;
+	VMLINUX_SYMBOL(__stop___verbose) = .;				\
+	KERNEL_CTORS()
 
 #define INIT_TEXT							\
 	*(.init.text)							\
Index: linux-2.6.29-rc3/include/linux/init.h
===================================================================
--- linux-2.6.29-rc3.orig/include/linux/init.h
+++ linux-2.6.29-rc3/include/linux/init.h
@@ -142,6 +142,8 @@ typedef void (*exitcall_t)(void);
 extern initcall_t __con_initcall_start[], __con_initcall_end[];
 extern initcall_t __security_initcall_start[], __security_initcall_end[];
 
+typedef void (*ctorcall_t)(void);
+
 /* Defined in init/main.c */
 extern int do_one_initcall(initcall_t fn);
 extern char __initdata boot_command_line[];
Index: linux-2.6.29-rc3/include/linux/module.h
===================================================================
--- linux-2.6.29-rc3.orig/include/linux/module.h
+++ linux-2.6.29-rc3/include/linux/module.h
@@ -347,6 +347,12 @@ struct module
 	/* Reference counts */
 	struct module_ref ref[NR_CPUS];
 #endif
+
+#ifdef CONFIG_CONSTRUCTORS
+	/* Constructor functions. */
+	ctorcall_t *ctors;
+	unsigned int num_ctors;
+#endif
 };
 #ifndef MODULE_ARCH_INIT
 #define MODULE_ARCH_INIT {}
Index: linux-2.6.29-rc3/init/main.c
===================================================================
--- linux-2.6.29-rc3.orig/init/main.c
+++ linux-2.6.29-rc3/init/main.c
@@ -686,6 +686,18 @@ asmlinkage void __init start_kernel(void
 	rest_init();
 }
 
+/* Call all constructor functions linked into the kernel. */
+static void __init do_ctors(void)
+{
+#ifdef CONFIG_CONSTRUCTORS
+	extern ctorcall_t __ctors_start[], __ctors_end[];
+	ctorcall_t *call;
+
+	for (call = __ctors_start; call < __ctors_end; call++)
+		(*call)();
+#endif
+}
+
 int initcall_debug;
 core_param(initcall_debug, initcall_debug, bool, 0644);
 
@@ -765,6 +777,7 @@ static void __init do_basic_setup(void)
 	usermodehelper_init();
 	driver_init();
 	init_irq_proc();
+	do_ctors();
 	do_initcalls();
 }
 
Index: linux-2.6.29-rc3/kernel/module.c
===================================================================
--- linux-2.6.29-rc3.orig/kernel/module.c
+++ linux-2.6.29-rc3/kernel/module.c
@@ -2145,6 +2145,10 @@ static noinline struct module *load_modu
 					sizeof(*mod->tracepoints),
 					&mod->num_tracepoints);
 #endif
+#ifdef CONFIG_CONSTRUCTORS
+	mod->ctors = section_objs(hdr, sechdrs, secstrings, ".ctors",
+				  sizeof(*mod->ctors), &mod->num_ctors);
+#endif
 
 #ifdef CONFIG_MODVERSIONS
 	if ((mod->num_syms && !mod->crcs)
@@ -2295,6 +2299,17 @@ static noinline struct module *load_modu
 	goto free_hdr;
 }
 
+/* Call module constructors. */
+static void do_mod_ctors(struct module *mod)
+{
+#ifdef CONFIG_CONSTRUCTORS
+	unsigned long i;
+
+	for (i = 0; i < mod->num_ctors; i++)
+		mod->ctors[i]();
+#endif
+}
+
 /* This is where the real work happens */
 SYSCALL_DEFINE3(init_module, void __user *, umod,
 		unsigned long, len, const char __user *, uargs)
@@ -2323,6 +2338,7 @@ SYSCALL_DEFINE3(init_module, void __user
 	blocking_notifier_call_chain(&module_notify_list,
 			MODULE_STATE_COMING, mod);
 
+	do_mod_ctors(mod);
 	/* Start the module */
 	if (mod->init != NULL)
 		ret = do_one_initcall(mod->init);
Index: linux-2.6.29-rc3/init/Kconfig
===================================================================
--- linux-2.6.29-rc3.orig/init/Kconfig
+++ linux-2.6.29-rc3/init/Kconfig
@@ -16,6 +16,11 @@ config DEFCONFIG_LIST
 	default "$ARCH_DEFCONFIG"
 	default "arch/$ARCH/defconfig"
 
+config CONSTRUCTORS
+	bool
+	depends on !UML
+	default y
+
 menu "General setup"
 
 config EXPERIMENTAL


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

* Re: [PATCH 1/4] kernel: constructor support
  2009-02-04 15:05   ` Peter Oberparleiter
@ 2009-02-04 23:23     ` Rusty Russell
  0 siblings, 0 replies; 22+ messages in thread
From: Rusty Russell @ 2009-02-04 23:23 UTC (permalink / raw)
  To: Peter Oberparleiter
  Cc: linux-kernel, Andrew Morton, Andi Kleen, Huang Ying, Sam Ravnborg,
	Jeff Dike

On Thursday 05 February 2009 01:35:49 Peter Oberparleiter wrote:
> You're right - this must have slipped in with last minute changes.
> Sorry about that. See fixed patch below (tested successfully with
> modules on s390).

Acked-by: Rusty Russell <rusty@rustcorp.com.au>

Thanks,
Rusty.

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

* [PATCH 1/4] kernel: constructor support
@ 2009-02-26 13:51 Peter Oberparleiter
  0 siblings, 0 replies; 22+ messages in thread
From: Peter Oberparleiter @ 2009-02-26 13:51 UTC (permalink / raw)
  To: linux-kernel
  Cc: Andrew Morton, Andi Kleen, Huang Ying, Sam Ravnborg,
	Rusty Russell, Jeff Dike

From: Peter Oberparleiter <oberpar@linux.vnet.ibm.com>

Call constructors (gcc-generated initcall-like functions) during
kernel start and module load. Constructors are e.g. used for gcov data
initialization.

Disable constructor support for usermode Linux to prevent conflicts
with host glibc.

Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com>
Acked-by: Rusty Russell <rusty@rustcorp.com.au>

---
 include/asm-generic/vmlinux.lds.h |   11 ++++++++++-
 include/linux/init.h              |    2 ++
 include/linux/module.h            |    6 ++++++
 init/Kconfig                      |    5 +++++
 init/main.c                       |   13 +++++++++++++
 kernel/module.c                   |   16 ++++++++++++++++
 6 files changed, 52 insertions(+), 1 deletion(-)

Index: linux-2.6.29-rc6/include/asm-generic/vmlinux.lds.h
===================================================================
--- linux-2.6.29-rc6.orig/include/asm-generic/vmlinux.lds.h
+++ linux-2.6.29-rc6/include/asm-generic/vmlinux.lds.h
@@ -301,6 +301,14 @@
 /* Section used for early init (in .S files) */
 #define HEAD_TEXT  *(.head.text)
 
+#ifdef CONFIG_CONSTRUCTORS
+#define KERNEL_CTORS()	VMLINUX_SYMBOL(__ctors_start) = .; \
+			*(.ctors)			   \
+			VMLINUX_SYMBOL(__ctors_end) = .;
+#else
+#define KERNEL_CTORS()
+#endif
+
 /* init and exit section handling */
 #define INIT_DATA							\
 	*(.init.data)							\
@@ -317,7 +325,8 @@
 	. = ALIGN(8);							\
 	VMLINUX_SYMBOL(__start___verbose) = .;                          \
 	*(__verbose)                                                    \
-	VMLINUX_SYMBOL(__stop___verbose) = .;
+	VMLINUX_SYMBOL(__stop___verbose) = .;				\
+	KERNEL_CTORS()
 
 #define INIT_TEXT							\
 	*(.init.text)							\
Index: linux-2.6.29-rc6/include/linux/init.h
===================================================================
--- linux-2.6.29-rc6.orig/include/linux/init.h
+++ linux-2.6.29-rc6/include/linux/init.h
@@ -142,6 +142,8 @@ typedef void (*exitcall_t)(void);
 extern initcall_t __con_initcall_start[], __con_initcall_end[];
 extern initcall_t __security_initcall_start[], __security_initcall_end[];
 
+typedef void (*ctorcall_t)(void);
+
 /* Defined in init/main.c */
 extern int do_one_initcall(initcall_t fn);
 extern char __initdata boot_command_line[];
Index: linux-2.6.29-rc6/include/linux/module.h
===================================================================
--- linux-2.6.29-rc6.orig/include/linux/module.h
+++ linux-2.6.29-rc6/include/linux/module.h
@@ -345,6 +345,12 @@ struct module
 	local_t ref;
 #endif
 #endif
+
+#ifdef CONFIG_CONSTRUCTORS
+	/* Constructor functions. */
+	ctorcall_t *ctors;
+	unsigned int num_ctors;
+#endif
 };
 #ifndef MODULE_ARCH_INIT
 #define MODULE_ARCH_INIT {}
Index: linux-2.6.29-rc6/init/main.c
===================================================================
--- linux-2.6.29-rc6.orig/init/main.c
+++ linux-2.6.29-rc6/init/main.c
@@ -686,6 +686,18 @@ asmlinkage void __init start_kernel(void
 	rest_init();
 }
 
+/* Call all constructor functions linked into the kernel. */
+static void __init do_ctors(void)
+{
+#ifdef CONFIG_CONSTRUCTORS
+	extern ctorcall_t __ctors_start[], __ctors_end[];
+	ctorcall_t *call;
+
+	for (call = __ctors_start; call < __ctors_end; call++)
+		(*call)();
+#endif
+}
+
 int initcall_debug;
 core_param(initcall_debug, initcall_debug, bool, 0644);
 
@@ -765,6 +777,7 @@ static void __init do_basic_setup(void)
 	usermodehelper_init();
 	driver_init();
 	init_irq_proc();
+	do_ctors();
 	do_initcalls();
 }
 
Index: linux-2.6.29-rc6/kernel/module.c
===================================================================
--- linux-2.6.29-rc6.orig/kernel/module.c
+++ linux-2.6.29-rc6/kernel/module.c
@@ -2157,6 +2157,10 @@ static noinline struct module *load_modu
 					sizeof(*mod->tracepoints),
 					&mod->num_tracepoints);
 #endif
+#ifdef CONFIG_CONSTRUCTORS
+	mod->ctors = section_objs(hdr, sechdrs, secstrings, ".ctors",
+				  sizeof(*mod->ctors), &mod->num_ctors);
+#endif
 
 #ifdef CONFIG_MODVERSIONS
 	if ((mod->num_syms && !mod->crcs)
@@ -2310,6 +2314,17 @@ static noinline struct module *load_modu
 	goto free_hdr;
 }
 
+/* Call module constructors. */
+static void do_mod_ctors(struct module *mod)
+{
+#ifdef CONFIG_CONSTRUCTORS
+	unsigned long i;
+
+	for (i = 0; i < mod->num_ctors; i++)
+		mod->ctors[i]();
+#endif
+}
+
 /* This is where the real work happens */
 SYSCALL_DEFINE3(init_module, void __user *, umod,
 		unsigned long, len, const char __user *, uargs)
@@ -2338,6 +2353,7 @@ SYSCALL_DEFINE3(init_module, void __user
 	blocking_notifier_call_chain(&module_notify_list,
 			MODULE_STATE_COMING, mod);
 
+	do_mod_ctors(mod);
 	/* Start the module */
 	if (mod->init != NULL)
 		ret = do_one_initcall(mod->init);
Index: linux-2.6.29-rc6/init/Kconfig
===================================================================
--- linux-2.6.29-rc6.orig/init/Kconfig
+++ linux-2.6.29-rc6/init/Kconfig
@@ -16,6 +16,11 @@ config DEFCONFIG_LIST
 	default "$ARCH_DEFCONFIG"
 	default "arch/$ARCH/defconfig"
 
+config CONSTRUCTORS
+	bool
+	depends on !UML
+	default y
+
 menu "General setup"
 
 config EXPERIMENTAL



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

* [PATCH 1/4] kernel: constructor support
  2009-05-07 12:45 [PATCH 0/4] gcov kernel support Peter Oberparleiter
@ 2009-05-07 12:45 ` Peter Oberparleiter
  2009-05-07 12:51   ` Ingo Molnar
  2009-05-07 12:53   ` Ingo Molnar
  0 siblings, 2 replies; 22+ messages in thread
From: Peter Oberparleiter @ 2009-05-07 12:45 UTC (permalink / raw)
  To: linux-kernel
  Cc: Andrew Morton, Andi Kleen, Huang Ying, Li Wei, Michael Ellerman,
	Rusty Russell, Sam Ravnborg, Jeff Dike

[-- Attachment #1: kernel-constructor-support.patch --]
[-- Type: text/plain, Size: 5117 bytes --]

From: Peter Oberparleiter <oberpar@linux.vnet.ibm.com>

Call constructors (gcc-generated initcall-like functions) during
kernel start and module load. Constructors are e.g. used for gcov data
initialization.

Disable constructor support for usermode Linux to prevent conflicts
with host glibc.

Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com>
Acked-by: Rusty Russell <rusty@rustcorp.com.au>
Cc: Sam Ravnborg <sam@ravnborg.org>
Cc: Jeff Dike <jdike@addtoit.com>
---
 include/asm-generic/vmlinux.lds.h |   11 ++++++++++-
 include/linux/init.h              |    2 ++
 include/linux/module.h            |    6 ++++++
 init/Kconfig                      |    5 +++++
 init/main.c                       |   13 +++++++++++++
 kernel/module.c                   |   16 ++++++++++++++++
 6 files changed, 52 insertions(+), 1 deletion(-)

Index: linux-2.6.30-rc4/include/asm-generic/vmlinux.lds.h
===================================================================
--- linux-2.6.30-rc4.orig/include/asm-generic/vmlinux.lds.h
+++ linux-2.6.30-rc4/include/asm-generic/vmlinux.lds.h
@@ -332,6 +332,14 @@
 /* Section used for early init (in .S files) */
 #define HEAD_TEXT  *(HEAD_TEXT_SECTION)
 
+#ifdef CONFIG_CONSTRUCTORS
+#define KERNEL_CTORS()	VMLINUX_SYMBOL(__ctors_start) = .; \
+			*(.ctors)			   \
+			VMLINUX_SYMBOL(__ctors_end) = .;
+#else
+#define KERNEL_CTORS()
+#endif
+
 /* init and exit section handling */
 #define INIT_DATA							\
 	*(.init.data)							\
@@ -340,7 +348,8 @@
 	CPU_DISCARD(init.data)						\
 	CPU_DISCARD(init.rodata)					\
 	MEM_DISCARD(init.data)						\
-	MEM_DISCARD(init.rodata)
+	MEM_DISCARD(init.rodata)					\
+	KERNEL_CTORS()
 
 #define INIT_TEXT							\
 	*(.init.text)							\
Index: linux-2.6.30-rc4/include/linux/init.h
===================================================================
--- linux-2.6.30-rc4.orig/include/linux/init.h
+++ linux-2.6.30-rc4/include/linux/init.h
@@ -136,6 +136,8 @@ typedef void (*exitcall_t)(void);
 extern initcall_t __con_initcall_start[], __con_initcall_end[];
 extern initcall_t __security_initcall_start[], __security_initcall_end[];
 
+typedef void (*ctorcall_t)(void);
+
 /* Defined in init/main.c */
 extern int do_one_initcall(initcall_t fn);
 extern char __initdata boot_command_line[];
Index: linux-2.6.30-rc4/include/linux/module.h
===================================================================
--- linux-2.6.30-rc4.orig/include/linux/module.h
+++ linux-2.6.30-rc4/include/linux/module.h
@@ -354,6 +354,12 @@ struct module
 	local_t ref;
 #endif
 #endif
+
+#ifdef CONFIG_CONSTRUCTORS
+	/* Constructor functions. */
+	ctorcall_t *ctors;
+	unsigned int num_ctors;
+#endif
 };
 #ifndef MODULE_ARCH_INIT
 #define MODULE_ARCH_INIT {}
Index: linux-2.6.30-rc4/init/main.c
===================================================================
--- linux-2.6.30-rc4.orig/init/main.c
+++ linux-2.6.30-rc4/init/main.c
@@ -700,6 +700,18 @@ asmlinkage void __init start_kernel(void
 	rest_init();
 }
 
+/* Call all constructor functions linked into the kernel. */
+static void __init do_ctors(void)
+{
+#ifdef CONFIG_CONSTRUCTORS
+	extern ctorcall_t __ctors_start[], __ctors_end[];
+	ctorcall_t *call;
+
+	for (call = __ctors_start; call < __ctors_end; call++)
+		(*call)();
+#endif
+}
+
 int initcall_debug;
 core_param(initcall_debug, initcall_debug, bool, 0644);
 
@@ -780,6 +792,7 @@ static void __init do_basic_setup(void)
 	usermodehelper_init();
 	driver_init();
 	init_irq_proc();
+	do_ctors();
 	do_initcalls();
 }
 
Index: linux-2.6.30-rc4/kernel/module.c
===================================================================
--- linux-2.6.30-rc4.orig/kernel/module.c
+++ linux-2.6.30-rc4/kernel/module.c
@@ -2172,6 +2172,10 @@ static noinline struct module *load_modu
 					sizeof(*mod->tracepoints),
 					&mod->num_tracepoints);
 #endif
+#ifdef CONFIG_CONSTRUCTORS
+	mod->ctors = section_objs(hdr, sechdrs, secstrings, ".ctors",
+				  sizeof(*mod->ctors), &mod->num_ctors);
+#endif
 
 #ifdef CONFIG_MODVERSIONS
 	if ((mod->num_syms && !mod->crcs)
@@ -2328,6 +2332,17 @@ static noinline struct module *load_modu
 	goto free_hdr;
 }
 
+/* Call module constructors. */
+static void do_mod_ctors(struct module *mod)
+{
+#ifdef CONFIG_CONSTRUCTORS
+	unsigned long i;
+
+	for (i = 0; i < mod->num_ctors; i++)
+		mod->ctors[i]();
+#endif
+}
+
 /* This is where the real work happens */
 SYSCALL_DEFINE3(init_module, void __user *, umod,
 		unsigned long, len, const char __user *, uargs)
@@ -2356,6 +2371,7 @@ SYSCALL_DEFINE3(init_module, void __user
 	blocking_notifier_call_chain(&module_notify_list,
 			MODULE_STATE_COMING, mod);
 
+	do_mod_ctors(mod);
 	/* Start the module */
 	if (mod->init != NULL)
 		ret = do_one_initcall(mod->init);
Index: linux-2.6.30-rc4/init/Kconfig
===================================================================
--- linux-2.6.30-rc4.orig/init/Kconfig
+++ linux-2.6.30-rc4/init/Kconfig
@@ -16,6 +16,11 @@ config DEFCONFIG_LIST
 	default "$ARCH_DEFCONFIG"
 	default "arch/$ARCH/defconfig"
 
+config CONSTRUCTORS
+	bool
+	depends on !UML
+	default y
+
 menu "General setup"
 
 config EXPERIMENTAL



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

* Re: [PATCH 1/4] kernel: constructor support
  2009-05-07 12:45 ` [PATCH 1/4] kernel: constructor support Peter Oberparleiter
@ 2009-05-07 12:51   ` Ingo Molnar
  2009-05-07 13:33     ` Peter Oberparleiter
  2009-05-07 12:53   ` Ingo Molnar
  1 sibling, 1 reply; 22+ messages in thread
From: Ingo Molnar @ 2009-05-07 12:51 UTC (permalink / raw)
  To: Peter Oberparleiter
  Cc: linux-kernel, Andrew Morton, Andi Kleen, Huang Ying, Li Wei,
	Michael Ellerman, Rusty Russell, Sam Ravnborg, Jeff Dike


* Peter Oberparleiter <oberpar@linux.vnet.ibm.com> wrote:

> +typedef void (*ctorcall_t)(void);

that name is pretty ugly. Please change it to the usual kernel 
convention for function pointers:

	typedef void (*ctor_fn_t)(void);

Thanks,

	Ingo

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

* Re: [PATCH 1/4] kernel: constructor support
  2009-05-07 12:45 ` [PATCH 1/4] kernel: constructor support Peter Oberparleiter
  2009-05-07 12:51   ` Ingo Molnar
@ 2009-05-07 12:53   ` Ingo Molnar
  2009-05-07 13:38     ` Peter Oberparleiter
  1 sibling, 1 reply; 22+ messages in thread
From: Ingo Molnar @ 2009-05-07 12:53 UTC (permalink / raw)
  To: Peter Oberparleiter
  Cc: linux-kernel, Andrew Morton, Andi Kleen, Huang Ying, Li Wei,
	Michael Ellerman, Rusty Russell, Sam Ravnborg, Jeff Dike


* Peter Oberparleiter <oberpar@linux.vnet.ibm.com> wrote:

> Disable constructor support for usermode Linux to prevent conflicts
> with host glibc.

> +++ linux-2.6.30-rc4/init/Kconfig
> @@ -16,6 +16,11 @@ config DEFCONFIG_LIST
>  	default "$ARCH_DEFCONFIG"
>  	default "arch/$ARCH/defconfig"
>  
> +config CONSTRUCTORS
> +	bool
> +	depends on !UML
> +	default y
> +
>  menu "General setup"

Hm, excluding UML like that is sad. Is there no better solution?

	Ingo

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

* Re: [PATCH 1/4] kernel: constructor support
  2009-05-07 12:51   ` Ingo Molnar
@ 2009-05-07 13:33     ` Peter Oberparleiter
  0 siblings, 0 replies; 22+ messages in thread
From: Peter Oberparleiter @ 2009-05-07 13:33 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: linux-kernel, Andrew Morton, Andi Kleen, Huang Ying, Li Wei,
	Michael Ellerman, Rusty Russell, Sam Ravnborg, Jeff Dike

Ingo Molnar wrote:
> * Peter Oberparleiter <oberpar@linux.vnet.ibm.com> wrote:
> 
>> +typedef void (*ctorcall_t)(void);
> 
> that name is pretty ugly. Please change it to the usual kernel 
> convention for function pointers:
> 
> 	typedef void (*ctor_fn_t)(void);

Ok, will do. Thanks.


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

* Re: [PATCH 1/4] kernel: constructor support
  2009-05-07 12:53   ` Ingo Molnar
@ 2009-05-07 13:38     ` Peter Oberparleiter
  2009-05-07 13:48       ` Ingo Molnar
  0 siblings, 1 reply; 22+ messages in thread
From: Peter Oberparleiter @ 2009-05-07 13:38 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: linux-kernel, Andrew Morton, Andi Kleen, Huang Ying, Li Wei,
	Michael Ellerman, Rusty Russell, Sam Ravnborg, Jeff Dike

Ingo Molnar wrote:
> * Peter Oberparleiter <oberpar@linux.vnet.ibm.com> wrote:
> 
>> Disable constructor support for usermode Linux to prevent conflicts
>> with host glibc.
> 
>> +++ linux-2.6.30-rc4/init/Kconfig
>> @@ -16,6 +16,11 @@ config DEFCONFIG_LIST
>>  	default "$ARCH_DEFCONFIG"
>>  	default "arch/$ARCH/defconfig"
>>  
>> +config CONSTRUCTORS
>> +	bool
>> +	depends on !UML
>> +	default y
>> +
>>  menu "General setup"
> 
> Hm, excluding UML like that is sad. Is there no better solution?

UML is excluded because in that environment constructors are called by 
the host glibc, so there is no need for kernel support on UML (in fact 
it would break things).

Or were you referring to the actual way the exclusion is implemented?


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

* Re: [PATCH 1/4] kernel: constructor support
  2009-05-07 13:38     ` Peter Oberparleiter
@ 2009-05-07 13:48       ` Ingo Molnar
  2009-05-08 11:23         ` Peter Oberparleiter
  0 siblings, 1 reply; 22+ messages in thread
From: Ingo Molnar @ 2009-05-07 13:48 UTC (permalink / raw)
  To: Peter Oberparleiter
  Cc: linux-kernel, Andrew Morton, Andi Kleen, Huang Ying, Li Wei,
	Michael Ellerman, Rusty Russell, Sam Ravnborg, Jeff Dike


* Peter Oberparleiter <oberpar@linux.vnet.ibm.com> wrote:

> Ingo Molnar wrote:
>> * Peter Oberparleiter <oberpar@linux.vnet.ibm.com> wrote:
>>
>>> Disable constructor support for usermode Linux to prevent conflicts
>>> with host glibc.
>>
>>> +++ linux-2.6.30-rc4/init/Kconfig
>>> @@ -16,6 +16,11 @@ config DEFCONFIG_LIST
>>>  	default "$ARCH_DEFCONFIG"
>>>  	default "arch/$ARCH/defconfig"
>>>  +config CONSTRUCTORS
>>> +	bool
>>> +	depends on !UML
>>> +	default y
>>> +
>>>  menu "General setup"
>>
>> Hm, excluding UML like that is sad. Is there no better solution?
>
> UML is excluded because in that environment constructors are 
> called by the host glibc, so there is no need for kernel support 
> on UML (in fact it would break things).
>
> Or were you referring to the actual way the exclusion is 
> implemented?

the way it's done is OK (there's really just UML in this situation), 
but the question is really, shouldnt it be possible to coverage-test 
UML instances 'from the inside'?

Plus, if any other kernel facility grows out of this or makes use of 
it, UML will be left out in the cold.

	Ingo

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

* Re: [PATCH 1/4] kernel: constructor support
  2009-05-07 13:48       ` Ingo Molnar
@ 2009-05-08 11:23         ` Peter Oberparleiter
  0 siblings, 0 replies; 22+ messages in thread
From: Peter Oberparleiter @ 2009-05-08 11:23 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: linux-kernel, Andrew Morton, Andi Kleen, Huang Ying, Li Wei,
	Michael Ellerman, Rusty Russell, Sam Ravnborg, Jeff Dike

Ingo Molnar wrote:
> * Peter Oberparleiter <oberpar@linux.vnet.ibm.com> wrote:
>> Ingo Molnar wrote:
>>> * Peter Oberparleiter <oberpar@linux.vnet.ibm.com> wrote:
>>>
>>>> Disable constructor support for usermode Linux to prevent conflicts
>>>> with host glibc.
>>>> +++ linux-2.6.30-rc4/init/Kconfig
>>>> @@ -16,6 +16,11 @@ config DEFCONFIG_LIST
>>>>  	default "$ARCH_DEFCONFIG"
>>>>  	default "arch/$ARCH/defconfig"
>>>>  +config CONSTRUCTORS
>>>> +	bool
>>>> +	depends on !UML
>>>> +	default y
>>>> +
>>>>  menu "General setup"
>>> Hm, excluding UML like that is sad. Is there no better solution?
>> UML is excluded because in that environment constructors are 
>> called by the host glibc, so there is no need for kernel support 
>> on UML (in fact it would break things).
>>
>> Or were you referring to the actual way the exclusion is 
>> implemented?
> 
> the way it's done is OK (there's really just UML in this situation), 
> but the question is really, shouldnt it be possible to coverage-test 
> UML instances 'from the inside'?

 From a mere gcov perspective, coverage-testing from the outside is 
superior because that is the way it was meant to be run in the first place.

> 
> Plus, if any other kernel facility grows out of this or makes use of 
> it, UML will be left out in the cold.

I'm afraid that trying to over-engineer the gcov-kernel mechanism at 
this time might serve neither the gcov-kernel users, nor potential new 
users. Once the base is established, it will be far easier to decide 
which other purposes the infrastructure can serve (without completely 
bending it).


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

* [PATCH 1/4] kernel: constructor support
  2009-05-08 15:44 [PATCH 0/4] gcov kernel support Peter Oberparleiter
@ 2009-05-08 15:44 ` Peter Oberparleiter
  2009-05-09  5:03   ` Américo Wang
  0 siblings, 1 reply; 22+ messages in thread
From: Peter Oberparleiter @ 2009-05-08 15:44 UTC (permalink / raw)
  To: linux-kernel
  Cc: Andrew Morton, Andi Kleen, Huang Ying, Li Wei, Michael Ellerman,
	Ingo Molnar, Heiko Carstens, Martin Schwidefsky, Rusty Russell,
	Sam Ravnborg, Jeff Dike

[-- Attachment #1: kernel-constructor-support.patch --]
[-- Type: text/plain, Size: 5113 bytes --]

From: Peter Oberparleiter <oberpar@linux.vnet.ibm.com>

Call constructors (gcc-generated initcall-like functions) during
kernel start and module load. Constructors are e.g. used for gcov data
initialization.

Disable constructor support for usermode Linux to prevent conflicts
with host glibc.

Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com>
Acked-by: Rusty Russell <rusty@rustcorp.com.au>
Cc: Sam Ravnborg <sam@ravnborg.org>
Cc: Jeff Dike <jdike@addtoit.com>
---
 include/asm-generic/vmlinux.lds.h |   11 ++++++++++-
 include/linux/init.h              |    2 ++
 include/linux/module.h            |    6 ++++++
 init/Kconfig                      |    5 +++++
 init/main.c                       |   13 +++++++++++++
 kernel/module.c                   |   16 ++++++++++++++++
 6 files changed, 52 insertions(+), 1 deletion(-)

Index: linux-2.6.30-rc4/include/asm-generic/vmlinux.lds.h
===================================================================
--- linux-2.6.30-rc4.orig/include/asm-generic/vmlinux.lds.h
+++ linux-2.6.30-rc4/include/asm-generic/vmlinux.lds.h
@@ -332,6 +332,14 @@
 /* Section used for early init (in .S files) */
 #define HEAD_TEXT  *(HEAD_TEXT_SECTION)
 
+#ifdef CONFIG_CONSTRUCTORS
+#define KERNEL_CTORS()	VMLINUX_SYMBOL(__ctors_start) = .; \
+			*(.ctors)			   \
+			VMLINUX_SYMBOL(__ctors_end) = .;
+#else
+#define KERNEL_CTORS()
+#endif
+
 /* init and exit section handling */
 #define INIT_DATA							\
 	*(.init.data)							\
@@ -340,7 +348,8 @@
 	CPU_DISCARD(init.data)						\
 	CPU_DISCARD(init.rodata)					\
 	MEM_DISCARD(init.data)						\
-	MEM_DISCARD(init.rodata)
+	MEM_DISCARD(init.rodata)					\
+	KERNEL_CTORS()
 
 #define INIT_TEXT							\
 	*(.init.text)							\
Index: linux-2.6.30-rc4/include/linux/init.h
===================================================================
--- linux-2.6.30-rc4.orig/include/linux/init.h
+++ linux-2.6.30-rc4/include/linux/init.h
@@ -136,6 +136,8 @@ typedef void (*exitcall_t)(void);
 extern initcall_t __con_initcall_start[], __con_initcall_end[];
 extern initcall_t __security_initcall_start[], __security_initcall_end[];
 
+typedef void (*ctor_fn_t)(void);
+
 /* Defined in init/main.c */
 extern int do_one_initcall(initcall_t fn);
 extern char __initdata boot_command_line[];
Index: linux-2.6.30-rc4/include/linux/module.h
===================================================================
--- linux-2.6.30-rc4.orig/include/linux/module.h
+++ linux-2.6.30-rc4/include/linux/module.h
@@ -354,6 +354,12 @@ struct module
 	local_t ref;
 #endif
 #endif
+
+#ifdef CONFIG_CONSTRUCTORS
+	/* Constructor functions. */
+	ctor_fn_t *ctors;
+	unsigned int num_ctors;
+#endif
 };
 #ifndef MODULE_ARCH_INIT
 #define MODULE_ARCH_INIT {}
Index: linux-2.6.30-rc4/init/main.c
===================================================================
--- linux-2.6.30-rc4.orig/init/main.c
+++ linux-2.6.30-rc4/init/main.c
@@ -700,6 +700,18 @@ asmlinkage void __init start_kernel(void
 	rest_init();
 }
 
+/* Call all constructor functions linked into the kernel. */
+static void __init do_ctors(void)
+{
+#ifdef CONFIG_CONSTRUCTORS
+	extern ctor_fn_t __ctors_start[], __ctors_end[];
+	ctor_fn_t *call;
+
+	for (call = __ctors_start; call < __ctors_end; call++)
+		(*call)();
+#endif
+}
+
 int initcall_debug;
 core_param(initcall_debug, initcall_debug, bool, 0644);
 
@@ -780,6 +792,7 @@ static void __init do_basic_setup(void)
 	usermodehelper_init();
 	driver_init();
 	init_irq_proc();
+	do_ctors();
 	do_initcalls();
 }
 
Index: linux-2.6.30-rc4/kernel/module.c
===================================================================
--- linux-2.6.30-rc4.orig/kernel/module.c
+++ linux-2.6.30-rc4/kernel/module.c
@@ -2172,6 +2172,10 @@ static noinline struct module *load_modu
 					sizeof(*mod->tracepoints),
 					&mod->num_tracepoints);
 #endif
+#ifdef CONFIG_CONSTRUCTORS
+	mod->ctors = section_objs(hdr, sechdrs, secstrings, ".ctors",
+				  sizeof(*mod->ctors), &mod->num_ctors);
+#endif
 
 #ifdef CONFIG_MODVERSIONS
 	if ((mod->num_syms && !mod->crcs)
@@ -2328,6 +2332,17 @@ static noinline struct module *load_modu
 	goto free_hdr;
 }
 
+/* Call module constructors. */
+static void do_mod_ctors(struct module *mod)
+{
+#ifdef CONFIG_CONSTRUCTORS
+	unsigned long i;
+
+	for (i = 0; i < mod->num_ctors; i++)
+		mod->ctors[i]();
+#endif
+}
+
 /* This is where the real work happens */
 SYSCALL_DEFINE3(init_module, void __user *, umod,
 		unsigned long, len, const char __user *, uargs)
@@ -2356,6 +2371,7 @@ SYSCALL_DEFINE3(init_module, void __user
 	blocking_notifier_call_chain(&module_notify_list,
 			MODULE_STATE_COMING, mod);
 
+	do_mod_ctors(mod);
 	/* Start the module */
 	if (mod->init != NULL)
 		ret = do_one_initcall(mod->init);
Index: linux-2.6.30-rc4/init/Kconfig
===================================================================
--- linux-2.6.30-rc4.orig/init/Kconfig
+++ linux-2.6.30-rc4/init/Kconfig
@@ -16,6 +16,11 @@ config DEFCONFIG_LIST
 	default "$ARCH_DEFCONFIG"
 	default "arch/$ARCH/defconfig"
 
+config CONSTRUCTORS
+	bool
+	depends on !UML
+	default y
+
 menu "General setup"
 
 config EXPERIMENTAL



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

* Re: [PATCH 1/4] kernel: constructor support
  2009-05-08 15:44 ` [PATCH 1/4] kernel: constructor support Peter Oberparleiter
@ 2009-05-09  5:03   ` Américo Wang
  2009-05-11  8:43     ` Peter Oberparleiter
  0 siblings, 1 reply; 22+ messages in thread
From: Américo Wang @ 2009-05-09  5:03 UTC (permalink / raw)
  To: Peter Oberparleiter
  Cc: linux-kernel, Andrew Morton, Andi Kleen, Huang Ying, Li Wei,
	Michael Ellerman, Ingo Molnar, Heiko Carstens, Martin Schwidefsky,
	Rusty Russell, Sam Ravnborg, Jeff Dike

On Fri, May 08, 2009 at 05:44:09PM +0200, Peter Oberparleiter wrote:
>From: Peter Oberparleiter <oberpar@linux.vnet.ibm.com>
>
>Call constructors (gcc-generated initcall-like functions) during
>kernel start and module load. Constructors are e.g. used for gcov data
>initialization.
>
>Disable constructor support for usermode Linux to prevent conflicts
>with host glibc.
>
>Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com>
>Acked-by: Rusty Russell <rusty@rustcorp.com.au>
>Cc: Sam Ravnborg <sam@ravnborg.org>
>Cc: Jeff Dike <jdike@addtoit.com>


For UML, Acked-by: WANG Cong <xiyou.wangcong@gmail.com>

A small detail below.


>---
> include/asm-generic/vmlinux.lds.h |   11 ++++++++++-
> include/linux/init.h              |    2 ++
> include/linux/module.h            |    6 ++++++
> init/Kconfig                      |    5 +++++
> init/main.c                       |   13 +++++++++++++
> kernel/module.c                   |   16 ++++++++++++++++
> 6 files changed, 52 insertions(+), 1 deletion(-)
>
>Index: linux-2.6.30-rc4/include/asm-generic/vmlinux.lds.h
>===================================================================
>--- linux-2.6.30-rc4.orig/include/asm-generic/vmlinux.lds.h
>+++ linux-2.6.30-rc4/include/asm-generic/vmlinux.lds.h
>@@ -332,6 +332,14 @@
> /* Section used for early init (in .S files) */
> #define HEAD_TEXT  *(HEAD_TEXT_SECTION)
> 
>+#ifdef CONFIG_CONSTRUCTORS
>+#define KERNEL_CTORS()	VMLINUX_SYMBOL(__ctors_start) = .; \
>+			*(.ctors)			   \
>+			VMLINUX_SYMBOL(__ctors_end) = .;
>+#else
>+#define KERNEL_CTORS()
>+#endif
>+
> /* init and exit section handling */
> #define INIT_DATA							\
> 	*(.init.data)							\
>@@ -340,7 +348,8 @@
> 	CPU_DISCARD(init.data)						\
> 	CPU_DISCARD(init.rodata)					\
> 	MEM_DISCARD(init.data)						\
>-	MEM_DISCARD(init.rodata)
>+	MEM_DISCARD(init.rodata)					\
>+	KERNEL_CTORS()
> 
> #define INIT_TEXT							\
> 	*(.init.text)							\
>Index: linux-2.6.30-rc4/include/linux/init.h
>===================================================================
>--- linux-2.6.30-rc4.orig/include/linux/init.h
>+++ linux-2.6.30-rc4/include/linux/init.h
>@@ -136,6 +136,8 @@ typedef void (*exitcall_t)(void);
> extern initcall_t __con_initcall_start[], __con_initcall_end[];
> extern initcall_t __security_initcall_start[], __security_initcall_end[];
> 
>+typedef void (*ctor_fn_t)(void);
>+
> /* Defined in init/main.c */
> extern int do_one_initcall(initcall_t fn);
> extern char __initdata boot_command_line[];
>Index: linux-2.6.30-rc4/include/linux/module.h
>===================================================================
>--- linux-2.6.30-rc4.orig/include/linux/module.h
>+++ linux-2.6.30-rc4/include/linux/module.h
>@@ -354,6 +354,12 @@ struct module
> 	local_t ref;
> #endif
> #endif
>+
>+#ifdef CONFIG_CONSTRUCTORS
>+	/* Constructor functions. */
>+	ctor_fn_t *ctors;
>+	unsigned int num_ctors;
>+#endif
> };
> #ifndef MODULE_ARCH_INIT
> #define MODULE_ARCH_INIT {}
>Index: linux-2.6.30-rc4/init/main.c
>===================================================================
>--- linux-2.6.30-rc4.orig/init/main.c
>+++ linux-2.6.30-rc4/init/main.c
>@@ -700,6 +700,18 @@ asmlinkage void __init start_kernel(void
> 	rest_init();
> }
> 
>+/* Call all constructor functions linked into the kernel. */
>+static void __init do_ctors(void)
>+{
>+#ifdef CONFIG_CONSTRUCTORS
>+	extern ctor_fn_t __ctors_start[], __ctors_end[];


I would like these to be globally decleared, since they are.


-- 
Live like a child, think like the god.
 

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

* Re: [PATCH 1/4] kernel: constructor support
  2009-05-09  5:03   ` Américo Wang
@ 2009-05-11  8:43     ` Peter Oberparleiter
  2009-05-11 18:54       ` Sam Ravnborg
  0 siblings, 1 reply; 22+ messages in thread
From: Peter Oberparleiter @ 2009-05-11  8:43 UTC (permalink / raw)
  To: Américo Wang
  Cc: linux-kernel, Andrew Morton, Andi Kleen, Huang Ying, Li Wei,
	Michael Ellerman, Ingo Molnar, Heiko Carstens, Martin Schwidefsky,
	Rusty Russell, Sam Ravnborg, Jeff Dike

Américo Wang wrote:
> On Fri, May 08, 2009 at 05:44:09PM +0200, Peter Oberparleiter wrote:
>> From: Peter Oberparleiter <oberpar@linux.vnet.ibm.com>
>> Index: linux-2.6.30-rc4/init/main.c
>> ===================================================================
>> --- linux-2.6.30-rc4.orig/init/main.c
>> +++ linux-2.6.30-rc4/init/main.c
>> @@ -700,6 +700,18 @@ asmlinkage void __init start_kernel(void
>> 	rest_init();
>> }
>>
>> +/* Call all constructor functions linked into the kernel. */
>> +static void __init do_ctors(void)
>> +{
>> +#ifdef CONFIG_CONSTRUCTORS
>> +	extern ctor_fn_t __ctors_start[], __ctors_end[];
> 
> 
> I would like these to be globally decleared, since they are.

Ok, I will move the __ctors_* declarations to include/linux/ínit.h

Thanks.


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

* Re: [PATCH 1/4] kernel: constructor support
  2009-05-11  8:43     ` Peter Oberparleiter
@ 2009-05-11 18:54       ` Sam Ravnborg
  2009-05-12 13:12         ` Peter Oberparleiter
  0 siblings, 1 reply; 22+ messages in thread
From: Sam Ravnborg @ 2009-05-11 18:54 UTC (permalink / raw)
  To: Peter Oberparleiter
  Cc: Américo Wang, linux-kernel, Andrew Morton, Andi Kleen,
	Huang Ying, Li Wei, Michael Ellerman, Ingo Molnar, Heiko Carstens,
	Martin Schwidefsky, Rusty Russell, Jeff Dike

On Mon, May 11, 2009 at 10:43:34AM +0200, Peter Oberparleiter wrote:
> Américo Wang wrote:
> >On Fri, May 08, 2009 at 05:44:09PM +0200, Peter Oberparleiter wrote:
> >>From: Peter Oberparleiter <oberpar@linux.vnet.ibm.com>
> >>Index: linux-2.6.30-rc4/init/main.c
> >>===================================================================
> >>--- linux-2.6.30-rc4.orig/init/main.c
> >>+++ linux-2.6.30-rc4/init/main.c
> >>@@ -700,6 +700,18 @@ asmlinkage void __init start_kernel(void
> >>	rest_init();
> >>}
> >>
> >>+/* Call all constructor functions linked into the kernel. */
> >>+static void __init do_ctors(void)
> >>+{
> >>+#ifdef CONFIG_CONSTRUCTORS
> >>+	extern ctor_fn_t __ctors_start[], __ctors_end[];
> >
> >
> >I would like these to be globally decleared, since they are.
> 
> Ok, I will move the __ctors_* declarations to include/linux/ínit.h

include/asm-generic/sections.h please.
And please add a comment too.

That the other entries in the same file lacks a comment is not
the example to follow.

	Sam

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

* Re: [PATCH 1/4] kernel: constructor support
  2009-05-11 18:54       ` Sam Ravnborg
@ 2009-05-12 13:12         ` Peter Oberparleiter
  0 siblings, 0 replies; 22+ messages in thread
From: Peter Oberparleiter @ 2009-05-12 13:12 UTC (permalink / raw)
  To: Sam Ravnborg
  Cc: Américo Wang, linux-kernel, Andrew Morton, Andi Kleen,
	Huang Ying, Li Wei, Michael Ellerman, Ingo Molnar, Heiko Carstens,
	Martin Schwidefsky, Rusty Russell, Jeff Dike

Sam Ravnborg wrote:
> On Mon, May 11, 2009 at 10:43:34AM +0200, Peter Oberparleiter wrote:
>> Américo Wang wrote:
>>> On Fri, May 08, 2009 at 05:44:09PM +0200, Peter Oberparleiter wrote:
>>>> From: Peter Oberparleiter <oberpar@linux.vnet.ibm.com>
>>>> Index: linux-2.6.30-rc4/init/main.c
>>>> ===================================================================
>>>> --- linux-2.6.30-rc4.orig/init/main.c
>>>> +++ linux-2.6.30-rc4/init/main.c
>>>> @@ -700,6 +700,18 @@ asmlinkage void __init start_kernel(void
>>>> 	rest_init();
>>>> }
>>>>
>>>> +/* Call all constructor functions linked into the kernel. */
>>>> +static void __init do_ctors(void)
>>>> +{
>>>> +#ifdef CONFIG_CONSTRUCTORS
>>>> +	extern ctor_fn_t __ctors_start[], __ctors_end[];
>>>
>>> I would like these to be globally decleared, since they are.
>> Ok, I will move the __ctors_* declarations to include/linux/ínit.h
> 
> include/asm-generic/sections.h please.
> And please add a comment too.

Ok. I'm also assuming that the preferred type declaration for section 
boundaries defined in sections.h would be char[] so I'm changing that as 
well.

Updated patch set to follow. Thanks.


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

* [PATCH 1/4] kernel: constructor support
  2009-05-12 15:38 [PATCH 0/4] gcov kernel support Peter Oberparleiter
@ 2009-05-12 15:38 ` Peter Oberparleiter
  0 siblings, 0 replies; 22+ messages in thread
From: Peter Oberparleiter @ 2009-05-12 15:38 UTC (permalink / raw)
  To: linux-kernel
  Cc: Andrew Morton, Andi Kleen, Huang Ying, Li Wei, Michael Ellerman,
	Ingo Molnar, Heiko Carstens, Martin Schwidefsky, Rusty Russell,
	WANG Cong, Sam Ravnborg, Jeff Dike

[-- Attachment #1: kernel-constructor-support.patch --]
[-- Type: text/plain, Size: 5839 bytes --]

From: Peter Oberparleiter <oberpar@linux.vnet.ibm.com>

Call constructors (gcc-generated initcall-like functions) during
kernel start and module load. Constructors are e.g. used for gcov data
initialization.

Disable constructor support for usermode Linux to prevent conflicts
with host glibc.

Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com>
Acked-by: Rusty Russell <rusty@rustcorp.com.au>
Acked-by: WANG Cong <xiyou.wangcong@gmail.com>
Cc: Sam Ravnborg <sam@ravnborg.org>
Cc: Jeff Dike <jdike@addtoit.com>
---
 include/asm-generic/sections.h    |    3 +++
 include/asm-generic/vmlinux.lds.h |   11 ++++++++++-
 include/linux/init.h              |    3 +++
 include/linux/module.h            |    6 ++++++
 init/Kconfig                      |    5 +++++
 init/main.c                       |   12 ++++++++++++
 kernel/module.c                   |   16 ++++++++++++++++
 7 files changed, 55 insertions(+), 1 deletion(-)

Index: linux-2.6.30-rc5/include/asm-generic/vmlinux.lds.h
===================================================================
--- linux-2.6.30-rc5.orig/include/asm-generic/vmlinux.lds.h
+++ linux-2.6.30-rc5/include/asm-generic/vmlinux.lds.h
@@ -332,6 +332,14 @@
 /* Section used for early init (in .S files) */
 #define HEAD_TEXT  *(HEAD_TEXT_SECTION)
 
+#ifdef CONFIG_CONSTRUCTORS
+#define KERNEL_CTORS()	VMLINUX_SYMBOL(__ctors_start) = .; \
+			*(.ctors)			   \
+			VMLINUX_SYMBOL(__ctors_end) = .;
+#else
+#define KERNEL_CTORS()
+#endif
+
 /* init and exit section handling */
 #define INIT_DATA							\
 	*(.init.data)							\
@@ -340,7 +348,8 @@
 	CPU_DISCARD(init.data)						\
 	CPU_DISCARD(init.rodata)					\
 	MEM_DISCARD(init.data)						\
-	MEM_DISCARD(init.rodata)
+	MEM_DISCARD(init.rodata)					\
+	KERNEL_CTORS()
 
 #define INIT_TEXT							\
 	*(.init.text)							\
Index: linux-2.6.30-rc5/include/linux/init.h
===================================================================
--- linux-2.6.30-rc5.orig/include/linux/init.h
+++ linux-2.6.30-rc5/include/linux/init.h
@@ -136,6 +136,9 @@ typedef void (*exitcall_t)(void);
 extern initcall_t __con_initcall_start[], __con_initcall_end[];
 extern initcall_t __security_initcall_start[], __security_initcall_end[];
 
+/* Used for contructor calls. */
+typedef void (*ctor_fn_t)(void);
+
 /* Defined in init/main.c */
 extern int do_one_initcall(initcall_t fn);
 extern char __initdata boot_command_line[];
Index: linux-2.6.30-rc5/include/linux/module.h
===================================================================
--- linux-2.6.30-rc5.orig/include/linux/module.h
+++ linux-2.6.30-rc5/include/linux/module.h
@@ -354,6 +354,12 @@ struct module
 	local_t ref;
 #endif
 #endif
+
+#ifdef CONFIG_CONSTRUCTORS
+	/* Constructor functions. */
+	ctor_fn_t *ctors;
+	unsigned int num_ctors;
+#endif
 };
 #ifndef MODULE_ARCH_INIT
 #define MODULE_ARCH_INIT {}
Index: linux-2.6.30-rc5/init/main.c
===================================================================
--- linux-2.6.30-rc5.orig/init/main.c
+++ linux-2.6.30-rc5/init/main.c
@@ -700,6 +700,17 @@ asmlinkage void __init start_kernel(void
 	rest_init();
 }
 
+/* Call all constructor functions linked into the kernel. */
+static void __init do_ctors(void)
+{
+#ifdef CONFIG_CONSTRUCTORS
+	ctor_fn_t *call = (ctor_fn_t *) __ctors_start;
+
+	for (; call < (ctor_fn_t *) __ctors_end; call++)
+		(*call)();
+#endif
+}
+
 int initcall_debug;
 core_param(initcall_debug, initcall_debug, bool, 0644);
 
@@ -780,6 +791,7 @@ static void __init do_basic_setup(void)
 	usermodehelper_init();
 	driver_init();
 	init_irq_proc();
+	do_ctors();
 	do_initcalls();
 }
 
Index: linux-2.6.30-rc5/kernel/module.c
===================================================================
--- linux-2.6.30-rc5.orig/kernel/module.c
+++ linux-2.6.30-rc5/kernel/module.c
@@ -2172,6 +2172,10 @@ static noinline struct module *load_modu
 					sizeof(*mod->tracepoints),
 					&mod->num_tracepoints);
 #endif
+#ifdef CONFIG_CONSTRUCTORS
+	mod->ctors = section_objs(hdr, sechdrs, secstrings, ".ctors",
+				  sizeof(*mod->ctors), &mod->num_ctors);
+#endif
 
 #ifdef CONFIG_MODVERSIONS
 	if ((mod->num_syms && !mod->crcs)
@@ -2328,6 +2332,17 @@ static noinline struct module *load_modu
 	goto free_hdr;
 }
 
+/* Call module constructors. */
+static void do_mod_ctors(struct module *mod)
+{
+#ifdef CONFIG_CONSTRUCTORS
+	unsigned long i;
+
+	for (i = 0; i < mod->num_ctors; i++)
+		mod->ctors[i]();
+#endif
+}
+
 /* This is where the real work happens */
 SYSCALL_DEFINE3(init_module, void __user *, umod,
 		unsigned long, len, const char __user *, uargs)
@@ -2356,6 +2371,7 @@ SYSCALL_DEFINE3(init_module, void __user
 	blocking_notifier_call_chain(&module_notify_list,
 			MODULE_STATE_COMING, mod);
 
+	do_mod_ctors(mod);
 	/* Start the module */
 	if (mod->init != NULL)
 		ret = do_one_initcall(mod->init);
Index: linux-2.6.30-rc5/init/Kconfig
===================================================================
--- linux-2.6.30-rc5.orig/init/Kconfig
+++ linux-2.6.30-rc5/init/Kconfig
@@ -16,6 +16,11 @@ config DEFCONFIG_LIST
 	default "$ARCH_DEFCONFIG"
 	default "arch/$ARCH/defconfig"
 
+config CONSTRUCTORS
+	bool
+	depends on !UML
+	default y
+
 menu "General setup"
 
 config EXPERIMENTAL
Index: linux-2.6.30-rc5/include/asm-generic/sections.h
===================================================================
--- linux-2.6.30-rc5.orig/include/asm-generic/sections.h
+++ linux-2.6.30-rc5/include/asm-generic/sections.h
@@ -14,6 +14,9 @@ extern char __kprobes_text_start[], __kp
 extern char __initdata_begin[], __initdata_end[];
 extern char __start_rodata[], __end_rodata[];
 
+/* Start and end of .ctors section - used for constructor calls. */
+extern char __ctors_start[], __ctors_end[];
+
 /* function descriptor handling (if any).  Override
  * in asm/sections.h */
 #ifndef dereference_function_descriptor



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

* [PATCH 1/4] kernel: constructor support
  2009-05-19 14:24 [PATCH 0/4] gcov kernel support Peter Oberparleiter
@ 2009-05-19 14:24 ` Peter Oberparleiter
  0 siblings, 0 replies; 22+ messages in thread
From: Peter Oberparleiter @ 2009-05-19 14:24 UTC (permalink / raw)
  To: Andrew Morton
  Cc: linux-kernel, Andi Kleen, Huang Ying, Li Wei, Michael Ellerman,
	Ingo Molnar, Heiko Carstens, Martin Schwidefsky, Rusty Russell,
	WANG Cong, Sam Ravnborg, Jeff Dike

[-- Attachment #1: kernel-constructor-support.patch --]
[-- Type: text/plain, Size: 6028 bytes --]

From: Peter Oberparleiter <oberpar@linux.vnet.ibm.com>

Call constructors (gcc-generated initcall-like functions) during
kernel start and module load. Constructors are e.g. used for gcov data
initialization.

Disable constructor support for usermode Linux to prevent conflicts
with host glibc.

Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com>
Acked-by: Rusty Russell <rusty@rustcorp.com.au>
Acked-by: WANG Cong <xiyou.wangcong@gmail.com>
Cc: Sam Ravnborg <sam@ravnborg.org>
Cc: Jeff Dike <jdike@addtoit.com>
---
 include/asm-generic/sections.h    |    3 +++
 include/asm-generic/vmlinux.lds.h |   11 ++++++++++-
 include/linux/init.h              |    3 +++
 include/linux/module.h            |    6 ++++++
 init/Kconfig                      |    5 +++++
 init/main.c                       |   12 ++++++++++++
 kernel/module.c                   |   16 ++++++++++++++++
 7 files changed, 55 insertions(+), 1 deletion(-)

Index: linux-2.6.30-rc6/include/asm-generic/vmlinux.lds.h
===================================================================
--- linux-2.6.30-rc6.orig/include/asm-generic/vmlinux.lds.h	2009-05-19 12:27:39.000000000 +0200
+++ linux-2.6.30-rc6/include/asm-generic/vmlinux.lds.h	2009-05-19 12:41:25.000000000 +0200
@@ -332,6 +332,14 @@
 /* Section used for early init (in .S files) */
 #define HEAD_TEXT  *(HEAD_TEXT_SECTION)
 
+#ifdef CONFIG_CONSTRUCTORS
+#define KERNEL_CTORS()	VMLINUX_SYMBOL(__ctors_start) = .; \
+			*(.ctors)			   \
+			VMLINUX_SYMBOL(__ctors_end) = .;
+#else
+#define KERNEL_CTORS()
+#endif
+
 /* init and exit section handling */
 #define INIT_DATA							\
 	*(.init.data)							\
@@ -340,7 +348,8 @@
 	CPU_DISCARD(init.data)						\
 	CPU_DISCARD(init.rodata)					\
 	MEM_DISCARD(init.data)						\
-	MEM_DISCARD(init.rodata)
+	MEM_DISCARD(init.rodata)					\
+	KERNEL_CTORS()
 
 #define INIT_TEXT							\
 	*(.init.text)							\
Index: linux-2.6.30-rc6/include/linux/init.h
===================================================================
--- linux-2.6.30-rc6.orig/include/linux/init.h	2009-05-19 12:27:39.000000000 +0200
+++ linux-2.6.30-rc6/include/linux/init.h	2009-05-19 12:41:25.000000000 +0200
@@ -136,6 +136,9 @@
 extern initcall_t __con_initcall_start[], __con_initcall_end[];
 extern initcall_t __security_initcall_start[], __security_initcall_end[];
 
+/* Used for contructor calls. */
+typedef void (*ctor_fn_t)(void);
+
 /* Defined in init/main.c */
 extern int do_one_initcall(initcall_t fn);
 extern char __initdata boot_command_line[];
Index: linux-2.6.30-rc6/include/linux/module.h
===================================================================
--- linux-2.6.30-rc6.orig/include/linux/module.h	2009-05-19 12:27:39.000000000 +0200
+++ linux-2.6.30-rc6/include/linux/module.h	2009-05-19 12:41:25.000000000 +0200
@@ -354,6 +354,12 @@
 	local_t ref;
 #endif
 #endif
+
+#ifdef CONFIG_CONSTRUCTORS
+	/* Constructor functions. */
+	ctor_fn_t *ctors;
+	unsigned int num_ctors;
+#endif
 };
 #ifndef MODULE_ARCH_INIT
 #define MODULE_ARCH_INIT {}
Index: linux-2.6.30-rc6/init/main.c
===================================================================
--- linux-2.6.30-rc6.orig/init/main.c	2009-05-19 12:27:39.000000000 +0200
+++ linux-2.6.30-rc6/init/main.c	2009-05-19 12:41:25.000000000 +0200
@@ -700,6 +700,17 @@
 	rest_init();
 }
 
+/* Call all constructor functions linked into the kernel. */
+static void __init do_ctors(void)
+{
+#ifdef CONFIG_CONSTRUCTORS
+	ctor_fn_t *call = (ctor_fn_t *) __ctors_start;
+
+	for (; call < (ctor_fn_t *) __ctors_end; call++)
+		(*call)();
+#endif
+}
+
 int initcall_debug;
 core_param(initcall_debug, initcall_debug, bool, 0644);
 
@@ -780,6 +791,7 @@
 	usermodehelper_init();
 	driver_init();
 	init_irq_proc();
+	do_ctors();
 	do_initcalls();
 }
 
Index: linux-2.6.30-rc6/kernel/module.c
===================================================================
--- linux-2.6.30-rc6.orig/kernel/module.c	2009-05-19 12:27:39.000000000 +0200
+++ linux-2.6.30-rc6/kernel/module.c	2009-05-19 12:41:26.000000000 +0200
@@ -2172,6 +2172,10 @@
 					sizeof(*mod->tracepoints),
 					&mod->num_tracepoints);
 #endif
+#ifdef CONFIG_CONSTRUCTORS
+	mod->ctors = section_objs(hdr, sechdrs, secstrings, ".ctors",
+				  sizeof(*mod->ctors), &mod->num_ctors);
+#endif
 
 #ifdef CONFIG_MODVERSIONS
 	if ((mod->num_syms && !mod->crcs)
@@ -2328,6 +2332,17 @@
 	goto free_hdr;
 }
 
+/* Call module constructors. */
+static void do_mod_ctors(struct module *mod)
+{
+#ifdef CONFIG_CONSTRUCTORS
+	unsigned long i;
+
+	for (i = 0; i < mod->num_ctors; i++)
+		mod->ctors[i]();
+#endif
+}
+
 /* This is where the real work happens */
 SYSCALL_DEFINE3(init_module, void __user *, umod,
 		unsigned long, len, const char __user *, uargs)
@@ -2356,6 +2371,7 @@
 	blocking_notifier_call_chain(&module_notify_list,
 			MODULE_STATE_COMING, mod);
 
+	do_mod_ctors(mod);
 	/* Start the module */
 	if (mod->init != NULL)
 		ret = do_one_initcall(mod->init);
Index: linux-2.6.30-rc6/init/Kconfig
===================================================================
--- linux-2.6.30-rc6.orig/init/Kconfig	2009-05-19 12:27:39.000000000 +0200
+++ linux-2.6.30-rc6/init/Kconfig	2009-05-19 12:41:26.000000000 +0200
@@ -16,6 +16,11 @@
 	default "$ARCH_DEFCONFIG"
 	default "arch/$ARCH/defconfig"
 
+config CONSTRUCTORS
+	bool
+	depends on !UML
+	default y
+
 menu "General setup"
 
 config EXPERIMENTAL
Index: linux-2.6.30-rc6/include/asm-generic/sections.h
===================================================================
--- linux-2.6.30-rc6.orig/include/asm-generic/sections.h	2009-05-19 12:27:39.000000000 +0200
+++ linux-2.6.30-rc6/include/asm-generic/sections.h	2009-05-19 12:41:26.000000000 +0200
@@ -14,6 +14,9 @@
 extern char __initdata_begin[], __initdata_end[];
 extern char __start_rodata[], __end_rodata[];
 
+/* Start and end of .ctors section - used for constructor calls. */
+extern char __ctors_start[], __ctors_end[];
+
 /* function descriptor handling (if any).  Override
  * in asm/sections.h */
 #ifndef dereference_function_descriptor



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

* [PATCH 1/4] kernel: constructor support
  2009-06-02 11:43 [PATCH 0/4] gcov kernel support Peter Oberparleiter
@ 2009-06-02 11:44 ` Peter Oberparleiter
  2009-06-02 21:32   ` Andrew Morton
  0 siblings, 1 reply; 22+ messages in thread
From: Peter Oberparleiter @ 2009-06-02 11:44 UTC (permalink / raw)
  To: Andrew Morton
  Cc: linux-kernel, Andi Kleen, Huang Ying, Li Wei, Michael Ellerman,
	Ingo Molnar, Heiko Carstens, Martin Schwidefsky, Rusty Russell,
	WANG Cong, Sam Ravnborg, Jeff Dike

[-- Attachment #1: kernel-constructor-support.patch --]
[-- Type: text/plain, Size: 6028 bytes --]

From: Peter Oberparleiter <oberpar@linux.vnet.ibm.com>

Call constructors (gcc-generated initcall-like functions) during
kernel start and module load. Constructors are e.g. used for gcov data
initialization.

Disable constructor support for usermode Linux to prevent conflicts
with host glibc.

Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com>
Acked-by: Rusty Russell <rusty@rustcorp.com.au>
Acked-by: WANG Cong <xiyou.wangcong@gmail.com>
Cc: Sam Ravnborg <sam@ravnborg.org>
Cc: Jeff Dike <jdike@addtoit.com>
---
 include/asm-generic/sections.h    |    3 +++
 include/asm-generic/vmlinux.lds.h |   11 ++++++++++-
 include/linux/init.h              |    3 +++
 include/linux/module.h            |    6 ++++++
 init/Kconfig                      |    5 +++++
 init/main.c                       |   12 ++++++++++++
 kernel/module.c                   |   16 ++++++++++++++++
 7 files changed, 55 insertions(+), 1 deletion(-)

Index: linux-2.6.30-rc7/include/asm-generic/vmlinux.lds.h
===================================================================
--- linux-2.6.30-rc7.orig/include/asm-generic/vmlinux.lds.h	2009-06-02 10:34:37.000000000 +0200
+++ linux-2.6.30-rc7/include/asm-generic/vmlinux.lds.h	2009-06-02 10:35:20.000000000 +0200
@@ -332,6 +332,14 @@
 /* Section used for early init (in .S files) */
 #define HEAD_TEXT  *(HEAD_TEXT_SECTION)
 
+#ifdef CONFIG_CONSTRUCTORS
+#define KERNEL_CTORS()	VMLINUX_SYMBOL(__ctors_start) = .; \
+			*(.ctors)			   \
+			VMLINUX_SYMBOL(__ctors_end) = .;
+#else
+#define KERNEL_CTORS()
+#endif
+
 /* init and exit section handling */
 #define INIT_DATA							\
 	*(.init.data)							\
@@ -340,7 +348,8 @@
 	CPU_DISCARD(init.data)						\
 	CPU_DISCARD(init.rodata)					\
 	MEM_DISCARD(init.data)						\
-	MEM_DISCARD(init.rodata)
+	MEM_DISCARD(init.rodata)					\
+	KERNEL_CTORS()
 
 #define INIT_TEXT							\
 	*(.init.text)							\
Index: linux-2.6.30-rc7/include/linux/init.h
===================================================================
--- linux-2.6.30-rc7.orig/include/linux/init.h	2009-06-02 10:34:40.000000000 +0200
+++ linux-2.6.30-rc7/include/linux/init.h	2009-06-02 10:35:20.000000000 +0200
@@ -136,6 +136,9 @@
 extern initcall_t __con_initcall_start[], __con_initcall_end[];
 extern initcall_t __security_initcall_start[], __security_initcall_end[];
 
+/* Used for contructor calls. */
+typedef void (*ctor_fn_t)(void);
+
 /* Defined in init/main.c */
 extern int do_one_initcall(initcall_t fn);
 extern char __initdata boot_command_line[];
Index: linux-2.6.30-rc7/include/linux/module.h
===================================================================
--- linux-2.6.30-rc7.orig/include/linux/module.h	2009-06-02 10:34:41.000000000 +0200
+++ linux-2.6.30-rc7/include/linux/module.h	2009-06-02 10:35:20.000000000 +0200
@@ -354,6 +354,12 @@
 	local_t ref;
 #endif
 #endif
+
+#ifdef CONFIG_CONSTRUCTORS
+	/* Constructor functions. */
+	ctor_fn_t *ctors;
+	unsigned int num_ctors;
+#endif
 };
 #ifndef MODULE_ARCH_INIT
 #define MODULE_ARCH_INIT {}
Index: linux-2.6.30-rc7/init/main.c
===================================================================
--- linux-2.6.30-rc7.orig/init/main.c	2009-06-02 10:34:46.000000000 +0200
+++ linux-2.6.30-rc7/init/main.c	2009-06-02 10:35:20.000000000 +0200
@@ -700,6 +700,17 @@
 	rest_init();
 }
 
+/* Call all constructor functions linked into the kernel. */
+static void __init do_ctors(void)
+{
+#ifdef CONFIG_CONSTRUCTORS
+	ctor_fn_t *call = (ctor_fn_t *) __ctors_start;
+
+	for (; call < (ctor_fn_t *) __ctors_end; call++)
+		(*call)();
+#endif
+}
+
 int initcall_debug;
 core_param(initcall_debug, initcall_debug, bool, 0644);
 
@@ -780,6 +791,7 @@
 	usermodehelper_init();
 	driver_init();
 	init_irq_proc();
+	do_ctors();
 	do_initcalls();
 }
 
Index: linux-2.6.30-rc7/kernel/module.c
===================================================================
--- linux-2.6.30-rc7.orig/kernel/module.c	2009-06-02 10:34:47.000000000 +0200
+++ linux-2.6.30-rc7/kernel/module.c	2009-06-02 10:35:20.000000000 +0200
@@ -2172,6 +2172,10 @@
 					sizeof(*mod->tracepoints),
 					&mod->num_tracepoints);
 #endif
+#ifdef CONFIG_CONSTRUCTORS
+	mod->ctors = section_objs(hdr, sechdrs, secstrings, ".ctors",
+				  sizeof(*mod->ctors), &mod->num_ctors);
+#endif
 
 #ifdef CONFIG_MODVERSIONS
 	if ((mod->num_syms && !mod->crcs)
@@ -2328,6 +2332,17 @@
 	goto free_hdr;
 }
 
+/* Call module constructors. */
+static void do_mod_ctors(struct module *mod)
+{
+#ifdef CONFIG_CONSTRUCTORS
+	unsigned long i;
+
+	for (i = 0; i < mod->num_ctors; i++)
+		mod->ctors[i]();
+#endif
+}
+
 /* This is where the real work happens */
 SYSCALL_DEFINE3(init_module, void __user *, umod,
 		unsigned long, len, const char __user *, uargs)
@@ -2356,6 +2371,7 @@
 	blocking_notifier_call_chain(&module_notify_list,
 			MODULE_STATE_COMING, mod);
 
+	do_mod_ctors(mod);
 	/* Start the module */
 	if (mod->init != NULL)
 		ret = do_one_initcall(mod->init);
Index: linux-2.6.30-rc7/init/Kconfig
===================================================================
--- linux-2.6.30-rc7.orig/init/Kconfig	2009-06-02 10:34:46.000000000 +0200
+++ linux-2.6.30-rc7/init/Kconfig	2009-06-02 10:35:20.000000000 +0200
@@ -16,6 +16,11 @@
 	default "$ARCH_DEFCONFIG"
 	default "arch/$ARCH/defconfig"
 
+config CONSTRUCTORS
+	bool
+	depends on !UML
+	default y
+
 menu "General setup"
 
 config EXPERIMENTAL
Index: linux-2.6.30-rc7/include/asm-generic/sections.h
===================================================================
--- linux-2.6.30-rc7.orig/include/asm-generic/sections.h	2009-06-02 10:34:37.000000000 +0200
+++ linux-2.6.30-rc7/include/asm-generic/sections.h	2009-06-02 10:35:20.000000000 +0200
@@ -14,6 +14,9 @@
 extern char __initdata_begin[], __initdata_end[];
 extern char __start_rodata[], __end_rodata[];
 
+/* Start and end of .ctors section - used for constructor calls. */
+extern char __ctors_start[], __ctors_end[];
+
 /* function descriptor handling (if any).  Override
  * in asm/sections.h */
 #ifndef dereference_function_descriptor



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

* Re: [PATCH 1/4] kernel: constructor support
  2009-06-02 11:44 ` [PATCH 1/4] kernel: constructor support Peter Oberparleiter
@ 2009-06-02 21:32   ` Andrew Morton
  2009-06-03 11:55     ` Peter Oberparleiter
  0 siblings, 1 reply; 22+ messages in thread
From: Andrew Morton @ 2009-06-02 21:32 UTC (permalink / raw)
  To: Peter Oberparleiter
  Cc: linux-kernel, andi, ying.huang, W.Li, michaele, mingo, heicars2,
	mschwid2, rusty, xiyou.wangcong, sam, jdike

On Tue, 02 Jun 2009 13:44:00 +0200
Peter Oberparleiter <oberpar@linux.vnet.ibm.com> wrote:

> From: Peter Oberparleiter <oberpar@linux.vnet.ibm.com>
> 
> Call constructors (gcc-generated initcall-like functions) during
> kernel start and module load. Constructors are e.g. used for gcov data
> initialization.
> 
> Disable constructor support for usermode Linux to prevent conflicts
> with host glibc.
> 
> Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com>
> Acked-by: Rusty Russell <rusty@rustcorp.com.au>
> Acked-by: WANG Cong <xiyou.wangcong@gmail.com>
> Cc: Sam Ravnborg <sam@ravnborg.org>
> Cc: Jeff Dike <jdike@addtoit.com>
>
> ...
>
> --- linux-2.6.30-rc7.orig/include/asm-generic/vmlinux.lds.h	2009-06-02 10:34:37.000000000 +0200
> +++ linux-2.6.30-rc7/include/asm-generic/vmlinux.lds.h	2009-06-02 10:35:20.000000000 +0200

Sam's tree has mucked with this file in linux-next.

> @@ -332,6 +332,14 @@
>  /* Section used for early init (in .S files) */
>  #define HEAD_TEXT  *(HEAD_TEXT_SECTION)
>  
> +#ifdef CONFIG_CONSTRUCTORS
> +#define KERNEL_CTORS()	VMLINUX_SYMBOL(__ctors_start) = .; \
> +			*(.ctors)			   \
> +			VMLINUX_SYMBOL(__ctors_end) = .;
> +#else
> +#define KERNEL_CTORS()
> +#endif
> +
>  /* init and exit section handling */
>  #define INIT_DATA							\
>  	*(.init.data)							\
> @@ -340,7 +348,8 @@
>  	CPU_DISCARD(init.data)						\
>  	CPU_DISCARD(init.rodata)					\
>  	MEM_DISCARD(init.data)						\
> -	MEM_DISCARD(init.rodata)
> +	MEM_DISCARD(init.rodata)					\
> +	KERNEL_CTORS()
>  

What we now have here is

#define INIT_DATA							\
	*(.init.data)							\
	DEV_DISCARD(init.data)						\
	CPU_DISCARD(init.data)						\
	MEM_DISCARD(init.data)						\
	*(.init.rodata)							\
	DEV_DISCARD(init.rodata)					\
	CPU_DISCARD(init.rodata)					\
	MEM_DISCARD(init.rodata)

and I don't think that you wanted KERNEL_DTORS() inside the .rodata
section, so I did this:

#define INIT_DATA							\
	*(.init.data)							\
	DEV_DISCARD(init.data)						\
	CPU_DISCARD(init.data)						\
	MEM_DISCARD(init.data)						\
	KERNEL_CTORS()							\
	*(.init.rodata)							\
	DEV_DISCARD(init.rodata)					\
	CPU_DISCARD(init.rodata)					\
	MEM_DISCARD(init.rodata)

Please check that?

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

* Re: [PATCH 1/4] kernel: constructor support
  2009-06-02 21:32   ` Andrew Morton
@ 2009-06-03 11:55     ` Peter Oberparleiter
  0 siblings, 0 replies; 22+ messages in thread
From: Peter Oberparleiter @ 2009-06-03 11:55 UTC (permalink / raw)
  To: Andrew Morton
  Cc: linux-kernel, andi, ying.huang, W.Li, michaele, mingo, heicars2,
	mschwid2, rusty, xiyou.wangcong, sam, jdike

Andrew Morton wrote:
> On Tue, 02 Jun 2009 13:44:00 +0200
> Peter Oberparleiter <oberpar@linux.vnet.ibm.com> wrote:
>> ...
>>
>> --- linux-2.6.30-rc7.orig/include/asm-generic/vmlinux.lds.h	2009-06-02 10:34:37.000000000 +0200
>> +++ linux-2.6.30-rc7/include/asm-generic/vmlinux.lds.h	2009-06-02 10:35:20.000000000 +0200
> 
> Sam's tree has mucked with this file in linux-next.
> 
>> @@ -332,6 +332,14 @@
>>  /* Section used for early init (in .S files) */
>>  #define HEAD_TEXT  *(HEAD_TEXT_SECTION)
>>  
>> +#ifdef CONFIG_CONSTRUCTORS
>> +#define KERNEL_CTORS()	VMLINUX_SYMBOL(__ctors_start) = .; \
>> +			*(.ctors)			   \
>> +			VMLINUX_SYMBOL(__ctors_end) = .;
>> +#else
>> +#define KERNEL_CTORS()
>> +#endif
>> +
>>  /* init and exit section handling */
>>  #define INIT_DATA							\
>>  	*(.init.data)							\
>> @@ -340,7 +348,8 @@
>>  	CPU_DISCARD(init.data)						\
>>  	CPU_DISCARD(init.rodata)					\
>>  	MEM_DISCARD(init.data)						\
>> -	MEM_DISCARD(init.rodata)
>> +	MEM_DISCARD(init.rodata)					\
>> +	KERNEL_CTORS()
>>  
> 
> What we now have here is
> 
> #define INIT_DATA							\
> 	*(.init.data)							\
> 	DEV_DISCARD(init.data)						\
> 	CPU_DISCARD(init.data)						\
> 	MEM_DISCARD(init.data)						\
> 	*(.init.rodata)							\
> 	DEV_DISCARD(init.rodata)					\
> 	CPU_DISCARD(init.rodata)					\
> 	MEM_DISCARD(init.rodata)
> 
> and I don't think that you wanted KERNEL_DTORS() inside the .rodata
> section, so I did this:
> 
> #define INIT_DATA							\
> 	*(.init.data)							\
> 	DEV_DISCARD(init.data)						\
> 	CPU_DISCARD(init.data)						\
> 	MEM_DISCARD(init.data)						\
> 	KERNEL_CTORS()							\
> 	*(.init.rodata)							\
> 	DEV_DISCARD(init.rodata)					\
> 	CPU_DISCARD(init.rodata)					\
> 	MEM_DISCARD(init.rodata)
> 
> Please check that?

Looks good, compiles and still works. So that's an ACK from me.


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

end of thread, other threads:[~2009-06-03 11:56 UTC | newest]

Thread overview: 22+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-02-03 12:46 [PATCH 1/4] kernel: constructor support Peter Oberparleiter
2009-02-04  2:54 ` Rusty Russell
2009-02-04 15:05   ` Peter Oberparleiter
2009-02-04 23:23     ` Rusty Russell
  -- strict thread matches above, loose matches on Subject: below --
2009-02-26 13:51 Peter Oberparleiter
2009-05-07 12:45 [PATCH 0/4] gcov kernel support Peter Oberparleiter
2009-05-07 12:45 ` [PATCH 1/4] kernel: constructor support Peter Oberparleiter
2009-05-07 12:51   ` Ingo Molnar
2009-05-07 13:33     ` Peter Oberparleiter
2009-05-07 12:53   ` Ingo Molnar
2009-05-07 13:38     ` Peter Oberparleiter
2009-05-07 13:48       ` Ingo Molnar
2009-05-08 11:23         ` Peter Oberparleiter
2009-05-08 15:44 [PATCH 0/4] gcov kernel support Peter Oberparleiter
2009-05-08 15:44 ` [PATCH 1/4] kernel: constructor support Peter Oberparleiter
2009-05-09  5:03   ` Américo Wang
2009-05-11  8:43     ` Peter Oberparleiter
2009-05-11 18:54       ` Sam Ravnborg
2009-05-12 13:12         ` Peter Oberparleiter
2009-05-12 15:38 [PATCH 0/4] gcov kernel support Peter Oberparleiter
2009-05-12 15:38 ` [PATCH 1/4] kernel: constructor support Peter Oberparleiter
2009-05-19 14:24 [PATCH 0/4] gcov kernel support Peter Oberparleiter
2009-05-19 14:24 ` [PATCH 1/4] kernel: constructor support Peter Oberparleiter
2009-06-02 11:43 [PATCH 0/4] gcov kernel support Peter Oberparleiter
2009-06-02 11:44 ` [PATCH 1/4] kernel: constructor support Peter Oberparleiter
2009-06-02 21:32   ` Andrew Morton
2009-06-03 11:55     ` Peter Oberparleiter

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).