linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/4] gcov kernel support
@ 2009-05-08 15:44 Peter Oberparleiter
  2009-05-08 15:44 ` [PATCH 1/4] kernel: constructor support Peter Oberparleiter
                   ` (3 more replies)
  0 siblings, 4 replies; 26+ 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

This patchset implements support for performing kernel code coverage
measurements based on gcc's gcov mechanism. It can be used to improve
kernel code quality by identifying code parts which are not exercised
during test cases. Patch base is 2.6.30-rc4.

Changes since last version:
* moved compiler version assertion to include/linux/compiler-gcc3.h
* moved all module-specific code under CONFIG_MODULES
* added symbolic names for gcda file record numbers
* split seq_write_gcov_int() into two functions
* coding style changes:
  * fixed multi-line comments
  * added braces for multi-line blocks
  * improved rc and error label usage
  * made local variable initialization consistent
  * added initialization indentation
  * improved readability by using local variables

Patch overview:
[PATCH 1/4] kernel: constructor support
[PATCH 2/4] seq_file: add function to write binary data
[PATCH 3/4] gcov: add gcov profiling infrastructure
[PATCH 4/4] gcov: enable GCOV_PROFILE_ALL for x86_64

For more information see Documentation/gcov.txt and the previous post:
http://marc.info/?l=linux-kernel&m=123565658224661


^ permalink raw reply	[flat|nested] 26+ messages in thread
* [PATCH 0/4] gcov kernel support
@ 2009-06-02 11:43 Peter Oberparleiter
  2009-06-02 11:44 ` [PATCH 1/4] kernel: constructor support Peter Oberparleiter
  0 siblings, 1 reply; 26+ messages in thread
From: Peter Oberparleiter @ 2009-06-02 11:43 UTC (permalink / raw)
  To: Andrew Morton
  Cc: linux-kernel, Andi Kleen, Huang Ying, Li Wei, Michael Ellerman,
	Ingo Molnar, Heiko Carstens, Martin Schwidefsky

This patchset implements support for performing kernel code coverage
measurements based on gcc's gcov mechanism. It can be used to improve
kernel code quality by identifying code parts which are not exercised
during test cases. Patch base is 2.6.30-rc7.

Changes since last version:
* removed __gcov_execve (assuming no kernel function will be called
  execve)

Patch overview:
[PATCH 1/4] kernel: constructor support
[PATCH 2/4] seq_file: add function to write binary data
[PATCH 3/4] gcov: add gcov profiling infrastructure
[PATCH 4/4] gcov: enable GCOV_PROFILE_ALL for x86_64

For more information see Documentation/gcov.txt and the previous post:
http://marc.info/?l=linux-kernel&m=123565658224661


^ permalink raw reply	[flat|nested] 26+ messages in thread
* [PATCH 0/4] gcov kernel support
@ 2009-05-19 14:24 Peter Oberparleiter
  2009-05-19 14:24 ` [PATCH 1/4] kernel: constructor support Peter Oberparleiter
  0 siblings, 1 reply; 26+ 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

This patchset implements support for performing kernel code coverage
measurements based on gcc's gcov mechanism. It can be used to improve
kernel code quality by identifying code parts which are not exercised
during test cases. Patch base is 2.6.30-rc6.

Patch feedback has been integrated. There were no further comments
since the last version. In my opinion this patchset is ready for
inclusion into the -mm tree.

Patch overview:
[PATCH 1/4] kernel: constructor support
[PATCH 2/4] seq_file: add function to write binary data
[PATCH 3/4] gcov: add gcov profiling infrastructure
[PATCH 4/4] gcov: enable GCOV_PROFILE_ALL for x86_64

For more information see Documentation/gcov.txt and the previous post:
http://marc.info/?l=linux-kernel&m=123565658224661


^ permalink raw reply	[flat|nested] 26+ messages in thread
* [PATCH 0/4] gcov kernel support
@ 2009-05-12 15:38 Peter Oberparleiter
  2009-05-12 15:38 ` [PATCH 1/4] kernel: constructor support Peter Oberparleiter
  0 siblings, 1 reply; 26+ 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

This patchset implements support for performing kernel code coverage
measurements based on gcc's gcov mechanism. It can be used to improve
kernel code quality by identifying code parts which are not exercised
during test cases. Patch base is 2.6.30-rc5.

Changes since last version:
* updated to 2.6.30-rc5
* moved __ctors_start and __ctors_end declaration to
  include/asm-generic/sections.h

Patch overview:
[PATCH 1/4] kernel: constructor support
[PATCH 2/4] seq_file: add function to write binary data
[PATCH 3/4] gcov: add gcov profiling infrastructure
[PATCH 4/4] gcov: enable GCOV_PROFILE_ALL for x86_64

For more information see Documentation/gcov.txt and the previous post:
http://marc.info/?l=linux-kernel&m=123565658224661


^ permalink raw reply	[flat|nested] 26+ messages in thread
* [PATCH 0/4] gcov kernel support
@ 2009-05-07 12:45 Peter Oberparleiter
  2009-05-07 12:45 ` [PATCH 1/4] kernel: constructor support Peter Oberparleiter
  0 siblings, 1 reply; 26+ 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

This patchset implements support for performing kernel code coverage
measurements based on gcc's gcov mechanism. It can be used to improve
kernel code quality by identifying code parts which are not exercised
during test cases. Patch base is 2.6.30-rc4.

Changes since last version:
* fix return code of gcov_seq_show

Patch overview:
[PATCH 1/4] kernel: constructor support
[PATCH 2/4] seq_file: add function to write binary data
[PATCH 3/4] gcov: add gcov profiling infrastructure
[PATCH 4/4] gcov: enable GCOV_PROFILE_ALL for x86_64

For more information see Documentation/gcov.txt and the previous post:
http://marc.info/?l=linux-kernel&m=123565658224661


^ permalink raw reply	[flat|nested] 26+ messages in thread
* [PATCH 1/4] kernel: constructor support
@ 2009-02-26 13:51 Peter Oberparleiter
  0 siblings, 0 replies; 26+ 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] 26+ messages in thread
* [PATCH 1/4] kernel: constructor support
@ 2009-02-03 12:46 Peter Oberparleiter
  2009-02-04  2:54 ` Rusty Russell
  0 siblings, 1 reply; 26+ 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] 26+ messages in thread

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

Thread overview: 26+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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-08 15:44 ` [PATCH 2/4] seq_file: add function to write binary data Peter Oberparleiter
2009-05-08 15:44 ` [PATCH 3/4] gcov: add gcov profiling infrastructure Peter Oberparleiter
2009-05-08 15:44 ` [PATCH 4/4] gcov: enable GCOV_PROFILE_ALL for x86_64 Peter Oberparleiter
  -- strict thread matches above, loose matches on Subject: below --
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
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-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-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-02-26 13:51 Peter Oberparleiter
2009-02-03 12:46 Peter Oberparleiter
2009-02-04  2:54 ` Rusty Russell
2009-02-04 15:05   ` Peter Oberparleiter
2009-02-04 23:23     ` Rusty Russell

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