diff mbox series

xen/coverage: wrap coverage related things under 'CONFIG_COVERAGE'

Message ID 1560232949-10673-1-git-send-email-chenbaodong@mxnavi.com (mailing list archive)
State New, archived
Headers show
Series xen/coverage: wrap coverage related things under 'CONFIG_COVERAGE' | expand

Commit Message

chenbaodong June 11, 2019, 6:02 a.m. UTC
Constructors between '__ctors_start' and '__ctors_end' only used
for code-coverage, not by xen itself, so use 'CONFIG_COVERAGE' wrap them.

Signed-off-by: Baodong Chen <chenbaodong@mxnavi.com>
---
 xen/arch/arm/xen.lds.S | 2 ++
 xen/arch/x86/xen.lds.S | 2 ++
 xen/common/lib.c       | 5 +++++
 3 files changed, 9 insertions(+)

Comments

Jan Beulich June 11, 2019, 2:03 p.m. UTC | #1
>>> On 11.06.19 at 08:02, <chenbaodong@mxnavi.com> wrote:
> --- a/xen/arch/x86/xen.lds.S
> +++ b/xen/arch/x86/xen.lds.S
> @@ -240,12 +240,14 @@ SECTIONS
>          *(.altinstructions)
>          __alt_instructions_end = .;
>  
> +#if defined(CONFIG_COVERAGE)
>         . = ALIGN(8);
>         __ctors_start = .;
>         *(.ctors)
>         *(.init_array)
>         *(SORT(.init_array.*))
>         __ctors_end = .;
> +#endif

How is this (only) coverage related? And how is making this conditional
going to help in any way?

And if we were to take this, then please use the shorter #ifdef.

> --- a/xen/common/lib.c
> +++ b/xen/common/lib.c
> @@ -491,15 +491,20 @@ unsigned long long parse_size_and_unit(const char *s, const char **ps)
>      return ret;
>  }
>  
> +#if defined(CONFIG_COVERAGE)
>  typedef void (*ctor_func_t)(void);
>  extern const ctor_func_t __ctors_start[], __ctors_end[];
> +#endif

Again - how does this help?

> +/* see 'docs/hypervisor-guide/code-coverage.rst' */
>  void __init init_constructors(void)

There's no mention of this function in the referenced docs file.

>  {
> +#if defined(CONFIG_COVERAGE)
>      const ctor_func_t *f;
>      for ( f = __ctors_start; f < __ctors_end; ++f )
>          (*f)();
>  
> +#endif
>      /* Putting this here seems as good (or bad) as any other place. */

Again, besides lacking suitable reasoning you also should look
more closely, in this case where exactly it makes sense to place
the #endif.

Jan
chenbaodong June 12, 2019, 12:23 a.m. UTC | #2
On 6/11/19 22:03, Jan Beulich wrote:
>>>> On 11.06.19 at 08:02, <chenbaodong@mxnavi.com> wrote:
>> --- a/xen/arch/x86/xen.lds.S
>> +++ b/xen/arch/x86/xen.lds.S
>> @@ -240,12 +240,14 @@ SECTIONS
>>           *(.altinstructions)
>>           __alt_instructions_end = .;
>>   
>> +#if defined(CONFIG_COVERAGE)
>>          . = ALIGN(8);
>>          __ctors_start = .;
>>          *(.ctors)
>>          *(.init_array)
>>          *(SORT(.init_array.*))
>>          __ctors_end = .;
>> +#endif
> How is this (only) coverage related? And how is making this conditional
> going to help in any way?

Hello Jan,

When i read the code 'init_constructors()', i want to understand when 
it's used.

I can not find any helper macros like '__init' in init.h, put things in 
this section.

Also run under arm foundation platform, the section is empty.

So i check commit history and found it's commit logs: it is coverage 
related.

And compiled with CONFIG_COVERAGE enabled, this section is not empty 
anymore.

So the patch mainly want to clarify the code is coverage related,

which want to help newcomer easily understand this code.

Am i misunderstanding here?

>
> And if we were to take this, then please use the shorter #ifdef.
Yes, can be fixed.
>
>> --- a/xen/common/lib.c
>> +++ b/xen/common/lib.c
>> @@ -491,15 +491,20 @@ unsigned long long parse_size_and_unit(const char *s, const char **ps)
>>       return ret;
>>   }
>>   
>> +#if defined(CONFIG_COVERAGE)
>>   typedef void (*ctor_func_t)(void);
>>   extern const ctor_func_t __ctors_start[], __ctors_end[];
>> +#endif
> Again - how does this help?
Want to clarify this is coverage related code.
>
>> +/* see 'docs/hypervisor-guide/code-coverage.rst' */
>>   void __init init_constructors(void)
> There's no mention of this function in the referenced docs file.

Same as above.

>
>>   {
>> +#if defined(CONFIG_COVERAGE)
>>       const ctor_func_t *f;
>>       for ( f = __ctors_start; f < __ctors_end; ++f )
>>           (*f)();
>>   
>> +#endif
>>       /* Putting this here seems as good (or bad) as any other place. */
> Again, besides lacking suitable reasoning you also should look
> more closely, in this case where exactly it makes sense to place
> the #endif.

The blank line here? If yes, can be removed. i missed this.

>
> Jan
>
>
> .
>
Jan Beulich June 12, 2019, 6:34 a.m. UTC | #3
>>> On 12.06.19 at 02:23, <chenbaodong@mxnavi.com> wrote:
> On 6/11/19 22:03, Jan Beulich wrote:
>>>>> On 11.06.19 at 08:02, <chenbaodong@mxnavi.com> wrote:
>>> --- a/xen/arch/x86/xen.lds.S
>>> +++ b/xen/arch/x86/xen.lds.S
>>> @@ -240,12 +240,14 @@ SECTIONS
>>>           *(.altinstructions)
>>>           __alt_instructions_end = .;
>>>   
>>> +#if defined(CONFIG_COVERAGE)
>>>          . = ALIGN(8);
>>>          __ctors_start = .;
>>>          *(.ctors)
>>>          *(.init_array)
>>>          *(SORT(.init_array.*))
>>>          __ctors_end = .;
>>> +#endif
>> How is this (only) coverage related? And how is making this conditional
>> going to help in any way?
> 
> Hello Jan,
> 
> When i read the code 'init_constructors()', i want to understand when 
> it's used.
> 
> I can not find any helper macros like '__init' in init.h, put things in 
> this section.
> 
> Also run under arm foundation platform, the section is empty.
> 
> So i check commit history and found it's commit logs: it is coverage 
> related.
> 
> And compiled with CONFIG_COVERAGE enabled, this section is not empty 
> anymore.
> 
> So the patch mainly want to clarify the code is coverage related,
> 
> which want to help newcomer easily understand this code.
> 
> Am i misunderstanding here?

The code may have been _introduced_ for coverage, but are you
willing to guarantee it's coverage-only? Plus - what does removing
an empty section buy you?

>>> --- a/xen/common/lib.c
>>> +++ b/xen/common/lib.c
>>> @@ -491,15 +491,20 @@ unsigned long long parse_size_and_unit(const char *s, const char **ps)
>>>       return ret;
>>>   }
>>>   
>>> +#if defined(CONFIG_COVERAGE)
>>>   typedef void (*ctor_func_t)(void);
>>>   extern const ctor_func_t __ctors_start[], __ctors_end[];
>>> +#endif
>> Again - how does this help?
> Want to clarify this is coverage related code.

If only it really was (provably).

>>> +/* see 'docs/hypervisor-guide/code-coverage.rst' */
>>>   void __init init_constructors(void)
>> There's no mention of this function in the referenced docs file.
> 
> Same as above.

No. The reference makes no sense here without that doc somehow
mentioning the function you attach the comment to.

>>>   {
>>> +#if defined(CONFIG_COVERAGE)
>>>       const ctor_func_t *f;
>>>       for ( f = __ctors_start; f < __ctors_end; ++f )
>>>           (*f)();
>>>   
>>> +#endif
>>>       /* Putting this here seems as good (or bad) as any other place. */
>> Again, besides lacking suitable reasoning you also should look
>> more closely, in this case where exactly it makes sense to place
>> the #endif.
> 
> The blank line here? If yes, can be removed. i missed this.

Removed? No. If anything there's one missing. You've inserted
the #ifdef after the blank line rather than before it.

Jan
chenbaodong June 12, 2019, 7:36 a.m. UTC | #4
On 6/12/19 14:34, Jan Beulich wrote:
>>>> On 12.06.19 at 02:23, <chenbaodong@mxnavi.com> wrote:
>> On 6/11/19 22:03, Jan Beulich wrote:
>>>>>> On 11.06.19 at 08:02, <chenbaodong@mxnavi.com> wrote:
>>>> --- a/xen/arch/x86/xen.lds.S
>>>> +++ b/xen/arch/x86/xen.lds.S
>>>> @@ -240,12 +240,14 @@ SECTIONS
>>>>            *(.altinstructions)
>>>>            __alt_instructions_end = .;
>>>>    
>>>> +#if defined(CONFIG_COVERAGE)
>>>>           . = ALIGN(8);
>>>>           __ctors_start = .;
>>>>           *(.ctors)
>>>>           *(.init_array)
>>>>           *(SORT(.init_array.*))
>>>>           __ctors_end = .;
>>>> +#endif
>>> How is this (only) coverage related? And how is making this conditional
>>> going to help in any way?
>> Hello Jan,
>>
>> When i read the code 'init_constructors()', i want to understand when
>> it's used.
>>
>> I can not find any helper macros like '__init' in init.h, put things in
>> this section.
>>
>> Also run under arm foundation platform, the section is empty.
>>
>> So i check commit history and found it's commit logs: it is coverage
>> related.
>>
>> And compiled with CONFIG_COVERAGE enabled, this section is not empty
>> anymore.
>>
>> So the patch mainly want to clarify the code is coverage related,
>>
>> which want to help newcomer easily understand this code.
>>
>> Am i misunderstanding here?
> The code may have been _introduced_ for coverage, but are you
> willing to guarantee it's coverage-only? Plus - what does removing
> an empty section buy you?

Currently seems true, but not sure about the future, can not guarantee.

Personally guess this should not be used by xen, but use __init_call(fn) 
like in init.h.

My purpose is to clarify the code is coverage related(at least currently 
is).

If you are unhappy with it this way, how about just add a comment, 
something like:

+/* currently only used by code coverage */
   void __init init_constructors(void)

>>>> --- a/xen/common/lib.c
>>>> +++ b/xen/common/lib.c
>>>> @@ -491,15 +491,20 @@ unsigned long long parse_size_and_unit(const char *s, const char **ps)
>>>>        return ret;
>>>>    }
>>>>    
>>>> +#if defined(CONFIG_COVERAGE)
>>>>    typedef void (*ctor_func_t)(void);
>>>>    extern const ctor_func_t __ctors_start[], __ctors_end[];
>>>> +#endif
>>> Again - how does this help?
>> Want to clarify this is coverage related code.
> If only it really was (provably).
>
>>>> +/* see 'docs/hypervisor-guide/code-coverage.rst' */
>>>>    void __init init_constructors(void)
>>> There's no mention of this function in the referenced docs file.
>> Same as above.
> No. The reference makes no sense here without that doc somehow
> mentioning the function you attach the comment to.
>
>>>>    {
>>>> +#if defined(CONFIG_COVERAGE)
>>>>        const ctor_func_t *f;
>>>>        for ( f = __ctors_start; f < __ctors_end; ++f )
>>>>            (*f)();
>>>>    
>>>> +#endif
>>>>        /* Putting this here seems as good (or bad) as any other place. */
>>> Again, besides lacking suitable reasoning you also should look
>>> more closely, in this case where exactly it makes sense to place
>>> the #endif.
>> The blank line here? If yes, can be removed. i missed this.
> Removed? No. If anything there's one missing. You've inserted
> the #ifdef after the blank line rather than before it.
Sorry for my expression, what you said here is exactly what i want.
>
> Jan
>
>
> .
>
Jan Beulich June 12, 2019, 7:58 a.m. UTC | #5
>>> On 12.06.19 at 09:36, <chenbaodong@mxnavi.com> wrote:

> On 6/12/19 14:34, Jan Beulich wrote:
>>>>> On 12.06.19 at 02:23, <chenbaodong@mxnavi.com> wrote:
>>> On 6/11/19 22:03, Jan Beulich wrote:
>>>>>>> On 11.06.19 at 08:02, <chenbaodong@mxnavi.com> wrote:
>>>>> --- a/xen/arch/x86/xen.lds.S
>>>>> +++ b/xen/arch/x86/xen.lds.S
>>>>> @@ -240,12 +240,14 @@ SECTIONS
>>>>>            *(.altinstructions)
>>>>>            __alt_instructions_end = .;
>>>>>    
>>>>> +#if defined(CONFIG_COVERAGE)
>>>>>           . = ALIGN(8);
>>>>>           __ctors_start = .;
>>>>>           *(.ctors)
>>>>>           *(.init_array)
>>>>>           *(SORT(.init_array.*))
>>>>>           __ctors_end = .;
>>>>> +#endif
>>>> How is this (only) coverage related? And how is making this conditional
>>>> going to help in any way?
>>> Hello Jan,
>>>
>>> When i read the code 'init_constructors()', i want to understand when
>>> it's used.
>>>
>>> I can not find any helper macros like '__init' in init.h, put things in
>>> this section.
>>>
>>> Also run under arm foundation platform, the section is empty.
>>>
>>> So i check commit history and found it's commit logs: it is coverage
>>> related.
>>>
>>> And compiled with CONFIG_COVERAGE enabled, this section is not empty
>>> anymore.
>>>
>>> So the patch mainly want to clarify the code is coverage related,
>>>
>>> which want to help newcomer easily understand this code.
>>>
>>> Am i misunderstanding here?
>> The code may have been _introduced_ for coverage, but are you
>> willing to guarantee it's coverage-only? Plus - what does removing
>> an empty section buy you?
> 
> Currently seems true, but not sure about the future, can not guarantee.
> 
> Personally guess this should not be used by xen, but use __init_call(fn) 
> like in init.h.
> 
> My purpose is to clarify the code is coverage related(at least currently 
> is).
> 
> If you are unhappy with it this way, how about just add a comment, 
> something like:
> 
> +/* currently only used by code coverage */
>    void __init init_constructors(void)

I'd prefer if the entire patch was dropped, unless there really was
a clear (and clearly spelled out) gain. Adding a comment like you
suggest only calls for it going stale at some point.

Jan
chenbaodong June 12, 2019, 8:49 a.m. UTC | #6
On 6/12/19 15:58, Jan Beulich wrote:
>>>> On 12.06.19 at 09:36, <chenbaodong@mxnavi.com> wrote:
>> On 6/12/19 14:34, Jan Beulich wrote:
>>>>>> On 12.06.19 at 02:23, <chenbaodong@mxnavi.com> wrote:
>>>> On 6/11/19 22:03, Jan Beulich wrote:
>>>>>>>> On 11.06.19 at 08:02, <chenbaodong@mxnavi.com> wrote:
>>>>>> --- a/xen/arch/x86/xen.lds.S
>>>>>> +++ b/xen/arch/x86/xen.lds.S
>>>>>> @@ -240,12 +240,14 @@ SECTIONS
>>>>>>             *(.altinstructions)
>>>>>>             __alt_instructions_end = .;
>>>>>>     
>>>>>> +#if defined(CONFIG_COVERAGE)
>>>>>>            . = ALIGN(8);
>>>>>>            __ctors_start = .;
>>>>>>            *(.ctors)
>>>>>>            *(.init_array)
>>>>>>            *(SORT(.init_array.*))
>>>>>>            __ctors_end = .;
>>>>>> +#endif
>>>>> How is this (only) coverage related? And how is making this conditional
>>>>> going to help in any way?
>>>> Hello Jan,
>>>>
>>>> When i read the code 'init_constructors()', i want to understand when
>>>> it's used.
>>>>
>>>> I can not find any helper macros like '__init' in init.h, put things in
>>>> this section.
>>>>
>>>> Also run under arm foundation platform, the section is empty.
>>>>
>>>> So i check commit history and found it's commit logs: it is coverage
>>>> related.
>>>>
>>>> And compiled with CONFIG_COVERAGE enabled, this section is not empty
>>>> anymore.
>>>>
>>>> So the patch mainly want to clarify the code is coverage related,
>>>>
>>>> which want to help newcomer easily understand this code.
>>>>
>>>> Am i misunderstanding here?
>>> The code may have been _introduced_ for coverage, but are you
>>> willing to guarantee it's coverage-only? Plus - what does removing
>>> an empty section buy you?
>> Currently seems true, but not sure about the future, can not guarantee.
>>
>> Personally guess this should not be used by xen, but use __init_call(fn)
>> like in init.h.
>>
>> My purpose is to clarify the code is coverage related(at least currently
>> is).
>>
>> If you are unhappy with it this way, how about just add a comment,
>> something like:
>>
>> +/* currently only used by code coverage */
>>     void __init init_constructors(void)
> I'd prefer if the entire patch was dropped, unless there really was
> a clear (and clearly spelled out) gain. Adding a comment like you
> suggest only calls for it going stale at some point.

Copy that.

Thanks for all your comments.

>
> Jan
>
>
> .
>
diff mbox series

Patch

diff --git a/xen/arch/arm/xen.lds.S b/xen/arch/arm/xen.lds.S
index 1e72906..320ff68 100644
--- a/xen/arch/arm/xen.lds.S
+++ b/xen/arch/arm/xen.lds.S
@@ -172,12 +172,14 @@  SECTIONS
        *(.init.data.rel)
        *(.init.data.rel.*)
 
+#if defined(CONFIG_COVERAGE)
        . = ALIGN(8);
        __ctors_start = .;
        *(.ctors)
        *(.init_array)
        *(SORT(.init_array.*))
        __ctors_end = .;
+#endif
 
 #if defined(CONFIG_HAS_VPCI) && !defined(CONFIG_LATE_HWDOM)
        . = ALIGN(POINTER_ALIGN);
diff --git a/xen/arch/x86/xen.lds.S b/xen/arch/x86/xen.lds.S
index cb42dc8..604353f 100644
--- a/xen/arch/x86/xen.lds.S
+++ b/xen/arch/x86/xen.lds.S
@@ -240,12 +240,14 @@  SECTIONS
         *(.altinstructions)
         __alt_instructions_end = .;
 
+#if defined(CONFIG_COVERAGE)
        . = ALIGN(8);
        __ctors_start = .;
        *(.ctors)
        *(.init_array)
        *(SORT(.init_array.*))
        __ctors_end = .;
+#endif
 
 #if defined(CONFIG_HAS_VPCI) && !defined(CONFIG_LATE_HWDOM)
        . = ALIGN(POINTER_ALIGN);
diff --git a/xen/common/lib.c b/xen/common/lib.c
index 8ebec81..b8fc165 100644
--- a/xen/common/lib.c
+++ b/xen/common/lib.c
@@ -491,15 +491,20 @@  unsigned long long parse_size_and_unit(const char *s, const char **ps)
     return ret;
 }
 
+#if defined(CONFIG_COVERAGE)
 typedef void (*ctor_func_t)(void);
 extern const ctor_func_t __ctors_start[], __ctors_end[];
+#endif
 
+/* see 'docs/hypervisor-guide/code-coverage.rst' */
 void __init init_constructors(void)
 {
+#if defined(CONFIG_COVERAGE)
     const ctor_func_t *f;
     for ( f = __ctors_start; f < __ctors_end; ++f )
         (*f)();
 
+#endif
     /* Putting this here seems as good (or bad) as any other place. */
     BUILD_BUG_ON(sizeof(size_t) != sizeof(ssize_t));
 }