[PATCH v2] init/gcov: allow CONFIG_CONSTRUCTORS on UML to fix module gcov

Lambert lambertdev at qq.com
Sat May 8 14:50:09 BST 2021


> On Jan 21, 2021, at 1:04 AM, Peter Oberparleiter <oberpar at linux.ibm.com> wrote:
> 
> On 20.01.2021 17:20, Johannes Berg wrote:
>> From: Johannes Berg <johannes.berg at intel.com>
>> 
>> On ARCH=um, loading a module doesn't result in its constructors
>> getting called, which breaks module gcov since the debugfs files
>> are never registered. On the other hand, in-kernel constructors
>> have already been called by the dynamic linker, so we can't call
>> them again.
>> 
>> Get out of this conundrum by allowing CONFIG_CONSTRUCTORS to be
>> selected, but avoiding the in-kernel constructor calls.
>> 
>> Also remove the "if !UML" from GCOV selecting CONSTRUCTORS now,
>> since we really do want CONSTRUCTORS, just not kernel binary
>> ones.
>> 
>> Signed-off-by: Johannes Berg <johannes.berg at intel.com>
> 
> Looks good+nicer than v1 to me!
> 
> I also tested this patch on s390 and can confirm that it doesn't break
> gcov-kernel there.
> 
> Reviewed-by: Peter Oberparleiter <oberpar at linux.ibm.com>
> 
> Andrew, do we need additional reviews/sign-offs? Could this go in via
> your tree?
> 
>> ---
>> Tested with a kernel configured with CONFIG_GCOV_KERNEL, without
>> the patch nothing ever appears in /sys/kernel/debug/gcov/ (apart
>> from the reset file), and with it we get the files and they work.
> 
> Just to be sure: could you confirm that this test statement for UML also
> applies to v2, i.e. that it fixes the original problem you were seeing?
> 

Hi Johannes and Peter, sorry to bother but I have one question 
on this change. The do_ctors() won’t be executed for UML 
because  *the constructors have already been called for ELF*. 

The init_array section for each C file is linked to *vmlinux*  between 
*__ctors_start*  and  *__ctors_end* symbols. See link:
https://elixir.bootlin.com/linux/v5.12.2/source/include/asm-generic/vmlinux.lds.h#L676

In my environment, UML+GCC 10, I can't find __gcov_init executed 
before kernel starts. So I did some trace and found glibc __libc_csu_init 
will only execute constructors between *__init_array_start*and *__init_array_end*.  
Which means if do_ctors() is not executed for UML, no elsewhere will 
the constructors be executed.

Shall we remove the *!defined(CONFIG_UML)* for GCC, or I just missed 
some steps to make the GCOV work for UML? 

>> 
>> v2:
>> * special-case UML instead of splitting the CONSTRUCTORS config
>> ---
>> init/Kconfig        | 1 -
>> init/main.c         | 8 +++++++-
>> kernel/gcov/Kconfig | 2 +-
>> 3 files changed, 8 insertions(+), 3 deletions(-)
>> 
>> diff --git a/init/Kconfig b/init/Kconfig
>> index b77c60f8b963..29ad68325028 100644
>> --- a/init/Kconfig
>> +++ b/init/Kconfig
>> @@ -76,7 +76,6 @@ config CC_HAS_ASM_INLINE
>> 
>> config CONSTRUCTORS
>> 	bool
>> -	depends on !UML
>> 
>> config IRQ_WORK
>> 	bool
>> diff --git a/init/main.c b/init/main.c
>> index c68d784376ca..a626e78dbf06 100644
>> --- a/init/main.c
>> +++ b/init/main.c
>> @@ -1066,7 +1066,13 @@ asmlinkage __visible void __init __no_sanitize_address start_kernel(void)
>> /* Call all constructor functions linked into the kernel. */
>> static void __init do_ctors(void)
>> {
>> -#ifdef CONFIG_CONSTRUCTORS
>> +/*
>> + * For UML, the constructors have already been called by the
>> + * normal setup code as it's just a normal ELF binary, so we
>> + * cannot do it again - but we do need CONFIG_CONSTRUCTORS
>> + * even on UML for modules.
>> + */
>> +#if defined(CONFIG_CONSTRUCTORS) && !defined(CONFIG_UML)
>> 	ctor_fn_t *fn = (ctor_fn_t *) __ctors_start;
>> 
>> 	for (; fn < (ctor_fn_t *) __ctors_end; fn++)
>> diff --git a/kernel/gcov/Kconfig b/kernel/gcov/Kconfig
>> index 3110c77230c7..f62de2dea8a3 100644
>> --- a/kernel/gcov/Kconfig
>> +++ b/kernel/gcov/Kconfig
>> @@ -4,7 +4,7 @@ menu "GCOV-based kernel profiling"
>> config GCOV_KERNEL
>> 	bool "Enable gcov-based kernel profiling"
>> 	depends on DEBUG_FS
>> -	select CONSTRUCTORS if !UML
>> +	select CONSTRUCTORS
>> 	default n
>> 	help
>> 	This option enables gcov-based code profiling (e.g. for code coverage
>> 
> 
> 
> -- 
> Peter Oberparleiter
> Linux on Z Development - IBM Germany
> 




More information about the linux-um mailing list