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