diff mbox series

[v2,1/2] xen: add config option to include failing condition in BUG_ON() message

Message ID 20200109134825.31482-2-jgross@suse.com (mailing list archive)
State Superseded
Headers show
Series xen: fix CONFIG_DEBUG_LOCKS | expand

Commit Message

Jürgen Groß Jan. 9, 2020, 1:48 p.m. UTC
Today a triggering BUG_ON() will only print source file and line
information. Add the possibility to print the triggering condition like
ASSERT().

Do that by introducing BUG_ON_VERBOSE() and add a Kconfig option to
make BUG_ON use BUG_ON_VERBOSE().

Signed-off-by: Juergen Gross <jgross@suse.com>
---
 xen/Kconfig.debug         | 6 ++++++
 xen/include/asm-x86/bug.h | 5 +++--
 xen/include/xen/lib.h     | 5 +++++
 3 files changed, 14 insertions(+), 2 deletions(-)

Comments

Jan Beulich Jan. 14, 2020, 3:47 p.m. UTC | #1
On 09.01.2020 14:48, Juergen Gross wrote:
> --- a/xen/Kconfig.debug
> +++ b/xen/Kconfig.debug
> @@ -81,6 +81,12 @@ config PERF_ARRAYS
>  	---help---
>  	  Enables software performance counter array histograms.
>  
> +config DEBUG_BUGVERBOSE
> +	bool "Verbose BUG_ON messages"
> +	default DEBUG
> +	---help---
> +	  In case a BUG_ON triggers additionally print the triggering
> +	  condition on the console.
>  
>  config VERBOSE_DEBUG

While I can see reasons to put this here, doing so means the option
will be unavailable in non-EXPERT release builds. Is it intended to
be that way?

> --- a/xen/include/xen/lib.h
> +++ b/xen/include/xen/lib.h
> @@ -8,7 +8,12 @@
>  #include <xen/string.h>
>  #include <asm/bug.h>
>  
> +#define BUG_ON_VERBOSE(p) do { if (unlikely(p)) BUG_VERBOSE(#p);  } while (0)
> +#ifdef CONFIG_DEBUG_BUGVERBOSE
> +#define BUG_ON(p)  BUG_ON_VERBOSE(p)

Looks like this will fail to build on Arm? Also - any particular
reason for the introduction of the separate BUG_ON_VERBOSE(),
when BUG_ON() could directly use BUG_VERBOSE()? I don't think we
want to encourage use of BUG_ON_VERBOSE() elsewhere ...

Jan
Jürgen Groß Jan. 14, 2020, 4 p.m. UTC | #2
On 14.01.20 16:47, Jan Beulich wrote:
> On 09.01.2020 14:48, Juergen Gross wrote:
>> --- a/xen/Kconfig.debug
>> +++ b/xen/Kconfig.debug
>> @@ -81,6 +81,12 @@ config PERF_ARRAYS
>>   	---help---
>>   	  Enables software performance counter array histograms.
>>   
>> +config DEBUG_BUGVERBOSE
>> +	bool "Verbose BUG_ON messages"
>> +	default DEBUG
>> +	---help---
>> +	  In case a BUG_ON triggers additionally print the triggering
>> +	  condition on the console.
>>   
>>   config VERBOSE_DEBUG
> 
> While I can see reasons to put this here, doing so means the option
> will be unavailable in non-EXPERT release builds. Is it intended to
> be that way?

I can move it either to xen/Kconfig or in Kconfig.debug out of the
"if expert" section if you want.

> 
>> --- a/xen/include/xen/lib.h
>> +++ b/xen/include/xen/lib.h
>> @@ -8,7 +8,12 @@
>>   #include <xen/string.h>
>>   #include <asm/bug.h>
>>   
>> +#define BUG_ON_VERBOSE(p) do { if (unlikely(p)) BUG_VERBOSE(#p);  } while (0)
>> +#ifdef CONFIG_DEBUG_BUGVERBOSE
>> +#define BUG_ON(p)  BUG_ON_VERBOSE(p)
> 
> Looks like this will fail to build on Arm? Also - any particular

Uh, shame on me!

> reason for the introduction of the separate BUG_ON_VERBOSE(),
> when BUG_ON() could directly use BUG_VERBOSE()? I don't think we
> want to encourage use of BUG_ON_VERBOSE() elsewhere ...

I wanted to offer that option. If you want me to remove it I wouldn't
mind.


Juergen
Jan Beulich Jan. 14, 2020, 4:12 p.m. UTC | #3
On 14.01.2020 17:00, Jürgen Groß wrote:
> On 14.01.20 16:47, Jan Beulich wrote:
>> On 09.01.2020 14:48, Juergen Gross wrote:
>>> --- a/xen/Kconfig.debug
>>> +++ b/xen/Kconfig.debug
>>> @@ -81,6 +81,12 @@ config PERF_ARRAYS
>>>   	---help---
>>>   	  Enables software performance counter array histograms.
>>>   
>>> +config DEBUG_BUGVERBOSE
>>> +	bool "Verbose BUG_ON messages"
>>> +	default DEBUG
>>> +	---help---
>>> +	  In case a BUG_ON triggers additionally print the triggering
>>> +	  condition on the console.
>>>   
>>>   config VERBOSE_DEBUG
>>
>> While I can see reasons to put this here, doing so means the option
>> will be unavailable in non-EXPERT release builds. Is it intended to
>> be that way?
> 
> I can move it either to xen/Kconfig or in Kconfig.debug out of the
> "if expert" section if you want.

I think this would be better, but give others a chance to voice
opinions.

>>> --- a/xen/include/xen/lib.h
>>> +++ b/xen/include/xen/lib.h
>>> @@ -8,7 +8,12 @@
>>>   #include <xen/string.h>
>>>   #include <asm/bug.h>
>>>   
>>> +#define BUG_ON_VERBOSE(p) do { if (unlikely(p)) BUG_VERBOSE(#p);  } while (0)
>>> +#ifdef CONFIG_DEBUG_BUGVERBOSE
>>> +#define BUG_ON(p)  BUG_ON_VERBOSE(p)
>>
>> Looks like this will fail to build on Arm? Also - any particular
> 
> Uh, shame on me!
> 
>> reason for the introduction of the separate BUG_ON_VERBOSE(),
>> when BUG_ON() could directly use BUG_VERBOSE()? I don't think we
>> want to encourage use of BUG_ON_VERBOSE() elsewhere ...
> 
> I wanted to offer that option. If you want me to remove it I wouldn't
> mind.

As above - unless there are good reasons (making others to agree
with you to have it), I'd prefer to not see it being independently
usable, at least for the time being.

Jan
Andrew Cooper Jan. 16, 2020, 6:54 p.m. UTC | #4
On 14/01/2020 16:12, Jan Beulich wrote:
> On 14.01.2020 17:00, Jürgen Groß wrote:
>> On 14.01.20 16:47, Jan Beulich wrote:
>>> On 09.01.2020 14:48, Juergen Gross wrote:
>>>> --- a/xen/Kconfig.debug
>>>> +++ b/xen/Kconfig.debug
>>>> @@ -81,6 +81,12 @@ config PERF_ARRAYS
>>>>   	---help---
>>>>   	  Enables software performance counter array histograms.
>>>>   
>>>> +config DEBUG_BUGVERBOSE
>>>> +	bool "Verbose BUG_ON messages"
>>>> +	default DEBUG
>>>> +	---help---
>>>> +	  In case a BUG_ON triggers additionally print the triggering
>>>> +	  condition on the console.
>>>>   
>>>>   config VERBOSE_DEBUG
>>> While I can see reasons to put this here, doing so means the option
>>> will be unavailable in non-EXPERT release builds. Is it intended to
>>> be that way?
>> I can move it either to xen/Kconfig or in Kconfig.debug out of the
>> "if expert" section if you want.
> I think this would be better, but give others a chance to voice
> opinions.

TBH, I don't think anyone will be interested in not having the strings. 
The change is what? a couple of hundred bytes?  That is a fraction of
the size of some functions we have.

Personally, I wouldn't even bother having the option.

>
>>>> --- a/xen/include/xen/lib.h
>>>> +++ b/xen/include/xen/lib.h
>>>> @@ -8,7 +8,12 @@
>>>>   #include <xen/string.h>
>>>>   #include <asm/bug.h>
>>>>   
>>>> +#define BUG_ON_VERBOSE(p) do { if (unlikely(p)) BUG_VERBOSE(#p);  } while (0)
>>>> +#ifdef CONFIG_DEBUG_BUGVERBOSE
>>>> +#define BUG_ON(p)  BUG_ON_VERBOSE(p)
>>> Looks like this will fail to build on Arm? Also - any particular
>> Uh, shame on me!
>>
>>> reason for the introduction of the separate BUG_ON_VERBOSE(),
>>> when BUG_ON() could directly use BUG_VERBOSE()? I don't think we
>>> want to encourage use of BUG_ON_VERBOSE() elsewhere ...
>> I wanted to offer that option. If you want me to remove it I wouldn't
>> mind.
> As above - unless there are good reasons (making others to agree
> with you to have it), I'd prefer to not see it being independently
> usable, at least for the time being.

I'd agree with the wish to not have a new flavour of BUG_ON().

People writing code aren't going to want the complexity of thinking
about it, and people who care about the presence/absence of messages
will care about it globally, not on a per-use bases.

~Andrew
Jan Beulich Jan. 17, 2020, 8:39 a.m. UTC | #5
On 16.01.2020 19:54, Andrew Cooper wrote:
> On 14/01/2020 16:12, Jan Beulich wrote:
>> On 14.01.2020 17:00, Jürgen Groß wrote:
>>> On 14.01.20 16:47, Jan Beulich wrote:
>>>> On 09.01.2020 14:48, Juergen Gross wrote:
>>>>> --- a/xen/Kconfig.debug
>>>>> +++ b/xen/Kconfig.debug
>>>>> @@ -81,6 +81,12 @@ config PERF_ARRAYS
>>>>>   	---help---
>>>>>   	  Enables software performance counter array histograms.
>>>>>   
>>>>> +config DEBUG_BUGVERBOSE
>>>>> +	bool "Verbose BUG_ON messages"
>>>>> +	default DEBUG
>>>>> +	---help---
>>>>> +	  In case a BUG_ON triggers additionally print the triggering
>>>>> +	  condition on the console.
>>>>>   
>>>>>   config VERBOSE_DEBUG
>>>> While I can see reasons to put this here, doing so means the option
>>>> will be unavailable in non-EXPERT release builds. Is it intended to
>>>> be that way?
>>> I can move it either to xen/Kconfig or in Kconfig.debug out of the
>>> "if expert" section if you want.
>> I think this would be better, but give others a chance to voice
>> opinions.
> 
> TBH, I don't think anyone will be interested in not having the strings. 
> The change is what? a couple of hundred bytes?  That is a fraction of
> the size of some functions we have.

Well, it's a couple thousand (about 7k according to my simplistic
estimation, but this is taking Arm and x86 together). It's not the
end of the world, but in particular embedded users may want to get
rid of this. There's a reason after all (I assume) that Linux has
the option.

Jan
Jürgen Groß Jan. 17, 2020, 8:53 a.m. UTC | #6
On 17.01.20 09:39, Jan Beulich wrote:
> On 16.01.2020 19:54, Andrew Cooper wrote:
>> On 14/01/2020 16:12, Jan Beulich wrote:
>>> On 14.01.2020 17:00, Jürgen Groß wrote:
>>>> On 14.01.20 16:47, Jan Beulich wrote:
>>>>> On 09.01.2020 14:48, Juergen Gross wrote:
>>>>>> --- a/xen/Kconfig.debug
>>>>>> +++ b/xen/Kconfig.debug
>>>>>> @@ -81,6 +81,12 @@ config PERF_ARRAYS
>>>>>>    	---help---
>>>>>>    	  Enables software performance counter array histograms.
>>>>>>    
>>>>>> +config DEBUG_BUGVERBOSE
>>>>>> +	bool "Verbose BUG_ON messages"
>>>>>> +	default DEBUG
>>>>>> +	---help---
>>>>>> +	  In case a BUG_ON triggers additionally print the triggering
>>>>>> +	  condition on the console.
>>>>>>    
>>>>>>    config VERBOSE_DEBUG
>>>>> While I can see reasons to put this here, doing so means the option
>>>>> will be unavailable in non-EXPERT release builds. Is it intended to
>>>>> be that way?
>>>> I can move it either to xen/Kconfig or in Kconfig.debug out of the
>>>> "if expert" section if you want.
>>> I think this would be better, but give others a chance to voice
>>> opinions.
>>
>> TBH, I don't think anyone will be interested in not having the strings.
>> The change is what? a couple of hundred bytes?  That is a fraction of
>> the size of some functions we have.
> 
> Well, it's a couple thousand (about 7k according to my simplistic
> estimation, but this is taking Arm and x86 together). It's not the
> end of the world, but in particular embedded users may want to get
> rid of this. There's a reason after all (I assume) that Linux has
> the option.

The needed code churn is rather limited, so I think we should keep the
config option.


Juergen
diff mbox series

Patch

diff --git a/xen/Kconfig.debug b/xen/Kconfig.debug
index b3511e81a2..dfbcac575a 100644
--- a/xen/Kconfig.debug
+++ b/xen/Kconfig.debug
@@ -81,6 +81,12 @@  config PERF_ARRAYS
 	---help---
 	  Enables software performance counter array histograms.
 
+config DEBUG_BUGVERBOSE
+	bool "Verbose BUG_ON messages"
+	default DEBUG
+	---help---
+	  In case a BUG_ON triggers additionally print the triggering
+	  condition on the console.
 
 config VERBOSE_DEBUG
 	bool "Verbose debug messages"
diff --git a/xen/include/asm-x86/bug.h b/xen/include/asm-x86/bug.h
index 9bb4a19420..46d282777f 100644
--- a/xen/include/asm-x86/bug.h
+++ b/xen/include/asm-x86/bug.h
@@ -60,10 +60,11 @@  struct bug_frame {
 
 
 #define WARN() BUG_FRAME(BUGFRAME_warn, __LINE__, __FILE__, 0, NULL)
-#define BUG() do {                                              \
-    BUG_FRAME(BUGFRAME_bug,  __LINE__, __FILE__, 0, NULL);      \
+#define BUG_VERBOSE(msg) do {                                   \
+    BUG_FRAME(BUGFRAME_bug,  __LINE__, __FILE__, 0, msg);       \
     unreachable();                                              \
 } while (0)
+#define BUG() BUG_VERBOSE(NULL)
 
 #define run_in_exception_handler(fn) BUG_FRAME(BUGFRAME_run_fn, 0, fn, 0, NULL)
 
diff --git a/xen/include/xen/lib.h b/xen/include/xen/lib.h
index 8fbe84032d..e7770b0d24 100644
--- a/xen/include/xen/lib.h
+++ b/xen/include/xen/lib.h
@@ -8,7 +8,12 @@ 
 #include <xen/string.h>
 #include <asm/bug.h>
 
+#define BUG_ON_VERBOSE(p) do { if (unlikely(p)) BUG_VERBOSE(#p);  } while (0)
+#ifdef CONFIG_DEBUG_BUGVERBOSE
+#define BUG_ON(p)  BUG_ON_VERBOSE(p)
+#else
 #define BUG_ON(p)  do { if (unlikely(p)) BUG();  } while (0)
+#endif
 #define WARN_ON(p) do { if (unlikely(p)) WARN(); } while (0)
 
 #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)