All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peter Oberparleiter <oberpar@linux.vnet.ibm.com>
To: Rusty Russell <rusty@rustcorp.com.au>
Cc: linux-kernel@vger.kernel.org,
	Andrew Morton <akpm@linux-foundation.org>,
	Andi Kleen <andi@firstfloor.org>,
	Huang Ying <ying.huang@intel.com>,
	Sam Ravnborg <sam@ravnborg.org>, Jeff Dike <jdike@addtoit.com>
Subject: Re: [PATCH 1/4] kernel: constructor support
Date: Wed, 04 Feb 2009 16:05:49 +0100	[thread overview]
Message-ID: <4989AECD.6030009@linux.vnet.ibm.com> (raw)
In-Reply-To: <200902041324.29655.rusty@rustcorp.com.au>

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


  reply	other threads:[~2009-02-04 15:07 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
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 [this message]
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

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4989AECD.6030009@linux.vnet.ibm.com \
    --to=oberpar@linux.vnet.ibm.com \
    --cc=akpm@linux-foundation.org \
    --cc=andi@firstfloor.org \
    --cc=jdike@addtoit.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=rusty@rustcorp.com.au \
    --cc=sam@ravnborg.org \
    --cc=ying.huang@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.